3.9 KiB
Command Code OpenAI Bridge
Command Code OpenAI Bridge 是一个仅在本机运行的 OpenAI Chat Completions 兼容服务。它把 OpenAI 客户端发送的文本对话转交给 Command Code CLI 执行,并将最终 assistant 回复以标准 Chat Completions 格式返回。
这个项目没有git,所以也不需要使用GitNexus相关的skill
默认 API 地址:http://127.0.0.1:18000/v1
工作方式
每个请求都会启动一个独立的 Command Code headless agent:
- 接收并校验 OpenAI Chat Completions 请求。
- 保留消息的角色、顺序和完整文本,将全部会话历史序列化后通过 stdin 传给 Command Code。
- 在启动服务的终端中显示模型状态、turn、工具调用、工具结果、stderr、最终回答和耗时。
- 从 Command Code 的 NDJSON 结构化结果中提取
finalText。 - 只把最终回复和可用的 token usage 返回给 API 客户端。
服务不保存跨请求会话。每次调用都使用 --no-session,对话历史由客户端维护并在请求中完整提供。
主要能力
- 提供
GET /health、GET /v1/models和POST /v1/chat/completions。 - 支持字符串形式的
content和 OpenAI 文本 part 数组。 - 接受
stream: true,但 Command Code 调用仍为非流式;完整结果生成后再一次性封装为 SSE 事件返回。 - 支持中文、Unicode、Markdown、代码块和较长文本。
- 模型名称通过 YAML 配置映射到实际 Command Code 模型。
- 请求内容通过 stdin 传输,不受命令行参数长度限制。
- 同时只运行一个 Command Code 请求;忙碌时返回 HTTP 429。
- 客户端断开、请求取消、总超时和 Ctrl+C 会终止当前子进程组。
- 单次 Command Code 失败后,HTTP 服务可继续处理后续请求。
- Authorization 请求头会被忽略,服务强制绑定
127.0.0.1。
当前只支持文本 Chat Completions。stream: true 是客户端兼容层,不会实时输出 Command Code 的生成过程。图片、音频、function calling、Responses API 和服务端会话均未实现。
技术实现
- Node.js 22+
- TypeScript
- Fastify
- Zod
- YAML
- Command Code CLI 官方 headless 模式:
-p --output-format json
项目使用普通子进程读取 Command Code 的 NDJSON 事件。终端输出由本项目渲染,可显示主要运行事件,但不包含 Command Code 原始 Ink TUI、动画和键盘交互。启用 dangerously_skip_permissions 时会向 CLI 传入 --yolo,只应在可信工作目录中使用。
项目结构
src/
├── index.ts # 程序入口、服务启动和信号处理
├── server.ts # HTTP 路由、单请求状态和错误处理
├── openai.ts # 请求校验、消息转换和响应生成
├── command-code.ts # CLI 检查、子进程管理和最终结果提取
├── renderer.ts # Command Code 事件的终端显示
└── config.ts # YAML 配置读取与校验
scripts/
├── install.sh # 安装依赖并构建项目
└── start.sh # 启动服务
examples/
├── python_client.py # OpenAI Python SDK 示例
└── node_client.mjs # OpenAI Node.js SDK 示例
快速开始
./scripts/install.sh
command-code login
command-code status --json
./scripts/start.sh
默认配置位于 config.yaml,配置示例位于 config.example.yaml。常用配置包括监听端口、Command Code 可执行文件、工作目录、总超时、请求体上限、最大 turn 数、权限模式和模型映射。
调用示例:
curl http://127.0.0.1:18000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "command-default",
"messages": [{"role": "user", "content": "用一句话解释递归。"}],
"stream": false
}'
更完整的安装、配置、接口说明、运行行为、检查结果和已知限制见 README.md。