Skip to content

Commit f369d23

Browse files
支持 OpenAI Chat 兼容协议 (claude-code-best#99)
* feat: 完成 openai 接口兼容 * feat: 完成 openai 协议兼容 * fix: 修复测试用例
1 parent 6631ed5 commit f369d23

22 files changed

Lines changed: 2283 additions & 18 deletions

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ on:
88

99
jobs:
1010
ci:
11-
runs-on: ubuntu-latest
11+
runs-on: macos-latest
1212

1313
steps:
1414
- uses: actions/checkout@v4

DEV-LOG.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,54 @@
11
# DEV-LOG
22

3+
## OpenAI 接口兼容 (2026-04-03)
4+
5+
**分支**: `feature/openai`
6+
7+
`/login` 流程中新增 "OpenAI Compatible" 选项,支持 Ollama、DeepSeek、vLLM、One API 等兼容 OpenAI Chat Completions API 的第三方服务。用户通过 `/login` 配置后,所有 API 请求自动走 OpenAI 路径。
8+
9+
**改动文件(10 个,+384 / -134):**
10+
11+
| 文件 | 变更 |
12+
|------|------|
13+
| `.github/workflows/ci.yml` | CI runner 从 `ubuntu-latest` 改为 `macos-latest` |
14+
| `README.md` | TODO 列表新增 "OpenAI 接口兼容" 条目 |
15+
| `src/components/ConsoleOAuthFlow.tsx` | 新增 `openai_chat_api` OAuth state(含 Base URL / API Key / 3 个模型映射字段);idle 选择列表新增 "OpenAI Compatible" 选项;完整表单 UI(Tab 切换、Enter 保存);保存时写入 `modelType: 'openai'` + env 到 settings.json;OAuth 登录时重置 `modelType``anthropic` |
16+
| `src/services/api/openai/index.ts` | 从直接 `yield* adaptOpenAIStreamToAnthropic()` 改为完整流处理循环:累积 content blocks(text/tool_use/thinking)、按 `content_block_stop` yield `AssistantMessage`、同时 yield `StreamEvent` 用于实时显示;错误处理改用新签名 `createAssistantAPIErrorMessage({ content, apiError, error })` |
17+
| `src/services/api/openai/convertMessages.ts` | 输入类型从 Anthropic SDK `BetaMessageParam[]` 改为内部 `(UserMessage \| AssistantMessage)[]`;通过 `msg.type` 而非 `msg.role` 判断角色;从 `msg.message.content` 读取内容;跳过 `cache_edits` / `server_tool_use` 等内部 block 类型 |
18+
| `src/services/api/openai/modelMapping.ts` | 移除 `OPENAI_MODEL_MAP` JSON 环境变量 + 缓存机制;新增 `getModelFamily()` 按 haiku/sonnet/opus 分类;解析优先级改为:`OPENAI_MODEL``ANTHROPIC_DEFAULT_{FAMILY}_MODEL``DEFAULT_MODEL_MAP` → 原名透传 |
19+
| `src/services/api/openai/__tests__/convertMessages.test.ts` | 测试输入从裸 `{ role, content }` 改为 `makeUserMsg()` / `makeAssistantMsg()` 包装的内部格式 |
20+
| `src/services/api/openai/__tests__/modelMapping.test.ts` | 测试从 `OPENAI_MODEL_MAP` 改为 `ANTHROPIC_DEFAULT_{HAIKU,SONNET,OPUS}_MODEL`;新增 3 个 env var override 测试 |
21+
| `src/utils/model/providers.ts` | `getAPIProvider()` 新增最高优先级:从 settings.json `modelType` 字段判断;环境变量 `CLAUDE_CODE_USE_OPENAI` 降为次优先 |
22+
| `src/utils/settings/types.ts` | `SettingsSchema` 新增 `modelType` 字段:`z.enum(['anthropic', 'openai']).optional()` |
23+
24+
**关键设计决策:**
25+
26+
1. **`modelType` 存入 settings.json** — 而非纯环境变量,使 `/login` 配置持久化,重启后仍然生效
27+
2. **复用 `ANTHROPIC_DEFAULT_*_MODEL` 环境变量** — 而非新增 `OPENAI_MODEL_MAP`,与 Custom Platform 共用同一套模型映射配置,减少用户认知负担
28+
3. **流处理双 yield** — 同时 yield `AssistantMessage`(给消费方处理工具调用)和 `StreamEvent`(给 REPL 实时渲染),与 Anthropic 路径行为对齐
29+
4. **OAuth 登录重置 modelType** — 用户切换回官方 Anthropic 登录时自动重置为 `anthropic`,避免残留配置导致请求走错误路径
30+
31+
**配置方式:**
32+
33+
```
34+
/login → 选择 "OpenAI Compatible" → 填写 Base URL / API Key / 模型名称
35+
```
36+
37+
或手动编辑 `~/.claude/settings.json`
38+
39+
```json
40+
{
41+
"modelType": "openai",
42+
"env": {
43+
"OPENAI_BASE_URL": "http://localhost:11434/v1",
44+
"OPENAI_API_KEY": "ollama",
45+
"ANTHROPIC_DEFAULT_SONNET_MODEL": "qwen3:32b"
46+
}
47+
}
48+
```
49+
50+
---
51+
352
## Enable Remote Control / BRIDGE_MODE (2026-04-03)
453

554
**PR**: [claude-code-best/claude-code#60](https://github.com/claude-code-best/claude-code/pull/60)

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
- [x] 添加自定义 GrowthBook 支持 (GB 也是开源的, 现在你可以配置一个自定义的遥控平台) [文档](https://ccb.agent-aura.top/docs/internals/growthbook-adapter)
3737
- [x] 自定义 login 模式, 大家可以用这个配置 Claude 的模型!
3838
- [x] 修复搜索工具的 rg 缺失问题(需要重新 bun i)
39+
- [ ] OpenAI 接口兼容! /login 然后配置 OpenAI 平台即可!
3940
- [ ] V6 大规模重构石山代码, 全面模块分包
4041
- [ ] V6 将会为全新分支, 届时 main 分支将会封存为历史版本
4142

bun.lock

Lines changed: 27 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)