Claude Agent SDK 与 CLI 对比完全指南
目录
概述
什么是 Claude Agent SDK 和 Claude CLI?
Claude CLI (Claude Code) 是 Anthropic 官方提供的命令行交互工具,专为开发者设计,提供了丰富的开发辅助功能。
Claude Agent SDK 是用于构建自定义 AI 代理的编程接口,允许开发者将 Claude 集成到自己的应用程序中。
Claude直连平台 🔗Weelinking Opus4.6 效率十倍提升。 第一时间体验 Opus4.6
核心差异一览
| 特性 | Claude CLI | Agent SDK (默认) | Agent SDK (预设模式) |
|---|---|---|---|
| 系统提示 | 模块化架构(~269+ 基础token) | 最小化 | 模块化(匹配CLI) |
| 内置工具 | 18+ 个工具 | 仅提供的工具 | 18+ 个工具 |
| 自动加载 CLAUDE.md | ✅ 是 | ❌ 否 | ❌ 需配置 |
| 编码规范 | ✅ 包含 | ❌ 无 | ✅ 包含 |
| 安全规则 | ✅ 完整 | ⚠️ 基础 | ✅ 完整 |
| 输出确定性 | ❌ 无保证 | ❌ 无保证 | ❌ 无保证 |
| 使用场景 | 交互式开发 | 程序集成 | 匹配CLI行为 |
系统提示对比
Claude CLI 的系统提示架构
Claude CLI 采用模块化系统提示架构,由 110+ 个系统提示字符串组成,基础提示约 269 个 token,根据激活的功能条件加载额外内容。
系统提示组件详解
| 组件 | 说明 | 加载方式 | Token 影响 |
|---|---|---|---|
| 基础系统提示 | 核心指令和行为规范 | 始终加载 | ~269 tokens |
| 工具指令 | 18+ 个内置工具说明 | 始终加载 | 中等 |
| 编码指南 | 代码风格、格式、安全实践 | 始终加载 | 中等 |
| 安全规则 | 拒绝规则、注入防御、危害预防 | 始终加载 | 中等 |
| 响应风格 | 语气、详细程度、emoji使用 | 始终加载 | 较小 |
| 环境上下文 | 工作目录、git状态、平台信息 | 始终加载 | 较小 |
| 项目上下文 | CLAUDE.md 内容、设置、钩子配置 | 条件加载 | 可变 |
| 子代理提示 | 计划模式、探索代理、任务代理 | 条件加载 | 较大 |
| 安全审查 | 扩展安全指令 | 条件加载 | ~2,610 tokens |
关键特性:
- ✅ 模块化架构,根据需求灵活组合
- ✅ 基础提示精简,总量根据激活功能而变化
- ✅ 包含广泛的安全和注入防御层
- ✅ 自动加载工作目录中的 CLAUDE.md 文件
- ✅ 交互模式下保持会话持久上下文
Agent SDK 的系统提示架构
默认模式(最小化)
SDK 默认使用最小化系统提示,仅包含:
| 组件 | 说明 | Token 影响 |
|---|---|---|
| 基本工具指令 | 仅显式提供的工具 | 最小 |
| 基础安全 | 最小安全指令 | 最小 |
特点:
- ❌ 默认无编码指南或风格偏好
- ❌ 默认无项目上下文
- ❌ 无详细工具描述
- ✅ 需要显式配置以匹配 CLI 行为
预设模式(claude_code)
可以通过配置启用与 CLI 相同的系统提示:
typescript
import { query } from "@anthropic-ai/agent-sdk";
const response = await query({
prompt: "您的问题",
options: {
systemPrompt: {
type: "preset",
preset: "claude_code" // 使用 CLI 预设
}
}
});
使用预设后,系统提示结构与 CLI 相同,但仍需配置 settingSources 来加载 CLAUDE.md。
核心区别详解
1. 发送的内容差异
通过 Claude CLI 发送
当你向 Claude CLI 发送消息时:
系统提示: [模块化, ~269+ 基础 tokens]
├── 基础系统提示 (~269 tokens)
├── 工具指令 (Write, Read, Edit, Bash, Grep, Glob 等)
├── Git 安全协议
├── 代码引用指南
├── 专业客观性指令
├── 安全和注入防御规则
├── 环境上下文 (操作系统、目录、日期)
├── CLAUDE.md 内容 (如果存在) [条件加载]
├── MCP 工具描述 (如果配置) [条件加载]
├── 计划/探索模式提示 [条件加载]
└── 会话/对话上下文
用户消息: "挪威的首都是什么?"
通过 Agent SDK (默认) 发送
系统提示: [最小化]
├── 基本工具指令 (如果提供了工具)
└── 基本操作上下文
用户消息: "挪威的首都是什么?"
Claude直连平台 🔗Weelinking Opus4.6 效率十倍提升。 第一时间体验 Opus4.6
通过 Agent SDK (claude_code 预设) 发送
typescript
const response = await query({
prompt: "挪威的首都是什么?",
options: {
systemPrompt: {
type: "preset",
preset: "claude_code"
},
settingSources: ["project"] // 加载项目上下文
}
});
系统提示: [模块化, 匹配 CLI]
├── 完整 Claude Code 系统提示
├── 工具指令
├── 编码指南
└── 安全规则
// 注意: 仍需配置 settingSources 来加载 CLAUDE.md
2. 自定义方式对比
Claude CLI 自定义
| 方法 | 命令 | 效果 |
|---|---|---|
| 追加到提示 | claude -p "..." --append-system-prompt "..." |
添加指令,保留默认设置 |
| 替换提示 | claude -p "..." --system-prompt "..." |
完全替换系统提示 |
| 项目上下文 | CLAUDE.md 文件 | 自动加载,持久化 |
| 输出样式 | /output-style [名称] |
应用预定义响应样式 |
示例:
bash
# 追加自定义指令
claude -p "修复这个bug" --append-system-prompt "使用详细的注释解释每个步骤"
# 完全替换系统提示
claude -p "生成报告" --system-prompt "你是一个技术写作专家"
Agent SDK 自定义
| 方法 | 配置 | 效果 |
|---|---|---|
| 自定义提示 | systemPrompt: "..." |
完全替换(会丢失工具) |
| 预设 + 追加 | systemPrompt: { type: "preset", preset: "claude_code", append: "..." } |
保留 CLI 功能 + 自定义指令 |
| CLAUDE.md 加载 | settingSources: ["project"] |
加载项目级指令 |
| 输出样式 | settingSources: ["user"] 或 settingSources: ["project"] |
加载保存的输出样式 |
示例:
typescript
// 方式1: 自定义提示(会丢失工具功能)
const response1 = await query({
prompt: "生成报告",
options: {
systemPrompt: "你是一个技术写作专家"
}
});
// 方式2: 预设 + 追加(推荐)
const response2 = await query({
prompt: "修复这个bug",
options: {
systemPrompt: {
type: "preset",
preset: "claude_code",
append: "使用详细的注释解释每个步骤"
},
settingSources: ["project", "user"]
}
});
输出一致性分析
⚠️ 重要发现:无确定性保证
Claude Messages API 不提供 seed 参数来保证可重现性。 这是一个根本性的架构限制。
阻止完全一致输出的因素
| 因素 | 说明 | 可控? |
|---|---|---|
| 系统提示差异 | CLI 与 SDK 默认设置不同 | ✅ 可以(通过配置) |
| 浮点运算 | 并行硬件的微小差异 | ❌ 不可控 |
| MoE 路由 | 混合专家架构的路由变化 | ❌ 不可控 |
| 批处理/调度 | 云基础设施差异 | ❌ 不可控 |
| 数值精度 | 推理引擎变化 | ❌ 不可控 |
| 模型快照 | 版本更新/变更 | ❌ 不可控 |
Temperature 和采样
即使设置 temperature=0.0(贪婪解码):
- ❌ 不保证完全确定性
- ⚠️ 由于基础设施因素,仍可能出现细微变化
- 🐛 已知问题:Claude CLI 对相同输入产生非确定性输出
实现最大一致性的方法
要在 SDK 和 CLI 之间获得尽可能接近的相同输出:
SDK 配置示例
typescript
import Anthropic from "@anthropic-ai/sdk";
import { query } from "@anthropic-ai/agent-sdk";
// 使用 Messages API
const client = new Anthropic();
const response = await client.messages.create({
model: "claude-sonnet-4-20250514",
max_tokens: 1024,
temperature: 0, // 贪婪解码
system: "匹配 CLI 的系统提示内容",
messages: [
{ role: "user", content: "挪威的首都是什么?" }
]
});
// 使用 Agent SDK query 函数
for await (const message of query({
prompt: "挪威的首都是什么?",
options: {
systemPrompt: {
type: "preset",
preset: "claude_code"
},
temperature: 0,
model: "claude-sonnet-4-20250514",
settingSources: ["project"] // 像 CLI 一样加载项目上下文
}
})) {
// 处理响应
}
CLI 配置示例
bash
# 匹配 SDK 配置
claude -p "挪威的首都是什么?" \
--model claude-sonnet-4-20250514 \
--temperature 0
⚠️ 仍不保证一致
即使配置完全匹配:
- 输出可能在不同运行之间有所不同
- 输出可能在 SDK 和 CLI 之间有所不同
- 不存在 seed 参数来强制可重现性
实战配置方案
场景 1: 在 SDK 中完全复现 CLI 行为
需求: 在自己的应用中获得与 CLI 相同的体验。
配置方案:
typescript
import { query } from "@anthropic-ai/agent-sdk";
for await (const message of query({
prompt: "帮我重构这段代码",
options: {
// 使用 claude_code 预设
systemPrompt: {
type: "preset",
preset: "claude_code",
append: "特别注意代码的可读性和性能优化"
},
// 加载项目和用户设置
settingSources: ["project", "user"],
// 使用推荐模型
model: "claude-sonnet-4-20250514",
// 贪婪解码(最大一致性)
temperature: 0,
// 其他 CLI 默认设置
max_tokens: 4096
}
})) {
console.log(message);
}
场景 2: 轻量级 SDK 集成(最小 token 使用)
需求: 在应用中嵌入 Claude,但不需要完整的开发工具功能。
配置方案:
typescript
import { query } from "@anthropic-ai/agent-sdk";
for await (const message of query({
prompt: "总结这篇文章的要点",
options: {
// 使用自定义系统提示(轻量级)
systemPrompt: "你是一个专业的内容总结助手,善于提取关键信息",
// 不加载额外设置
settingSources: [],
// 使用快速模型
model: "claude-haiku-4-5-20251001",
// 允许一些创造性
temperature: 0.3
}
})) {
console.log(message);
}
场景 3: CLI 中添加自定义指令
需求: 使用 CLI 的完整功能,但添加项目特定的指令。
方式 1: 使用 CLAUDE.md(推荐)
在项目根目录创建 .claude/CLAUDE.md 或 CLAUDE.md:
markdown
# 项目指南
## 编码规范
- 使用 TypeScript strict 模式
- 所有函数必须有 JSDoc 注释
- 优先使用函数式编程风格
## 测试要求
- 每个功能必须有单元测试
- 测试覆盖率不低于 80%
## 提交规范
- 使用 Conventional Commits 格式
- 提交前必须运行 lint 和 test
方式 2: 使用命令行参数
bash
# 追加指令
claude -p "添加用户认证功能" \
--append-system-prompt "遵循 OWASP 安全最佳实践,使用 JWT 进行身份验证"
# 完全自定义
claude -p "生成 API 文档" \
--system-prompt "你是一个 API 文档专家,生成符合 OpenAPI 3.0 规范的文档"
场景 4: 批量处理任务(SDK)
需求: 自动化处理大量代码审查或文档生成任务。
配置方案:
typescript
import { query } from "@anthropic-ai/agent-sdk";
async function batchReview(files: string[]) {
const results = [];
for (const file of files) {
const fileContent = await readFile(file);
for await (const message of query({
prompt: `审查以下代码并提供改进建议:\n\n${fileContent}`,
options: {
systemPrompt: {
type: "preset",
preset: "claude_code",
append: `
专注于以下方面:
1. 代码质量和可维护性
2. 性能问题
3. 安全漏洞
4. 最佳实践遵循情况
`
},
model: "claude-sonnet-4-20250514",
temperature: 0,
// 缓存系统提示以提高性能
settingSources: ["project"]
}
})) {
results.push({ file, review: message });
}
}
return results;
}
Claude直连平台 🔗Weelinking Opus4.6 效率十倍提升。 第一时间体验 Opus4.6
使用场景推荐
何时使用 Claude CLI
| 场景 | 原因 |
|---|---|
| 交互式开发 | 完整工具套件,项目上下文自动加载 |
| 快速原型 | 无需配置,开箱即用 |
| 学习和实验 | 内置帮助和示例 |
| 一次性任务 | 快速设置,即时上下文 |
| 团队协作 | 通过 CLAUDE.md 共享项目知识 |
典型使用:
bash
# 快速开始开发
cd my-project
claude
# 一次性任务
claude -p "生成这个API的测试用例"
# 使用项目配置
claude # 自动加载 .claude/CLAUDE.md
何时使用 Agent SDK
| 场景 | 原因 |
|---|---|
| 程序化集成 | 细粒度控制,嵌入到应用中 |
| 一致的 API 响应 | 更多系统提示控制 |
| 批量处理 | 更适合自动化管道 |
| 自定义工作流 | 构建定制的 AI 工作流 |
| 生产环境 | 可预测的行为,错误处理 |
典型使用:
typescript
// 嵌入到 Web 应用
app.post('/api/code-review', async (req, res) => {
for await (const message of query({
prompt: req.body.code,
options: {
systemPrompt: { type: "preset", preset: "claude_code" }
}
})) {
res.write(message);
}
res.end();
});
// 自动化管道
async function automatedPipeline() {
// 步骤 1: 生成代码
// 步骤 2: 审查代码
// 步骤 3: 生成文档
// 步骤 4: 创建测试
}
混合使用策略
推荐工作流:
1. 开发阶段 → Claude CLI (终端)
2. 测试验证 → Claude CLI (交互式调试)
3. 自动化集成 → Agent SDK (程序化)
4. 生产部署 → Agent SDK (稳定 API)
常见问题解答
Q1: 为什么 SDK 和 CLI 给出的答案不完全一样?
A: 主要有三个原因:
- 系统提示不同 - CLI 默认有丰富的系统提示,SDK 默认最小化
- 上下文不同 - CLI 自动加载 CLAUDE.md 和项目上下文
- 非确定性 - Claude API 没有 seed 参数,即使配置相同也可能有细微差异
解决方案: 使用 claude_code 预设 + settingSources: ["project"]
Q2: 如何让 SDK 行为与 CLI 完全一致?
A: 使用以下配置:
typescript
const options = {
systemPrompt: {
type: "preset",
preset: "claude_code"
},
settingSources: ["project", "user"],
model: "claude-sonnet-4-20250514",
temperature: 0
};
注意: 即使这样也不能保证 100% 一致,因为存在基础设施层面的非确定性。
Q3: 系统提示会消耗多少 token?
A: Token 消耗情况:
| 配置 | 基础 Token | 额外内容 |
|---|---|---|
| SDK(最小) | 极少 | 仅基本工具指令 |
| SDK(claude_code 预设) | ~269+ | 根据激活功能变化 |
| CLI(默认) | ~269+ | + 项目上下文 + MCP 工具 |
| CLI(启用 MCP) | ~269+ | + 大量 MCP 工具描述 |
建议:
- 如果上下文预算紧张,使用最小化系统提示
- 如果需要完整功能,接受额外的 token 消耗
Q4: 可以完全禁用系统提示吗?
A: 不推荐,但技术上可以:
typescript
// ⚠️ 不推荐:会丢失所有工具功能
const response = await query({
prompt: "你的问题",
options: {
systemPrompt: "" // 空系统提示
}
});
后果:
- ❌ 失去所有内置工具(Read、Write、Edit 等)
- ❌ 失去编码规范和安全规则
- ❌ Claude 行为可能不可预测
Q5: CLAUDE.md 和系统提示有什么区别?
A:
| 特性 | CLAUDE.md | 系统提示 |
|---|---|---|
| 用途 | 项目特定指令 | 全局行为规范 |
| 加载 | CLI 自动,SDK 需配置 | 始终存在 |
| 版本控制 | 通常提交到 git | 不提交 |
| 团队共享 | ✅ 是 | ❌ 否 |
| 优先级 | 高(可覆盖部分系统提示) | 低 |
最佳实践:
- 系统提示:通用行为(如语气、安全规则)
- CLAUDE.md:项目特定规则(如编码规范、架构决策)
Q6: 如何查看完整的系统提示内容?
A:
CLI 方式:
bash
# 启用调试模式
claude --debug
# 查看系统提示组件
# 系统提示会在调试输出中显示
SDK 方式:
typescript
import { query } from "@anthropic-ai/agent-sdk";
// 启用详细日志
process.env.DEBUG = "anthropic:*";
for await (const message of query({
prompt: "测试",
options: {
systemPrompt: { type: "preset", preset: "claude_code" }
}
})) {
// 系统提示会在日志中输出
}
Q7: temperature=0 真的能保证确定性吗?
A: ❌ 不能保证
虽然 temperature=0 使用贪婪解码(总是选择最可能的 token),但由于以下因素仍可能产生不同输出:
- 浮点运算的微小差异
- 并行计算的执行顺序
- 模型快照的更新
- 基础设施的变化
建议:
- 不要依赖位级别的可重现性
- 使用结构化输出和验证逻辑
- 对关键任务考虑使用多次生成 + 一致性检查
Q8: 如何在保持功能的同时减少 token 消耗?
A: 策略组合:
typescript
// 1. 使用更快的模型处理子任务
const haiku_options = {
model: "claude-haiku-4-5-20251001", // 更快、更便宜
systemPrompt: "简化的系统提示"
};
// 2. 仅在需要时启用完整功能
const full_options = {
systemPrompt: {
type: "preset",
preset: "claude_code"
},
settingSources: ["project"] // 仅在需要项目上下文时加载
};
// 3. 使用提示缓存
// Claude 会自动缓存系统提示,减少重复消耗
总结
核心要点
- 系统提示不同 - CLI 使用模块化架构(~269+ 基础 token),SDK 默认最小化
- 无确定性保证 - 即使配置相同,输出也可能不同
- 可配置匹配 - SDK 可以通过
claude_code预设匹配 CLI 行为 - 场景选择 - CLI 适合交互开发,SDK 适合程序集成
选择建议
| 如果你需要... | 使用 |
|---|---|
| 交互式开发和调试 | Claude CLI |
| 嵌入到应用程序 | Agent SDK |
| 批量自动化处理 | Agent SDK |
| 快速原型和实验 | Claude CLI |
| 生产环境集成 | Agent SDK (claude_code 预设) |
| 团队协作和知识共享 | Claude CLI + CLAUDE.md |
最佳实践
- 不依赖完全确定性 - 构建能容忍输出变化的应用
- 使用结构化输出 - 通过 JSON schema 验证
- 在 SDK 中匹配 CLI - 使用
claude_code预设 +settingSources - 合理使用 token - 根据任务复杂度选择系统提示级别
- 善用 CLAUDE.md - 团队共享项目特定知识