这是一个将 Anthropic Claude API 协议转换为 OpenAI API 协议的代理服务。让你可以使用 Claude Code 连接到 OpenAI API、通义千问 API 或其他兼容 OpenAI 协议的 AI 服务。
作为开发者,你是否也曾遇到过这样的困扰:很喜欢用 Claude Code 写代码,但它的模型选择太有限了?OpenAi2CC 专门解决这个痛点,让你能够:
- 🔄 自由选择喜欢的 AI 模型
- 💰 根据需求平衡成本和性能
- 🏢 为团队提供统一的 AI 服务入口
- 🔧 灵活配置模型映射规则
- 🔄 协议转换:将 Claude API 格式转换为 OpenAI Chat API 格式
- 🌊 流式响应支持:完整的流式响应处理
- 🛡️ 错误处理:完善的错误处理和状态码映射
- 🎯 模型映射:自动映射 Claude 模型名到 OpenAI 模型
- 📊 健康检查:内置健康检查端点
- ⚡ 高性能:基于 Node.js 和 TypeScript 构建
- 🔑 Qwen CLI 支持:支持使用通义千问 CLI 的 OAuth 认证
- 🔄 自动 token 刷新:定时刷新访问 token 并更新配置文件
- 🔄 自动重试:对临时性错误(502, 503, 504, 429)自动重试
- 📝 详细错误信息:提供更友好的错误描述和建议
- 📝 模型映射日志:实时显示请求模型和映射后的模型信息
- 🗺️ 高级模型映射:支持 JSON 配置文件和模式匹配(包含、前缀、后缀、精确匹配)
- 🛠️ 工具调用支持:完整支持 Function Calling,在 Claude 和 OpenAI 协议间正确转换工具调用格式
- Node.js - 高性能的 JavaScript 运行时
- TypeScript - 类型安全的 JavaScript 超集
- Express.js - 轻量级 Web 框架
- Axios - HTTP 客户端库
npm installcp .env.example .env方法一:通过环境变量配置
编辑 .env 文件,填入你的 OpenAI API 密钥:
OPENAI_API_KEY=your_openai_api_key_here
# QWEN_CLI=false # 或者注释掉这行启动服务:
# 开发模式
npm run dev
# 生产模式
npm run build
npm start方法二:通过命令行参数
# 开发模式 - 通过命令行传递 API Key
npm run dev -- --openai-api-key your_api_key_here
# 开发模式 - 指定自定义 API 端点(自动处理 /v1)
npm run dev -- --openai-api-key your_api_key_here --openai-base-url https://your-api-endpoint.com
# 或
npm run dev -- --openai-api-key your_api_key_here --openai-base-url https://your-api-endpoint.com/v1/
# 或
npm run dev -- --openai-api-key your_api_key_here --openai-base-url https://your-api-endpoint.com/v1
# 开发模式 - 指定自定义模型(覆盖默认映射)
npm run dev -- --openai-api-key your_api_key_here --model gpt-4
# 生产模式
npm run build
npm start -- --openai-api-key your_api_key_here --model gpt-4确保你已经安装并配置了通义千问 CLI,并且 OAuth 凭据已保存在默认位置 ~/.qwen/oauth_creds.json 或自定义路径。
启动服务:
使用默认 OAuth 文件路径:
# 开发模式
npm run start:qwen
# 或者通过命令行参数
npm run dev -- --qwen-cli
# 生产模式
npm run build:qwen使用自定义 OAuth 文件路径:
# 通过命令行参数指定
npm run dev -- --qwen-cli --qwen-oauth-file /path/to/your/oauth_creds.json
# 通过环境变量指定
QWEN_CLI=true QWEN_OAUTH_FILE=/path/to/your/oauth_creds.json npm run dev或者通过环境变量(.env 文件):
QWEN_CLI=true
QWEN_OAUTH_FILE=/path/to/your/oauth_creds.json
# OPENAI_API_KEY 不需要设置在 Claude Code 中设置 API 端点:
# Claude Code 配置
export ANTHROPIC_API_URL=http://localhost:29999
export ANTHROPIC_API_KEY=dummy-key配置说明:
ANTHROPIC_API_URL必须指向 OpenAi2CC 服务的地址和端口(默认:29999)ANTHROPIC_API_KEY可以是任意值,因为实际的认证由代理服务处理- 如果修改了服务端口,需要相应调整 URL 中的端口号
- 配置后,Claude Code 的所有请求都会通过 OpenAi2CC 转发到你配置的 AI 服务
POST /v1/messages- Claude 协议的消息端点(支持工具调用)POST /v1/chat/completions- 聊天补全(OpenAI 兼容,支持工具调用)GET /v1/models- 模型列表GET /health- 健康检查
| Claude 模型 | OpenAI 模型 |
|---|---|
| claude-3-opus-20240229 | gpt-4 |
| claude-3-sonnet-20240229 | gpt-3.5-turbo |
| claude-3-haiku-20240307 | gpt-4-turbo |
所有 Claude 模型都会映射到 qwen3-coder-plus
Claude Code
↓ (Claude Protocol)
Proxy Server (Node.js)
↓ (OpenAI Protocol)
OpenAI API / 通义千问 API
代理服务负责:
- 接收 Claude 格式的请求(包含工具定义和工具调用)
- 转换为 OpenAI 格式(tools、tool_calls、tool 角色消息)
- 转发到 OpenAI API 或通义千问 API
- 接收响应并转换回 Claude 格式(tool_use、tool_result 内容块)
- 返回给 Claude Code
工具调用处理:
- 工具定义:自动在 Claude
tools和 OpenAItools格式间转换 - 工具调用:将 Claude
tool_use内容块转换为 OpenAItool_calls数组 - 工具结果:将 OpenAI
tool角色消息转换为 Claudetool_result内容块 - 混合内容:支持同时包含文本和工具调用的复杂消息格式
服务会在控制台实时显示模型映射信息,帮助你了解请求的模型是如何被转换的:
🔄 Claude Protocol - Request Model: claude-3-sonnet-20240229 -> Mapped to: claude-3-sonnet-20240229
📝 Using custom model override: gpt-4
🔧 Mode: OpenAI API
🔄 OpenAI Protocol - Request Model: gpt-4 -> Mapped to: claude-3-opus-20240229
🔧 Mode: Qwen CLI
⚠️ No mapping found for model 'unknown-model', using default: claude-3-sonnet-20240229
| OpenAI 模型 | Claude 模型 |
|---|---|
| gpt-4 | claude-3-opus-20240229 |
| gpt-4-turbo | claude-3-haiku-20240307 |
| gpt-3.5-turbo | claude-3-sonnet-20240229 |
| gpt-4o | claude-3-5-sonnet-20241022 |
| gpt-4o-mini | claude-3-haiku-20240307 |
| 其他模型 | claude-3-sonnet-20240229 (默认) |
注意:使用 --model 参数可以覆盖所有映射,强制使用指定的模型。
除了内置的模型映射外,你还支持通过 JSON 配置文件自定义模型映射规则,支持多种匹配模式和默认模型:
- 创建模型映射配置文件(参考
model-mapping.example.json):
{
"mappings": [
{
"pattern": "claude-3-5",
"target": "GLM-4",
"type": "contains"
},
{
"pattern": "gpt-4",
"target": "claude-3-opus-20240229",
"type": "contains"
},
{
"pattern": "qwen-",
"target": "qwen3-coder-plus",
"type": "prefix"
},
{
"pattern": "-turbo",
"target": "claude-3-haiku-20240307",
"type": "suffix"
}
],
"defaultModel": "claude-3-sonnet-20240229"
}- 启动服务时指定配置文件:
npm run dev -- --model-mapping ./model-mapping.json# 设置环境变量
export MODEL_MAPPINGS='{"mappings":[{"pattern":"claude-3-5","target":"GLM-4","type":"contains"}]}'
# 启动服务
npm run dev| 模式 | 说明 | 示例 |
|---|---|---|
contains |
包含匹配(默认) | "claude-3-5" 匹配 claude-3-5-sonnet, claude-3-5-haiku |
exact |
精确匹配 | "gpt-4" 只匹配 gpt-4 |
prefix |
前缀匹配 | "qwen-" 匹配 qwen-7b, qwen-14b |
suffix |
后缀匹配 | "-turbo" 匹配 gpt-4-turbo, gpt-3.5-turbo |
配置文件支持可选的 defaultModel 字段,当所有映射规则都不匹配时,会使用这个默认模型:
{
"mappings": [...],
"defaultModel": "claude-3-sonnet-20240229"
}工作原理:
- 系统按顺序检查所有映射规则
- 如果找到匹配,使用对应的
target模型 - 如果没有找到任何匹配,且配置了
defaultModel,则使用默认模型 - 如果既没有匹配也没有默认模型,则返回原始模型名称
使用场景:
- 为未知模型提供一个合理的默认值
- 确保所有请求都能映射到有效的模型
- 简化配置,避免为每个可能的模型都创建映射规则
模型映射按照以下优先级顺序处理:
-
model-mapping 模式匹配(最高优先级)
- JSON 配置文件中的模式匹配规则(按配置顺序)
- 例如:
{"pattern": "claude-3-5", "target": "GLM-4", "type": "contains"}
-
model-mapping 默认模型
- JSON 配置文件中的
defaultModel字段 - 当所有模式匹配都不命中时使用
- JSON 配置文件中的
-
--model参数- 命令行指定的模型参数
- 相当于 model-mapping 中的外部默认模型
- 仅在 model-mapping 配置中没有匹配且没有 defaultModel 时使用
-
内置模型映射(最低优先级)
- 系统内置的模型映射表
- 作为最后的备选方案
示例:
npm run dev -- --model-mapping ./config.json --model fallback-model- 请求
claude-3-5-sonnet→ 使用模式匹配映射到GLM-4 - 请求
unknown-model→ 使用配置文件中的defaultModel - 请求
another-unknown(配置文件无 defaultModel)→ 使用--model的fallback-model
设置环境变量 DEBUG_MODEL_MAPPING=true 可以在启动时显示所有激活的映射规则:
DEBUG_MODEL_MAPPING=true npm run dev -- --model-mapping ./model-mapping.jsonMODEL_MAPPING_FILE- 模型映射配置文件路径MODEL_MAPPINGS- JSON 格式的模型映射配置MODEL_MAPPING_ENV- 存储模型映射配置的环境变量名(默认:MODEL_MAPPINGS)DEBUG_MODEL_MAPPING- 启用调试模式(true/false)
通过环境变量配置默认模型:
# 设置包含默认模型的映射配置
export MODEL_MAPPINGS='{"mappings":[{"pattern":"claude-3-5","target":"GLM-4","type":"contains"}],"defaultModel":"claude-3-sonnet-20240229"}'
# 启动服务
npm run devsrc/
├── index.ts # 主服务器文件
├── protocol-converter.ts # 协议转换逻辑(支持工具调用)
├── model-mapping.ts # 高级模型映射管理器
└── qwen-cli-manager.ts # Qwen CLI 认证管理器
model-mapping.example.json # 模型映射配置示例
test-mapping-logs.js # 模型映射测试脚本
test-tool-calls.js # 工具调用功能测试脚本
demo-model-mapping.sh # 模型映射功能演示脚本
demo-default-model.sh # 默认模型功能演示脚本
运行测试脚本验证服务:
chmod +x test.sh
./test.sh测试工具调用功能:
# 构建项目
npm run build
# 运行工具调用测试
node test-tool-calls.js# 指定端口
npm run dev -- -p 8080
# 启用 Qwen CLI 模式
npm run dev -- --qwen-cli
# 指定自定义 OAuth 文件路径
npm run dev -- --qwen-cli --qwen-oauth-file /path/to/oauth_creds.json
# OpenAI 模式:指定 API Key
npm run dev -- --openai-api-key your_api_key_here
# OpenAI 模式:指定 Base URL
npm run dev -- --openai-base-url https://your-api-endpoint.com/v1
# OpenAI 模式:指定自定义模型
npm run dev -- --openai-api-key your_api_key_here --model gpt-4
# Qwen CLI 模式:指定自定义模型(覆盖默认的 qwen3-coder-plus)
npm run dev -- --qwen-cli --model qwen-turbo
# 组合使用
npm run dev -- -p 8080 --openai-api-key your_api_key_here --openai-base-url https://your-api-endpoint.com/v1 --model gpt-4
# 使用模型映射配置文件
npm run dev -- --model-mapping ./model-mapping.json
# 指定模型映射环境变量名
npm run dev -- --model-mapping-env CUSTOM_MODEL_MAPPINGS
# 启用调试模式查看映射规则
DEBUG_MODEL_MAPPING=true npm run dev -- --model-mapping ./model-mapping.json- 首次使用前,请确保已经通过通义千问 CLI 完成了 OAuth 认证
- 认证信息默认保存在
~/.qwen/oauth_creds.json - 你可以通过
--qwen-oauth-file参数或QWEN_OAUTH_FILE环境变量指定自定义路径 - 代理服务会自动读取 OAuth 文件,并定时刷新 token
- Token 刷新后会自动更新配置文件
Claude Code → 代理服务 → OpenAI API
Claude Code → 代理服务 → 通义千问 API
在 Qwen CLI 模式下:
- 代理服务读取
~/.qwen/oauth_creds.json获取认证信息 - 使用 access_token 调用通义千问 API
- 在 token 过期前自动刷新
- 刷新后的 token 保存回配置文件
你可以通过修改 protocol-converter.ts 来:
- 添加更多的模型映射
- 自定义消息转换逻辑
- 添加中间件功能
- 实现请求/响应日志
代理服务会自动规范化 openai-base-url,确保正确的 API 端点格式:
- 自动移除末尾的
/ - 自动添加缺失的
/v1后缀
示例:
https://api.example.com→https://api.example.com/v1https://api.example.com/→https://api.example.com/v1https://api.example.com/v1/→https://api.example.com/v1https://api.example.com/v1→https://api.example.com/v1
代理服务会对以下临时性错误自动重试(最多 3 次):
- 502 Bad Gateway - 上游服务返回无效响应
- 503 Service Unavailable - 上游服务暂时不可用
- 504 Gateway Timeout - 上游服务响应超时
- 429 Too Many Requests - 请求频率过高
重试采用指数退避策略,避免加重上游服务负担。
- 503 Service Unavailable: 上游服务可能暂时宕机或过载,请稍后重试
- 502 Bad Gateway: 上游服务返回了无效响应
- 429 Rate Limit Exceeded: 请求频率过高,请降低请求频率
- 401 Authentication Failed: API 密钥错误或已过期
- 403 Access Denied: 没有访问该资源的权限
- 404 Not Found: 请求的端点或模型不存在
- 流处理能力强 - 原生支持流式 HTTP 响应,完美匹配 Claude API 的流式需求
- JSON 处理友好 - JavaScript 原生支持 JSON,减少序列化/反序列化开销
- 异步 I/O 高效 - 单线程事件循环适合高并发代理场景
- 开发效率高 - 快速开发和部署
通过模型映射,在不同场景使用最合适的模型:
{
"mappings": [
{
"pattern": "claude-3-haiku",
"target": "gpt-3.5-turbo",
"type": "exact"
},
{
"pattern": "claude-3-opus",
"target": "gpt-4",
"type": "exact"
}
]
}在 AI 应用开发中,快速切换不同模型进行对比:
# 测试不同的后端模型
npm run dev -- --model gpt-4
npm run dev -- --model qwen-turbo
npm run dev -- --model claude-3-sonnet对于企业用户,OpenAi2CC 可以作为 AI 服务的统一入口:
- 🏢 为不同团队提供统一的 API 接口
- 🔒 集中管理模型访问权限
- 📊 提供完整的请求日志和审计追踪
MIT