Il Claude Agent SDK fornisce potenti controlli dei permessi che ti permettono di gestire come Claude utilizza gli strumenti nella tua applicazione.
Questa guida copre come implementare sistemi di permessi utilizzando il callback canUseTool, gli hook e le regole di permesso di settings.json. Per la documentazione completa dell'API, consulta il riferimento TypeScript SDK.
Il Claude Agent SDK fornisce quattro modi complementari per controllare l'uso degli strumenti:
Casi d'uso per ogni approccio:
canUseTool - Approvazione dinamica per casi non coperti, richiede il permesso all'utenteOrdine di Elaborazione: Hook PreToolUse → Regole di Negazione → Regole di Permesso → Regole di Richiesta → Controllo Modalità Permesso → Callback canUseTool → Hook PostToolUse
Le modalità di permesso forniscono controllo globale su come Claude utilizza gli strumenti. Puoi impostare la modalità di permesso quando chiami query() o cambiarla dinamicamente durante le sessioni di streaming.
L'SDK supporta quattro modalità di permesso, ognuna con comportamento diverso:
| Modalità | Descrizione | Comportamento Strumento |
|---|---|---|
default | Comportamento standard dei permessi | Si applicano i controlli normali dei permessi |
plan | Modalità pianificazione - nessuna esecuzione | Claude può utilizzare solo strumenti di sola lettura; presenta un piano prima dell'esecuzione (Attualmente non supportato nell'SDK) |
acceptEdits | Accetta automaticamente le modifiche ai file | Le modifiche ai file e le operazioni del filesystem vengono approvate automaticamente |
bypassPermissions | Bypassa tutti i controlli dei permessi | Tutti gli strumenti vengono eseguiti senza richieste di permesso (usa con cautela) |
Puoi impostare la modalità di permesso in due modi:
Imposta la modalità quando crei una query:
import { query } from "@anthropic-ai/claude-agent-sdk";
const result = await query({
prompt: "Aiutami a refactorizzare questo codice",
options: {
permissionMode: 'default' // Modalità permesso standard
}
});Cambia la modalità durante una sessione di streaming:
import { query } from "@anthropic-ai/claude-agent-sdk";
// Crea un generatore asincrono per l'input streaming
async function* streamInput() {
yield {
type: 'user',
message: {
role: 'user',
content: "Iniziamo con i permessi predefiniti"
}
};
// Più tardi nella conversazione...
yield {
type: 'user',
message: {
role: 'user',
content: "Ora acceleriamo lo sviluppo"
}
};
}
const q = query({
prompt: streamInput(),
options: {
permissionMode: 'default' // Inizia in modalità predefinita
}
});
// Cambia modalità dinamicamente
await q.setPermissionMode('acceptEdits');
// Elabora i messaggi
for await (const message of q) {
console.log(message);
}acceptEdits)In modalità accetta modifiche:
Operazioni approvate automaticamente:
bypassPermissions)In modalità bypassa permessi:
Le modalità di permesso vengono valutate in un punto specifico del flusso dei permessi:
bypassPermissions - Se attiva, consente tutti gli strumenti rimanenticanUseToolcanUseTool - Gestisce i casi rimanentiQuesto significa:
bypassPermissionsbypassPermissions sovrascrive il callback canUseTool per gli strumenti non corrispondentiEsempio di progressione delle modalità:
// Inizia in modalità predefinita per l'esecuzione controllata
permissionMode: 'default'
// Passa ad acceptEdits per l'iterazione rapida
await q.setPermissionMode('acceptEdits')Il callback canUseTool viene passato come opzione quando si chiama la funzione query. Riceve il nome dello strumento e i parametri di input, e deve restituire una decisione - consentire o negare.
canUseTool si attiva ogni volta che Claude Code mostrerebbe una richiesta di permesso a un utente, ad esempio gli hook e le regole di permesso non lo coprono e non è in modalità acceptEdits.
Ecco un esempio completo che mostra come implementare l'approvazione interattiva degli strumenti:
import { query } from "@anthropic-ai/claude-agent-sdk";
async function promptForToolApproval(toolName: string, input: any) {
console.log("\n🔧 Richiesta Strumento:");
console.log(` Strumento: ${toolName}`);
// Visualizza i parametri dello strumento
if (input && Object.keys(input).length > 0) {
console.log(" Parametri:");
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}`);
}
}
// Ottieni l'approvazione dell'utente (sostituisci con la tua logica UI)
const approved = await getUserApproval();
if (approved) {
console.log(" ✅ Approvato\n");
return {
behavior: "allow",
updatedInput: input
};
} else {
console.log(" ❌ Negato\n");
return {
behavior: "deny",
message: "L'utente ha negato il permesso per questo strumento"
};
}
}
// Usa il callback di permesso
const result = await query({
prompt: "Aiutami ad analizzare questa codebase",
options: {
canUseTool: async (toolName, input) => {
return promptForToolApproval(toolName, input);
}
}
});