Laboratório: Chatbot de Atendimento Empresarial com Claude e GPT via Python SDK
Você vai implementar um chatbot de atendimento que responde perguntas de clientes usando Claude (Anthropic) e GPT (OpenAI) via API, com Python e FastAPI, rodando localmente. Em cerca de 2 horas, terá um endpoint HTTP que recebe perguntas e retorna respostas dos dois modelos, pronto para integração com sistemas internos.

Roteiro para estudo em ambiente de laboratório ou de teste. Execute apenas em equipamentos, redes e contas que você tenha autorização para usar, com backup e homologação próprios. Comandos podem causar indisponibilidade ou perda de dados. Software e marcas citados pertencem aos seus titulares. Termos de Uso.
- Duração estimada
- 120 min
- Passos
- 13
- Validações
- 5
- Versões da documentação consultada
- Python a versão estável atual · FastAPI a versão estável atual · Uvicorn a versão estável atual · Anthropic SDK Python a versão estável atual · OpenAI SDK Python a versão estável atual
Demonstrar, na prática, como conectar aplicações empresariais a modelos de linguagem generativa de última geração usando apenas software de código aberto. O laboratório mostra como estruturar prompts, proteger segredos, registrar logs e validar respostas, simulando um cenário real de atendimento automatizado em uma empresa.
Topologia
Uma máquina local (192.168.56.10) roda o backend Python com FastAPI. O backend se conecta à API do Claude (api.anthropic.com) e à API do OpenAI (api.openai.com) via internet. Usuários internos acessam o endpoint HTTP local para enviar perguntas e receber respostas.
Usuário HTTP Claude API OpenAI API
| | |
| | |
[FastAPI Backend]----+------------------+
|
192.168.56.10
Equipamentos e software
| Item | Requisito, licença ou versão |
|---|---|
| PC ou VM | 2 vCPU, 4GB RAM, 1 porta aberta (8000/tcp), sistema operacional Linux ou Windows 10+ |
| Python | PSF · a versão estável atual |
| FastAPI | MIT · a versão estável atual |
| Uvicorn | BSD · a versão estável atual |
| Anthropic SDK Python | Apache-2.0 · a versão estável atual |
| OpenAI SDK Python | MIT · a versão estável atual |
Roteiro
- Preparar ambiente Python isolado
Evite conflitos criando um ambiente virtual para dependências.
python3 -m venv chatbot-env source chatbot-env/bin/activateO que você deve ver: Prompt do terminal alterado para (chatbot-env)
- Instalar dependências
Instale FastAPI, Uvicorn, e os SDKs oficiais da Anthropic e OpenAI.
pip install fastapi uvicorn anthropic openaiO que você deve ver: Mensagem de sucesso do pip para cada pacote
- Configurar variáveis de ambiente para segredos
Nunca exponha chaves de API no código. Use variáveis de ambiente.
export ANTHROPIC_API_KEY='sua-chave-clique-na-dashboard' export OPENAI_API_KEY='sua-chave-clique-na-dashboard'O que você deve ver: Variáveis setadas (sem saída, mas disponíveis para o Python)
- Criar arquivo main.py
Implemente o backend FastAPI com endpoints para perguntas e integração com Claude e GPT.
nano main.pyO que você deve ver: Arquivo main.py criado para edição
- Escrever código do endpoint
No main.py, crie um endpoint POST /ask que recebe pergunta e retorna respostas dos dois modelos.
Veja abaixo o exemplo de código.O que você deve ver: Código salvo sem erros de sintaxe
- Exemplo de código main.py
Cole o seguinte código no main.py (ajuste as chaves conforme necessário):
import os from fastapi import FastAPI, HTTPException from pydantic import BaseModel import anthropic import openai app = FastAPI() class Question(BaseModel): question: str @app.post('/ask') async def ask_bot(q: Question): # Claude try: client_claude = anthropic.Anthropic(api_key=os.environ['ANTHROPIC_API_KEY']) claude_response = client_claude.messages.create( model="claude-sonnet-5", max_tokens=512, messages=[{"role": "user", "content": q.question}] ) claude_answer = claude_response.content[0].text except Exception as e: claude_answer = f"Erro Claude: {str(e)}" # GPT try: client_openai = openai.OpenAI(api_key=os.environ['OPENAI_API_KEY']) gpt_response = client_openai.chat.completions.create( model="gpt-5.6-terra", messages=[{"role": "user", "content": q.question}], max_tokens=512 ) gpt_answer = gpt_response.choices[0].message.content except Exception as e: gpt_answer = f"Erro GPT: {str(e)}" return {"claude": claude_answer, "gpt": gpt_answer}O que você deve ver: Arquivo main.py com código pronto
- Rodar o backend localmente
Inicie o servidor FastAPI usando Uvicorn.
uvicorn main:app --host 0.0.0.0 --port 8000O que você deve ver: Mensagem 'Uvicorn running on http://0.0.0.0:8000'
- Testar endpoint com curl
Simule uma pergunta de cliente para o chatbot.
curl -X POST http://localhost:8000/ask -H "Content-Type: application/json" -d '{"question": "Como faço para atualizar minha fatura?"}'O que você deve ver: Resposta JSON com campos 'claude' e 'gpt' preenchidos
- Registrar logs das respostas
Adicione prints ou logging para registrar perguntas e respostas em main.py.
# Exemplo: print(f"Pergunta: {q.question} | Claude: {claude_answer} | GPT: {gpt_answer}")O que você deve ver: Logs impressos no terminal a cada requisição
- Adicionar validação de entrada
Garanta que a pergunta não esteja vazia e não exceda 500 caracteres.
# Adicione antes de chamar as APIs: if not q.question or len(q.question) > 500: raise HTTPException(status_code=400, detail="Pergunta inválida")O que você deve ver: Requisições inválidas retornam erro HTTP 400
- Testar com perguntas inválidas
Envie perguntas vazias ou muito longas para validar o guardrail.
curl -X POST http://localhost:8000/ask -H "Content-Type: application/json" -d '{"question": ""}'O que você deve ver: Resposta HTTP 400 com mensagem de erro
- Simular múltiplos acessos simultâneos
Envie várias requisições em paralelo para testar concorrência.
for i in {1..5}; do curl -X POST http://localhost:8000/ask -H "Content-Type: application/json" -d '{"question": "Qual o prazo de entrega?"}' & doneO que você deve ver: Respostas recebidas para todas as requisições
- Desligar o backend e limpar variáveis
Finalize o servidor e remova variáveis de ambiente.
Ctrl+C unset ANTHROPIC_API_KEY unset OPENAI_API_KEYO que você deve ver: Servidor parado e segredos não mais disponíveis
Como saber que funcionou
| Teste | Comando | Critério |
|---|---|---|
| Pergunta simples retorna respostas dos dois modelos | curl -X POST http://localhost:8000/ask -H "Content-Type: application/json" -d '{"question": "Quais os canais de atendimento?"}' | Campos 'claude' e 'gpt' com respostas textuais coerentes |
| Pergunta vazia retorna erro | curl -X POST http://localhost:8000/ask -H "Content-Type: application/json" -d '{"question": ""}' | HTTP 400 e mensagem 'Pergunta inválida' |
| Pergunta longa retorna erro | curl -X POST http://localhost:8000/ask -H "Content-Type: application/json" -d '{"question": "a"*600}' | HTTP 400 e mensagem 'Pergunta inválida' |
| Logs mostram perguntas e respostas | Verifique o terminal | Linha de log para cada requisição |
| Respostas diferentes para perguntas diferentes | Envie duas perguntas distintas | Respostas coerentes e diferentes nos campos 'claude' e 'gpt' |
Troubleshooting
| Sintoma | Causa provável | Correção |
|---|---|---|
| Erro 'ModuleNotFoundError' ao rodar main.py | Dependência não instalada no ambiente virtual | Ative o ambiente e rode 'pip install' novamente |
| Erro 'KeyError' para ANTHROPIC_API_KEY ou OPENAI_API_KEY | Variável de ambiente não definida | Exporte a variável antes de rodar o servidor |
| Resposta HTTP 500 ao chamar /ask | Chave de API inválida ou limite excedido | Confirme a chave na dashboard do fornecedor e consulte a documentação |
| Timeout ou lentidão nas respostas | Conexão lenta com as APIs externas | Teste conectividade com 'curl' direto para as APIs; tente novamente mais tarde |
| Respostas vazias ou incoerentes | Prompt mal formatado ou modelo indisponível | Revise o prompt e consulte a documentação dos modelos |
Segurança e hardening
- Nunca exponha chaves de API em código fonte ou logs públicos
- Restrinja o acesso ao endpoint HTTP para a rede interna
- Implemente limites de requisições por IP se for expor para mais usuários
- Não registre perguntas sensíveis sem anonimização
- Desative e remova variáveis de ambiente ao finalizar
Checklist final
Referências
- Anthropic Python SDK · GitHub (repositório oficial do projeto) (github.com)
- Anthropic API Reference · Platform.claude (platform.claude.com)
- OpenAI Python SDK · GitHub (repositório oficial do projeto) (github.com)
- OpenAI API Reference · Developers.openai (developers.openai.com)
- FastAPI Documentation · FastAPI (fastapi.tiangolo.com)
- Python Documentation · Python Software Foundation (docs.python.org)
- Publicado
- 13/09/2026
- Última revisão
- 13/09/2026
- Versão do conteúdo
- 1.0
- Referências
- 6 oficiais
- Revisão técnica
- redação e revisão por IA, URLs conferidas na publicação
- Status
- Atual
