所属专题簇:运行协议与接入面
建议前读:17. 系统提示词与模型决策
Claude Code 最终是如何把一次模型调用真正发往 Anthropic、Bedrock、Vertex 或 Foundry 的?
模型选择只是第一层;真正的执行还要经过 provider 路由、认证准备、region 决策、session ingress、retry 与错误处理,Claude Code 在这一层实现的是完整的模型接入控制面。
这一章解释 Claude Code 在 prompt / model 决策之后,如何真正建立 API client、选择 provider、准备 auth 与网络参数,并把请求可靠发出去。
model不等于provider,Claude Code 明确区分两者。- 鉴权方式不是单一 API key,而是支持 OAuth、AWS、GCP、Foundry 等多种路径。
- API client 层对 Claude Code 很重要,因为它决定了同一套 agent 行为能否跨不同模型平台复用。
如果 Claude Code 只是一个“只会请求 Anthropic 官方 API”的客户端,这一层会很薄。但当前实现显然假设它需要面对多种模型来源、不同云提供商和不同认证方式。
所以这一层的目标不是“发请求”,而是把“统一的 Claude Code agent 行为”映射到“异构 provider 的接入现实”。
- API client:src/services/api/client.ts
- API 服务目录:src/services/api/
- provider 解析:src/utils/model/providers.ts
- auth 入口:src/utils/auth.js
- bootstrap 状态:src/bootstrap/state.ts
flowchart TD
A["session model decision"] --> B["provider resolution"]
B --> C["auth preparation"]
C --> D["region / endpoint / proxy"]
D --> E["Anthropic SDK client"]
E --> F["retry / error handling / session ingress"]
F --> G["response back to QueryEngine"]
src/services/api/client.ts 顶部注释和 import 可以直接确认至少有这些接入面:
- Direct Anthropic API
- AWS Bedrock
- Azure Foundry
- Vertex AI
这说明 Claude Code 并不是把“模型 API”写死成单一 Anthropic 终点,而是把 provider 当作正式的运行时维度。
同一文件中直接 import 了:
getAnthropicApiKeygetClaudeAIOAuthTokensrefreshAndGetAwsCredentialsrefreshGcpCredentialsIfNeeded
这说明 Claude Code 既支持直接 API key,也支持 Claude.ai OAuth,以及云厂商风格的短期凭证刷新。
这层会影响:
- 实际 base URL
- auth header 生成方式
- region 决策
- 是否属于 first-party Anthropic base URL
- 某些 provider 下的模型别名和可见模型列表
所以研究 Claude Code 的行为时,只看“最后选中了哪个模型名”是不够的。
src/services/api/ 中还出现了:
sessionIngress.tswithRetry.tsusage.tspromptCacheBreakDetection.ts
这说明 API 层不是纯粹的“发一次 messages 请求”,而是同时承担长期会话、计费/usage、缓存与重试治理。
Claude Code 在这一层体现出的思路是:
- agent 行为骨架尽量统一
- 模型供应面保持可切换
- 鉴权与 provider 复杂性被收敛进接入层
这是一种典型的平台化设计,而不是“某个 prompt 套某个模型”的硬绑定产品。
17章讲的是“选什么模型”;这一章讲的是“怎么真正连上它”。- Claude Code 在 API 层已经做好了多 provider、多 auth、多 region 的工程准备。
- 这解释了为什么它更像 agent 平台,而不是只服务单一 API 的薄客户端。