Construir com Claude Code
Claude Code SDK
Implantação
Administração
Configuração
Recursos
Python
Construa agentes de IA personalizados com o Claude Code Python SDK
Pré-requisitos
- Python 3.10+
claude-code-sdk
do PyPI- Node.js 18+
@anthropic-ai/claude-code
do NPM
Para visualizar o código-fonte do Python SDK, consulte o repositório claude-code-sdk
.
Para desenvolvimento interativo, use IPython: pip install ipython
Instalação
Instale claude-code-sdk
do PyPI e @anthropic-ai/claude-code
do NPM:
pip install claude-code-sdk
npm install -g @anthropic-ai/claude-code # Dependência obrigatória
(Opcional) Instale IPython para desenvolvimento interativo:
pip install ipython
Início rápido
Crie seu primeiro agente:
# legal-agent.py
import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions
async def main():
async with ClaudeSDKClient(
options=ClaudeCodeOptions(
system_prompt="Você é um assistente jurídico. Identifique riscos e sugira melhorias.",
max_turns=2
)
) as client:
# Envie a consulta
await client.query(
"Revise esta cláusula de contrato para possíveis problemas: 'A parte concorda com responsabilidade ilimitada...'"
)
# Transmita a resposta
async for message in client.receive_response():
if hasattr(message, 'content'):
# Imprima o conteúdo em streaming conforme chega
for block in message.content:
if hasattr(block, 'text'):
print(block.text, end='', flush=True)
if __name__ == "__main__":
asyncio.run(main())
Salve o código acima como legal-agent.py
, depois execute:
python legal-agent.py
Para notebooks IPython/Jupyter, você pode executar o código diretamente em uma célula:
await main()
Os exemplos Python nesta página usam asyncio
, mas você também pode usar anyio
.
Uso básico
O Python SDK fornece duas interfaces principais:
1. A classe ClaudeSDKClient
(recomendada)
Melhor para respostas em streaming, conversas multi-turno e aplicações interativas:
import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions
async def main():
async with ClaudeSDKClient(
options=ClaudeCodeOptions(
system_prompt="Você é um engenheiro de performance",
allowed_tools=["Bash", "Read", "WebSearch"],
max_turns=5
)
) as client:
await client.query("Analise a performance do sistema")
# Transmita respostas
async for message in client.receive_response():
if hasattr(message, 'content'):
for block in message.content:
if hasattr(block, 'text'):
print(block.text, end='', flush=True)
# Execute como script
asyncio.run(main())
# Ou no IPython/Jupyter: await main()
2. A função query
Para consultas simples e únicas:
from claude_code_sdk import query, ClaudeCodeOptions
async for message in query(
prompt="Analise a performance do sistema",
options=ClaudeCodeOptions(system_prompt="Você é um engenheiro de performance")
):
if type(message).__name__ == "ResultMessage":
print(message.result)
Opções de configuração
O Python SDK aceita todos os argumentos suportados pela linha de comando através da classe ClaudeCodeOptions
.
Parâmetros ClaudeCodeOptions
from claude_code_sdk import ClaudeCodeOptions
options = ClaudeCodeOptions(
# Configuração principal
system_prompt="Você é um assistente útil",
append_system_prompt="Instruções adicionais do sistema",
max_turns=5,
model="claude-3-5-sonnet-20241022",
max_thinking_tokens=8000,
# Gerenciamento de ferramentas
allowed_tools=["Bash", "Read", "Write"],
disallowed_tools=["WebSearch"],
# Gerenciamento de sessão
continue_conversation=False,
resume="session-uuid",
# Ambiente
cwd="/caminho/para/diretorio/trabalho",
add_dirs=["/diretorio/contexto/adicional"],
settings="/caminho/para/settings.json",
# Permissões
permission_mode="acceptEdits", # "default", "acceptEdits", "plan", "bypassPermissions"
permission_prompt_tool_name="mcp__approval_tool",
# Integração MCP
mcp_servers={
"my_server": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-example"],
"env": {"API_KEY": "sua-chave"}
}
},
# Avançado
extra_args={"--verbose": None, "--custom-flag": "value"}
)
Detalhes dos parâmetros
system_prompt
:str | None
- Prompt de sistema personalizado definindo o papel do agenteappend_system_prompt
:str | None
- Texto adicional anexado ao prompt do sistemamax_turns
:int | None
- Máximo de turnos de conversa (ilimitado se None)model
:str | None
- Modelo Claude específico para usarmax_thinking_tokens
:int
- Máximo de tokens para o processo de pensamento do Claude (padrão: 8000)allowed_tools
:list[str]
- Ferramentas especificamente permitidas para usodisallowed_tools
:list[str]
- Ferramentas que não devem ser usadascontinue_conversation
:bool
- Continuar conversa mais recente (padrão: False)resume
:str | None
- UUID da sessão para retomar conversa específicacwd
:str | Path | None
- Diretório de trabalho para a sessãoadd_dirs
:list[str | Path]
- Diretórios adicionais para incluir no contextosettings
:str | None
- Caminho para arquivo de configurações ou string JSON de configuraçõespermission_mode
:str | None
- Modo de tratamento de permissõespermission_prompt_tool_name
:str | None
- Nome personalizado da ferramenta de prompt de permissãomcp_servers
:dict | str | Path
- Configurações do servidor MCPextra_args
:dict[str, str | None]
- Passar flags CLI arbitrárias para o Claude Code CLI subjacente
Modos de permissão
"default"
: CLI solicita para ferramentas perigosas (comportamento padrão)"acceptEdits"
: Aceitar automaticamente edições de arquivo sem solicitar"plan"
: Modo Plano - analisar sem fazer alterações"bypassPermissions"
: Permitir todas as ferramentas sem solicitar (use com cuidado)
Exemplo de configuração avançada
import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions
async def advanced_agent():
"""Exemplo mostrando opções de configuração avançadas"""
async with ClaudeSDKClient(
options=ClaudeCodeOptions(
# Diretório de trabalho personalizado e contexto adicional
cwd="/raiz/projeto",
add_dirs=["/libs/compartilhadas", "/utils/comuns"],
# Configuração de modelo e pensamento
model="claude-3-5-sonnet-20241022",
max_thinking_tokens=12000,
# Controle avançado de ferramentas
allowed_tools=["Read", "Write", "Bash", "Grep"],
disallowed_tools=["WebSearch", "Bash(rm*)"],
# Configurações personalizadas e argumentos CLI
settings='{"editor": "vim", "theme": "dark"}',
extra_args={
"--verbose": None,
"--timeout": "300"
}
)
) as client:
await client.query("Analise a estrutura da base de código")
async for message in client.receive_response():
if hasattr(message, 'content'):
for block in message.content:
if hasattr(block, 'text'):
print(block.text, end='', flush=True)
asyncio.run(advanced_agent())
Mensagens estruturadas e entradas de imagem
O SDK suporta passar mensagens estruturadas e entradas de imagem:
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions
async with ClaudeSDKClient() as client:
# Mensagem de texto
await client.query("Analise este código para problemas de segurança")
# Mensagem com referência de imagem (imagem será lida pela ferramenta Read do Claude)
await client.query("Explique o que está mostrado em screenshot.png")
# Múltiplas mensagens em sequência
messages = [
"Primeiro, analise o diagrama de arquitetura em diagram.png",
"Agora sugira melhorias baseadas no diagrama",
"Finalmente, gere código de implementação"
]
for msg in messages:
await client.query(msg)
async for response in client.receive_response():
# Processe cada resposta
pass
# O SDK trata arquivos de imagem através da ferramenta Read integrada do Claude
# Formatos suportados: PNG, JPG, PDF e outros formatos comuns
Conversas multi-turno
Método 1: Usando ClaudeSDKClient para conversas persistentes
import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions, query
# Método 1: Usando ClaudeSDKClient para conversas persistentes
async def multi_turn_conversation():
async with ClaudeSDKClient() as client:
# Primeira consulta
await client.query("Vamos refatorar o módulo de pagamento")
async for msg in client.receive_response():
# Processe primeira resposta
pass
# Continue na mesma sessão
await client.query("Agora adicione tratamento de erro abrangente")
async for msg in client.receive_response():
# Processe continuação
pass
# O contexto da conversa é mantido durante todo o processo
# Método 2: Usando função query com gerenciamento de sessão
async def resume_session():
# Continue conversa mais recente
async for message in query(
prompt="Agora refatore isso para melhor performance",
options=ClaudeCodeOptions(continue_conversation=True)
):
if type(message).__name__ == "ResultMessage":
print(message.result)
# Retome sessão específica
async for message in query(
prompt="Atualize os testes",
options=ClaudeCodeOptions(
resume="550e8400-e29b-41d4-a716-446655440000",
max_turns=3
)
):
if type(message).__name__ == "ResultMessage":
print(message.result)
# Execute os exemplos
asyncio.run(multi_turn_conversation())
Prompts de sistema personalizados
Prompts de sistema definem o papel, expertise e comportamento do seu agente:
import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions
async def specialized_agents():
# Agente de resposta a incidentes SRE com streaming
async with ClaudeSDKClient(
options=ClaudeCodeOptions(
system_prompt="Você é um especialista SRE. Diagnostique problemas sistematicamente e forneça soluções acionáveis.",
max_turns=3
)
) as sre_agent:
await sre_agent.query("API está fora do ar, investigue")
# Transmita o processo de diagnóstico
async for message in sre_agent.receive_response():
if hasattr(message, 'content'):
for block in message.content:
if hasattr(block, 'text'):
print(block.text, end='', flush=True)
# Agente de revisão jurídica com prompt personalizado
async with ClaudeSDKClient(
options=ClaudeCodeOptions(
append_system_prompt="Sempre inclua tratamento de erro abrangente e testes unitários.",
max_turns=2
)
) as dev_agent:
await dev_agent.query("Refatore esta função")
# Colete resposta completa
full_response = []
async for message in dev_agent.receive_response():
if type(message).__name__ == "ResultMessage":
print(message.result)
asyncio.run(specialized_agents())
Ferramentas personalizadas via MCP
O Model Context Protocol (MCP) permite dar aos seus agentes ferramentas e capacidades personalizadas:
import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions
async def mcp_enabled_agent():
# Agente jurídico com acesso a documentos e streaming
# Nota: Configure seus servidores MCP conforme necessário
mcp_servers = {
# Configuração de exemplo - descomente e configure conforme necessário:
# "docusign": {
# "command": "npx",
# "args": ["-y", "@modelcontextprotocol/server-docusign"],
# "env": {"API_KEY": "sua-chave"}
# }
}
async with ClaudeSDKClient(
options=ClaudeCodeOptions(
mcp_servers=mcp_servers,
allowed_tools=["mcp__docusign", "mcp__compliance_db"],
system_prompt="Você é um advogado corporativo especializado em revisão de contratos.",
max_turns=4
)
) as client:
await client.query("Revise este contrato para riscos de conformidade")
# Monitore uso de ferramentas e respostas
async for message in client.receive_response():
if hasattr(message, 'content'):
for block in message.content:
if hasattr(block, 'type'):
if block.type == 'tool_use':
print(f"\n[Usando ferramenta: {block.name}]\n")
elif hasattr(block, 'text'):
print(block.text, end='', flush=True)
elif hasattr(block, 'text'):
print(block.text, end='', flush=True)
if type(message).__name__ == "ResultMessage":
print(f"\n\nRevisão completa. Custo total: ${message.total_cost_usd:.4f}")
asyncio.run(mcp_enabled_agent())
Ferramenta de prompt de permissão personalizada
Implemente tratamento de permissão personalizado para chamadas de ferramentas:
import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions
async def use_permission_prompt():
"""Exemplo usando ferramenta de prompt de permissão personalizada"""
# Configuração do servidor MCP
mcp_servers = {
# Configuração de exemplo - descomente e configure conforme necessário:
# "security": {
# "command": "npx",
# "args": ["-y", "@modelcontextprotocol/server-security"],
# "env": {"API_KEY": "sua-chave"}
# }
}
async with ClaudeSDKClient(
options=ClaudeCodeOptions(
permission_prompt_tool_name="mcp__security__approval_prompt", # Alterado de permission_prompt_tool
mcp_servers=mcp_servers,
allowed_tools=["Read", "Grep"],
disallowed_tools=["Bash(rm*)", "Write"],
system_prompt="Você é um auditor de segurança"
)
) as client:
await client.query("Analise e corrija os problemas de segurança")
# Monitore uso de ferramentas e permissões
async for message in client.receive_response():
if hasattr(message, 'content'):
for block in message.content:
if hasattr(block, 'type'): # Adicionada verificação para atributo 'type'
if block.type == 'tool_use':
print(f"[Ferramenta: {block.name}] ", end='')
if hasattr(block, 'text'):
print(block.text, end='', flush=True)
# Verifique negações de permissão em mensagens de erro
if type(message).__name__ == "ErrorMessage":
if hasattr(message, 'error') and "Permission denied" in str(message.error):
print(f"\n⚠️ Permissão negada: {message.error}")
# Exemplo de implementação de servidor MCP (Python)
# Isso estaria no código do seu servidor MCP
async def approval_prompt(tool_name: str, input: dict, tool_use_id: str = None):
"""Manipulador de prompt de permissão personalizado"""
# Sua lógica personalizada aqui
if "allow" in str(input):
return json.dumps({
"behavior": "allow",
"updatedInput": input
})
else:
return json.dumps({
"behavior": "deny",
"message": f"Permissão negada para {tool_name}"
})
asyncio.run(use_permission_prompt())
Formatos de saída
Saída de texto com streaming
# Saída de texto padrão com streaming
async with ClaudeSDKClient() as client:
await client.query("Explique arquivo src/components/Header.tsx")
# Transmita texto conforme chega
async for message in client.receive_response():
if hasattr(message, 'content'):
for block in message.content:
if hasattr(block, 'text'):
print(block.text, end='', flush=True)
# Saída transmite em tempo real: Este é um componente React mostrando...
Saída JSON com metadados
# Colete todas as mensagens com metadados
async with ClaudeSDKClient() as client:
await client.query("Como funciona a camada de dados?")
messages = []
result_data = None
async for message in client.receive_messages():
messages.append(message)
# Capture mensagem de resultado com metadados
if type(message).__name__ == "ResultMessage":
result_data = {
"result": message.result,
"cost": message.total_cost_usd,
"duration": message.duration_ms,
"num_turns": message.num_turns,
"session_id": message.session_id
}
break
print(result_data)
Formatos de entrada
import asyncio
from claude_code_sdk import ClaudeSDKClient
async def process_inputs():
async with ClaudeSDKClient() as client:
# Entrada de texto
await client.query("Explique este código")
async for message in client.receive_response():
# Processe resposta em streaming
pass
# Entrada de imagem (Claude usará ferramenta Read automaticamente)
await client.query("O que há neste diagrama? screenshot.png")
async for message in client.receive_response():
# Processe análise de imagem
pass
# Múltiplas entradas com conteúdo misto
inputs = [
"Analise a arquitetura em diagram.png",
"Compare com melhores práticas",
"Gere versão melhorada"
]
for prompt in inputs:
await client.query(prompt)
async for message in client.receive_response():
# Processe cada resposta
pass
asyncio.run(process_inputs())
Exemplos de integração de agentes
Agente de resposta a incidentes SRE
import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions
async def investigate_incident(incident_description: str, severity: str = "medium"):
"""Agente de resposta a incidentes automatizado com streaming em tempo real"""
# Configuração do servidor MCP para ferramentas de monitoramento
mcp_servers = {
# Configuração de exemplo - descomente e configure conforme necessário:
# "datadog": {
# "command": "npx",
# "args": ["-y", "@modelcontextprotocol/server-datadog"],
# "env": {"API_KEY": "sua-chave-datadog", "APP_KEY": "sua-chave-app"}
# }
}
async with ClaudeSDKClient(
options=ClaudeCodeOptions(
system_prompt="Você é um especialista SRE. Diagnostique problemas sistematicamente e forneça soluções acionáveis.",
max_turns=6,
allowed_tools=["Bash", "Read", "WebSearch", "mcp__datadog"],
mcp_servers=mcp_servers
)
) as client:
# Envie os detalhes do incidente
prompt = f"Incidente: {incident_description} (Severidade: {severity})"
print(f"🚨 Investigando: {prompt}\n")
await client.query(prompt)
# Transmita o processo de investigação
investigation_log = []
async for message in client.receive_response():
if hasattr(message, 'content'):
for block in message.content:
if hasattr(block, 'type'):
if block.type == 'tool_use':
print(f"[{block.name}] ", end='')
if hasattr(block, 'text'):
text = block.text
print(text, end='', flush=True)
investigation_log.append(text)
# Capture resultado final
if type(message).__name__ == "ResultMessage":
return {
'analysis': ''.join(investigation_log),
'cost': message.total_cost_usd,
'duration_ms': message.duration_ms
}
# Uso
result = await investigate_incident("API de pagamento retornando erros 500", "high")
print(f"\n\nInvestigação completa. Custo: ${result['cost']:.4f}")
Revisão de segurança automatizada
import subprocess
import asyncio
import json
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions
async def audit_pr(pr_number: int):
"""Agente de auditoria de segurança para pull requests com feedback em streaming"""
# Obtenha diff do PR
pr_diff = subprocess.check_output(
["gh", "pr", "diff", str(pr_number)],
text=True
)
async with ClaudeSDKClient(
options=ClaudeCodeOptions(
system_prompt="Você é um engenheiro de segurança. Revise este PR para vulnerabilidades, padrões inseguros e problemas de conformidade.",
max_turns=3,
allowed_tools=["Read", "Grep", "WebSearch"]
)
) as client:
print(f"🔍 Auditando PR #{pr_number}\n")
await client.query(pr_diff)
findings = []
async for message in client.receive_response():
if hasattr(message, 'content'):
for block in message.content:
if hasattr(block, 'text'):
# Transmita descobertas conforme são descobertas
print(block.text, end='', flush=True)
findings.append(block.text)
if type(message).__name__ == "ResultMessage":
return {
'pr_number': pr_number,
'findings': ''.join(findings),
'metadata': {
'cost': message.total_cost_usd,
'duration': message.duration_ms,
'severity': 'high' if 'vulnerability' in ''.join(findings).lower() else 'medium'
}
}
# Uso
report = await audit_pr(123)
print(f"\n\nAuditoria completa. Severidade: {report['metadata']['severity']}")
print(json.dumps(report, indent=2))
Assistente jurídico multi-turno
import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions
async def legal_review():
"""Revisão de documento jurídico com sessão persistente e streaming"""
async with ClaudeSDKClient(
options=ClaudeCodeOptions(
system_prompt="Você é um advogado corporativo. Forneça análise jurídica detalhada.",
max_turns=2
)
) as client:
# Revisão multi-etapas na mesma sessão
steps = [
"Revise contract.pdf para cláusulas de responsabilidade",
"Verifique conformidade com requisitos GDPR",
"Gere resumo executivo dos riscos"
]
review_results = []
for step in steps:
print(f"\n📋 {step}\n")
await client.query(step)
step_result = []
async for message in client.receive_response():
if hasattr(message, 'content'):
for block in message.content:
if hasattr(block, 'text'):
text = block.text
print(text, end='', flush=True)
step_result.append(text)
if type(message).__name__ == "ResultMessage":
review_results.append({
'step': step,
'analysis': ''.join(step_result),
'cost': message.total_cost_usd
})
# Resumo
total_cost = sum(r['cost'] for r in review_results)
print(f"\n\n✅ Revisão jurídica completa. Custo total: ${total_cost:.4f}")
return review_results
# Uso
results = await legal_review()
Melhores práticas específicas do Python
Padrões principais
import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions
# Sempre use gerenciadores de contexto
async with ClaudeSDKClient() as client:
await client.query("Analise este código")
async for msg in client.receive_response():
# Processe mensagens em streaming
pass
# Execute múltiplos agentes simultaneamente
async with ClaudeSDKClient() as reviewer, ClaudeSDKClient() as tester:
await asyncio.gather(
reviewer.query("Revise main.py"),
tester.query("Escreva testes para main.py")
)
# Tratamento de erro
from claude_code_sdk import CLINotFoundError, ProcessError
try:
async with ClaudeSDKClient() as client:
# Seu código aqui
pass
except CLINotFoundError:
print("Instale CLI: npm install -g @anthropic-ai/claude-code")
except ProcessError as e:
print(f"Erro de processo: {e}")
# Colete resposta completa com metadados
async def get_response(client, prompt):
await client.query(prompt)
text = []
async for msg in client.receive_response():
if hasattr(msg, 'content'):
for block in msg.content:
if hasattr(block, 'text'):
text.append(block.text)
if type(msg).__name__ == "ResultMessage":
return {'text': ''.join(text), 'cost': msg.total_cost_usd}
Dicas IPython/Jupyter
# No Jupyter, use await diretamente em células
client = ClaudeSDKClient()
await client.connect()
await client.query("Analise data.csv")
async for msg in client.receive_response():
print(msg)
await client.disconnect()
# Crie funções auxiliares reutilizáveis
async def stream_print(client, prompt):
await client.query(prompt)
async for msg in client.receive_response():
if hasattr(msg, 'content'):
for block in msg.content:
if hasattr(block, 'text'):
print(block.text, end='', flush=True)
Recursos relacionados
- Uso e controles CLI - Documentação completa do CLI
- Integração GitHub Actions - Automatize seu fluxo de trabalho GitHub com Claude
- Fluxos de trabalho comuns - Guias passo a passo para casos de uso comuns
Was this page helpful?
- Pré-requisitos
- Instalação
- Início rápido
- Uso básico
- 1. A classe ClaudeSDKClient (recomendada)
- 2. A função query
- Opções de configuração
- Parâmetros ClaudeCodeOptions
- Detalhes dos parâmetros
- Modos de permissão
- Exemplo de configuração avançada
- Mensagens estruturadas e entradas de imagem
- Conversas multi-turno
- Método 1: Usando ClaudeSDKClient para conversas persistentes
- Prompts de sistema personalizados
- Ferramentas personalizadas via MCP
- Ferramenta de prompt de permissão personalizada
- Formatos de saída
- Saída de texto com streaming
- Saída JSON com metadados
- Formatos de entrada
- Exemplos de integração de agentes
- Agente de resposta a incidentes SRE
- Revisão de segurança automatizada
- Assistente jurídico multi-turno
- Melhores práticas específicas do Python
- Padrões principais
- Dicas IPython/Jupyter
- Recursos relacionados