SDK Hooks
在应用回调中处理工具、输入、生命周期和错误,并区分 SDK 与配置文件 Hooks。
SDK Hooks 是应用在创建或恢复会话时注册的回调,用来补充上下文、检查工具调用、处理结果或记录运行情况。它们在宿主应用中执行;CLI 或云端代理的 JSON Hooks 配置属于其他接入方式,不能直接照搬回调字段与返回值。
按需要选择回调
| 时机 | SDK 回调 | 文档 |
|---|---|---|
| 创建或恢复会话 | onSessionStart | 生命周期 |
| 用户提交输入 | onUserPromptSubmitted | 提交输入 |
| runtime 生成模型输入后 | onUserPromptTransformed | 模型输入转换 |
| 工具执行前 | onPreToolUse | 执行前检查 |
| 工具成功后 | onPostToolUse | 结果与失败处理 |
| 工具失败后 | onPostToolUseFailure | 结果与失败处理 |
| 顶层代理自然结束一轮 | onAgentStop | 停止前验证 |
| 会话结束 | onSessionEnd | 生命周期 |
| 执行中出现错误 | onErrorOccurred | 错误处理 |
回调可选,只注册实际需要的部分。返回 null 或语言对应的空结果通常表示沿用默认行为;具体能改变什么,应看该 Hook 的返回字段,不能把任意 Hook 都当作可拒绝操作的权限接口。
注册与关联会话
const session = await client.createSession({
hooks: {
onSessionStart: async (_input, invocation) => {
console.log("Session started", invocation.sessionId);
return { additionalContext: "Prefer concise explanations." };
},
onPostToolUse: async (input, invocation) => {
console.log("Tool succeeded", invocation.sessionId, input.toolName);
return null;
},
},
});每个 handler 接收 input 和 invocation;后者含 sessionId,适合关联日志或按会话存储状态。恢复时也可传入 hooks 对象,不把内存回调假定为磁盘会话自动保存的一部分。
保持处理路径简短
Hooks 在处理流程中内联执行,异步函数本身不会消除等待时间。大型日志写入或 HTTP 上报可交给应用的后台队列;有决策作用的检查则要在返回前完成。跟踪多个会话时以 sessionId 分开状态,并在结束后清理。
日志应只记录业务需要的字段。完整工具参数、结果和输入可能含有敏感内容;官方示例中的直接 JSON 输出和正则脱敏都是示范,不能据此认定任意日志已经安全处理。
不统一套用字段类型
官方实用示例有把 timestamp 当作 Date 的写法,部分专门参考表则标为 number / Unix timestamp;Post-tool 写作 SDK timestamp type。目录字段也同时存在 cwd 与 workingDirectory。以下各页按各自参考说明,实际代码以所用 SDK 类型为准,不统一调用 getTime(),也不凭字段名推断所有语言和版本的时间单位。
同样,示例的 onPermissionRequest 自动批准是示例选择,不是所有应用应采用的授权默认值。只想观察工具的 Hook 不应额外引入全局自动批准。
本节文档
- 工具执行前检查使用 onPreToolUse 决定工具是否执行、修改参数或补充上下文。
- 工具结果与失败处理分别处理成功结果和失败调用,避免遗漏失败日志或误改模型上下文。
- 用户提交输入 Hook补充上下文或展开输入模板,并把提示性建议与真正的请求限制分开。
- 模型输入转换 Hook在 runtime 补充上下文后检查实际模型输入,并理解替换内容的持久化行为。
- SDK 会话生命周期 Hooks在启动和恢复时加载上下文,在不同结束原因下保存状态并清理资源。
- 代理停止前验证使用 onAgentStop 检查完成条件,并限制由 Hook 触发的连续轮次。
- SDK 错误处理 Hook按错误发生位置决定提示、重试或终止,并保留可诊断信息。