TypeScript SDK 参考

2026-10-29   访问量:0

版本要求:本文档针对 CodeBuddy Agent SDK v0.1.0 及以上版本。

本文档提供 TypeScript SDK 的完整 API 参考。有关快速入门和使用示例,请参阅 SDK 概览。

Requirements

依赖

版本要求

Node.js

>= 18.0.0

TypeScript

>= 5.0.0(推荐)

运行时支持:

Node.js(推荐)

Bun

Deno

Installation

npm install @tencent-ai/agent-sdk

或使用其他包管理器:

yarn add @tencent-ai/agent-sdkpnpm add @tencent-ai/agent-sdk

环境变量

变量名

说明

必需

CODEBUDDY_CODE_PATH

CodeBuddy CLI 可执行文件路径

可选

认证配置

SDK 支持使用已有登录凭据、API Key 或 OAuth Client Credentials 认证,详见 SDK 概览 - 认证配置。

Functions

query()

主要 API 入口,创建一个查询并返回消息流。

function query(params: {  prompt: string | AsyncIterable<UserMessage>;  options?: Options;}): Query;

参数:

参数

类型

说明

prompt

string | AsyncIterable<UserMessage>

查询提示词或用户消息流

options

Options

配置选项(可选)

返回值:Query - 扩展了 AsyncGenerator<Message, void> 的接口

Query 接口

interface Query extends AsyncGenerator<Message, void> {

 // 中断当前执行

 interrupt(): Promise<void>;



 // 动态修改权限模式

 setPermissionMode(mode: PermissionMode): Promise<void>;



 // 动态修改模型

 setModel(model?: string): Promise<void>;



 // 设置最大思考 token 数

 setMaxThinkingTokens(tokens: number | null): Promise<void>;



 // 获取可用权限模式列表

 getAvailableModes(): Promise<ModeInfo[]>;



 // 获取可用模型列表

 getAvailableModels(): Promise<ModelInfo[]>;



 // 获取支持的斜杠命令

 supportedCommands(): Promise<SlashCommand[]>;



 // 获取支持的模型列表

 supportedModels(): Promise<ModelInfo[]>;



 // 获取 MCP 服务器状态

 mcpServerStatus(): Promise<McpServerStatus[]>;



 // 获取账户信息

 accountInfo(): Promise<AccountInfo>;



 // 流式输入用户消息

 streamInput(stream: AsyncIterable<UserMessage>): Promise<void>;

}

Constants

// 所有支持的 Hook 事件

const HOOK_EVENTS: readonly [

 'PreToolUse',

 'PostToolUse',

 'PostToolUseFailure',

 'Notification',

 'UserPromptSubmit',

 'SessionStart',

 'SessionEnd',

 'Stop',

 'SubagentStart',

 'SubagentStop',

 'PreCompact',

 'PermissionRequest',

 'WorktreeCreate',

 'WorktreeRemove'

];



// 所有退出原因

const EXIT_REASONS: readonly [

 'user_cancelled',

 'tool_error',

 'max_turns',

 'max_budget_usd',

 'completed',

 'interrupted',

 'hook_blocked'

];

Errors

