OpenAI Agents SDK: Multi-Agentes em Python — 2026
Aprenda a criar sistemas multi-agentes com o OpenAI Agents SDK em Python. Exemplos práticos com handoffs, tools e guardrails passo a passo.
O OpenAI Agents SDK é um framework Python leve e poderoso para construir sistemas multi-agentes — onde múltiplos agentes de IA colaboram, delegam tarefas entre si e usam ferramentas externas para resolver problemas complexos. Lançado como sucessor do experimental Swarm, o SDK rapidamente se tornou uma das bibliotecas mais populares para desenvolvimento de aplicações baseadas em agentes.
Neste artigo, vamos explorar como instalar, configurar e criar seus primeiros agentes com exemplos práticos e completos em Python.
O que são agentes de IA?
Um agente de IA é um programa que recebe instruções em linguagem natural, decide quais ações tomar, executa ferramentas e retorna resultados. Diferente de um chatbot simples que apenas responde perguntas, um agente pode:
- Chamar APIs externas
- Consultar bancos de dados
- Executar código
- Delegar tarefas para outros agentes
- Tomar decisões com base em contexto
O OpenAI Agents SDK abstrai toda essa complexidade em primitivas simples: Agent, Tool, Handoff e Guardrail.
Instalação e configuração
Para começar, instale o SDK usando pip ou uv:
# Com pip
pip install openai-agents
# Com uv (recomendado)
uv pip install openai-agents
# Com extras para voz e sessões Redis
pip install "openai-agents[voice,redis]"
Configure sua chave de API como variável de ambiente:
export OPENAI_API_KEY="sua-chave-aqui"
Criando seu primeiro agente
O conceito básico é simples: um Agent recebe instruções e pode usar ferramentas:
from agents import Agent, Runner
# Criar um agente simples
agente = Agent(
name="Assistente Python",
instructions="""
Você é um assistente especializado em Python.
Responda perguntas sobre a linguagem de forma clara e objetiva.
Inclua exemplos de código quando possível.
""",
)
async def main():
resultado = await Runner.run(
agente,
input="Como usar list comprehension em Python?"
)
print(resultado.final_output)
if __name__ == "__main__":
import asyncio
asyncio.run(main())
O SDK usa async/await nativamente, o que permite alta performance em aplicações que fazem múltiplas chamadas simultâneas.
Adicionando ferramentas (Tools)
O poder real dos agentes vem das ferramentas — funções Python que o agente pode chamar quando precisa de dados ou ações externas:
from agents import Agent, Runner, function_tool
import httpx
from datetime import datetime
@function_tool
def buscar_clima(cidade: str) -> str:
"""Busca a previsão do tempo para uma cidade."""
# Exemplo simplificado — substitua por uma API real
climas = {
"São Paulo": "25°C, parcialmente nublado",
"Rio de Janeiro": "32°C, ensolarado",
"Curitiba": "18°C, chuva leve",
"Belo Horizonte": "27°C, céu limpo",
}
return climas.get(cidade, f"Clima não disponível para {cidade}")
@function_tool
def data_atual() -> str:
"""Retorna a data e hora atuais."""
agora = datetime.now()
return agora.strftime("%d/%m/%Y às %H:%M")
@function_tool
def calcular(expressao: str) -> str:
"""Calcula uma expressão matemática simples."""
try:
# Apenas operações seguras
permitidos = set("0123456789+-*/.() ")
if not all(c in permitidos for c in expressao):
return "Expressão inválida"
resultado = eval(expressao) # seguro com validação acima
return f"Resultado: {resultado}"
except Exception as e:
return f"Erro no cálculo: {e}"
# Agente com ferramentas
assistente = Agent(
name="Assistente Completo",
instructions="""
Você é um assistente útil que pode verificar o clima,
informar a data atual e fazer cálculos.
Use as ferramentas disponíveis quando necessário.
Responda sempre em português brasileiro.
""",
tools=[buscar_clima, data_atual, calcular],
)
async def main():
resultado = await Runner.run(
assistente,
input="Qual o clima em São Paulo hoje? E quanto é 1250 * 0.85?"
)
print(resultado.final_output)
if __name__ == "__main__":
import asyncio
asyncio.run(main())
O decorador @function_tool transforma qualquer função Python em uma ferramenta que o agente pode usar. O SDK extrai automaticamente o nome, a docstring e os type hints para informar o modelo.
Sistema multi-agentes com handoffs
O recurso mais poderoso do SDK é o handoff — a capacidade de um agente delegar tarefas para outro agente especializado:
from agents import Agent, Runner
# Agente especialista em Python
especialista_python = Agent(
name="Especialista Python",
instructions="""
Você é um especialista em Python com foco em:
- Sintaxe e boas práticas
- Bibliotecas populares
- Padrões de projeto
Responda com exemplos de código práticos.
""",
)
# Agente especialista em dados
especialista_dados = Agent(
name="Especialista em Dados",
instructions="""
Você é um especialista em ciência de dados com Python.
Foque em:
- Pandas, Polars e NumPy
- Visualização com Matplotlib
- Análise exploratória
Inclua exemplos com DataFrames quando possível.
""",
)
# Agente especialista em DevOps
especialista_devops = Agent(
name="Especialista DevOps",
instructions="""
Você é um especialista em DevOps com Python.
Foque em:
- Docker e containers
- CI/CD e automação
- Deploy e infraestrutura
- Monitoramento e logging
""",
)
# Agente coordenador (triage)
coordenador = Agent(
name="Coordenador",
instructions="""
Você é um coordenador que direciona perguntas para o
especialista mais adequado:
- Perguntas sobre código Python → Especialista Python
- Perguntas sobre dados, análise, DataFrames → Especialista em Dados
- Perguntas sobre deploy, Docker, CI/CD → Especialista DevOps
Analise a pergunta e faça o handoff para o agente correto.
""",
handoffs=[especialista_python, especialista_dados, especialista_devops],
)
async def main():
perguntas = [
"Como usar decoradores em Python?",
"Como analisar um CSV grande com Polars?",
"Como fazer deploy de uma API FastAPI com Docker?",
]
for pergunta in perguntas:
print(f"\n{'='*60}")
print(f"Pergunta: {pergunta}")
print(f"{'='*60}")
resultado = await Runner.run(coordenador, input=pergunta)
print(f"\nResposta:\n{resultado.final_output}")
if __name__ == "__main__":
import asyncio
asyncio.run(main())
O coordenador analisa cada pergunta e faz o handoff automático para o agente mais adequado. Isso é poderoso para criar sistemas que escalam em complexidade sem perder qualidade nas respostas.
Guardrails: segurança e validação
Os guardrails permitem validar entradas e saídas dos agentes, garantindo que respostas inadequadas sejam filtradas:
from agents import Agent, Runner, InputGuardrail, GuardrailFunctionOutput
from pydantic import BaseModel
class ValidacaoEntrada(BaseModel):
"""Resultado da validação de entrada."""
is_valid: bool
reasoning: str
# Agente validador de entrada
agente_validador = Agent(
name="Validador",
instructions="""
Analise se a mensagem do usuário é uma pergunta legítima
sobre programação Python. Rejeite:
- Conteúdo ofensivo
- Pedidos para gerar código malicioso
- Perguntas que não são sobre programação
""",
output_type=ValidacaoEntrada,
)
async def validar_entrada(ctx, agent, input_data):
"""Guardrail que valida a entrada do usuário."""
resultado = await Runner.run(
agente_validador,
input=input_data,
context=ctx,
)
output = resultado.final_output_as(ValidacaoEntrada)
return GuardrailFunctionOutput(
output_info=output,
tripwire_triggered=not output.is_valid,
)
# Agente principal com guardrail
agente_seguro = Agent(
name="Assistente Seguro",
instructions="Responda perguntas sobre Python de forma útil e segura.",
input_guardrails=[
InputGuardrail(guardrail_function=validar_entrada),
],
)
async def main():
try:
resultado = await Runner.run(
agente_seguro,
input="Como usar dicionários em Python?"
)
print(resultado.final_output)
except Exception as e:
print(f"Entrada bloqueada pelo guardrail: {e}")
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Note o uso de Pydantic para definir o esquema de saída estruturada — um padrão que funciona perfeitamente com o SDK.
Agentes como ferramentas
Além de handoffs, você pode usar um agente como ferramenta de outro agente. A diferença é que o controle volta para o agente principal após a execução:
from agents import Agent, Runner
# Agente tradutor usado como ferramenta
agente_tradutor = Agent(
name="Tradutor",
instructions="""
Traduza o texto recebido do português para o inglês.
Retorne apenas a tradução, sem explicações.
""",
)
# Agente revisor usado como ferramenta
agente_revisor = Agent(
name="Revisor de Código",
instructions="""
Revise o código Python recebido e sugira melhorias.
Foque em: legibilidade, performance e boas práticas.
Retorne o código melhorado com comentários.
""",
)
# Agente principal que orquestra os outros
agente_principal = Agent(
name="Assistente Técnico",
instructions="""
Você é um assistente técnico que pode:
1. Traduzir textos usando o agente tradutor
2. Revisar código usando o agente revisor
Use-os como ferramentas quando necessário.
""",
tools=[
agente_tradutor.as_tool(
tool_name="traduzir",
tool_description="Traduz texto de português para inglês"
),
agente_revisor.as_tool(
tool_name="revisar_codigo",
tool_description="Revisa e melhora código Python"
),
],
)
async def main():
resultado = await Runner.run(
agente_principal,
input="""
Revise este código Python:
def pegar_dados(url):
import requests
r = requests.get(url)
dados = r.json()
resultado = []
for item in dados:
if item['ativo'] == True:
resultado.append(item['nome'])
return resultado
"""
)
print(resultado.final_output)
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Tracing e observabilidade
O SDK inclui tracing integrado para monitorar e debugar seus agentes:
from agents import Agent, Runner, trace
async def main():
agente = Agent(
name="Assistente",
instructions="Responda perguntas sobre Python.",
)
# O trace agrupa todas as operações do agente
with trace("minha-sessao"):
resultado = await Runner.run(
agente,
input="Explique generators em Python"
)
print(resultado.final_output)
# Acessar informações do trace
for item in resultado.raw_responses:
print(f"Modelo: {item.model}")
print(f"Tokens usados: {item.usage}")
if __name__ == "__main__":
import asyncio
asyncio.run(main())
O tracing permite visualizar o fluxo completo de execução, identificar gargalos e debugar problemas em sistemas complexos. Isso é essencial para manter a qualidade quando você tem múltiplos agentes interagindo.
Exemplo prático: assistente de código
Vamos juntar tudo em um exemplo completo — um assistente que analisa código Python, sugere melhorias e explica conceitos:
from agents import Agent, Runner, function_tool
import subprocess
import tempfile
import os
@function_tool
def executar_python(codigo: str) -> str:
"""Executa um trecho de código Python e retorna a saída."""
with tempfile.NamedTemporaryFile(
mode='w', suffix='.py', delete=False
) as f:
f.write(codigo)
f.flush()
try:
result = subprocess.run(
['python3', f.name],
capture_output=True,
text=True,
timeout=10,
)
output = result.stdout
if result.stderr:
output += f"\nErros:\n{result.stderr}"
return output or "Código executado sem saída"
except subprocess.TimeoutExpired:
return "Erro: timeout — o código demorou mais de 10s"
finally:
os.unlink(f.name)
@function_tool
def verificar_tipo(codigo: str) -> str:
"""Verifica tipos do código usando mypy."""
with tempfile.NamedTemporaryFile(
mode='w', suffix='.py', delete=False
) as f:
f.write(codigo)
f.flush()
try:
result = subprocess.run(
['mypy', f.name, '--no-error-summary'],
capture_output=True,
text=True,
timeout=15,
)
return result.stdout or "Nenhum erro de tipo encontrado"
except FileNotFoundError:
return "mypy não está instalado"
finally:
os.unlink(f.name)
assistente_codigo = Agent(
name="Assistente de Código Python",
instructions="""
Você é um assistente especializado em Python que pode:
1. Executar código Python para validar resultados
2. Verificar tipos com mypy
3. Explicar conceitos e sugerir melhorias
Sempre valide o código antes de apresentar ao usuário.
Responda em português brasileiro.
Use type hints e siga as boas práticas modernas do Python.
""",
tools=[executar_python, verificar_tipo],
)
async def main():
resultado = await Runner.run(
assistente_codigo,
input="""
Crie uma função que recebe uma lista de dicionários
representando produtos (nome, preco, quantidade) e
retorna os 3 produtos mais caros que estão em estoque.
Use type hints e dataclasses.
"""
)
print(resultado.final_output)
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Comparação com outras abordagens
| Ferramenta | Foco | Complexidade | Provider Lock-in |
|---|---|---|---|
| OpenAI Agents SDK | Multi-agentes | Baixa | Não (100+ LLMs) |
| LangChain | Chains e RAG | Alta | Não |
| CrewAI | Equipes de agentes | Média | Não |
| Autogen | Conversas multi-agentes | Média | Parcial |
O Agents SDK se destaca pela simplicidade. Se você já trabalha com APIs de LLMs e quer adicionar capacidade agentic ao seu projeto, é a opção com menor curva de aprendizado.
Boas práticas
Para construir sistemas multi-agentes robustos:
- Instruções claras: cada agente deve ter um papel bem definido
- Ferramentas específicas: crie ferramentas pequenas e focadas
- Guardrails sempre: valide entradas e saídas, especialmente em produção
- Logging: use tracing para monitorar todo o fluxo
- Testes: escreva testes para cada ferramenta individualmente
- Tratamento de erros: agentes podem falhar — prepare fallbacks
- Type hints: use tipagem em todas as ferramentas para documentação automática
Perguntas frequentes
Preciso usar a API da OpenAI?
Não necessariamente. O SDK é provider-agnostic e suporta mais de 100 LLMs diferentes, incluindo modelos locais e de outros provedores.
Qual a diferença entre handoff e agent-as-tool?
No handoff, o controle passa completamente para o outro agente. No agent-as-tool, o agente é usado como uma ferramenta e o controle retorna ao agente principal após a execução.
É possível manter estado entre conversas?
Sim. O SDK suporta sessions que persistem o histórico de conversas. Com o extra Redis, você pode manter sessões entre reinicializações da aplicação.
Funciona com Python 3.10+?
Sim, o SDK requer Python 3.10 ou superior. Recomendamos usar o Python 3.14 para aproveitar o JIT compiler e melhor performance geral.
Conclusão
O OpenAI Agents SDK simplifica drasticamente a construção de sistemas multi-agentes em Python. Com primitivas claras como Agent, Tool, Handoff e Guardrail, você pode criar desde assistentes simples até pipelines complexos de IA.
Para começar, instale o SDK, crie seu primeiro agente com ferramentas e evolua para sistemas multi-agentes conforme a necessidade. E se você quer entender melhor o ecossistema de IA em Python, confira nosso artigo sobre Python e LLMs e o guia de design patterns em Python.
Equipe python.dev.br
Contribuidor do Python Brasil — Aprenda Python em Português