para essa atividade necessario dividir 4 partes, com isso, integrando e interagindo, aplicação com LLM; com a função de transformar um chatbot em um serviço backend confiável e validação automática, armazenamento de conversas e proteção contra exposição de dados.
as 4 partes são:
API tipada com FastAPI + Pydantic
integração com provedores de LLM (GrokCloud e OpenRouter)
sanitização de resposta
persistência de histórico com SQLAlchemy + SQLite
1 . Esquemas com Pydantic
definem o corpo da API
validar os dados de entrada e saída
gerar documentos automaticamente no FastAPI
ajude a produzir mensagens de erro claras
Exemplo
from pydantic import BaseModel, Field
from typing import Optional, List
class ChatRequest(BaseModel):
question: str = Field(..., min_length=3, description="Pergunta enviada ao chatbot")
history: Optional[List[dict]] = []
model: Optional[str] = None
class ChatResponse(BaseModel):
response: str
model: Optional[str] = None
2. Endpoints tipados com FastAPI
mas tipados
validam automaticamente o corpo da requisição
retornam erros estruturados, como422 Unprocessable Entity
Exemplo
from fastapi import FastAPI
app = FastAPI()
@app.post("/chat", response_model=ChatResponse)
def chat_endpoint(payload: ChatRequest):
return ChatResponse(response=f"Você perguntou: {payload.question}", model=payload.model)
3. Testar mensagens de erro
Esse ponto é muito importante.
Se o usuário enviar:
{
"model": "llama3"
}
4. Integração com LLMs via API Key
A aplicação precisa chamar provedores externos, como:
GrokCloud
Roteador aberto
As credenciais devem ficar em variáveis de ambiente , não no código.
Exemplo
import os
GROQ_API_KEY = os.getenv("GROQ_API_KEY")
OPENROUTER_API_KEY = os.getenv("OPENROUTER_API_KEY")
Fluxo típico
recebe pergunta
escolha o modelo
montar prompt/contexto
envia aoxo
recebe resposta
higienização
salva no banco
retorna ao usuário
- Higienização de respostas
Sanitizar significa limpar ou mascarar dados sensíveis antes de exibir ou salvar.
Exemplos de dados sensíveis
e-mails
cadeiras
CPF
CNPJ
URLs privadas
números de processo
Exemplo com regex
import re
EMAIL = re.compile(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}')
def sanitize_response(text: str) -> str:
return EMAIL.sub('[REDACTED_EMAIL]', text.strip())
6. Persistência com SQLAlchemy e SQLite
O chatbot precisa salvar o histórico de conversas.
Por que persistir?
manter contexto entre interações
permitir auditório
analisar comportamento do chatbot
· erros
Exemplo de modelo
from sqlalchemy import Column, Integer, String, DateTime, func
from sqlalchemy.orm import declarative_base
Base = declarative_base()
class ConversationHistory(Base):
tablename = "conversation_history"
id = Column(Integer, primary_key=True, index=True)
session_id = Column(String, index=True, nullable=False)
role = Column(String, nullable=False)
content = Column(String, nullable=False)
timestamp = Column(DateTime(timezone=True), server_default=func.now())
SQLite
É uma boa escolha para:
protótipo
desenvolvimento local
projeto pequeno
7. Sessão de conversa
O histórico deve ser associado a um identificador, por exemplo session_id.
Conceito de exemplo
Sessão abc123:
usuário: “Quanto custa a consultar?”
bot: “R$ 850,00”
usuário: “Vocês atendem online?”
Sem session_id, a conversa fica fragmentada.
Com session_id, a aplicação recupera o contexto certo.
- Fluxo completo do endpoint
A arquitetura mental correta é esta:
receber requisição
validar com Pydantic
recuperar histórico no banco
chamar o LLM
higienizar uma resposta
salvar pergunta e resposta
devolver JSON final