Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Claude Agent SDK 提供强大的权限控制功能,允许您管理 Claude 在应用程序中如何使用工具。
本指南涵盖如何使用 canUseTool 回调、钩子和 settings.json 权限规则来实现权限系统。有关完整的 API 文档,请参阅 TypeScript SDK 参考。
Claude Agent SDK 提供四种互补的方式来控制工具使用:
每种方法的用例:
canUseTool - 对未涵盖情况的动态批准,提示用户获取权限处理顺序: PreToolUse 钩子 → 拒绝规则 → 允许规则 → 询问规则 → 权限模式检查 → canUseTool 回调 → PostToolUse 钩子
权限模式提供对 Claude 如何使用工具的全局控制。您可以在调用 query() 时设置权限模式,或在流式会话期间动态更改它。
SDK 支持四种权限模式,每种都有不同的行为:
| 模式 | 描述 | 工具行为 |
|---|---|---|
default | 标准权限行为 | 应用正常权限检查 |
plan | 规划模式 - 无执行 | Claude 只能使用只读工具;在执行前呈现计划 (SDK 中当前不支持) |
acceptEdits | 自动接受文件编辑 | 文件编辑和文件系统操作自动获得批准 |
bypassPermissions | 绕过所有权限检查 | 所有工具无需权限提示即可运行(谨慎使用) |
您可以通过两种方式设置权限模式:
在创建查询时设置模式:
import { query } from "@anthropic-ai/claude-agent-sdk";
const result = await query({
prompt: "帮我重构这段代码",
options: {
permissionMode: 'default' // 标准权限模式
}
});在流式会话期间更改模式:
import { query } from "@anthropic-ai/claude-agent-sdk";
// 为流式输入创建异步生成器
async function* streamInput() {
yield {
type: 'user',
message: {
role: 'user',
content: "让我们从默认权限开始"
}
};
// 稍后在对话中...
yield {
type: 'user',
message: {
role: 'user',
content: "现在让我们加快开发速度"
}
};
}
const q = query({
prompt: streamInput(),
options: {
permissionMode: 'default' // 以默认模式开始
}
});
// 动态更改模式
await q.setPermissionMode('acceptEdits');
// 处理消息
for await (const message of q) {
console.log(message);
}acceptEdits)在接受编辑模式下:
自动批准的操作:
bypassPermissions)在绕过权限模式下:
权限模式在权限流程的特定点进行评估:
bypassPermissions 模式 - 如果激活,允许所有剩余工具canUseTool 回调canUseTool 回调 - 处理剩余情况这意味着:
bypassPermissions 模式下bypassPermissions 模式覆盖未匹配工具的 canUseTool 回调模式进展示例:
// 以默认模式开始进行受控执行
permissionMode: 'default'
// 切换到 acceptEdits 进行快速迭代
await q.setPermissionMode('acceptEdits')canUseTool 回调在调用 query 函数时作为选项传递。它接收工具名称和输入参数,必须返回一个决定 - 允许或拒绝。
canUseTool 在 Claude Code 向用户显示权限提示时触发,例如钩子和权限规则不涵盖它且不在 acceptEdits 模式下。
以下是一个完整示例,展示如何实现交互式工具批准:
import { query } from "@anthropic-ai/claude-agent-sdk";
async function promptForToolApproval(toolName: string, input: any) {
console.log("\n🔧 工具请求:");
console.log(` 工具: ${toolName}`);
// 显示工具参数
if (input && Object.keys(input).length > 0) {
console.log(" 参数:");
for (const [key, value] of Object.entries(input)) {
let displayValue = value;
if (typeof value === 'string' && value.length > 100) {
displayValue = value.substring(0, 100) + "...";
} else if (typeof value === 'object') {
displayValue = JSON.stringify(value, null, 2);
}
console.log(` ${key}: ${displayValue}`);
}
}
// 获取用户批准(用您的 UI 逻辑替换)
const approved = await getUserApproval();
if (approved) {
console.log(" ✅ 已批准\n");
return {
behavior: "allow",
updatedInput: input
};
} else {
console.log(" ❌ 已拒绝\n");
return {
behavior: "deny",
message: "用户拒绝了此工具的权限"
};
}
}
// 使用权限回调
const result = await query({
prompt: "帮我分析这个代码库",
options: {
canUseTool: async (toolName, input) => {
return promptForToolApproval(toolName, input);
}
}
});