curl 能调用,不代表 Claude Code 能连:先核对请求协议

curl 能调用 API,Claude Code 却连不上?通过真实 HTTP 探针与最小客户端测试,区分协议地址、认证方式、模型 ID 和运行环境,按步骤定位问题。

暖灰背景上的石桥黑色线稿、浅色卡纸、赭色竖条及 Claude Code 标题。

如果 API 请求在 curl 中能成功,但 Claude Code 失败,首先要确认两者发送的是不是同一种请求。一次成功的 OpenAI Chat Completions 请求,只能证明某条路由和凭据可用;它不能证明 Anthropic Messages 请求、流式响应或运行 Claude Code 的进程也能正常工作。

我们使用 Ofox 和 Claude Haiku 5.5 复现了这种区别。模型通过 Chat Completions 返回了回答;一个故意配置错误的 Messages URL 返回 HTTP 401;正确的 Anthropic 兼容路由返回了 READY,一个最简 Claude Code 请求也成功完成。修正 HTTP 探测请求中的路由与协议组合后,请求成功了。我们没有复现 Claude Code 会话失败,因此这不能证明修复了客户端故障,也不能说明所有连接错误都是基础 URL 配置错误。

本指南面向已经有可用 API 凭据、但需要定位编程客户端为何失败的开发者。首次配置服务商,请使用 Claude Code 配置指南。在这里,先保留现有项目设置,直到找出发生故障的环节。

本次测试实际确认了什么

测试使用 Claude Code 2.1.296、Ofox 模型 ID anthropic/claude-haiku-5.5,以及简短、非敏感的提示词。这些是单次请求测试,不是可用性或速度基准测试。

探测项请求或配置观察结果
OpenAI 兼容文本请求/v1/chat/completions,Bearer 身份验证HTTP 200;返回了请求的 JSON
故意配置错误的 Messages 请求/v1/v1/messages,x-api-keyHTTP 401;响应要求使用 Bearer 身份验证
Anthropic 兼容文本请求/anthropic/v1/messages,x-api-keyHTTP 200;返回 READY
最简 Claude Code 调用基础 URL 为 /anthropic,显式指定模型,禁用工具退出码 0;is_error: false;结果为 READY

配置错误的请求同时使用了错误路径,以及不适用于该路由的身份验证方式。这次测试同时改变了路径和认证方式,因此无法区分两者各自对失败的影响。尤其是,401 响应不能证明 API 密钥本身无效:同一凭据在匹配的路由上可以正常工作。

尽管请求成功,客户端仍针对带命名空间的模型标识符发出了 unrecognized_model 警告。诊断时应保留这条警告;不要把它等同于请求失败,也不要据此推断所有功能都受支持。本次探测禁用了工具,也没有测试编程工作流、MCP、账号切换或长时间流式会话。

匹配端点、请求体和凭据

记下本次测试使用的组合:服务商、基础 URL、最终路径、模型 ID、身份验证请求头和请求体格式。不要未经核对映射关系,就把一家服务商的模型名称复制到另一家服务商的示例中。

客户端协议本次测试使用的 Ofox URL请求体结构
OpenAI Chat Completionshttps://api.ofox.ai/v1/chat/completionsmodel、messages
Anthropic Messageshttps://api.ofox.ai/anthropic/v1/messagesmodel、messages、max_tokens
Claude Code 基础 URLhttps://api.ofox.ai/anthropic客户端会在后面追加操作路径

对于此 Anthropic 兼容配置,不能直接沿用 OpenAI SDK 常见的 https://api.ofox.ai/v1 基础地址;本例应使用 https://api.ofox.ai/anthropic。同样,也不要把完整的 /v1/messages URL 粘贴到原本只接受前缀的基础 URL 字段中。

Anthropic 的网关文档区分了网关配置与底层服务商。文档还明确表示,不保证支持通过第三方网关路由的非 Claude 模型。本次测试使用的是 Claude 模型;在其他模型上成功进行文本探测,并不能证明其与 Claude Code 完全兼容。

展示 Anthropic 基础 URL 的 Ofox 英文版 Haiku 代码示例

这是 10 月 12 日截取的 Ofox 公开代码示例界面,界面中标出了 Anthropic 路由和模型;它不是 CLI 测试结果的截图。

发送最简 Messages 探测请求

使用环境变量保存密钥,并通过你日常使用的密钥管理方式设置该变量。不要把密钥放进截图、文章评论、命令记录或共享诊断文件中。以下 POSIX shell 示例假设 OFOX_API_KEY 已经设置。

