TypeScript SDK 参考:安装与函数
Agent SDK TypeScript 的安装、编译为单文件可执行、/core 入口,以及 query、startup、prewarm、tool、createSdkMcpServer、会话函数、resolveSettings 的完整签名、参数与返回值。
本页是 TypeScript Agent SDK 参考的第一部分:安装和所有函数的签名。Options、Query 等类型见「TypeScript SDK 参考:选项与类型」,消息类型和 hook 类型见「TypeScript SDK 参考:消息与 hook」,工具输入输出和权限更新类型见「TypeScript SDK 参考:工具与权限类型」。
安装
npm install @anthropic-ai/claude-agent-sdkSDK 把适用于你平台的原生 Claude Code 二进制作为可选依赖捆绑(如 @anthropic-ai/claude-agent-sdk-darwin-arm64),大多数安装不需要单独安装 Claude Code;SDK 版本与它捆绑的 CLI 版本一致。如果你的包管理器不应用 npm 的 libc 字段(如 Yarn 1.x),在 Linux 上会同时装上 glibc 和 musl 两个平台包,安装体积约翻倍。
编译为单个可执行文件
用 bun build --compile 把应用编译成单文件可执行时,SDK 无法在运行时解析捆绑的 CLI 二进制(require.resolve 在编译后可执行文件的 $bunfs 虚拟文件系统里不起作用)。变通办法:把平台二进制嵌入为文件资源,启动时用 extractFromBunfs()(需要 SDK v0.3.144 或更高)把它提取到真实路径,并把该路径传给 pathToClaudeCodeExecutable:
const cliPath = extractFromBunfs(binPath);
for await (const message of query({
prompt: "Hello",
options: { pathToClaudeCodeExecutable: cliPath },
})) {
console.log(message);
}extractFromBunfs() 把嵌入的二进制从编译后可执行文件的虚拟文件系统复制到每用户临时目录并返回真实路径;在编译后的可执行文件之外它原样返回输入路径。每个编译后的可执行文件只嵌入一个平台的二进制,要让导入的平台包与你的 --target 匹配;交叉编译要强制安装不匹配的平台包;Windows 上二进制子路径是 claude.exe。
打包时使用 /core 入口
如果你的应用把 Agent SDK 与自己的依赖一起打包,从 @anthropic-ai/claude-agent-sdk/core 而不是包根导入(需要 TypeScript Agent SDK v0.3.282 或更高)。/core 入口导出与根入口相同的 query()、startup()、tool()、createSdkMcpServer() 和 resolveSettings(),以及重命名、打标签和删除会话的函数等;根入口内联自己的 zod 和 @modelcontextprotocol/sdk 副本,而 /core 入口从你的 node_modules 按 Agent SDK 的 peerDependencies 声明的范围导入它们,所以已经包含它们的打包不会重复。
函数
query()
与 Claude Code 交互的主函数,创建一个在消息到达时流式产出的异步生成器。
function query({
prompt,
options
}: {
prompt: string | AsyncIterable<SDKUserMessage>;
options?: Options;
}): Query;| 参数 | 类型 | 说明 |
|---|---|---|
prompt | string | AsyncIterable<SDKUserMessage> | 输入提示:字符串,或流式模式下的异步可迭代对象 |
options | Options | 可选的配置对象(见「选项与类型」) |
返回一个 Query 对象,它扩展 AsyncGenerator<SDKMessage, void> 并带额外方法。
startup()
预热 CLI 子进程:在提示可用之前就派生它并完成初始化握手。返回的 WarmQuery 句柄稍后接受提示并写入已就绪的进程,所以第一次 query() 调用不必内联付出子进程派生和初始化的代价。如果还不知道会话的工作目录,改用 prewarm()。
function startup(params?: {
options?: Options;
initializeTimeoutMs?: number;
}): Promise<WarmQuery>;| 参数 | 类型 | 说明 |
|---|---|---|
options | Options | 可选配置,与 query() 的 options 参数相同 |
initializeTimeoutMs | number | 等待子进程初始化的最长毫秒数,默认 60000;超时未完成则 promise 以超时错误拒绝 |
返回 Promise<WarmQuery>,在子进程派生并完成初始化握手后解析。尽早(例如应用启动时)调用 startup(),在提示就绪时对返回的句柄调用 .query(),这就把子进程派生和初始化挪出了关键路径:
import { startup } from "@anthropic-ai/claude-agent-sdk";
// 预先付出启动代价
const warm = await startup({ options: { maxTurns: 3 } });
// 之后提示就绪时,这是即时的
for await (const message of warm.query("What files are here?")) {
console.log(message);
}prewarm()
Alpha。 在知道它将服务哪个会话之前就把一个 Claude Code 进程作为备用启动,之后用 claim() 把它绑定到会话。适用于在用户选择文件夹之前就启动的应用(需要 TypeScript Agent SDK v0.3.282 及以上)。
prewarm() 完成与 startup() 相同的初始化握手,进程等待在你设置的 options.cwd 里,否则等待在 Claude Code 配置目录下的私有临时目录里。会话的工作目录、它的 SessionStart hooks、它的 stdio MCP 服务器、它的 CLAUDE.md 和 git 上下文都等到认领时才处理。一个备用进程等待时占用约 230 到 260 MB 内存。如果你的 spawnClaudeCodeProcess 在另一台机器或容器里运行 Claude Code,要把 options.cwd 设为那里存在的一个目录,让备用进程在其中等待。
function prewarm(params?: {
options?: Options;
initializeTimeoutMs?: number;
}): Promise<SpareProcess>;options 和 initializeTimeoutMs 的含义与 startup() 相同,只是 options.cwd 只设置备用进程等待的目录。进程完成初始化握手后,promise 以 SpareProcess 解析。如果 options 设了 resume、continue 或 forkSession,prewarm() 会抛出异常,因为备用进程还没有会话。认领时无法设置的一切(如 mcpServers、hooks、canUseTool、settingSources、systemPrompt 和 plugins)在备用进程的生命期内都是固定的,所以每一组不同的这类选项要保留一个备用进程,它们变化时再次预热。
import { prewarm } from "@anthropic-ai/claude-agent-sdk";
// 在应用启动时,会话的文件夹还未知
const spare = await prewarm({ options: { maxTurns: 3 } });
// 之后,用户在某个文件夹里开始会话时
const claimedQuery = spare.claim({
prompt: "What files are here?",
options: { cwd: "/path/to/project" },
});
spare.claimed.catch((error: Error) => {
// 除非消息以 "option_not_applied" 开头,提示没有运行:
// 改用 query() 开始这个会话
console.error("Claim failed:", error.message);
});
for await (const message of claimedQuery) {
console.log(message);
}tool()
为 SDK MCP 服务器创建类型安全的 MCP 工具定义。
function tool<Schema extends AnyZodRawShape>(
name: string,
description: string,
inputSchema: Schema,
handler: (args: InferShape<Schema>, extra: unknown) => Promise<CallToolResult>,
extras?: { annotations?: ToolAnnotations; searchHint?: string; alwaysLoad?: boolean }
): SdkMcpToolDefinition<Schema>;| 参数 | 类型 | 说明 |
|---|---|---|
name | string | 工具名 |
description | string | 工具做什么的描述 |
inputSchema | Schema extends AnyZodRawShape | 定义工具输入参数的 Zod schema(支持 Zod 3 和 Zod 4) |
handler | (args, extra) => Promise<CallToolResult> | 执行工具逻辑的异步函数 |
extras | { annotations?: ToolAnnotations; searchHint?: string; alwaysLoad?: boolean } | 可选附加项:annotations 向客户端提供 MCP 行为提示;searchHint 是工具搜索启用时在延迟工具列表里显示的一行能力短语;alwaysLoad: true 让该工具的完整 schema 保留在初始提示里而不被延迟 |
ToolAnnotations 定义在 @modelcontextprotocol/sdk/types.js,所有字段都是可选提示,客户端不应据此做安全决定:
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
title | string | undefined | 工具的人类可读标题 |
readOnlyHint | boolean | false | 为 true 时工具不修改其环境 |
destructiveHint | boolean | true | 为 true 时工具可能做破坏性更新(仅当 readOnlyHint 为 false 时有意义) |
idempotentHint | boolean | false | 为 true 时用相同参数重复调用没有额外影响(仅当 readOnlyHint 为 false 时有意义) |
openWorldHint | boolean | true | 为 true 时工具与外部实体交互(如网页搜索);为 false 时工具的领域是封闭的(如记忆工具) |
import { tool } from "@anthropic-ai/claude-agent-sdk";
import { z } from "zod";
const searchTool = tool(
"search",
"Search the web",
{ query: z.string() },
async ({ query }) => {
return { content: [{ type: "text", text: `Results for: ${query}` }] };
},
{ annotations: { readOnlyHint: true, openWorldHint: true } }
);createSdkMcpServer()
创建一个与你的应用在同一进程里运行的 MCP 服务器实例。
function createSdkMcpServer(options: {
name: string;
version?: string;
instructions?: string;
tools?: Array<SdkMcpToolDefinition<any>>;
alwaysLoad?: boolean;
timeout?: number;
}): McpSdkServerConfigWithInstance;| 参数 | 类型 | 说明 |
|---|---|---|
options.name | string | MCP 服务器名 |
options.version | string | 可选的版本字符串 |
options.instructions | string | 可选的服务器说明,由 initialize 返回,并作为 MCP 说明块呈现给模型 |
options.tools | Array<SdkMcpToolDefinition> | 用 tool() 创建的工具定义数组 |
options.alwaysLoad | boolean | 为 true 时,该服务器的每个工具都保留在初始提示里,从不被延迟到工具搜索之后;与 tool() 里每个工具自己的 alwaysLoad 组合 |
options.timeout | number | 该服务器工具调用的超时毫秒数。Claude Code 对这个服务器用它代替 MCP_TOOL_TIMEOUT;传不小于 1000 的整数,其他值被忽略(需要 TypeScript Agent SDK v0.3.248 及以上) |
listSessions()
发现并列出过去的会话及其轻量元数据;可按项目目录过滤,也可列出所有项目的会话。
function listSessions(options?: ListSessionsOptions): Promise<SDKSessionInfo[]>;| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
options.dir | string | undefined | 要列出会话的目录;省略时返回所有项目的会话 |
options.limit | number | undefined | 最多返回的会话数 |
options.includeWorktrees | boolean | true | dir 位于 git 仓库内时,包含所有 worktree 路径的会话 |
返回类型 SDKSessionInfo:
| 属性 | 类型 | 说明 |
|---|---|---|
sessionId | string | 唯一的会话标识(UUID) |
summary | string | 显示标题:自定义标题、最近的提示、自动生成的摘要,或第一个提示 |
lastModified | number | 最后修改时间,自 epoch 起的毫秒数 |
fileSize | number | undefined | 会话文件字节数,只对本地 JSONL 存储填充 |
customTitle | string | undefined | 设置了自定义标题时的会话标题(例如用 --name、/rename、hook 的 sessionTitle 输出或 renameSession() 设置);否则是 AI 生成的会话标题(如果有) |
firstPrompt | string | undefined | 会话里第一个有意义的用户提示 |
gitBranch | string | undefined | 会话结束时的 git 分支 |
cwd | string | undefined | 会话的工作目录 |
tag | string | undefined | 用户设置的会话标签(见 tagSession()) |
createdAt | number | undefined | 创建时间,自 epoch 起的毫秒数,取自第一个条目的时间戳 |
下面打印某个项目最近的 10 个会话。结果按 lastModified 降序排序,所以第一项是最新的;省略 dir 则跨所有项目搜索:
import { listSessions } from "@anthropic-ai/claude-agent-sdk";
const sessions = await listSessions({ dir: "/path/to/project", limit: 10 });
for (const session of sessions) {
console.log(`${session.summary} (${session.sessionId})`);
}getSessionMessages()
从过去会话的记录里读取用户和助手消息。
function getSessionMessages(
sessionId: string,
options?: GetSessionMessagesOptions
): Promise<SessionMessage[]>;| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
sessionId | string | 必填 | 要读取的会话 UUID(见 listSessions()) |
options.dir | string | undefined | 在其中查找会话的项目目录;省略时搜索所有项目 |
options.limit | number | undefined | 最多返回的消息数 |
options.offset | number | undefined | 从开头跳过的消息数 |
返回类型 SessionMessage:
| 属性 | 类型 | 说明 |
|---|---|---|
type | "user" | "assistant" | 消息角色 |
uuid | string | 唯一的消息标识 |
session_id | string | 消息所属的会话 |
message | unknown | 来自记录的原始消息载荷 |
parent_tool_use_id | string | null | 对子智能体消息,是启动该子智能体的 Agent 或 Skill 工具调用的 tool_use_id;主会话消息和较旧的会话为 null |
parent_agent_id | string | null | 对来自嵌套子智能体的消息,是派生它的子智能体的 agentId;主会话消息、顶层子智能体的消息和较旧的会话为 null(需要 Claude Code v2.1.202 及以上) |
import { listSessions, getSessionMessages } from "@anthropic-ai/claude-agent-sdk";
const [latest] = await listSessions({ dir: "/path/to/project", limit: 1 });
if (latest) {
const messages = await getSessionMessages(latest.sessionId, {
dir: "/path/to/project",
limit: 20
});
for (const msg of messages) {
console.log(`[${msg.type}] ${msg.uuid}`);
}
}getSessionInfo()
按 ID 读取单个会话的元数据,而不必扫描整个项目目录。
function getSessionInfo(
sessionId: string,
options?: GetSessionInfoOptions
): Promise<SDKSessionInfo | undefined>;| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
sessionId | string | 必填 | 要查找的会话 UUID |
options.dir | string | undefined | 项目目录路径;省略时搜索所有项目目录 |
返回 SDKSessionInfo,找不到会话时返回 undefined。
renameSession()
通过追加一个自定义标题条目来重命名会话。重复调用是安全的,最近的标题生效。
function renameSession(
sessionId: string,
title: string,
options?: SessionMutationOptions
): Promise<void>;| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
sessionId | string | 必填 | 要重命名的会话 UUID |
title | string | 必填 | 新标题,去掉空白后必须非空 |
options.dir | string | undefined | 项目目录路径;省略时搜索所有项目目录 |
tagSession()
给会话打标签;传 null 清除标签。重复调用是安全的,最近的标签生效。
function tagSession(
sessionId: string,
tag: string | null,
options?: SessionMutationOptions
): Promise<void>;| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
sessionId | string | 必填 | 要打标签的会话 UUID |
tag | string | null | 必填 | 标签字符串,或 null 以清除 |
options.dir | string | undefined | 项目目录路径;省略时搜索所有项目目录 |
resolveSettings()
用与 CLI 相同的合并引擎,为给定目录解析生效的 Claude Code 设置,而不派生 Claude CLI。用它在调用 query() 之前检查该调用会看到什么配置。该函数是 alpha,API 在稳定前可能变化。
这个快照与实时 query() 会话实际应用的不同:
policyHelper:resolveSettings()读取 MDM 来源(包括 macOS plist 和 Windows HKLM/HKCU),但不执行管理员配置的policyHelper子进程。- 服务器托管设置:
resolveSettings()不获取服务器托管设置,要把它们作为options.serverManagedSettings传入才包含。 defaultMode:快照原样返回每一层的permissions.defaultMode,所以可能包含来自项目和本地设置的'auto'和'bypassPermissions'值,而实时会话会忽略它们。
function resolveSettings(
options?: ResolveSettingsOptions
): Promise<ResolvedSettings>;resolveSettings() 接受单个选项对象,所有字段都是可选的:
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
options.cwd | string | process.cwd() | 解析项目和本地设置所相对的目录 |
options.settingSources | SettingSource[] | 所有来源 | 加载哪些文件系统来源;传 [] 跳过用户、项目和本地设置;端点托管策略总会加载;只有传了 options.serverManagedSettings 才包含服务器托管设置 |
options.managedSettings | Settings | undefined | 嵌入宿主提供的策略层设置;规则与 Options 里的 managedSettings 相同,不同之处是 resolveSettings() 不执行配置的 policyHelper,所以快照可能包含实时会话会丢弃的设置 |
options.serverManagedSettings | Settings | undefined | 来自 /api/claude_code/settings 的服务器托管设置载荷;非限制性的键不加过滤地通过 |
返回类型 ResolvedSettings,描述合并后的设置以及每个键由哪个来源贡献:
| 属性 | 类型 | 说明 |
|---|---|---|
effective | Settings | 按优先级顺序应用所有启用的来源后合并的设置 |
provenance | Partial<Record<keyof Settings, ProvenanceEntry>> | 对 effective 里的每个顶层键,哪个来源提供了该值 |
sources | Array<{ source, settings, path?, policyOrigin? }> | 每个来源的原始设置,按从低到高的优先级排序 |
下面的例子解析某个项目目录的设置,并打印控制清理周期的来源。在没有任何设置文件设置 cleanupPeriodDays 的机器上,两行输出的值都是 undefined,这是预期输出,不是错误:
import { resolveSettings } from "@anthropic-ai/claude-agent-sdk";
const { effective, provenance } = await resolveSettings({
cwd: "/path/to/project",
settingSources: ["user", "project", "local"],
});
console.log(`Cleanup period: ${effective.cleanupPeriodDays} days`);
console.log(`Set by: ${provenance.cleanupPeriodDays?.source}`);