class AbortError extends Error {  // 当操作被中止时抛出}

Unstable V2 API

警告:

以下 API 处于实验阶段,接口可能在未来版本中变更。

unstable_v2_createSession()

创建新的交互式会话。

function unstable_v2_createSession(options: SessionOptions): Session;

unstable_v2_resumeSession()

恢复现有会话。

function unstable_v2_resumeSession(  sessionId: string,  options: SessionOptions): Session;

unstable_v2_prompt()

单次查询便捷函数。

function unstable_v2_prompt(  message: string,  options: SessionOptions): Promise<Message[]>;

unstable_v2_authenticate()

发起交互式登录流程,支持多环境认证(海外版、国内版等)。

function unstable_v2_authenticate(options: AuthenticateOptions): Promise<AuthenticateResponse>;

参数:

字段

类型

说明

onAuthUrl

(authState: AuthState) => Promise<void>

认证 URL 回调,用于打开浏览器或显示链接

environment

'external' | 'internal' | 'ioa' | 'cloudhosted'

预定义环境(与 endpoint 二选一)

endpoint

string

自定义 endpoint URL(用于 selfhosted,与 environment 二选一)

methodId

string

认证方法 ID,默认 'external'

timeout

number

超时时间(毫秒),默认 300000

pathToCodebuddyCode

string

CLI 可执行文件路径(可选)

env

Record<string, string>

环境变量(可选)

返回值:Promise<AuthenticateResponse>

userinfo - 用户信息对象,包含 userId、userName、userNickname、token 等字段

示例:

import { unstable_v2_authenticate } from '@tencent-ai/agent-sdk';

import open from 'open';



// 海外版登录

const result = await unstable_v2_authenticate({

 environment: 'external',

 onAuthUrl: async (authState) => {

   console.log('请登录:', authState.authUrl);

   await open(authState.authUrl);

 }

});



console.log('登录成功:', result.userinfo.userName);



// 私有化部署登录

const result2 = await unstable_v2_authenticate({

 endpoint: 'https://your-company.com',

 onAuthUrl: async (authState) => {

   console.log('请登录:', authState.authUrl);

   await open(authState.authUrl);

 }

});

行为说明:

如果已有有效 token,直接返回用户信息,不会触发登录流程

否则通过 onAuthUrl 回调通知用户打开登录链接

登录成功后 token 会被缓存,下次调用自动复用

unstable_v2_logout()

登出并清除缓存的认证 token,下次调用 authenticate() 将重新登录。

function unstable_v2_logout(options?: LogoutOptions): Promise<void>;

参数:

字段

类型

说明

environment

'external' | 'internal' | 'ioa' | 'cloudhosted'

预定义环境(与 endpoint 二选一)

endpoint

string

自定义 endpoint URL(与 environment 二选一)

pathToCodebuddyCode

string

CLI 可执行文件路径(可选)

env

Record<string, string>

环境变量(可选)

示例:

import { unstable_v2_authenticate, unstable_v2_logout } from '@tencent-ai/agent-sdk';



// 登录

const result = await unstable_v2_authenticate({

 environment: 'external',

 onAuthUrl: (authState) => console.log('Login:', authState.authUrl),

});



// 登出

await unstable_v2_logout({ environment: 'external' });



// 以不同用户重新登录

const newUser = await unstable_v2_authenticate({

 environment: 'external',

 onAuthUrl: (authState) => console.log('Login:', authState.authUrl),

});

Session 接口

interface Session {

 // 会话 ID(初始化后可用)

 readonly sessionId: string;



 // 发送消息

 send(message: string | UserMessage): Promise<void>;



 // 获取响应流

 stream(): AsyncGenerator<Message, void>;



 // 关闭会话

 close(): void;



 // 异步释放

