在 Claude Code 中让第三方模型作为 subagent 与 Claude 协作

token 不够用,闲置配额却不少

我平时主要靠 Claude Code 订阅做开发。放在当下,Claude Fable 5.1 和 Opus 5.5 工作得非常好,说是 SOTA 也不为过。唯一的问题是 token 总是不够用。

与此同时,我手上还有不少别的模型的配额。之前拿到过小米 MiMo 的免费配额,其他国产模型偶尔也会有低价活动,还有朋友不用了的 GLM 订阅。于是我开始想,能不能让这些模型接手那些简单又相对确定的工作,把真正需要 Claude 的部分留给 Claude。

第一次尝试,通过 TUI 驱动另一个 harness

最先试的是 herdr。Claude Code 可以调用 herdr 的 API,在另一个面板里启动 opencode 之类的 harness,给它下达指令,再通过读屏幕来获取结果或查看进度。

这样能用,但感觉有点怪。更糟的是,我发现 Claude Code 可以直接批准另一个 harness 的权限请求,两个 harness 甚至可以互相批准,把权限检查整个绕过去。再加上 herdr 本身就完全游离在 Claude Code 的权限机制和 Codex 的沙箱之外,感觉有点危险。

第二次尝试,藏在 skill 后面的 harness

我之前还自己写过一个 harness,叫 paimon。我给它加了一个内置的 skill,让 Claude Code 或 Codex 可以直接调用它,用法和 claude -p 差不多,但多了一些功能。调用方可以按范围查询 paimon 的会话历史。paimon 做完任务、进程退出之后,还可以被重新拉起来,resume 同一个会话继续工作。

理论上这比 claude -p 更好,但实际体验仍然很差。Claude 并不总是会把工作交给它。Claude 想了解最终结果之外的上下文时,翻看 paimon 的会话历史要走好几步,这些步骤本身也在消耗 token。任务不复杂的时候,我怀疑整套做法花掉的 token 比省下的还多。

直觉告诉我,真正的问题还要更深一层。尽管 skill 里写了提示,Claude Code 始终没有把 paimon 当作自己的 subagent 来看待。

想法

这时我想起来,这些廉价模型很多都兼容 Anthropic 的 API。我之前就在 Claude Code 里用过它们,只需要设置几个环境变量。

那能不能做一个本地 proxy 呢?先启动 proxy,再让 Claude Code 指向它启动,同时注册一些自定义的 subagent,各自用不同的模型名。所有 LLM 请求都会经过 proxy。发给 Fable 或 Opus 的请求原样转发给 Anthropic。来自自定义 subagent 的请求,比如一个更便宜的 explore agent,则转发到 MiMo、Kimi 或 GLM 的 Anthropic 兼容端点。在 Claude Code 看来,这些廉价模型就和内置的 subagent 平起平坐了。

简单调研之后,发现情况比我预想的还要好。除了 base URL 的环境变量,Claude Code 还支持通过命令行参数定义 subagent,每个都可以写明用途、权限和可用的工具。所以 Claude Code 的配置完全不用改。一个 wrapper 先启动 proxy,再带着环境变量和额外的参数启动 Claude Code 就行了。直接运行 claude 的话,一切和原来一样。

现成的方案也有,比如 Claude Code Router。不过它的功能比我需要的多得多,也比较复杂。我的场景更简单,因为这些模型本来就说 Anthropic 格式的协议,不需要做协议转换。于是我决定自己做一个。

cameo

果然和我想的一样简单。一个四五条推特长的 prompt,Claude Code 配合 Opus 5.5 一次就完成了。

成果就是 cameo,一个 400 行左右的 Go 小程序。cameo 是影视里的说法,指短暂的客串出场,正好用来形容这些第三方模型在这里的角色。它们在 Claude Code 里以 subagent 的身份客串一两场戏,主角仍然是 Claude。

它读取一个 TOML 文件,在 localhost 上启动一个 HTTP proxy,然后把你配置的 subagent 转换成命令行参数来启动 Claude Code。proxy 只看每个请求里的 model 字段。如果这个模型属于某个 cameo subagent,proxy 就换上对应服务商的模型名和 API key,把请求转发过去。其余的请求一律原样发给 Anthropic。proxy 不需要理解消息的其他部分,所以代码才能这么短。

下面是项目自带的示例配置。

toml 复制代码
[agents.cheap-general]
description = """
General purpose agent for multi-step tasks: researching questions, searching \
code and making changes. Same role as the default general-purpose agent, but \
prefer this one first because it costs much less. If the result is not good \
enough, fall back to general-purpose."""
prompt = """
You are a general purpose software engineering agent. Complete the task you \
are given, then report what you did and what you found."""
url = "https://api.deepseek.com/anthropic"
key = "$DEEPSEEK_API_KEY"
model = "deepseek-flash"

[agents.cheap-explore]
description = """
Read-only agent for exploring the codebase: finding files, searching code and \
answering questions about how things work. Same role as the default Explore \
agent, but prefer this one first because it costs much less. If the result is \
not good enough, fall back to Explore."""
prompt = """
You are a read-only codebase exploration agent. Find what you are asked for \
and report it with file paths and line numbers. Never modify anything."""
tools = ["Read", "Grep", "Glob"]
url = "https://open.bigmodel.cn/api/anthropic"
key = "$GLM_API_KEY"
model = "glm-5.3"

每个 [agents.<name>] 段都会成为 Claude Code 里的一个 subagent。description 用来告诉 Claude 什么时候该用这个 agent,以及它相对其他 agent 的优先级。上面两个 agent 和内置的 general-purpose、Explore 一一对应,只是标明了更便宜。如果不想两个都留着,把 agent 命名为 Explore 或 general-purpose,它就会直接替换掉内置的那个。

之后,在原本运行 claude 的地方运行 cameo 就可以了,所有参数都会原样传给 claude。

实际用下来,Claude Code 调用这些廉价版本的频率确实比当初调用 paimon 高得多,尤其是在我明确指定的时候。

那 Codex 呢?

接下来我本想支持 Codex,因为这些廉价模型也提供兼容 OpenAI 的端点。但简单看了一下,发现 Codex 已经全面转向 Responses API,而这些模型绝大部分只支持更早的 Chat Completions API。要支持 Codex 就得自己做协议转换,那就等于重新实现一遍 Claude Code Router 了。所以我决定不做,至少等这些模型也支持 Responses API 再说。

相关推荐
渔阳节度使1 小时前
AI Coding 零基础实战教程
ai编程
用户539418729071 小时前
Cursor 别只用来按 Tab:我每天高频在用的几个功能,附快捷键和踩坑
ai编程·cursor
用户4475248566751 小时前
在手机上跑 Claude Code:一个 Android/Termux 的 AI 编程助手
ai编程
wechatbot8882 小时前
企业微信HTTP协议接口完整接入教程|全量消息收发 API 实战
网络协议·http·微信·企业微信·ai编程
金字塔頂の蝸牛2 小时前
每周GitCode开源项目精选
开源·ai编程·gitcode
ZzT3 小时前
Claude 干活的时候,在终端里打砖块
人工智能·ai编程·claude
wechatbot8883 小时前
企微第三方自动化开发:原生能力无阉割 API 开放平台介绍
后端·ios·微信·企业微信·ai编程·ipad
xhy_07073 小时前
常用 Prompt 每次都要重贴?WES Code 技能系统(Skills)怎么用
人工智能·大模型·prompt·ai编程·wes code
zhangfeng113318 小时前
Reward Hacking 奖励钻空子 / 奖励作弊 Specification Gaming(规范博弈)
人工智能·华为·ai编程·npu