cidadao.ai-backend / src /api /routes /chat_emergency.py
anderson-ufrj
refactor: change default Maritaca model from sabia-3 to sabiazinho-3
f317ea3
raw
history blame
7.94 kB
"""
Emergency chat endpoint - Minimal dependencies, maximum reliability
This endpoint ensures the chat always works, even if other services fail
"""
import os
from src.core import json_utils
from datetime import datetime
from typing import Dict, Any, Optional, List
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel, Field
import httpx
import random
from src.core import get_logger
logger = get_logger(__name__)
router = APIRouter(prefix="/api/v1/chat", tags=["chat-emergency"])
# Request/Response models
class ChatRequest(BaseModel):
message: str = Field(..., min_length=1, max_length=1000)
session_id: Optional[str] = None
class ChatResponse(BaseModel):
session_id: str
agent_id: str = "assistant"
agent_name: str = "Assistente Cidadão.AI"
message: str
confidence: float = 0.95
suggested_actions: List[str] = []
metadata: Dict[str, Any] = {}
# Professional responses for common queries
RESPONSES = {
"greeting": [
"Olá! Sou o assistente do Cidadão.AI. Estou aqui para ajudar você a entender e investigar gastos públicos. Como posso ajudar?",
"Bem-vindo ao Cidadão.AI! Posso ajudar você a analisar contratos, investigar gastos e entender melhor a transparência pública.",
"Oi! Sou especializado em transparência pública. Posso investigar contratos, analisar gastos governamentais e muito mais. O que você gostaria de saber?"
],
"investigation": [
"Vou ajudar você a investigar. Posso analisar:\n• Contratos e licitações\n• Gastos por órgão público\n• Pagamentos a fornecedores\n• Evolução temporal de despesas\n\nQual área específica você quer investigar?",
"Entendi que você quer investigar gastos públicos. Tenho acesso a dados de contratos, fornecedores e órgãos públicos. Por onde gostaria de começar?",
"Perfeito! Posso investigar contratos suspeitos, analisar padrões de gastos e identificar anomalias. Me dê mais detalhes sobre o que você procura."
],
"help": [
"Posso ajudar você com:\n\n📊 **Análise de Contratos**: Investigar licitações e contratos públicos\n💰 **Gastos Públicos**: Acompanhar despesas governamentais\n🔍 **Detecção de Anomalias**: Identificar padrões irregulares\n📈 **Relatórios**: Gerar análises detalhadas\n\nO que você gostaria de fazer?",
"O Cidadão.AI oferece várias funcionalidades:\n• Investigar contratos específicos\n• Analisar gastos de órgãos públicos\n• Comparar fornecedores\n• Detectar anomalias em pagamentos\n• Gerar relatórios de transparência\n\nComo posso ajudar?",
"Aqui está o que posso fazer por você:\n1. Buscar informações sobre contratos\n2. Analisar tendências de gastos\n3. Identificar fornecedores frequentes\n4. Detectar possíveis irregularidades\n5. Criar visualizações de dados\n\nQual dessas opções te interessa?"
],
"default": [
"Entendi sua pergunta. Para te ajudar melhor com transparência pública, você pode:\n• Pedir para investigar contratos específicos\n• Solicitar análise de gastos de um órgão\n• Buscar informações sobre fornecedores\n\nComo posso ajudar?",
"Interessante sua questão! No contexto de transparência pública, posso ajudar você a entender gastos governamentais, contratos e licitações. Que tipo de informação você procura?",
"Certo! Como assistente de transparência, posso investigar dados públicos, analisar contratos e identificar padrões. Me conte mais sobre o que você quer descobrir."
]
}
def detect_intent(message: str) -> str:
"""Simple intent detection based on keywords"""
message_lower = message.lower()
if any(word in message_lower for word in ["olá", "oi", "bom dia", "boa tarde", "boa noite", "prazer"]):
return "greeting"
elif any(word in message_lower for word in ["investigar", "verificar", "analisar", "buscar", "procurar"]):
return "investigation"
elif any(word in message_lower for word in ["ajuda", "ajudar", "pode", "consegue", "o que", "como"]):
return "help"
else:
return "default"
async def try_maritaca(message: str) -> Optional[str]:
"""Try to get response from Maritaca AI"""
api_key = os.getenv("MARITACA_API_KEY")
if not api_key:
return None
try:
async with httpx.AsyncClient(timeout=10.0) as client:
response = await client.post(
"https://chat.maritaca.ai/api/chat/inference",
headers={"authorization": f"Bearer {api_key}"},
json={
"messages": [
{
"role": "system",
"content": "Você é um assistente especializado em transparência pública brasileira. Ajude os cidadãos a entender gastos governamentais, contratos e licitações. Seja claro, objetivo e sempre sugira ações específicas."
},
{"role": "user", "content": message}
],
"model": "sabiazinho-3",
"temperature": 0.7,
"max_tokens": 400
}
)
if response.status_code == 200:
data = response.json()
return data.get("answer", None)
except Exception as e:
logger.warning(f"Maritaca request failed: {e}")
return None
@router.post("/emergency", response_model=ChatResponse)
async def chat_emergency(request: ChatRequest) -> ChatResponse:
"""
Emergency chat endpoint - Always returns a valid response
Tries Maritaca AI first, falls back to intelligent responses
"""
session_id = request.session_id or f"emergency_{datetime.now().timestamp()}"
# Try Maritaca first
maritaca_response = await try_maritaca(request.message)
if maritaca_response:
return ChatResponse(
session_id=session_id,
agent_id="maritaca",
agent_name="Assistente Cidadão.AI (Maritaca)",
message=maritaca_response,
confidence=0.95,
suggested_actions=["investigate_contracts", "analyze_expenses", "generate_report"],
metadata={
"model": "sabiazinho-3",
"backend": "maritaca_ai",
"timestamp": datetime.utcnow().isoformat()
}
)
# Fallback to intelligent responses
intent = detect_intent(request.message)
response_list = RESPONSES.get(intent, RESPONSES["default"])
selected_response = random.choice(response_list)
# Determine suggested actions based on intent
if intent == "greeting":
actions = ["start_investigation", "view_recent_contracts", "help"]
elif intent == "investigation":
actions = ["search_contracts", "analyze_supplier", "view_timeline"]
elif intent == "help":
actions = ["examples", "start_investigation", "documentation"]
else:
actions = ["help", "start_investigation", "search"]
return ChatResponse(
session_id=session_id,
agent_id="system",
agent_name="Assistente Cidadão.AI",
message=selected_response,
confidence=0.85,
suggested_actions=actions,
metadata={
"backend": "intelligent_fallback",
"intent": intent,
"timestamp": datetime.utcnow().isoformat()
}
)
@router.get("/emergency/health")
async def emergency_health():
"""Health check for emergency endpoint"""
maritaca_available = bool(os.getenv("MARITACA_API_KEY"))
return {
"status": "operational",
"endpoint": "/api/v1/chat/emergency",
"maritaca_configured": maritaca_available,
"fallback_ready": True,
"timestamp": datetime.utcnow().isoformat()
}