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.

10 min de leitura Equipe python.dev.br

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

FerramentaFocoComplexidadeProvider Lock-in
OpenAI Agents SDKMulti-agentesBaixaNão (100+ LLMs)
LangChainChains e RAGAltaNão
CrewAIEquipes de agentesMédiaNão
AutogenConversas multi-agentesMédiaParcial

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:

  1. Instruções claras: cada agente deve ter um papel bem definido
  2. Ferramentas específicas: crie ferramentas pequenas e focadas
  3. Guardrails sempre: valide entradas e saídas, especialmente em produção
  4. Logging: use tracing para monitorar todo o fluxo
  5. Testes: escreva testes para cada ferramenta individualmente
  6. Tratamento de erros: agentes podem falhar — prepare fallbacks
  7. 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.

E

Equipe python.dev.br

Contribuidor do Python Brasil — Aprenda Python em Português