139 lines
7.6 KiB
Markdown
139 lines
7.6 KiB
Markdown
# Command Code OpenAI Bridge
|
||
|
||
Command Code OpenAI Bridge 是一个仅在本机运行的 OpenAI 兼容服务。它把 Chat Completions/Responses 文本、受限图片与纯文本文件输入及 function calling 决策转交给 Command Code CLI 执行。
|
||
|
||
默认 API 地址:`http://127.0.0.1:18000/v1`
|
||
|
||
## 工作方式
|
||
|
||
每个请求都会启动一个独立的 Command Code headless agent:
|
||
|
||
1. 接收并校验 OpenAI Chat Completions 请求。
|
||
2. 保留消息的角色、顺序和完整文本,将会话历史通过 stdin 传给 Command Code;附件经校验后写入请求专用临时文件并以 `@path` 交给真实 `read_file`。
|
||
3. 在启动服务的终端中显示模型状态、turn、工具调用、工具结果、stderr、最终回答和耗时。
|
||
4. 从 Command Code 的 NDJSON 结构化结果中提取 `finalText`。
|
||
5. 把最终回复、外部 function tool calls 和可用的 token usage 返回给 API 客户端。
|
||
|
||
服务不保存跨请求会话。每次调用都使用 `--no-session`,对话历史由客户端维护并在请求中完整提供。
|
||
|
||
## 主要能力
|
||
|
||
- 提供 `GET /health`、`GET /v1/models` 和 `POST /v1/chat/completions`。
|
||
- 支持字符串形式的 `content` 和 OpenAI 文本 part 数组。
|
||
- Chat 支持图片 data URL;Responses 还支持 UTF-8 `input_file.file_data`。远程 URL、本地路径、PDF 和其他二进制拒绝。
|
||
- Chat Completions 支持标准 function tools、工具选择、assistant tool calls 和 tool 结果消息;工具由客户端执行。
|
||
- 接受 `stream: true`;普通 Chat 实时转发文本 delta,function calling 在完整决策校验后发送工具调用 SSE。
|
||
- 支持中文、Unicode、Markdown、代码块和较长文本。
|
||
- 模型名称通过 YAML 配置映射到实际 Command Code 模型。
|
||
- 请求内容通过 stdin 传输,不受命令行参数长度限制。
|
||
- 可配置同时运行的 Command Code 请求数;其余请求进入共享的有限 FIFO 队列,队列已满时返回 HTTP 429。
|
||
- 客户端断开、请求取消、总超时和 Ctrl+C 会终止当前子进程组。
|
||
- 单次 Command Code 失败后,HTTP 服务可继续处理后续请求。
|
||
- Authorization 请求头会被忽略,服务强制绑定 `127.0.0.1`。
|
||
|
||
普通 Chat SSE 实时转发 Command Code 文本 delta;function calling 会等待完整决策通过 JSON 与参数 Schema 校验后发送 `tool_calls`。图片只接受 PNG/JPEG/GIF/WebP base64 data URL,并要求模型映射显式声明 `supports_image_input: true`。文件只接受 Responses UTF-8 `file_data`。音频、视频、PDF/Office、任意二进制、Computer Use、托管工具和服务端 Chat 会话均未实现。
|
||
|
||
## 技术实现
|
||
|
||
- 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`,只应在可信工作目录中使用。
|
||
|
||
## 项目结构
|
||
|
||
```text
|
||
src/
|
||
├── index.ts # 程序入口、服务启动和信号处理
|
||
├── server.ts # HTTP 路由、共享并发协调和错误处理
|
||
├── openai.ts # 请求校验、消息转换和响应生成
|
||
├── attachments.ts # data URL/base64 校验、临时文件和清理
|
||
├── command-code.ts # CLI 检查、子进程管理和最终结果提取
|
||
├── tool-calling.ts # 外部 function calling 决策解析与参数校验
|
||
├── 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 示例
|
||
└── opencode.json # OpenCode provider 与模型模态示例
|
||
```
|
||
|
||
## 快速开始
|
||
|
||
```bash
|
||
./scripts/install.sh
|
||
command-code login
|
||
command-code status --json
|
||
./scripts/start.sh
|
||
```
|
||
|
||
默认配置位于 `config.yaml`,配置示例位于 `config.example.yaml`。常用配置包括监听端口、Command Code 可执行文件、工作目录、总超时、请求体上限、等待队列上限、最大 turn 数、权限模式和模型映射。
|
||
|
||
调用示例:
|
||
|
||
```bash
|
||
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`。
|
||
|
||
<!-- gitnexus:start -->
|
||
# GitNexus — Code Intelligence
|
||
|
||
This project is indexed by GitNexus as **command-code-openai-bridge** (461 symbols, 1291 relationships, 29 execution flows). Use the GitNexus MCP tools to understand code, assess impact, and navigate safely.
|
||
|
||
> Index stale? Run `node .gitnexus/run.cjs analyze` from the project root — it auto-selects an available runner. No `.gitnexus/run.cjs` yet? `npx gitnexus analyze` (npm 11 crash → `npm i -g gitnexus`; #1939).
|
||
|
||
## Always Do
|
||
|
||
- **MUST run impact analysis before editing any symbol.** Before modifying a function, class, or method, run `impact({target: "symbolName", direction: "upstream"})` and report the blast radius (direct callers, affected processes, risk level) to the user.
|
||
- **MUST run `detect_changes()` before committing** to verify your changes only affect expected symbols and execution flows. For regression review, compare against the default branch: `detect_changes({scope: "compare", base_ref: "main"})`.
|
||
- **MUST warn the user** if impact analysis returns HIGH or CRITICAL risk before proceeding with edits.
|
||
- When exploring unfamiliar code, use `query({search_query: "concept"})` to find execution flows instead of grepping. It returns process-grouped results ranked by relevance.
|
||
- When you need full context on a specific symbol — callers, callees, which execution flows it participates in — use `context({name: "symbolName"})`.
|
||
- For security review, `explain({target: "fileOrSymbol"})` lists taint findings (source→sink flows; needs `analyze --pdg`).
|
||
|
||
## Never Do
|
||
|
||
- NEVER edit a function, class, or method without first running `impact` on it.
|
||
- NEVER ignore HIGH or CRITICAL risk warnings from impact analysis.
|
||
- NEVER rename symbols with find-and-replace — use `rename` which understands the call graph.
|
||
- NEVER commit changes without running `detect_changes()` to check affected scope.
|
||
|
||
## Resources
|
||
|
||
| Resource | Use for |
|
||
|----------|---------|
|
||
| `gitnexus://repo/command-code-openai-bridge/context` | Codebase overview, check index freshness |
|
||
| `gitnexus://repo/command-code-openai-bridge/clusters` | All functional areas |
|
||
| `gitnexus://repo/command-code-openai-bridge/processes` | All execution flows |
|
||
| `gitnexus://repo/command-code-openai-bridge/process/{name}` | Step-by-step execution trace |
|
||
|
||
## CLI
|
||
|
||
| Task | Read this skill file |
|
||
|------|---------------------|
|
||
| Understand architecture / "How does X work?" | `.claude/skills/gitnexus/gitnexus-exploring/SKILL.md` |
|
||
| Blast radius / "What breaks if I change X?" | `.claude/skills/gitnexus/gitnexus-impact-analysis/SKILL.md` |
|
||
| Trace bugs / "Why is X failing?" | `.claude/skills/gitnexus/gitnexus-debugging/SKILL.md` |
|
||
| Rename / extract / split / refactor | `.claude/skills/gitnexus/gitnexus-refactoring/SKILL.md` |
|
||
| Tools, resources, schema reference | `.claude/skills/gitnexus/gitnexus-guide/SKILL.md` |
|
||
| Index, status, clean, wiki CLI commands | `.claude/skills/gitnexus/gitnexus-cli/SKILL.md` |
|
||
|
||
<!-- gitnexus:end -->
|