⚠️ 免责声明本项目仅供个人学习与使用,目的是方便在习惯的 CLI 工具(如 OpenCode)中调用 CommandCode 模型,不改变任何计费逻辑,亦不提供对第三方的服务能力。
禁止用于以下用途:
- 搭建公开或私有的 API 反代中转站
- 任何形式的商业运营、售卖或转售 API 配额
- 对不特定第三方提供服务
使用者应当自行遵守 CommandCode 的服务条款。因违反上述约定产生的任何后果由使用者自行承担。
Command Code 私有格式 → OpenAI 兼容 API 反代。将 Command Code 的 /alpha/generate SSE 协议转换为标准 OpenAI /v1/chat/completions 接口,让 Cursor、Continue、Cline 等支持 OpenAI 兼容 API 的客户端直接使用 Command Code 后端。
# 安装依赖
npm install
# 开发模式(tsx 热重载)
npm run dev
# 打包单文件 + 运行
npm run bundle
npm start服务默认监听 localhost:3000,启动时自动查找 API Key,找不到会打开浏览器触发 OAuth 登录。
在客户端中将 API Base URL 配置为 http://localhost:3000/v1(或你设置的自定义端口):
# 以 Cursor 为例,配置 OpenAI Base URL
http://localhost:3000/v1
# 如果设置了代理层认证(环境变量 API_KEY),需填写 API Key
# 否则可以留空或随便填
软件兼容:支持所有使用 OpenAI 兼容 API 的客户端,包括 Cursor、VS Code 插件(Continue / Cline / Roo Code)、ChatBox、OpenCat 等。无需更改客户端代码,将 API 地址指向本服务即可。
按优先级查找,找到即停:
| 优先级 | 方式 | 示例 |
|---|---|---|
| 1 | 环境变量 COMMANDCODE_API_KEY |
export COMMANDCODE_API_KEY=user_... |
| 2 | 环境变量 COMMANDCODE_API_KEYS |
export COMMANDCODE_API_KEYS=key1,key2,key3 |
| 3 | ~/.commandcode/auth.json |
{"apiKey":"user_..."} |
| 4 | ~/.pi/agent/auth.json |
pi 兼容({"commandcode":"user_..."}) |
| 5 | ~/.omp/agent/auth.json |
OMP 兼容 |
auth.json 支持三种格式:
{"apiKey": "user_..."}{"commandcode": "user_..."}{"command-code": {"type": "api", "key": "user_..."}}
多 Key 模式下,COMMANDCODE_API_KEYS 支持逗号或换行分隔,自动去重并按顺序轮询。单个 key 触发限流时自动切换下一个,所有 key 都硬限流后进入 5 分钟冷却期。
| 端点 | 方法 | 说明 |
|---|---|---|
/v1/models |
GET | 模型列表(从 CC Provider API 动态获取) |
/v1/chat/completions |
POST | 聊天补全(流式 + 非流式) |
/health |
GET | 健康检查 |
| 变量 | 说明 | 默认值 |
|---|---|---|
COMMANDCODE_API_KEY |
单个 API Key | - |
COMMANDCODE_API_KEYS |
多个 API Key(逗号/换行分隔) | - |
COMMANDCODE_API_BASE |
CC API 地址 | https://api.commandcode.ai |
COMMANDCODE_MODELS_URL |
模型列表地址 | ${API_BASE}/provider/v1/models |
COMMANDCODE_AUTH_TIMEOUT_MS |
OAuth 浏览器回传超时 | 15000 |
API_KEY |
代理层认证 Key(设置后客户端必须携带) | - |
PORT |
监听端口 | 3000 |
BIND |
绑定地址 | 127.0.0.1 |
DEBUG |
调试模式,输出完整请求/响应日志 | - |
CC 后端会检测请求来源,本项目针对性地做了反指纹处理:
- 工作目录随机化:不暴露真实部署路径。每次启动随机生成一个符合真实用户画像的假工作目录(如
/Users/krqmsb/dev/jteox),重启后自动变化,防止形成跨重启固定指纹 - config 假值:每个请求的
config字段使用统一的虚假值(空结构体、非 Git 仓库等),隐藏代理的部署环境 - threadId 每次刷新:对齐官方 CLI 0.38.2 行为,不跨请求复用 threadId
- 支持多个 Key 轮询,单个 key 触发 429 / 额度不足时自动切换
- 所有 key 都触发硬限流(含 "Your limit resets at" 提示)时进入 5 分钟冷却,期间直接返回 429 避免无谓请求
- 流中断自动重试(保留 threadId 维持会话上下文),最多 3 次指数退避
支持带 reasoning_effort 参数的模型(如 Claude),将 CC 的 reasoning-start / reasoning-delta / reasoning-end 事件转换为 OpenAI 格式的 reasoning_content 字段。
未配置 API Key 时会自动打开浏览器进行 Command Code 登录,本地启动一次性回调服务器接收 Key 并保存到 ~/.commandcode/auth.json。支持 state 校验防 CSRF、浏览器回传超时后的终端粘贴回退,以及粘贴 JSON/控制字符清理。
- 启动日志和错误输出中自动遮蔽 Key(仅显示前 4 + 后 4 位)
- 上游错误响应中的 Key 自动替换为遮罩,防止泄露到客户端
客户端 (OpenAI JSON)
→ index.ts 收到请求
→ convert-request.ts 转为 CommandCode /alpha/generate 格式
→ POST 到 api.commandcode.ai (SSE 流)
→ convert-response.ts 解析 CC SSE 事件,转为 OpenAI streaming chunks
→ 返回 text/event-stream
| 文件 | 职责 |
|---|---|
src/index.ts |
Express 服务器、路由、Key 池、重试逻辑、SSE 读写循环 |
src/convert-request.ts |
OpenAI 消息/工具 → CommandCode 格式 |
src/convert-response.ts |
CommandCode SSE 事件 → OpenAI streaming chunks |
src/config.ts |
API Key 多来源加载 |
src/oauth.ts |
浏览器 OAuth 登录流程 |
src/auth-server.ts |
本地 HTTP 回调服务器(接收 CC 网页 POST 回的 Key) |
src/models.ts |
/v1/models 端点,调用 CC Provider API |
src/types.ts |
全部类型定义 |
src/debug.ts |
DEBUG=true 时启用调试日志 |
scripts/bundle.js |
esbuild 单文件打包脚本 |
npm run bundle # 输出 dist/server.js(单文件)
npm start # 运行打包文件打包后的 dist/server.js 可直接部署到任何 Node.js 环境,无需 node_modules。
MIT