我昨天花了半小时给一个叫Hermes的Agent项目接入了第三个模型网关供应商。朋友翻我的提交记录时满脸疑惑:“就这点代码真的能用?”我告诉他,这份插件连一个子类都没写,也没处理半分钱流式数据包。它就这么安静地注册了一下,Hermes就把新供应商当成了自家的一等公民。背后是Hermes Agent团队设计的一套“不做题”SDK:如果你要接入的服务已经能说OpenAI的“行话”,那整个接入流程可以被压缩成二十多行声明。

传统的“给一个AI框架接入新模型供应商”教程,往往是一本子类化英雄故事。你需要继承一个基础类,重写至少三个方法,对照两家云厂商的原始对接文档,自己写出适配层,还要挨个处理毫秒级推送的数据片段——也就是所谓的“流式块”。最后还得把这一坨代码挂到某个设置页面里。等终于上线,你早已忘记当初想做的不过是让Agent调用另一个后台模型。Hermes的provider-plugin SDK摆明了拒绝这套剧本。它把整个过程压扁成一个声明式数据类,外加一次注册调用。用作者的话说,“如果目标服务已经支持OpenAI Chat Completions的线上格式,你二十六行就能搞定。”

打开网易新闻 查看精彩图片

这套打法的示范是一位开发者发布的omnizen-provider插件。它表面是帮Hermes对接一个叫Omnizen的网关,但作者特意强调,你大可以忽略Omnizen这个名字——所有的OpenAI兼容网关都共享同一套形状。无论是云上的Together、Groq、Fireworks,还是你用vLLM自建的推理服务,甚至是公司内部自己撸的路由中间件,替换一下插件里的URL就完事。之所以拿Omnizen举例,纯粹因为它的地址是唯一需要交换的变量,放在教程里一目了然。

一个Hermes供应商插件住在`plugins/model-providers/<你的名字>/`目录底下,只携带两个文件。一个叫`plugin.yaml`,是一份短得可怜的清单,让Hermes知道这里有新成员,顺便标上版本号。另一个是`__init__.py`,负责两件事:实例化一个`ProviderProfile`对象,接着对它调用`register_provider()`函数。没有适配器类要继承,没有`chat-completions`方法要实现,也不用编写任何流式块处理器。`ProviderProfile`本身是声明式的——你只描述这个供应商“是谁”,Hermes已有的、经过验证的OpenAI兼容调用通路会接手所有脏活。文档里提到的那些必填字段是什么?原文没卖关子,大概就是一些基础身份信息外加一个请求要扔过去的地址。填齐这些字段,供应商就活了过来。

我用Omnizen插件为例拆解那份`__init__.py`。代码里没有省略号,也没有“此处请自行脑补”的注释。你定义一个`ProviderProfile`实例,把供应商的名字、API基础URL,以及一些元数据塞进去,然后调用`register_provider()`。旁边那个`plugin.yaml`更是不超过十行,版本、作者、简述一填就能用。两份文件加起来,真的没超过二十六行。作者把这份代码公开在了Hermes-Omnizen仓库里,有兴趣的话可以直接跑去验证行数。

启动时的小动作很有条理。Hermes启动,只需执行一次插件的`__init__.py`。`register_provider(omnizen)`这句调用把整个`ProviderProfile`往内存注册表里一丢。从Hermes的角度看,这个供应商此刻正式存在,再无其他前置条件。随后用户敲下`hermes model`,从菜单里挑出刚刚装好的供应商,Hermes就记下这个选择。当用户运行`hermes chat`,或者触发一个工具,再或者通过Agent通信协议跳转到另一个智能体时,Hermes会默默拼装出一个标准的OpenAI Chat Completions请求,从环境变量里捞出`OMNIZEN_API_KEY`,然后把请求往`base_url`一扔。上游网关用OpenAI规范的SSE信封回复,Hermes自带的解析器照常解析流与工具调用帧。这一整条链路里,没有任何一行代码分得清自己对话的对象是Omnizen还是OpenAI原厂——因为线上格式完全一样,同一条通路无差别服务两边。

这件事的底层逻辑是,OpenAI Chat Completions API正迅速成为模型供应的通用在线语言。不管你背后接的是哪家模型,只要对话终端说的都是这套格式,框架就不需要为每个新供应商重复造轮子。Hermes把这个现实用到了极致:既然标准已经有了,框架就把所有说标准语言的供应商统一成“可插拔的配置项”,而不是需要逐个硬编码的特例。你相当于只需要填个名片,剩下的收发信件全部交给邮差。

对比之下,过去的方式像是在给每个新邮差重新发明一套信封。子类化、重写方法、手工处理流式块,这些都让添加一个模型供应商变成一项工程任务。而Hermes现在的方案把工程任务退化成数据配置。这背后的哲学大概是:“别再去写那些迟早要出bug的胶水代码,让已有的成熟通路替你干活。”对开发者来说,这不仅是省下敲键盘的时间,更是省下调试流解析、担心内存泄漏的脑细胞。毕竟,你已经忘了当初接入新供应商是为干什么,而Hermes让你在还没忘之前就把活干完了。