cdx.cc 是一个 Anthropic Messages API ↔ OpenAI Responses API 协议桥。
它的目标很直接:
- 让 Claude Code CLI 按 Anthropic 协议接入
- 实际把请求转发到 OpenAI / Codex / 兼容 Responses API 上游
- 尽量保持 Claude Code 侧的原生体验,包括流式、工具调用、多模态、token 计数、压缩和
/fast
- Anthropic
POST /v1/messages→ OpenAIPOST /v1/responses - 流式 SSE 桥接,支持文本、reasoning、工具调用、citations 等事件
- 非流式响应转换,保留 usage / service tier / context management
tool_use/tool_result、web search、tool search、local shell、custom tool 映射- 多模态内容映射:text / image / document / search_result
POST /v1/messages/count_tokens精确估算,兼容 Claude Code 上下文显示POST /v1/responses/compact远程压缩透传- 自动压缩:
context_management或/v1/responses/compact - Prompt Cache 策略:
off/auto/force_24h,支持自动生成稳定prompt_cache_key - Web 管理面板:上游、模型映射、连接信息、自动压缩、Prompt Cache 热更新
runtime_config.json持久化运行时配置/fast兼容脚本与 bridge 端点支持
Claude Code CLI
│ Anthropic Messages API
▼
┌────────────────────────────────┐
│ cdx.cc │
│ │
│ /v1/messages ─┐ │
│ /v1/messages/count_tokens ─┼─┼─→ OpenAI Responses API
│ /v1/responses/compact ─┘ │
│ │
│ /admin 管理面板 │
│ /health 健康检查 │
│ /v1/models 入站模型列表 │
└────────────────────────────────┘
go build -o claude-bridge ./cmd/claude-bridge./claude-bridge默认监听 :8787。
- 管理面板:
http://localhost:8787/admin - 健康检查:
http://localhost:8787/health
也可以通过环境变量直接启动:
UPSTREAM_BASE_URL=https://api.openai.com \
UPSTREAM_API_KEY=sk-xxx \
AUTH_TOKEN=sk-cdx.cc-demo \
./claude-bridge如果没有现成的运行时配置,bridge 会自动生成:
auth_tokenadmin_password
并写入:
- 当前目录下的
runtime_config.json - 或
DATA_DIR/runtime_config.json
在 /admin 中完成这些配置:
- 上游 Base URL / API Key
- 模型映射
- 客户端连接 Token
- 管理密码
- 服务地址
- 自动压缩
- Prompt Cache
Claude Code 连接这个 bridge 时,使用的是 Anthropic 风格的客户端环境变量。
export ANTHROPIC_AUTH_TOKEN="sk-cdx.cc-demo"
export ANTHROPIC_BASE_URL="http://localhost:8787"
# 可选:指定默认模型
# export ANTHROPIC_MODEL="claude-sonnet-4-6"
claude$env:ANTHROPIC_AUTH_TOKEN = "sk-cdx.cc-demo"
$env:ANTHROPIC_BASE_URL = "http://localhost:8787"
# 可选:指定默认模型
# $env:ANTHROPIC_MODEL = "claude-sonnet-4-6"
claude{
"env": {
"ANTHROPIC_AUTH_TOKEN": "sk-cdx.cc-demo",
"ANTHROPIC_BASE_URL": "http://localhost:8787"
}
}请从项目目录内启动 Claude Code,例如
cd your-project && claude。
访问 http://localhost:8787/admin。
支持的主要配置项:
- Upstream
- Base URL
- API Key
- Models
- 入站模型名 → 上游模型名
- 可选覆盖
reasoning_effort - 可从上游拉取模型列表
- Connection
auth_tokenadmin_passwordservice_url
- Auto Compact
- 模式
- 阈值
- Prompt Cache
offautoforce_24h- 自动生成
prompt_cache_key
所有配置都会保存到 runtime_config.json,无需重启即可生效。
bridge 支持把 Claude Code / Anthropic 风格缓存习惯兼容到 OpenAI / Codex 的 prompt caching。
off- 不自动注入
prompt_cache_retention - 不自动生成
prompt_cache_key - 仅保留客户端显式传入的缓存字段
- 不自动注入
auto- 检测到缓存信号时才注入缓存策略
- 例如:
- 客户端显式传了
prompt_cache_key - bridge 能从 Claude Code metadata 安全派生稳定 key
- Anthropic 请求里存在
cache_control
- 客户端显式传了
force_24h- 默认强制注入
prompt_cache_retention: "24h"
- 默认强制注入
启用后,如果客户端没有显式传 prompt_cache_key,bridge 会自动生成稳定 key。
优先使用 Claude Code metadata 中可稳定识别会话/设备的信息:
account_uuiddevice_idsession_id
并结合:
- auth token
- user-agent
做哈希生成,尽量提高缓存命中率并降低冲突概率。
当策略允许注入 retention 时,bridge 会优先使用:
prompt_cache_retention: "24h"
如果上游 / 模型不支持该字段,bridge 会自动重试一次并移除它。
Anthropic 的 cache_control.ttl=1h|5m 与 OpenAI 的 prompt caching 不是完全同构。
bridge 的兼容策略是:
- 优先提升到 OpenAI 侧可用的高缓存模式
- 使用
24h作为最佳实践默认值 - 在 usage 上尽量回填为 Claude Code 可消费的缓存字段
OpenAI / Codex 原生返回的主要是:
input_tokens_details.cached_tokens
bridge 会把它兼容回填到 Anthropic usage:
cache_read_input_tokenscache_creation.ephemeral_1h_input_tokenscache_creation.ephemeral_5m_input_tokens
这是兼容近似值,用于让 Claude Code 的 UI、状态栏和上下文显示更贴近原生;不是对上游真实 cache creation 计费桶的 1:1 还原。
支持 3 种模式:
offcontext_managementresponses_compact
达到阈值后,bridge 会在消息请求里自动注入 compaction 相关上下文字段。
适合上游已经支持 context_management / compaction 的场景。
达到阈值后,bridge 会:
- 先调用
POST /v1/responses/compact - 用压缩后的历史重新构造输入
- 再继续正式
POST /v1/responses
- Claude Code
/compact:客户端本地命令 - bridge 自动压缩:服务端阈值触发
它们是两套机制,可以同时存在。
Claude Code 的 /fast 检测并不完全走 ANTHROPIC_BASE_URL,因此需要两部分配合:
- bridge 暴露
GET /api/claude_code_penguin_mode - 对本地 Claude Code CLI 做一次 patch
仓库内提供了两个脚本:
scripts/setup-claude-code-bridge.shscripts/setup-claude-code-bridge.ps1
bash scripts/setup-claude-code-bridge.shpowershell -ExecutionPolicy Bypass -File .\scripts\setup-claude-code-bridge.ps1
setup-claude-code-bridge.ps1是 PowerShell 启动器,底层仍调用 Bash 脚本;Windows 上请准备好 Git Bash 或可用的bash。
bash scripts/setup-claude-code-bridge.sh \
--bridge http://localhost:8787 \
--admin-password 'your-admin-password' \
--compact-mode responses_compact \
--compact-threshold 180000bash scripts/setup-claude-code-bridge.sh --restore--bridge URL
--admin-password PASS
--compact-mode off|context_management|responses_compact
--compact-threshold N
--skip-fast
--skip-compact
--restore
| 端点 | 说明 |
|---|---|
GET /health |
健康检查 |
GET /v1/models |
Anthropic 风格模型列表 |
POST /v1/messages |
主消息接口,支持流式和非流式 |
POST /v1/messages/count_tokens |
Token 计数 |
POST /v1/responses/compact |
OpenAI / Codex 远程 compact 透传 |
POST /responses/compact |
POST /v1/responses/compact 别名 |
GET /api/claude_code_penguin_mode |
/fast 所需状态端点 |
GET /admin |
管理面板 |
当前 bridge 覆盖的是“Claude Code 常用 Anthropic 语义”与“OpenAI Responses/Codex item 模型”之间的双向映射。
| Anthropic Messages | OpenAI Responses |
|---|---|
model |
model |
max_tokens |
max_output_tokens |
messages |
input |
system |
instructions |
tools |
tools |
tool_choice |
tool_choice |
stream |
stream |
temperature |
temperature |
top_p |
top_p |
stop_sequences |
stop |
metadata |
metadata |
thinking |
reasoning |
speed=fast |
service_tier=priority |
context_management |
context_management |
这些字段会从 Anthropic 请求体直接带到 OpenAI Responses:
includeparallel_tool_callsprevious_response_idprompt_cache_keyprompt_cache_retentionservice_tierstoretext
除此之外,未显式识别的额外字段也会尽量保存在请求的 ExtraFields 中继续向上游透传。
| Anthropic block / message | OpenAI input item / content |
|---|---|
message(role=user/assistant) |
message(role=user/assistant) |
text |
input_text / output_text |
image |
input_image |
document |
input_file |
thinking / signature(历史) |
剥离,不继续上传上游 |
phase / end_turn |
保存在 message.phase / message.end_turn |
| Anthropic | OpenAI Responses |
|---|---|
tool_use |
function_call |
tool_use(name=Bash) |
local_shell_call |
tool_use(name=ToolSearch) |
tool_search_call |
tool_use(responses_type=custom_tool_call) |
custom_tool_call |
server_tool_use(name=web_search) |
web_search_call |
其中这些字段会尽量保留:
id↔call_idnamenamespacestatusexecutionactionraw_input
local_shell_call 还会额外映射:
commandtimeout/timeout_mscwd/working_directoryenvuserrun_in_background
| Anthropic | OpenAI Responses |
|---|---|
tool_result |
function_call_output |
tool_result(custom tool) |
custom_tool_call_output |
tool_search_tool_result |
tool_search_output |
web_search_tool_result |
保留为历史结果块;web_search 调用由 server_tool_use 对应 |
tool_result.content 支持:
tool_result.content block |
OpenAI output payload |
|---|---|
text |
input_text / 字符串输出 |
image |
input_image |
document |
input_file |
search_result |
结构化 input_text |
| Anthropic | OpenAI Responses |
|---|---|
compaction |
compaction |
image_generation_call |
image_generation_call |
responses_output_item |
未知/未来 output item 原样回放 |
| OpenAI Responses output item | Anthropic content block |
|---|---|
message |
text / 带 citations 的文本块 |
reasoning |
thinking |
function_call |
tool_use |
local_shell_call |
tool_use(name=Bash) |
tool_search_call |
tool_use(name=ToolSearch) |
tool_search_output |
tool_search_tool_result |
custom_tool_call |
tool_use + responses_type=custom_tool_call |
web_search_call |
server_tool_use + web_search_tool_result |
compaction / compaction_summary |
compaction |
image_generation_call |
image_generation_call |
| 未知 output item | responses_output_item |
| OpenAI Responses | Anthropic |
|---|---|
usage.input_tokens |
usage.input_tokens |
usage.output_tokens |
usage.output_tokens |
usage.input_tokens_details.cached_tokens |
usage.cache_read_input_tokens |
prompt_cache_retention=24h |
优先回填到 usage.cache_creation.ephemeral_1h_input_tokens |
prompt_cache_retention=in_memory |
优先回填到 usage.cache_creation.ephemeral_5m_input_tokens |
service_tier |
usage.service_tier |
priority |
usage.speed=fast |
context_management |
message.context_management |
| web search 次数 | usage.server_tool_use.web_search_requests |
bridge 会把 OpenAI Responses SSE 转成 Anthropic 风格流式事件。
| OpenAI SSE | Anthropic SSE |
|---|---|
response.output_item.added(message text) |
content_block_start |
response.output_text.delta |
content_block_delta(text_delta) |
response.output_text.done / response.content_part.done |
content_block_stop |
response.content_part.done with annotations |
content_block_delta(citations_delta) |
response.function_call_arguments.delta |
content_block_delta(input_json_delta) |
response.output_item.done(function_call) |
tool_use block 完成 |
response.output_item.done(local_shell_call) |
tool_use(name=Bash) |
response.output_item.done(tool_search_call) |
tool_use(name=ToolSearch) |
response.output_item.done(tool_search_output) |
tool_search_tool_result |
response.reasoning_text.delta / response.reasoning_summary_text.delta |
content_block_delta(thinking_delta) |
response.reasoning_text.done / response.reasoning_summary_text.done |
signature_delta + content_block_stop |
response.web_search_call.completed |
server_tool_use + web_search_tool_result |
response.output_item.done(compaction) |
compaction |
response.output_item.done(image_generation_call) |
image_generation_call |
response.completed / response.incomplete / response.cancelled / response.failed |
message_delta + message_stop |
error |
Anthropic error 事件 |
说明:
thinking会插入占位signature,以兼容 Claude Code 的折叠 UI。message done会避免与已经流式发出的文本块重复。- 未识别的 output item 会尽量用
responses_output_item发回,避免流式阶段直接丢失。
- OpenAI
web_search_call.action.query→ Anthropicserver_tool_use.input.query url_citationannotations →web_search_tool_result.contentusage.server_tool_use.web_search_requests会累计回填
tool_search_call.arguments↔tool_use(name=ToolSearch).inputtool_search_output.tools↔tool_search_tool_result- 原始
toolsJSON 会优先保留,无法精确恢复时退回tool_reference
local_shell_call.action↔tool_use(name=Bash).input- 如果上游是
["bash","-lc","pwd"]这类命令,bridge 会尽量还原成更自然的command: "pwd"
- Anthropic
thinking会映射到 OpenAIreasoning - OpenAI
reasoning.summary/reasoning_text会映射回 Anthropicthinking - 历史里的
thinking/signature块不会再原样发回上游
| 场景 | 行为 |
|---|---|
Anthropic context_management |
转成 OpenAI context_management compaction 项 |
Anthropic compaction 历史块 |
转成 OpenAI compaction input item |
OpenAI compaction / compaction_summary 输出 |
转成 Anthropic compaction |
POST /v1/responses/compact |
原样透传到上游 |
自动压缩 context_management 模式 |
超阈值后注入 compact_threshold |
自动压缩 responses_compact 模式 |
超阈值后先调远程 compact,再重建 input |
对于当前未显式支持的 OpenAI output item:
- 非流式:转成 Anthropic
responses_output_item - 流式 done:同样尽量发成
responses_output_item - 下一轮历史回放时再还原回 OpenAI input item
这可以减少新 item 类型导致的字段丢失。
Claude Code 对 token 计数和 rate-limit 头比较敏感。
bridge 会处理:
POST /v1/messages/count_tokensanthropic-ratelimit-*anthropic-ratelimit-unified-*- 自动压缩前后的重新估算
- 图片、文档、搜索结果等多模态内容的计数近似
- cached token / reasoning token 相关 usage 映射
- prompt cache usage 的 Anthropic 兼容回填
这会影响:
- 状态栏上下文百分比
- 自动压缩触发时机
- usage / cost 展示
- request / quota 提示
| 变量 | 默认值 | 说明 |
|---|---|---|
LISTEN_ADDR |
:8787 |
监听地址 |
UPSTREAM_BASE_URL |
https://api.openai.com |
上游基础地址 |
UPSTREAM_API_KEY |
— | 上游 API Key |
AUTH_TOKEN |
自动生成 | bridge 入站鉴权 token |
MODE |
best_effort |
strict 或 best_effort |
MODEL_MAP |
— | 模型映射,如 claude-sonnet-4-6=gpt-5.4:high |
UPSTREAM_TIMEOUT_SECS |
120 |
上游请求超时秒数 |
MAX_BODY_MB |
10 |
最大请求体大小 |
CONTEXT_LIMIT |
1048576 |
上下文窗口大小,用于兼容头和估算 |
OUTPUT_LIMIT |
32000 |
最大输出 token 数 |
AUTO_COMPACT_MODE |
off |
off / context_management / responses_compact |
AUTO_COMPACT_THRESHOLD_TOKENS |
— | 自动压缩阈值 |
PROMPT_CACHE_MODE |
force_24h |
off / auto / force_24h |
PROMPT_CACHE_AUTO_KEY |
true |
是否自动生成稳定 prompt_cache_key |
DISABLE_RESPONSE_STORAGE |
— | 设置任意值时向上游发送 store=false |
LOG_LEVEL |
info |
日志级别 |
REDIS_URL |
— | Redis 存储地址;留空时使用内存 |
DATA_DIR |
当前目录 | runtime_config.json 持久化目录 |
仓库包含 docker-compose.yml,可以直接启动:
docker compose up -d启动前请根据你的上游服务修改 compose 中的环境变量,例如:
UPSTREAM_BASE_URLUPSTREAM_API_KEYMODEL_MAP
cmd/claude-bridge/main.go 启动入口
internal/server/ HTTP 路由、消息处理、自动压缩
internal/transform/ Anthropic ↔ OpenAI 请求/响应/SSE 转换
internal/admin/ 管理面板与接口
internal/config/ 环境变量与 runtime_config
internal/tokenizer/ token 计数
internal/types/ 协议结构体
internal/upstream/ 上游 HTTP 客户端
scripts/ /fast 与自动压缩辅助脚本
运行测试:
go test ./...如果修改了 /fast 或自动压缩安装脚本,也可以单独检查:
bash -n scripts/setup-claude-code-bridge.shMIT