O loop em um relance
Cada sessão de agente segue o mesmo ciclo:- Receber prompt. Claude recebe seu prompt, junto com o prompt do sistema, definições de ferramentas e histórico de conversa. O SDK produz uma
SystemMessagecom subtipo"init"contendo metadados da sessão. - Avaliar e responder. Claude avalia o estado atual e determina como proceder. Pode responder com texto, solicitar uma ou mais chamadas de ferramentas, ou ambos. O SDK produz uma
AssistantMessagecontendo o texto e quaisquer solicitações de chamadas de ferramentas. - Executar ferramentas. O SDK executa cada ferramenta solicitada e coleta os resultados. Cada conjunto de resultados de ferramentas retorna para Claude para a próxima decisão. Você pode usar hooks para interceptar, modificar ou bloquear chamadas de ferramentas antes de serem executadas.
- Repetir. Os passos 2 e 3 se repetem como um ciclo. Cada ciclo completo é uma volta. Claude continua chamando ferramentas e processando resultados até produzir uma resposta sem chamadas de ferramentas.
- Retornar resultado. O SDK produz uma
AssistantMessagefinal com a resposta de texto (sem chamadas de ferramentas), seguida por umaResultMessagecom o texto final, uso de tokens, custo e ID da sessão.
Glob e respondendo com os resultados. Uma tarefa complexa (“refatore o módulo de autenticação e atualize os testes”) pode encadear dezenas de chamadas de ferramentas em muitas voltas, lendo arquivos, editando código e executando testes, com Claude ajustando sua abordagem com base em cada resultado.
Voltas e mensagens
Uma volta é uma rodada dentro do loop: Claude produz saída que inclui chamadas de ferramentas, o SDK executa essas ferramentas e os resultados retornam para Claude automaticamente. Isso acontece sem ceder o controle de volta para seu código. As voltas continuam até que Claude produza saída sem chamadas de ferramentas, momento em que o loop termina e o resultado final é entregue. Considere como uma sessão completa pode parecer para o prompt “Corrija os testes falhando em auth.ts”. Primeiro, o SDK envia seu prompt para Claude e produz umaSystemMessage com os metadados da sessão. Então o loop começa:
- Volta 1: Claude chama
Bashpara executarnpm test. O SDK produz umaAssistantMessagecom a chamada de ferramenta, executa o comando, então produz umaUserMessagecom a saída (três falhas). - Volta 2: Claude chama
Reademauth.tseauth.test.ts. O SDK retorna o conteúdo dos arquivos e produz umaAssistantMessage. - Volta 3: Claude chama
Editpara corrigirauth.ts, então chamaBashpara executar novamentenpm test. Todos os três testes passam. O SDK produz umaAssistantMessage. - Volta final: Claude produz uma resposta apenas com texto sem chamadas de ferramentas: “Corrigi o bug de autenticação, todos os três testes passam agora.” O SDK produz uma
AssistantMessagefinal com este texto, então umaResultMessagecom o mesmo texto mais custo e uso.
max_turns / maxTurns, que conta apenas voltas de uso de ferramentas. Por exemplo, max_turns=2 no loop acima teria parado antes da etapa de edição. Você também pode usar max_budget_usd / maxBudgetUsd para limitar voltas com base em um limite de gastos.
Sem limites, o loop é executado até que Claude termine por conta própria, o que é bom para tarefas bem definidas, mas pode ser longo em prompts abertos (“melhore esta base de código”). Definir um orçamento é um bom padrão para agentes em produção. Veja Voltas e orçamento abaixo para a referência de opções.
Tipos de mensagens
Conforme o loop é executado, o SDK produz um fluxo de mensagens. Cada mensagem carrega um tipo que informa em qual estágio do loop ela veio. Os cinco tipos principais são:SystemMessage: eventos do ciclo de vida da sessão. O camposubtypeos distingue:"init"é a primeira mensagem (metadados da sessão), e"compact_boundary"dispara após compactação. Em TypeScript, o limite de compactação é seu próprio tipoSDKCompactBoundaryMessageem vez de um subtipo deSDKSystemMessage.AssistantMessage: emitida após cada resposta do Claude, incluindo a final apenas com texto. Contém blocos de conteúdo de texto e blocos de chamadas de ferramentas dessa volta.UserMessage: emitida após cada execução de ferramenta com o conteúdo do resultado da ferramenta enviado de volta para Claude. Também emitida para quaisquer entradas do usuário que você transmita no meio do loop.StreamEvent: emitida apenas quando mensagens parciais estão habilitadas. Contém eventos brutos de streaming da API (deltas de texto, pedaços de entrada de ferramentas). Veja Respostas de streaming.ResultMessage: marca o fim do loop do agente. Contém o resultado de texto final, uso de tokens, custo e ID da sessão. Verifique o camposubtypepara determinar se a tarefa foi bem-sucedida ou atingiu um limite. Um pequeno número de eventos de sistema finais, comoprompt_suggestion, pode chegar após ele, então itere o fluxo até a conclusão em vez de quebrar no resultado. Veja Lidar com o resultado.
Lidar com mensagens
Quais mensagens você lida depende do que você está construindo:- Apenas resultados finais: lide com
ResultMessagepara obter a saída, custo e se a tarefa foi bem-sucedida ou atingiu um limite. - Atualizações de progresso: lide com
AssistantMessagepara ver o que Claude está fazendo a cada volta, incluindo quais ferramentas chamou. - Streaming ao vivo: habilite mensagens parciais (
include_partial_messagesem Python,includePartialMessagesem TypeScript) para obter mensagensStreamEventem tempo real. Veja Respostas de streaming em tempo real.
- Python: verifique tipos de mensagens com
isinstance()contra classes importadas declaude_agent_sdk(por exemplo,isinstance(message, ResultMessage)). - TypeScript: verifique o campo de string
type(por exemplo,message.type === "result").AssistantMessageeUserMessageenvolvem a mensagem bruta da API em um campo.message, então blocos de conteúdo estão emmessage.message.content, não emmessage.content.
Exemplo: Verificar tipos de mensagens e lidar com resultados
Exemplo: Verificar tipos de mensagens e lidar com resultados
Execução de ferramentas
Ferramentas dão ao seu agente a capacidade de agir. Sem ferramentas, Claude pode apenas responder com texto. Com ferramentas, Claude pode ler arquivos, executar comandos, pesquisar código e interagir com serviços externos.Ferramentas integradas
O SDK inclui as mesmas ferramentas que alimentam o Claude Code:| Categoria | Ferramentas | O que fazem |
|---|---|---|
| Operações de arquivo | Read, Edit, Write | Ler, modificar e criar arquivos |
| Pesquisa | Glob, Grep | Encontrar arquivos por padrão, pesquisar conteúdo com regex |
| Execução | Bash | Executar comandos de shell, scripts, operações git |
| Web | WebSearch, WebFetch | Pesquisar a web, buscar e analisar páginas |
| Descoberta | ToolSearch | Encontrar e carregar ferramentas dinamicamente sob demanda em vez de pré-carregar todas elas |
| Orquestração | Agent, Skill, AskUserQuestion, TaskCreate, TaskUpdate | Gerar subagentes, invocar skills, perguntar ao usuário, rastrear tarefas |
- Conectar serviços externos com servidores MCP (bancos de dados, navegadores, APIs)
- Definir ferramentas personalizadas com manipuladores de ferramentas personalizadas
- Carregar skills do projeto via fontes de configuração para fluxos de trabalho reutilizáveis
Permissões de ferramentas
Claude determina quais ferramentas chamar com base na tarefa, mas você controla se essas chamadas podem ser executadas. Você pode aprovar automaticamente ferramentas específicas, bloquear outras completamente ou exigir aprovação para tudo. Três opções funcionam juntas para determinar o que é executado:allowed_tools/allowedToolsaprova automaticamente ferramentas listadas. Um agente somente leitura com["Read", "Glob", "Grep"]em sua lista de ferramentas permitidas executa essas ferramentas sem avisar. Ferramentas não listadas ainda estão disponíveis, mas exigem permissão.disallowed_tools/disallowedToolsbloqueia ferramentas listadas, independentemente de outras configurações. Veja Permissões para a ordem em que as regras são verificadas antes de uma ferramenta ser executada.permission_mode/permissionModecontrola o que acontece com ferramentas que não são cobertas por regras de permissão ou negação. Veja Modo de permissão para os modos disponíveis.
"Bash(npm *)" para permitir apenas comandos específicos. Veja Permissões para a sintaxe completa de regras.
Quando uma ferramenta é negada, Claude recebe uma mensagem de rejeição como resultado da ferramenta e normalmente tenta uma abordagem diferente ou relata que não pôde prosseguir.
Execução paralela de ferramentas
Quando Claude solicita múltiplas chamadas de ferramentas em uma única volta, ambos os SDKs podem executá-las concorrentemente ou sequencialmente dependendo da ferramenta. Ferramentas somente leitura (comoRead, Glob, Grep e ferramentas MCP marcadas como somente leitura) podem ser executadas concorrentemente. Ferramentas que modificam estado (como Edit, Write e Bash) são executadas sequencialmente para evitar conflitos.
Ferramentas personalizadas padrão para execução sequencial. Para habilitar execução paralela para uma ferramenta personalizada, defina readOnlyHint em suas anotações. Ambos os SDKs TypeScript e Python usam este nome de campo do SDK MCP.
Controlar como o loop é executado
Você pode limitar quantas voltas o loop leva, quanto custa, quão profundamente Claude raciocina e se as ferramentas exigem aprovação antes de serem executadas. Todas essas são campos emClaudeAgentOptions (Python) / Options (TypeScript).
Voltas e orçamento
| Opção | O que controla | Padrão |
|---|---|---|
Max turns (max_turns / maxTurns) | Máximo de rodadas de uso de ferramentas | Sem limite |
Max budget (max_budget_usd / maxBudgetUsd) | Custo máximo antes de parar | Sem limite |
ResultMessage com um subtipo de erro correspondente (error_max_turns ou error_max_budget_usd). Veja Lidar com o resultado para como verificar esses subtipos e ClaudeAgentOptions / Options para sintaxe.
Nível de esforço
A opçãoeffort controla quanto raciocínio Claude aplica. Níveis de esforço mais baixos usam menos tokens por volta e reduzem custo. Nem todos os modelos suportam o parâmetro de esforço. Veja Esforço para quais modelos o suportam.
| Nível | Comportamento | Bom para |
|---|---|---|
"low" | Raciocínio mínimo, respostas rápidas | Buscas de arquivo, listagem de diretórios |
"medium" | Raciocínio equilibrado | Edições rotineiras, tarefas padrão |
"high" | Análise completa | Refatorações, depuração |
"xhigh" | Profundidade de raciocínio estendida | Tarefas de codificação e agentes; recomendado em Opus 4.7 |
"max" | Profundidade máxima de raciocínio | Problemas multi-etapas que exigem análise profunda |
effort, o SDK Python deixa o parâmetro indefinido e defere para o comportamento padrão do modelo. O SDK TypeScript padrão é "high".
effort negocia latência e custo de token por profundidade de raciocínio dentro de cada resposta. Extended thinking é um recurso separado que produz blocos de cadeia de pensamento visíveis na saída. Eles são independentes: você pode definir effort: "low" com extended thinking habilitado, ou effort: "max" sem ele.effort nas opções de nível superior query() para toda a sessão, ou por subagente com o campo effort em AgentDefinition para sobrescrever o nível de sessão.
Modo de permissão
A opção de modo de permissão (permission_mode em Python, permissionMode em TypeScript) controla se o agente pede aprovação antes de usar ferramentas:
| Modo | Comportamento |
|---|---|
"default" | Ferramentas não cobertas por regras de permissão acionam seu callback de aprovação; sem callback significa negar |
"acceptEdits" | Aprova automaticamente edições de arquivo e comandos comuns do sistema de arquivos (mkdir, touch, mv, cp, etc.); outros comandos Bash seguem regras padrão |
"plan" | Ferramentas somente leitura são executadas; Claude explora e produz um plano sem editar seus arquivos de origem |
"dontAsk" | Nunca avisa. Ferramentas pré-aprovadas por regras de permissão são executadas, tudo mais é negado |
"auto" (apenas TypeScript) | Usa um classificador de modelo para aprovar ou negar cada chamada de ferramenta. Veja Modo Auto para disponibilidade e comportamento |
"bypassPermissions" | Executa todas as ferramentas permitidas sem avisar. Não pode ser usado ao executar como root em Unix. Use apenas em ambientes isolados onde as ações do agente não podem afetar sistemas que você se importa |
"default" com um callback de aprovação de ferramenta para exibir avisos de aprovação. Para agentes autônomos em uma máquina de desenvolvimento, "acceptEdits" aprova automaticamente edições de arquivo e comandos comuns do sistema de arquivos (mkdir, touch, mv, cp, etc.) enquanto ainda controla outros comandos Bash atrás de regras de permissão. Reserve "bypassPermissions" para CI, contêineres ou outros ambientes isolados. Veja Permissões para detalhes completos.
Modelo
Se você não definirmodel, o SDK usa o padrão do Claude Code, que depende do seu método de autenticação e assinatura. Defina explicitamente (por exemplo, model="claude-sonnet-4-6") para fixar um modelo específico ou usar um modelo menor para agentes mais rápidos e baratos. Veja modelos para IDs disponíveis.
A janela de contexto
A janela de contexto é a quantidade total de informações disponíveis para Claude durante uma sessão. Ela não é redefinida entre voltas dentro de uma sessão. Tudo se acumula: o prompt do sistema, definições de ferramentas, histórico de conversa, entradas de ferramentas e saídas de ferramentas. Conteúdo que permanece igual entre voltas (prompt do sistema, definições de ferramentas, CLAUDE.md) é automaticamente prompt cached, o que reduz custo e latência para prefixos repetidos.O que consome contexto
Aqui está como cada componente afeta o contexto no SDK:| Fonte | Quando carrega | Impacto |
|---|---|---|
| Prompt do sistema | Cada requisição | Custo fixo pequeno, sempre presente |
| Arquivos CLAUDE.md | Início da sessão, via settingSources | Conteúdo completo em cada requisição (mas prompt-cached, então apenas a primeira requisição paga o custo completo) |
| Definições de ferramentas | Cada requisição; esquemas MCP adiados por padrão | Esquemas de ferramentas integradas carregam a cada requisição. Tool search adia esquemas de ferramentas MCP por padrão, voltando ao carregamento antecipado no Vertex AI ou em um ANTHROPIC_BASE_URL não de primeira parte. Veja Configurar busca de ferramentas para a matriz completa |
| Histórico de conversa | Acumula entre voltas | Cresce a cada volta: prompts, respostas, entradas de ferramentas, saídas de ferramentas |
| Descrições de skills | Início da sessão, via fontes de configuração | Resumos curtos; conteúdo completo carrega apenas quando invocado |
Compactação automática
Quando a janela de contexto se aproxima de seu limite, o SDK compacta automaticamente a conversa: resume o histórico mais antigo para liberar espaço, mantendo suas trocas mais recentes e decisões-chave intactas. O SDK emite uma mensagem comtype: "system" e subtype: "compact_boundary" no fluxo quando isso acontece (em Python isso é uma SystemMessage; em TypeScript é um tipo separado SDKCompactBoundaryMessage).
A compactação substitui mensagens mais antigas por um resumo, então instruções específicas do início da conversa podem não ser preservadas. Regras persistentes pertencem a CLAUDE.md (carregado via settingSources) em vez do prompt inicial, porque o conteúdo CLAUDE.md é reinjetado em cada requisição.
Você pode personalizar o comportamento de compactação de várias maneiras:
- Instruções de sumarização em CLAUDE.md: O compactador lê seu CLAUDE.md como qualquer outro contexto, então você pode incluir uma seção dizendo a ele o que preservar ao resumir. O cabeçalho da seção é livre (não uma string mágica); o compactador corresponde à intenção.
- Hook
PreCompact: Execute lógica personalizada antes da compactação ocorrer, por exemplo para arquivar a transcrição completa. O hook recebe um campotrigger(manualouauto). Veja hooks. - Compactação manual: Envie
/compactcomo uma string de prompt para acionar compactação sob demanda. Comandos enviados desta forma são entradas SDK, não atalhos apenas CLI. Veja slash commands no SDK.
Exemplo: Instruções de sumarização em CLAUDE.md
Exemplo: Instruções de sumarização em CLAUDE.md
Adicione uma seção ao CLAUDE.md do seu projeto dizendo ao compactador o que preservar. O nome do cabeçalho não é especial; use qualquer rótulo claro.
CLAUDE.md
Manter contexto eficiente
Algumas estratégias para agentes de longa duração:- Use subagentes para subtarefas. Cada subagente começa com uma conversa fresca (sem histórico de mensagens anterior, embora carregue seu próprio prompt do sistema e contexto de nível de projeto como CLAUDE.md). Ele não vê as voltas do pai, e apenas sua resposta final retorna ao pai como resultado de ferramenta. O contexto do agente principal cresce por esse resumo, não pela transcrição completa da subtarefa. Veja O que subagentes herdam para detalhes.
- Seja seletivo com ferramentas. Cada definição de ferramenta ocupa espaço de contexto. Use o campo
toolsemAgentDefinitionpara escopo subagentes ao conjunto mínimo que precisam. - Observe custos de servidor MCP. MCP tool search adia esquemas de ferramentas MCP por padrão e carrega-os sob demanda. Quando a busca de ferramentas está desativada, no Vertex AI, ou atrás de um
ANTHROPIC_BASE_URLnão de primeira parte, cada servidor MCP adiciona todos os seus esquemas de ferramentas a cada requisição, então alguns servidores com muitas ferramentas podem consumir contexto significativo antes do agente fazer qualquer trabalho. - Use esforço mais baixo para tarefas rotineiras. Defina esforço para
"low"para agentes que apenas precisam ler arquivos ou listar diretórios. Isso reduz uso de tokens e custo.
Sessões e continuidade
Cada interação com o SDK cria ou continua uma sessão. Capture o ID da sessão deResultMessage.session_id (disponível em ambos os SDKs) para retomar mais tarde. O SDK TypeScript também o expõe como um campo direto na SystemMessage init; em Python está aninhado em SystemMessage.data.
Quando você retoma, o contexto completo de voltas anteriores é restaurado: arquivos que foram lidos, análise que foi realizada e ações que foram tomadas. Você também pode bifurcar uma sessão para ramificar em uma abordagem diferente sem modificar a original.
Veja Gerenciamento de sessão para o guia completo em padrões de retomada, continuação e bifurcação.
Em Python,
ClaudeSDKClient lida com IDs de sessão automaticamente em múltiplas chamadas. Veja a referência do SDK Python para detalhes.Lidar com o resultado
Quando o loop termina, aResultMessage informa o que aconteceu e fornece a saída. O campo subtype (disponível em ambos os SDKs) é a forma principal de verificar o estado de término.
| Subtipo de resultado | O que aconteceu | Campo result disponível? |
|---|---|---|
success | Claude terminou a tarefa normalmente | Sim |
error_max_turns | Atingiu o limite de maxTurns antes de terminar | Não |
error_max_budget_usd | Atingiu o limite de maxBudgetUsd antes de terminar | Não |
error_during_execution | Um erro interrompeu o loop (por exemplo, falha de API ou requisição cancelada) | Não |
error_max_structured_output_retries | Validação de saída estruturada falhou após o limite de tentativas configurado | Não |
result (a saída de texto final) está presente apenas na variante success, então sempre verifique o subtipo antes de lê-lo. Todos os subtipos de resultado carregam total_cost_usd, usage, num_turns e session_id para que você possa rastrear custo e retomar mesmo após erros. Em Python, total_cost_usd e usage são digitados como opcionais e podem ser None em alguns caminhos de erro, então proteja antes de formatá-los. Veja Rastreamento de custos e uso para detalhes sobre interpretação dos campos usage.
O resultado também inclui um campo stop_reason (string | null em TypeScript, str | None em Python) indicando por que o modelo parou de gerar em sua volta final. Valores comuns são end_turn (modelo terminou normalmente), max_tokens (atingiu o limite de token de saída) e refusal (o modelo recusou a requisição). Em subtipos de resultado de erro, stop_reason carrega o valor da última resposta do assistente antes do loop terminar. Para detectar recusas, verifique stop_reason === "refusal" (TypeScript) ou stop_reason == "refusal" (Python). Veja SDKResultMessage (TypeScript) ou ResultMessage (Python) para o tipo completo.
Hooks
Hooks são callbacks que disparam em pontos específicos do loop: antes de uma ferramenta ser executada, depois que retorna, quando o agente termina e assim por diante. Alguns hooks comumente usados são:| Hook | Quando dispara | Usos comuns |
|---|---|---|
PreToolUse | Antes de uma ferramenta ser executada | Validar entradas, bloquear comandos perigosos |
PostToolUse | Depois que uma ferramenta retorna | Auditar saídas, acionar efeitos colaterais |
UserPromptSubmit | Quando um prompt é enviado | Injetar contexto adicional em prompts |
Stop | Quando o agente termina | Validar o resultado, salvar estado da sessão |
SubagentStart / SubagentStop | Quando um subagente é gerado ou completa | Rastrear e agregar resultados de tarefas paralelas |
PreCompact | Antes da compactação de contexto | Arquivar transcrição completa antes de resumir |
PreToolUse que rejeita uma chamada de ferramenta impede sua execução, e Claude recebe a mensagem de rejeição em vez disso.
Ambos os SDKs suportam todos os eventos acima. O SDK TypeScript inclui eventos adicionais que Python ainda não suporta. Veja Controlar execução com hooks para a lista completa de eventos, disponibilidade por SDK e a API de callback completa.
Juntar tudo
Este exemplo combina os conceitos-chave desta página em um único agente que corrige testes falhando. Ele configura o agente com ferramentas permitidas (pré-aprovadas para que o agente seja executado autonomamente), configurações de projeto e limites de segurança em voltas e esforço de raciocínio. Conforme o loop é executado, ele captura o ID da sessão para possível retomada, lida com o resultado final e imprime o custo total.Próximos passos
Agora que você entende o loop, aqui está para onde ir dependendo do que você está construindo:- Ainda não executou um agente? Comece com o quickstart para obter o SDK instalado e ver um exemplo completo sendo executado de ponta a ponta.
- Pronto para conectar ao seu projeto? Carregue CLAUDE.md, skills e hooks do sistema de arquivos para que o agente siga suas convenções de projeto automaticamente.
- Construindo uma UI interativa? Habilite streaming para mostrar texto ao vivo e chamadas de ferramentas conforme o loop é executado.
- Precisa de controle mais apertado sobre o que o agente pode fazer? Bloqueie o acesso a ferramentas com permissões e use hooks para auditar, bloquear ou transformar chamadas de ferramentas antes de serem executadas.
- Executando tarefas longas ou caras? Descarregue trabalho isolado para subagentes para manter seu contexto principal enxuto.