TypeScript
使用 Claude Code TypeScript SDK 构建自定义 AI 代理
先决条件
- Node.js 18+
安装
从 NPM 安装 @anthropic-ai/claude-code
:
要查看 TypeScript SDK 源代码,请访问 NPM 上的 @anthropic-ai/claude-code
页面。
基本用法
通过 TypeScript SDK 的主要接口是 query
函数,它返回一个异步迭代器,在消息到达时流式传输消息:
配置选项
参数 | 类型 | 描述 | 默认值 |
---|---|---|---|
abortController | AbortController | 用于取消操作的中止控制器 | new AbortController() |
additionalDirectories | string[] | 要包含在会话中的附加目录 | undefined |
allowedTools | string[] | Claude 被允许使用的工具列表 | 默认启用所有工具 |
appendSystemPrompt | string | 要附加到默认系统提示的文本 | undefined |
canUseTool | (toolName: string, input: any) => Promise<ToolPermissionResult> | 工具使用的自定义权限函数 | undefined |
continue | boolean | 继续最近的会话 | false |
customSystemPrompt | string | 完全替换默认系统提示 | undefined |
cwd | string | 当前工作目录 | process.cwd() |
disallowedTools | string[] | Claude 不被允许使用的工具列表 | undefined |
env | Dict<string> | 要设置的环境变量 | undefined |
executable | 'bun' | 'deno' | 'node' | 要使用的 JavaScript 运行时 | 使用 Node.js 运行时为 node ,使用 Bun 运行时为 bun |
executableArgs | string[] | 传递给可执行文件的参数 | [] |
fallbackModel | string | 主模型失败时使用的模型 | undefined |
hooks | Partial<Record<HookEvent, HookCallbackMatcher[]>> | 用于自定义的生命周期钩子 | undefined |
includePartialMessages | boolean | 在消息流中包含部分流式事件 | false |
maxThinkingTokens | number | Claude 思考过程的最大令牌数 | undefined |
maxTurns | number | 对话轮次的最大数量 | undefined |
mcpServers | Record<string, McpServerConfig> | MCP 服务器配置 | undefined |
model | string | 要使用的 Claude 模型 | 使用 CLI 配置的默认值 |
pathToClaudeCodeExecutable | string | Claude Code 可执行文件的路径 | 与 @anthropic-ai/claude-code 一起提供的可执行文件 |
permissionMode | PermissionMode | 会话的权限模式 | "default" (选项:"default" , "acceptEdits" , "bypassPermissions" , "plan" ) |
resume | string | 要恢复的会话 ID | undefined |
stderr | (data: string) => void | stderr 输出的回调 | undefined |
strictMcpConfig | boolean | 强制严格的 MCP 配置验证 | undefined |
部分消息流式传输
当启用 includePartialMessages
时,SDK 将发出包含来自 Claude API 的原始流式事件的 stream_event
消息。这允许您在内容生成时访问部分内容,对于实现实时 UI 更新或进度指示器很有用。
每个 stream_event
消息包括:
event
:来自 API 的原始流式事件session_id
:当前会话标识符parent_tool_use_id
:正在执行的工具的 ID(如果适用)uuid
:此事件的唯一标识符
部分消息流式传输主要对需要对流式响应进行精细控制的高级用例有用。对于大多数应用程序,默认行为(等待完整消息)就足够了。
多轮对话
对于多轮对话,您有两个选择。
您可以生成响应并恢复它们,或者您可以使用流式输入模式,该模式接受消息数组的异步/生成器。目前,流式输入模式是通过消息附加图像的唯一方式。
使用会话管理恢复
流式输入模式
流式输入模式允许您将消息作为异步可迭代对象而不是单个字符串提供。这启用了多轮对话、图像附件和动态消息生成:
带图像的流式输入
流式输入模式是通过消息附加图像的唯一方式:
自定义系统提示
系统提示定义您的代理的角色、专业知识和行为:
MCP 服务器集成
模型上下文协议(MCP)让您为代理提供自定义工具和功能:
使用进程内 MCP 服务器的自定义工具
SDK MCP 服务器允许您创建直接在应用程序进程中运行的自定义工具,提供类型安全的工具执行,而无需单独进程或网络通信的开销。
创建自定义工具
使用 createSdkMcpServer
和 tool
辅助函数定义类型安全的自定义工具:
使用 Zod 的类型安全
tool
辅助函数从您的 Zod 模式提供完整的 TypeScript 类型推断:
钩子
钩子允许您通过在代理生命周期的各个点运行自定义回调来自定义和扩展 Claude Code 的行为。与执行 bash 命令的 CLI 钩子不同,SDK 钩子是在进程内运行的 JavaScript/TypeScript 函数。
定义钩子
钩子按事件类型组织,具有可选的匹配器来过滤它们何时运行:
可用的钩子事件
- PreToolUse:在工具执行之前运行。可以阻止工具或提供反馈。
- PostToolUse:在成功的工具执行之后运行。
- UserPromptSubmit:当用户提交提示时运行。
- SessionStart:当会话开始时运行。
- SessionEnd:当会话结束时运行。
- Stop:当 Claude 即将停止响应时运行。
- SubagentStop:当子代理即将停止时运行。
- PreCompact:在对话压缩之前运行。
- Notification:当发送通知时运行。
钩子输入类型
每个钩子根据事件接收类型化输入:
钩子输出
钩子返回控制执行流程的输出:
实际示例
日志记录和监控
文件操作验证
自动格式化代码
提示增强
自定义压缩指令
钩子执行行为
- 并行化:所有匹配的钩子并行运行
- 超时:钩子遵守选项中的中止信号
- 错误处理:钩子错误被记录但不会停止执行
- 匹配器:支持正则表达式模式(例如,
"Write|Edit"
)
将钩子与 canUseTool 结合
虽然 canUseTool
提供权限控制,但钩子提供更广泛的生命周期集成:
使用 canUseTool 进行权限控制
canUseTool
回调提供对工具执行的细粒度控制。它在每次工具使用之前被调用,可以允许、拒绝或修改工具输入:
canUseTool 的用例
- 权限管理:在允许工具执行之前检查用户权限
- 输入验证:在执行之前验证或清理工具输入
- 速率限制:为昂贵的操作实施速率限制
- 审计日志:记录工具使用以进行合规或调试
- 动态权限:根据运行时条件启用/禁用工具
输出格式
文本输出(默认)
JSON 输出
输入格式
代理集成示例
SRE 事件响应代理
自动化安全审查
多轮法律助手
消息模式
从 JSON API 返回的消息根据以下模式严格类型化:
其他支持类型:
Message
、MessageParam
和 Usage
类型在 Anthropic TypeScript SDK 中可用。
相关资源
- CLI 用法和控制 - 完整的 CLI 文档
- GitHub Actions 集成 - 使用 Claude 自动化您的 GitHub 工作流程
- 常见工作流程 - 常见用例的分步指南