curl --silent --show-error --fail-with-body \
  --connect-timeout 10 --max-time 45 \
  'https://api.ofox.ai/anthropic/v1/messages' \
  -H "x-api-key: $OFOX_API_KEY" \
  -H 'anthropic-version: 2023-06-01' \
  -H 'content-type: application/json' \
  --data '{"model":"anthropic/claude-haiku-5.5","max_tokens":64,"messages":[{"role":"user","content":"Reply with READY only."}]}'

成功时,Messages 响应的 content 中应包含一个值为 READY 的文本块。请同时检查 HTTP 状态和响应正文。HTML 登录页、空的成功响应正文或错误对象,都不算有效的模型响应。

如果命令失败,请保存 HTTP 状态、错误类型以及可用时的请求 ID。向服务商报告问题时可以提供请求 ID,但要删去身份验证请求头和个人提示词。连接超时、证书错误和 HTTP 401 发生在不同环节,不应采用相同的解决方法。

在不加载项目工作负载的情况下运行客户端

在我们使用的版本中,--bare 会启用客户端的最简模式;--tools "" 会为这次纯文本探测禁用工具。复制这些特定于版本的标志前,请先运行你自己版本的 claude --help。

claude --version

(
  unset ANTHROPIC_AUTH_TOKEN
  export ANTHROPIC_BASE_URL='https://api.ofox.ai/anthropic'
  export ANTHROPIC_API_KEY="$OFOX_API_KEY"
  claude --bare -p 'Reply with READY only.' \
    --model 'anthropic/claude-haiku-5.5' \
    --tools '' --no-session-persistence --output-format json
)

括号会将这些环境变量改动限制在本次探测中。我们是在一个空的临时目录中运行该命令的。它不会改写项目配置,也不会移除组织设置的控制措施。如果你的组织限制了可用服务商,请使用获准的目标地址;这不是绕过托管策略的操作步骤。

验收条件是:退出状态为 0、is_error: false,并且结果符合预期。在我们的测试中,整个进程耗时 2.64 秒。CLI 的成本字段没有与 Ofox 账单核对,不能当作网关最终结算费用。即使结果正确,也只能说明这次最简连接请求成功。

如果两次探测结果不一致

如果 Messages 请求成功,但客户端失败,请比较进程环境。Shell 和由 IDE 启动的进程可能使用不同的环境变量。修正客户端的启动配置后,重启受影响的客户端,再检查它实际使用的服务商和模型。不要输出完整的环境变量转储,其中可能包含密钥。

接下来检查设置的作用范围。Claude Code 的设置指南介绍了用户、项目、本地和托管设置。请检查实际生效的值,不要假设最近编辑的文件一定覆盖了其他设置。修改设置前先留存副本。如果只有某一个代码仓库失败,先将它的项目配置与干净环境下的探测结果进行比较,而不是先改动全局配置。

现象下一步区分性测试应避免的做法
HTTP 401 或 403检查路由、凭据类型和服务商策略是否匹配还没检查路由,就轮换一个原本可用的密钥
找不到模型的响应将准确的模型 ID 与该服务商提供的模型进行比对把宣传名称当作 API 标识符
证书或代理错误比较受影响进程所使用的获准网络配置禁用 TLS 证书验证
最简响应成功,长会话失败收集流终止和超时证据把纯文本探测称为流式测试
文本请求成功,工具调用失败分别验证工具调用请求和结果协议仅因文本请求成功就把问题归咎于模型
只有 IDE 失败使用预期的环境变量重启 IDE,并重新检查设置一次性修改多个无关的全局设置

如果你要连接 DeepSeek,DeepSeek Claude Code 配置文章介绍了另一套服务商协议。不要将其中的直连端点与本示例中的 Ofox 配置混用。

分阶段恢复正常工作

最简探测通过后,每次只恢复一层:先使用常规项目,再指定预期模型,然后尝试无害的只读工具请求,最后恢复正常工作流。每个阶段都要核实预期操作和用量记录。保留成功的探测结果作为基线,以便后续失败时能缩小到具体改动。

有用的问题报告应包含客户端版本、操作系统、服务商路由、脱敏后的模型配置、故障时间、请求 ID,以及能复现问题的最简提示词。还要分别说明哪些检查已通过。只有明确说明 curl 测试了哪种协议,“curl 能用”才算有用的证据。

常见问题

curl 请求成功,能证明 Claude Code 配置正确吗?
不能。它只能证明那一条特定请求成功了。要将结论扩展到客户端之前,先比较实际路径、身份验证方式、模型和进程环境。
应该禁用证书验证来修复连接失败吗?
不应该。请检查证书链和获准使用的代理配置。禁用验证会掩盖问题,也会削弱连接安全性。
客户端测试能证明工具调用和编程功能可用吗?
不能。我们的探测有意禁用了工具。在依赖这套配置之前,请分别验证只读工具操作和有代表性的项目任务。