Claude Agent SDK
Claude Agent SDK 的调用栈本质
Claude Agent SDK 并非直接调用 Anthropic API 的 HTTP 客户端,而是把 Claude Code CLI 当作子进程启动的可编程封装层。
TypeScript SDK 通过 query() 等 API 启动本地 Claude Code 二进制,由 CLI 子进程自治执行 Read、Edit、Bash 等内置工具,并维护会话持久化。因此它的能力边界、
升级节奏和 bug 行为与 Claude Code CLI 强绑定。
见:Agent SDK overview - Claude Code Docs
Claude Agent SDK 的 User-Agent 结构
通过 Agent SDK 发起的请求,其 User-Agent 由 Claude Code CLI 子进程生成,模板为:
claude-cli/<version>(external, <entrypoint>, agent-sdk/<sdk-version>[, client-app/<app-id>])
其中 external 标记请求来自外部客户端;<entrypoint> 由 CLAUDE_CODE_ENTRYPOINT 环境变量决定,TypeScript SDK 默认 sdk-ts,
Python SDK 默认 sdk-py,Claude Desktop Code tab 为 local-agent;
agent-sdk/<sdk-version> 由 SDK 强制写入 CLAUDE_AGENT_SDK_VERSION;
client-app/<app-id> 可通过 options.env 中的 CLAUDE_AGENT_SDK_CLIENT_APP 自定义。
见:Environment variables - Claude Code Docs
通过 ANTHROPIC_CUSTOM_HEADERS 覆盖 Claude Code User-Agent
Claude Code CLI 向 Anthropic API 发送请求时,允许通过 ANTHROPIC_CUSTOM_HEADERS 环境变量注入自定义 HTTP headers,实测可用其覆盖默认的 User-Agent。
该变量采用 Name: Value 格式,多个 header 用换行(\n)分隔,既可配置在 shell 环境,也可写入 ~/.claude/settings.json 的 env 字段中。
此机制常用于将 Claude Code 路由到内部 LLM 网关或代理,但也可以直接修改请求标识。
示例:
export ANTHROPIC_CUSTOM_HEADERS="User-Agent: MyAgent/1.0
X-Request-ID: abc-123"
由于 User-Agent 只是普通 HTTP header,在 Claude Code 的自定义 header 机制中会被最终请求采用,覆盖掉 CLI 默认生成的 User-Agent。 Anthropic 侧对客户端的识别并不依赖 User-Agent,而是依赖 system prompt 中的 billing header,因此修改 User-Agent 不会影响订阅计费或客户端身份判定。
见:Environment variables - Claude Code Docs
CLAUDE_CODE_ENTRYPOINT 的入口点映射
CLAUDE_CODE_ENTRYPOINT 不仅影响 User-Agent 括号内的字符串,也决定 Anthropic 内部遥测对客户端类别的归类。常见入口点与 telemetry 分类的映射包括:
cli → claude_code_cli、sdk-ts/sdk-py → claude_code_sdk、local-agent → claude_code_local_agent、
claude-vscode → claude_code_vscode、各类 remote_* → claude_code_remote、mcp → claude_code_mcp。
SDK 用户可在 options.env 中显式覆盖入口点,但未知入口点会落入默认分类。
Agent SDK 与 Vercel AI SDK 的调用栈差异
Vercel AI SDK 的 @ai-sdk/anthropic 是进程内直接调用 Anthropic API,其 User-Agent 以 ai/、
ai-sdk/provider-utils/ 和 ai-sdk/anthropic/ 为前缀;Agent SDK 则是进程内托管 Claude Code CLI,由 CLI 再发出 API 请求。前者适合单次模型调用,
后者适合需要自动读写文件、执行命令、管理多轮会话的自主任务。两者在鉴权头、模型 ID 映射、工具执行位置和会话状态管理上也存在显著差异。