把 myflicker 接到 CLIProxyAPI
Posted on from Haidian, BeijingCLIProxyAPI 擅长把 Claude Code、Codex 这类订阅收成标准 HTTP。我想做的是补另一头:让公司的 myflicker(万擎)也成为它的 upstream。
配置文件里填个 base URL?不行。myflicker 不提供本地 /v1。请求真正打到 Takumi 的几条网关,而且还要带机器绑定的签名。我一开始路径写错,拿到一串 404;后来才发现签名其实已经过了,只是 URL 对不上。
抓真实请求
源码里能抠出签名逻辑,但路径和模型名仍容易猜偏。更省事的是让 CLI 自己发请求,用 Node hook 住 fetch / https.request,只记录发往 takumi.corp.kuaishou.com 的流量。
myflicker call models.test --model=wanqing/... 比完整 agent 会话干净。抓完以后,路由大致是:
- Claude / GLM / Kimi →
POST /rest/wanqing/api/gateway/v1/messages - GPT-5.6 的 sol / luna / terra →
POST .../gateway/v1/responses?api-version=v1(这个口基本要求stream: true) - DeepSeek 等 ep 模型 →
POST .../gateway/v1/endpoints/chat/completions
另外几个细节:x-takumi-username 是小写;body 里的 model 要用 epModelName(例如 claude-4.6-sonnet-ep、GPT-5.6-Sol);版本号也要跟当前 CLI 一致。
本地 OpenAI 垫层
我写了个很小的 Node 代理,默认听 :13456。外面是 OpenAI chat/completions,里面按上面三种格式转发,鉴权头按真实 CLI 流量补齐。Ed25519 还是用本机 ~/.myflicker/cli-sig.json 解出的私钥,payload 是 timestamp 加上 tools 数量。
没积分时,官方 CLI 和这个代理会一起 402。这反而好排查:路通了,只是账上没钱。充完以后,ds-pro、kimi-k3、sol、opus 都能正常返回。
GPT 那条有过一次教训:非流式 JSON 打 responses 口,会报 The model does not support v1/responses。代理里对这类模型强制上游流式,再把 SSE 收成一次 chat.completion。
Anthropic 口这边,代理默认上游非流式,再在本地拼成 OpenAI SSE。Claude Code / CLIProxyAPI 一直在等 event-stream;如果直接回整包 JSON,CPA 会变成 502,看起来像代理坏了。
tool 历史也要按 Anthropic 形状转:tool_calls 变成 tool_use,role: tool 变成带 tool_result 的 user 消息。早先我把 tool 结果当成普通 user 文本塞回去,网关也不吃。
挂到 CLIProxyAPI
本机本来就有 claudex 用的 CPA,占着 :8317。万擎另开一份配置听 :8318,openai-compatibility 指到 http://127.0.0.1:13456/v1。别名按自己习惯写:opus、sonnet、sol、kimi-k3。
客户端 key 我不想记,就把 api-keys 留空。CPA 的规则是列表为空则开放访问;服务只绑 127.0.0.1,可以接受。
早先的 402 还会把凭证打进冷却,后面全变成 auth_unavailable。配置加了 disable-cooling: true,并重启过服务。
claudem
HTTP 通了之后,还差一个跟 claudex 对称的入口。claudem 很薄:确认 launchd 里的 takumi-proxy 和 CPA 还活着,设 ANTHROPIC_BASE_URL=http://127.0.0.1:8318,然后 exec Claude Code。仓库在 Micuks/claudem(private)。
选模型:
列表默认读 ~/.myflicker/cli-model-list-cache.json。超过 TTL(默认 6 小时)就带着本机 token 去刷 /rest/codeflicker/model/list,再写回缓存。默认值落在 ~/.config/claudem/config。
Claude Code 的 403
小请求好好的,一进真实 Claude Code 会话就变成 403 非法请求来源。界面还会让你 /login。跟 Anthropic 登录无关,是万擎网关在拦。
我复现到的硬条件有两条:
- system 里出现
You are Claude Code...。改成普通 coding agent 表述就过。 - 工具名正好叫
Edit或Read。改成FileEdit/FileRead发出去,回程再映回原名,Claude Code 无感。
代理里现在默认做这两件事。更新 takumi-proxy.js 后记得 launchctl kickstart 一下对应的 LaunchAgent。
边界
这套东西绑着你的 myflicker 登录态和当前主机名。cli-sig.json 换机器基本搬不走。公司网关、积分、合规都还在,别把它当公共 API。
对我自己,问题更窄:Claude Code 想用万擎时,不必再开另一套平行流程。