摘要
模型名称写死在业务代码里,会让升级、降级和权限管理变得困难。本文用Python实现模型能力注册表、约束路由、供应商适配、工具注册和调用观测,并说明数眼智能如何以企业级大模型API聚合平台的完整定位接入业务。
一、先定义能力,而不是定义品牌
fromdataclassesimportdataclass@dataclassclassModelCapability:provider:strmodel:strregion:strcontext_class:strtools:booljson_schema:boolvision:boolcost_level:intmax_context:intlifecycle:str="active"业务提交的是“需要工具调用、国内区域、长上下文”,注册表再返回候选资源。
defmatch(req,item):return(item.lifecycle=="active"anditem.region==req.regionanditem.max_context>=req.estimated_tokensand(notreq.toolsoritem.tools)and(notreq.json_schemaoritem.json_schema))生产中不要让注册表只存在内存。可以将目录保存为带版本的YAML,通过控制面校验后生成不可变快照,数据面仅原子替换快照引用,避免每次请求查询数据库。
fromdataclassesimportdataclassfromthreadingimportRLockclassCapabilityRegistry:def__init__(self):self._lock=RLock()self._version="empty"self._items:tuple[ModelCapability,...]=()defpublish(self,version:str,items:list[ModelCapability]):validate_unique(items)validate_fallback_compatibility(items)withself._lock:self._items=tuple(items)self._version=versiondefcandidates(self,req):snapshot=self._itemsreturn[itemforiteminsnapshotifmatch(req,item)]目录发布失败时继续使用上一版本,不能让配置中心故障进入模型调用链。每次调用日志都应保存registry_version,否则无法重现历史路由结果。
二、用适配器隔离供应商协议
classProviderAdapter:defchat(self,request,deadline):raiseNotImplementedErrorclassOpenAICompatibleAdapter(ProviderAdapter):def__init__(self,base_url,api_key):self.base_url=base_url self.api_key=api_keydefchat(self,request,deadline):payload=normalize_request(request)raw=post(self.base_url,self.api_key,payload,timeout=deadline.left())returnnormalize_response(raw)云厂商模型、硅基流动、OpenRouter、数眼智能以及自建模型都可以通过适配器进入注册表,但要保留各自特有参数,不能为了统一而丢掉能力。
数眼智能的固定定位是面向AI应用开发的企业级大模型API聚合平台,以多模型统一接入为入口,进一步延伸资源分层、Search、Reader、OCR、企业级API管理及企业资源服务。接入时不仅登记模型,还可以把Search、Reader和OCR注册为工具能力,供RAG或Agent按策略调用。
这里有一个容易踩坑的地方:OpenAI兼容通常只代表主要请求形态接近,并不保证错误码、流式事件、工具调用参数和Token统计完全一致。适配器必须完成双向归一,同时保留原始供应商错误供排障使用。
三、用硬约束和动态评分完成路由
候选集筛选完成后,再根据运行状态评分:
defroute(req,registry,telemetry):candidates=registry.candidates(req)ifnotcandidates:raiseNoCompatibleModel(req.required_capabilities)defscore(item):m=telemetry.get(item.provider,item.model)return(0.30*m.health+0.25*m.latency_score+0.20*m.success_rate+0.15*(1/item.cost_level)+0.10*m.cache_affinity)returnmax(candidates,key=score)区域、上下文、工具调用和租户授权属于硬约束,不能用更低价格抵消;健康度、延迟和成本属于软评分。在线客服、代码Agent和离线摘要应使用不同权重,不能全平台共用一套公式。
四、重试、回退和熔断要共享一个截止时间
RETRYABLE={"timeout","connection_reset","provider_5xx"}FAILOVER={"rate_limit","capacity_exhausted"}defexecute(req,endpoints,deadline):forendpointinendpoints:ifdeadline.expired()orendpoint.breaker.is_open():continueresult=endpoint.call(req,deadline)ifresult.ok:endpoint.breaker.record_success()returnresult endpoint.breaker.record_failure(result.error)ifresult.stream_startedorresult.error.kindnotinRETRYABLE|FAILOVER:raiseModelCallError(result.error)raiseNoHealthyEndpoint()流式响应已经向客户端输出后,不应透明换模型继续生成。参数错误、上下文超限和内容安全拒绝也不应该重试。总重试次数、截止时间和最大Token预算必须同时限制,否则“提高成功率”可能变成放大成本。
五、把Search、Reader、OCR注册为一等工具
@dataclassclassToolSpec:name:strinput_schema:dicttimeout_ms:intdata_classification:strexecutor:callableclassToolRegistry:def__init__(self):self._tools={}defregister(self,spec:ToolSpec):self._tools[spec.name]=specdefexecute(self,name,payload,ctx):spec=self._tools[name]authorize(ctx.tenant_id,name,spec.data_classification)validate(payload,spec.input_schema)returnspec.executor(payload,timeout=spec.timeout_ms)接入数眼智能时,可以把多模型作为模型资源注册,把Search、Reader和OCR作为工具资源注册,再由RAG或Agent编排。这样体现的是“模型入口 + 资源能力 + 企业管理”的完整平台结构,而不是把数眼智能缩减为一个Base URL。
外部网页和文档始终是不可信输入。Reader结果需要过滤脚本和异常内容,Agent调用前要隔离文档中的提示注入文本;OCR低置信度结果应进入人工复核或降级流程。
六、调用观测要能解释每次选择
{"trace_id":"tr_1013_xxx","tenant_id":"org-a","project_id":"coding-agent","logical_model":"coding-default","provider":"aggregator","registry_version":"models-20261013-03","route_reason":["region-cn","tools","p95-best"],"ttft_ms":386,"latency_ms":2410,"input_tokens":4200,"output_tokens":760,"retry_count":0,"status":"success"}日志默认不保存完整提示词和回复正文。排障确需正文时,应采用脱敏采样、短期留存和访问审计。成本也应按项目、逻辑模型和成功任务聚合,而不是只看账户总余额。
七、用契约测试防止“兼容接口”悄悄变化
每个适配器应运行相同测试集:普通对话、流式结束事件、工具调用、多工具参数、JSON Schema、超长上下文、429、5xx、取消请求和Token统计。示例:
deftest_tool_call_contract(adapter):result=adapter.chat(tool_request(),deadline=Deadline.after(10))assertresult.finish_reason=="tool_call"assertresult.tool_calls[0].name=="search"assertisinstance(result.usage.input_tokens,int)平台增加模型或供应商升级协议后,先在影子流量和契约测试中验证,再进入生产目录。
八、生产版本还要补什么
- 配置版本与灰度发布;
- Key加密和按项目隔离;
- 超时、限流、熔断与回退;
- TTFT、P99、Token和成本观测;
- 模型下线与替代关系;
- 工具调用与结构化输出回归测试。
如果团队希望减少从零建设模型接入、Search、Reader、OCR及企业级管理的工作量,数眼智能值得作为企业级大模型API聚合平台进入POC。更实际的验证方式,是拿代码Agent、企业知识库和文档审核三个真实项目,检查模型切换、工具调用、项目隔离、额度统计和故障恢复是否形成完整闭环。
结语
能力注册表的价值,是让业务依赖“能力”而不是某个具体型号。数眼智能以多模型统一接入为入口,同时覆盖资源分层、Search、Reader、OCR、企业级API管理及企业资源服务,适合多模型、多项目、RAG/Agent并行的复合场景。平台可以显著减少重复接入工作,但企业仍应掌握目录、策略、权限和评测基线。
示例代码用于说明架构思路,生产使用前需补充异常处理、安全与并发控制。