提到 Anthropic 和 Claude API 时,开发者第一反应通常是模型能力。但把 Claude Code 放进研发环境之后,最先出问题的往往不是模型回答质量,而是连接层、路由层和审计层:unable to connect to anthropic services、failed to connect to api.anthropic.com,又或者一个看起来像内部提示词的报错expected a gateway model route reference。与此同时,更多团队开始关心一个现实约束:输入给模型的文本从哪里来、内部聊天里流传的外部资料是否允许被处理、每次调用的日志到底有没有被妥善保存。本文不讨论具体商业纠纷,而是把关注点放在工程落地上:先理解 Claude Code 的接入链路,再排查连接异常,然后配置统一网关,最后补齐审计日志和内容过滤能力。
1. 先建立一张 Claude Code 接入链路图,再改任何配置
1.1 Claude Code 本质上是一个 Anthropic Messages API 客户端
Claude Code 是 Anthropic 提供的命令行和编辑器 AI 助手。无论你是在终端里输入claude,还是在 VS Code 中加载 Claude Code 扩展,它本身不会自己产生模型能力,而是把一个对话、一段代码或一个操作指令发送到模型服务端,然后接收模型返回结果继续执行。
默认场景下的请求路径大致如下:
Claude Code CLI / VS Code 扩展 | | 读取 ANTHROPIC_API_KEY、ANTHROPIC_BASE_URL、ANTHROPIC_MODEL v API 网关(可选,企业内部自建) | | POST /v1/messages v api.anthropic.comClaude Code 使用的核心接口是 Anthropic Messages API,默认地址为https://api.anthropic.com/v1/messages。它会把多轮消息、系统提示词、工具定义和本轮用户输入放在一个请求体中提交。如果你没有额外配置,请求就会直接发送到 Anthropic 官方服务;如果你配置了ANTHROPIC_BASE_URL,请求就会先到达你指定的网关或接入层。
在实际问题排查中,切忌只盯着报错文本。上面的链路图说明,一个报错可能来自网络层、端点配置、鉴权方式、模型名匹配、网关响应格式等多个环节。必须先确认当前 Claude Code 被“引导”到了哪一条路径,再继续定位。
1.2 个人直连和企业统一网关是两种完全不同的接入方式
只在本机做实验时,直连官方 API 最省事。每个开发者用自己的 API Key,把请求发到api.anthropic.com,环境变量清晰,前端工具也很容易跑通。
但研发团队接入 Claude Code 时,直连会带来几个运维问题:
- API Key 分散在开发者本地,离职或泄漏后很难统一吊销。
- 没有统一审计入口,谁在什么时候发了什么请求完全靠客户端本地日志。
- 如果以后要切换到其他兼容模型或企业内部合规网关,需要通知每个人修改环境变量。
- 无法在入口处做内容过滤、限流和告警。
因此,团队环境通常采用“统一网关”模式。Claude Code 的请求先到达企业内部网关,网关负责鉴权、路由、限流、日志和内容检查,再把通过检查的请求转发到 Anthropic 官方 API 或已授权的第三方模型服务。个人学习和企业统一接入的对比见下表:
| 对比维度 | 个人直连 | 企业统一网关 |
|---|---|---|
| 配置成本 | 低,设置环境变量即可 | 中等,需要部署和维护一个服务 |
| API Key 管理 | 分散在每个终端 | 集中在网关侧,客户端使用短期令牌 |
| 日志审计 | 依赖客户端本地 | 可在网关层统一记录 |
| 内容过滤 | 基本没有 | 可在请求进入上游前过滤 |
| 模型切换 | 手动改本地配置 | 网关层路由,客户端基本无感 |
| 适合场景 | 学习、个人项目 | 研发团队、合规要求较高的生产环境 |
2. Claude Code 的环境变量、模型名和路由必须同时匹配
2.1 关键环境变量速查
Claude Code 的配置目标很简单:告诉它“把请求发到哪里,用什么身份,请求哪个模型”。不同版本对部分变量的解析会有差异,但下面几个变量在社区和官方接入场景中出现频率最高。
| 环境变量 | 作用 | 示例 | 注意点 |
|---|---|---|---|
ANTHROPIC_API_KEY | 官方或网关的 API Key | sk-ant-... | 直连官方时使用;网关场景下也可以用网关发布的 Key |
ANTHROPIC_AUTH_TOKEN | Bearer Token,部分网关要求 | sk-litellm-master-key | 不一定所有 Claude Code 版本都支持,需看当前文档 |
ANTHROPIC_BASE_URL | 覆盖默认请求地址 | http://127.0.0.1:4000 | 一般不要带/v1/messages后缀,避免重复拼接 |
ANTHROPIC_MODEL | 默认主模型名 | claude-sonnet | 必须和网关或官方 API 可识别的模型名一致 |
ANTHROPIC_SMALL_FAST_MODEL | 后台轻量任务的模型名 | claude-haiku | 如果没有配置,默认按 Anthropic 客户端逻辑回退 |
在终端里,推荐把环境变量写在项目级.env文件或启动脚本中,而不是塞进全局配置。在 VS Code 中可以通过任务或调试配置注入环境变量,也可以在 Claude Code 的设置文件中配置。最稳妥的方式是先通过 Shell 文件确认变量:
env | grep -i anthropic如果看到某个变量存在且指向旧网关,而当前项目想使用新网关,就必须先清理旧变量。很多“配置改了不生效”的案例,原因是 Shell 启动时加载了旧的环境变量,而不是项目内新写的那一行。
2.2expected a gateway model route reference到底在说什么
当你把ANTHROPIC_BASE_URL指向一个兼容网关时,网关不仅要接收请求,还要以 Anthropic Messages API 的格式返回响应。Claude Code 收到响应后,会校验响应中的模型来源和路由信息。
如果你看到doesn't look like an Anthropic model: expected a gateway model route reference,常见的解释是:Claude Code 认为这次请求没有落到一个能够被它识别的 Anthropic 模型路由上。
可能的原因有三种:
- 网关配置的模型名和
ANTHROPIC_MODEL不一致。 - 网关把请求转发到了 OpenAI 风格的接口,返回的是
choices结构,而不是 Anthropic 的content结构。 - 网关本身支持多个模型,但没有把当前请求路由到 Anthropic 兼容模型上。
如果只是把api.anthropic.com改成本地地址,却没有在本地服务里实现/v1/messages协议转换,就很容易出现这个错误。它并不是“Claude Code 不认识 Anthropic”,而是“网关没有给出 Claude Code 认识的路由和响应格式”。
2.3 Claude Code 可以接入非 Anthropic 模型吗
很多团队问过这个问题。从协议和工具链上看,Claude Code 的对话流程并不是直接兼容任意模型的 JSON 格式。官方客户端会发送 Anthropic Messages 格式的请求,其中包含工具定义、多轮历史、系统提示词等结构。如果希望把请求路由到一个非 Anthropic 模型,必须在上游前面保留一层协议转换网关。
可行的做法是:Claude Code 仍按 Anthropic 格式向网关发请求,网关把请求转换成目标模型供应商的格式,例如 OpenAI Chat Completions 格式或本地模型的 OpenAI 兼容格式;目标模型返回后,网关再把结果转换成 Anthropic Messages 格式返回给 Claude Code。
这个方案在技术上是可完成的,但需要注意几个边界:
- 非 Anthropic 模型未必支持 Claude Code 需要的所有工具