 [Symbol.asyncDispose](): Promise<void>;

}

SessionOptions

type SessionOptions = {  model: string;  pathToCodebuddyCode?: string;  executable?: 'node' | 'bun';  executableArgs?: string[];  env?: Record<string, string | undefined>;  canUseTool?: CanUseTool;};

Types

Options

完整配置选项:

字段

类型

说明

abortController

AbortController

用于取消请求

executable

'bun' | 'deno' | 'node'

运行时

executableArgs

string[]

运行时参数

pathToCodebuddyCode

string

CLI 路径

cwd

string

工作目录

additionalDirectories

string[]

额外的目录

env

Record<string, string | undefined>

环境变量

model

string

指定模型

fallbackModel

string

备用模型

maxThinkingTokens

number

最大思考 token 数(已废弃,请使用 thinking)

thinking

ThinkingConfig

思考模式配置:{ type: 'adaptive' }、{ type: 'enabled', budgetTokens: N } 或 { type: 'disabled' }

effort

'low' | 'medium' | 'high' | 'xhigh'

模型推理努力程度

allowedTools

string[]

允许的工具白名单

disallowedTools

string[]

禁止的工具黑名单

canUseTool

CanUseTool

权限回调函数

permissionMode

PermissionMode

权限模式

allowDangerouslySkipPermissions

boolean

允许跳过权限

permissionPromptToolName

string

权限提示工具名

continue

boolean

继续最近的会话

resume

string

要恢复的会话 ID

resumeSessionAt

string

恢复到特定消息位置

persistSession

boolean

是否持久化会话记录,默认 true。设为 false 时会话只保留在内存中,不写入本地 transcript,文件检查点也会一并跳过;恢复已有会话仍可用,只是不再写入。需要 CLI >= 2.125.1

forkSession

boolean

分叉会话

agents

Record<string, AgentDefinition>

自定义 Agent

hooks

Partial<Record<HookEvent, HookCallbackMatcher[]>>

Hook 配置

outputFormat

OutputFormat

输出格式

systemPrompt

string | { append: string }

系统提示词

includePartialMessages

boolean

包含部分消息

maxTurns

number

最大对话轮数

mcpServers

Record<string, McpServerConfig>

MCP 服务器配置

strictMcpConfig

boolean

严格 MCP 配置

sandbox

SandboxSettings

沙箱设置

settingSources

SettingSource[]

配置源,控制加载哪些文件系统配置。默认不加载任何配置

SettingSource

控制 SDK 从哪些文件系统位置加载配置。

type SettingSource = 'user' | 'project' | 'local';

值

说明

位置

'user'

全局用户设置

~/.codebuddy/settings.json

'project'

项目共享设置

.codebuddy/settings.json

'local'

项目本地设置

.codebuddy/settings.local.json

默认行为:当 settingSources 未指定时,SDK 不加载任何文件系统配置。这提供了完全干净的运行环境。

// 默认:不加载任何配置(干净环境)

const q = query({ prompt: '...' });



// 加载项目配置

const q = query({

 prompt: '...',

 options: { settingSources: ['project'] }

});



// 加载所有配置(类似 CLI 行为)

const q = query({

 prompt: '...',

 options: { settingSources: ['user', 'project', 'local'] }

});

PermissionMode

type PermissionMode =  | 'default'           // 默认模式,所有操作需确认  | 'acceptEdits'       // 自动批准文件编辑  | 'bypassPermissions' // 跳过所有权限检查  | 'plan'              // 规划模式,仅允许读取

PermissionResult

type PermissionResult =  | {      behavior: 'allow';      updatedInput: Record<string, unknown>;      updatedPermissions?: PermissionUpdate[];      toolUseID?: string;    }  | {      behavior: 'deny';      message: string;      interrupt?: boolean;      toolUseID?: string;    };

CanUseTool

type CanUseTool = (

 toolName: string,

 input: Record<string, unknown>,

 options: CanUseToolOptions

) => Promise<PermissionResult>;



type CanUseToolOptions = {

 signal: AbortSignal;

 suggestions?: PermissionUpdate[];

 blockedPath?: string;

 decisionReason?: string;

 toolUseID: string;

 agentID?: string;

};

AgentDefinition

type AgentDefinition = {  description: string;          // Agent 描述  prompt: string;               // 系统提示词  tools?: string[];             // 允许的工具  disallowedTools?: string[];   // 禁止的工具  model?: string;               // 使用的模型};

ModeInfo

interface ModeInfo {  id: string;           // 模式 ID  name: string;         // 显示名称  description: string;  // 模式说明}

ModelInfo

interface ModelInfo {  modelId: string;       // 模型 ID  name: string;          // 显示名称  description?: string;  // 模型说明}

McpServerConfig

// Stdio 类型

type McpStdioServerConfig = {

 type?: 'stdio';

 command: string;

 args?: string[];

 env?: Record<string, string>;

};



// SSE 类型

type McpSSEServerConfig = {

 type: 'sse';

 url: string;

 headers?: Record<string, string>;

};



// HTTP 类型

type McpHttpServerConfig = {

 type: 'http';

 url: string;

 headers?: Record<string, string>;

};



type McpServerConfig =

 | McpStdioServerConfig

 | McpSSEServerConfig

 | McpHttpServerConfig;

HookEvent

type HookEvent =  | 'PreToolUse'  | 'PostToolUse'  | 'PostToolUseFailure'  | 'Notification'  | 'UserPromptSubmit'  | 'SessionStart'  | 'SessionEnd'  | 'Stop'  | 'SubagentStart'  | 'SubagentStop'  | 'PreCompact'  | 'PermissionRequest'  | 'WorktreeCreate'  | 'WorktreeRemove';

HookCallback

type HookCallback = (

 input: HookInput,

 toolUseID: string | undefined,

 options: { signal: AbortSignal }

) => Promise<HookJSONOutput>;



interface HookCallbackMatcher {

 matcher?: string;        // 匹配模式(支持正则)

 hooks: HookCallback[];   // 回调函数列表

 timeout?: number;        // 超时时间(毫秒)

}

HookJSONOutput

// 同步输出

type SyncHookJSONOutput = {

 continue?: boolean;

 suppressOutput?: boolean;

 stopReason?: string;

 decision?: 'approve' | 'block';

 systemMessage?: string;

 reason?: string;

 hookSpecificOutput?: Record<string, unknown>;

};



// 异步输出

type AsyncHookJSONOutput = {

 async: true;

 asyncTimeout?: number;

};



type HookJSONOutput = SyncHookJSONOutput | AsyncHookJSONOutput;

Message Types

Message

所有消息类型的联合:

type Message =  | SystemMessage  | UserMessage  | AssistantMessage  | PartialAssistantMessage  | ResultMessage  | CompactBoundaryMessage  | StatusMessage  | TaskStartedMessage  | TaskNotificationMessage  | ToolProgressMessage;

SystemMessage

type SystemMessage = {  type: 'system';  subtype: 'init';  uuid: string;  session_id: string;  apiKeySource?: string;  cwd?: string;  tools: string[];  mcp_servers?: Array<{ name: string; status: string }>;  model: string;  permissionMode: PermissionMode;  slash_commands?: string[];  codebuddy_code_version?: string;  skills?: string[];  plugins?: Array<{ name: string; path: string }>;};

TaskStartedMessage

后台任务(Bash / PowerShell / Workflow / Agent,run_in_background: true)进入运行态时发出的 system 事件。并发任务靠 task_id 区分,tool_use_id 关联回发起该任务的 tool_use。

interface TaskStartedMessage {  type: 'system';  subtype: 'task_started';  task_id: string;  tool_use_id?: string;  description: string;  task_type?: string; // "Bash" / "PowerShell" / "Workflow" / "Agent"  uuid: string;  session_id: string;}

TaskUsage

task_progress / task_notification 携带的用量统计(对齐 Claude Code 的 TaskUsage)。sub-agent(task_type: 'Agent')后台任务有值;后台 shell(Bash/PowerShell)任务通常省略 usage。

interface TaskUsage {  total_tokens: number;  tool_uses: number;  duration_ms: number;}

TaskProgressMessage

后台任务进度事件。事件驱动(非定时):每完成一次 tool_use(usage.tool_uses 增长)推一条,携带累计 usage 与最近工具名 last_tool_name。后台 shell 任务不发 progress(对齐 CC——只有 sub-agent/workflow 类任务发 progress)。

interface TaskProgressMessage {  type: 'system';  subtype: 'task_progress';  task_id: string;  tool_use_id?: string;  description: string;  usage: TaskUsage;  last_tool_name?: string;  uuid: string;  session_id: string;}

TaskUpdatedMessage

后台任务状态变迁事件。patch 携带本次变更的字段(至少 status,终态补 end_time)。

生命周期提示:后台任务的终态有时只来 task_updated(patch.status 为终态)而没有配套的 task_notification。跟踪"活跃任务"的消费方应对 TaskNotificationMessage 与 TaskUpdatedMessage 二者的终态 status(completed / failed / stopped / killed)一视同仁地清理。

interface TaskUpdatedMessage {  type: 'system';  subtype: 'task_updated';  task_id: string;  patch: Record<string, unknown>; // e.g. { status, end_time }  status?: 'pending' | 'running' | 'paused' | 'completed' | 'failed' | 'killed';  uuid?: string;  session_id?: string;}

TaskNotificationMessage

后台任务完成 / 失败 / 被停止时发出。在 stdio stream-json 长连接模式下,任务若在触发它的那轮 result 之后才完成,该消息会被主动推回同一输出流——消费方需持续读取才能收到。据 task_id 路由,output_file 指向落盘的完整输出。usage 在 sub-agent 任务上携带,shell 任务省略。

query() 在首个 ResultMessage 处 break 并关闭子进程,会错过在该 result 之后才回推的后台完成事件。要接收跨轮完成事件,请用 V2 Session(unstable_v2_createSession)并在 send() 后反复调用 stream() 持续消费后台任务完成触发的后续轮次(对应 Python SDK 的 receive_messages() 持续读语义)。

query() 已自动禁用后台任务:由于上述结构性限制,SDK 在 query() 路径下会自动注入 CODEBUDDY_CODE_DISABLE_BACKGROUND_TASKS=1(Bash / PowerShell / Agent 的 run_in_background 被隐藏/降级为前台),避免后台任务被 query() 悄悄丢弃。若您确有理由要在 query() 下保留后台任务,显式在 options.env 或进程环境里设置该变量(任意值,包括 0)即可覆盖此默认。V2 Session 路径不受影响。

interface TaskNotificationMessage {  type: 'system';  subtype: 'task_notification';  task_id: string;  tool_use_id?: string;  status: 'completed' | 'failed' | 'stopped';  summary: string;  output_file?: string;  output_stderr_file?: string;  usage?: TaskUsage;  uuid: string;  session_id: string;}

用法示例(并发后台任务,靠 task_id 区分并在整体完成后接收通知):

import { unstable_v2_createSession, type Message } from '@tencent-ai/agent-sdk';



const session = unstable_v2_createSession({ permissionMode: 'bypassPermissions' });

const started = new Map<string, Message>();

const notified = new Map<string, Message>();



await session.send('并行跑两个后台命令,完成后告诉我结果');



// stream() 在每轮 result 处返回(但不关闭子进程)。反复调用它即可继续消费由后台

// 任务完成触发的后续 drain-run 轮次,直到集齐所有 task_notification。

while (notified.size < 2) {

 let sawResult = false;

 for await (const message of session.stream()) {

   if (message.type === 'system' && message.subtype === 'task_started') {

     started.set(message.task_id, message);

     console.log('started', message.task_id, message.description);

   } else if (message.type === 'system' && message.subtype === 'task_notification') {

     notified.set(message.task_id, message);

     console.log('done', message.task_id, message.status, message.output_file);

   } else if (message.type === 'result') {

     sawResult = true;

   }

 }

 if (!sawResult) break; // 子进程已关闭,避免空转

}



session.close();

UserMessage

type UserMessage = {  type: 'user';  uuid?: string;  session_id: string;  message: {    role: 'user';    content: string | ContentBlock[];  };  parent_tool_use_id: string | null;  isSynthetic?: boolean;  tool_use_result?: unknown;};

AssistantMessage

type AssistantMessage = {  type: 'assistant';  uuid: string;  session_id: string;  message: {    id: string;    type: 'message';    role: 'assistant';    model: string;    content: ContentBlock[];    stop_reason: StopReason | null;    stop_sequence: string | null;    usage: Usage;  };  parent_tool_use_id: string | null;  error?: string;};

ResultMessage

type ResultMessage =  | {      type: 'result';      subtype: 'success';      uuid: string;      session_id: string;      duration_ms: number;      duration_api_ms: number;      is_error: boolean;      num_turns: number;      result: string;      total_cost_usd: number;      usage: Usage;      permission_denials: PermissionDenial[];      structured_output?: unknown;    }  | {      type: 'result';      subtype: 'error_during_execution' | 'error_max_turns' | 'error_max_budget_usd';      uuid: string;      session_id: string;      duration_ms: number;      duration_api_ms: number;      is_error: boolean;      num_turns: number;      total_cost_usd: number;      usage: Usage;      permission_denials: PermissionDenial[];      errors?: string[];      /**       * Structured error info aligned with `errors[]` by index.       * - Length always equals `errors.length` when present       * - `errors_info[i]` describes `errors[i]`; `null` if no structured dimension could be extracted       * - Entire field is omitted when all entries are null (backward compatible: legacy consumers reading only `errors` are unaffected)       * - `category` values align with ACP error categories: `network` / `quota` / `auth` / `model_service` / `cancelled` / `internal`       */      errors_info?: Array<        | {            /** HTTP status code (e.g. 502, 429, 401) */            status?: number;            /** SDK/business error code (number like 10006 or string like `ECONNRESET`) */            code?: string | number;            /** Error category — same taxonomy as ACP `classifyErrorAsRequestError` */            category?: string;            /** Human-readable, sanitised error message */            details?: string;          }        | null      >;    };

ContentBlock

// 文本内容块

interface TextContentBlock {

 type: 'text';

 text: string;

}



// 工具调用块

interface ToolUseContentBlock {

 type: 'tool_use';

 id: string;

 name: string;

 input: Record<string, unknown>;

}



// 工具结果块

interface ToolResultContentBlock {

 type: 'tool_result';

 tool_use_id: string;

 content?: string | ContentBlock[];

 is_error?: boolean;

}



type ContentBlock =

 | TextContentBlock

 | ToolUseContentBlock

 | ToolResultContentBlock;

Usage

interface Usage {  input_tokens: number;  output_tokens: number;  cache_read_input_tokens?: number | null;  cache_creation_input_tokens?: number | null;}

Input Types

AskUserQuestionInput

interface AskUserQuestionInput {  // 要询问的问题列表(1-4 个问题)  questions: AskUserQuestionQuestion[];  // 用户答案(由权限组件收集)  answers?: Record<string, string>;}

AskUserQuestionQuestion

interface AskUserQuestionQuestion {  // 完整问题文本(应以 ? 结尾)  question: string;  // 简短标签(最多 12 个字符)  header: string;  // 可用选项(2-4 个选项)  options: AskUserQuestionOption[];  // 是否允许多选  multiSelect: boolean;}

AskUserQuestionOption

interface AskUserQuestionOption {  // 显示文本(1-5 个单词)  label: string;  // 选项说明  description: string;}

ToolInputMap

interface ToolInputMap {

 AskUserQuestion: AskUserQuestionInput;

}



type KnownToolName = keyof ToolInputMap;

相关文档

SDK 概览 - 快速入门和使用示例

Hook 参考指南 - 详细的 Hook 配置说明

MCP 集成 - MCP 服务器配置指南


热门文章
更多>