← Index

把 myflicker 接到 CLIProxyAPI

CLIProxyAPI 擅长把 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-epGPT-5.6-Sol);版本号也要跟当前 CLI 一致。

本地 OpenAI 垫层

我写了个很小的 Node 代理,默认听 :13456。外面是 OpenAI chat/completions,里面按上面三种格式转发,鉴权头按真实 CLI 流量补齐。Ed25519 还是用本机 ~/.myflicker/cli-sig.json 解出的私钥,payload 是 timestamp 加上 tools 数量。

没积分时,官方 CLI 和这个代理会一起 402。这反而好排查:路通了,只是账上没钱。充完以后,ds-prokimi-k3solopus 都能正常返回。

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_userole: tool 变成带 tool_result 的 user 消息。早先我把 tool 结果当成普通 user 文本塞回去,网关也不吃。

挂到 CLIProxyAPI

本机本来就有 claudex 用的 CPA,占着 :8317。万擎另开一份配置听 :8318openai-compatibility 指到 http://127.0.0.1:13456/v1。别名按自己习惯写:opussonnetsolkimi-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)。

选模型:

claudem --model          # 读万擎列表,选完写成默认
claudem --model sol      # 只影响这一次
export CLAUDEM_MODEL=terra

列表默认读 ~/.myflicker/cli-model-list-cache.json。超过 TTL(默认 6 小时)就带着本机 token 去刷 /rest/codeflicker/model/list,再写回缓存。默认值落在 ~/.config/claudem/config

Claude Code 的 403

小请求好好的,一进真实 Claude Code 会话就变成 403 非法请求来源。界面还会让你 /login。跟 Anthropic 登录无关,是万擎网关在拦。

我复现到的硬条件有两条:

  1. system 里出现 You are Claude Code...。改成普通 coding agent 表述就过。
  2. 工具名正好叫 EditRead。改成 FileEdit / FileRead 发出去,回程再映回原名,Claude Code 无感。

代理里现在默认做这两件事。更新 takumi-proxy.js 后记得 launchctl kickstart 一下对应的 LaunchAgent。

边界

这套东西绑着你的 myflicker 登录态和当前主机名。cli-sig.json 换机器基本搬不走。公司网关、积分、合规都还在,别把它当公共 API。

对我自己,问题更窄:Claude Code 想用万擎时,不必再开另一套平行流程。