"""Chatbot de ayuda y FAQ — usa OpenAI desde el backend.""" from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel, Field from app.core.config import settings from app.core.deps import get_current_user router = APIRouter(prefix="/chat", tags=["chat"]) SYSTEM_PROMPT = ( "Eres Eco, el asistente oficial de la app Recolecta, dedicada a la recolección " "inteligente y privada de residuos sólidos urbanos. Tu objetivo es responder " "preguntas frecuentes de los ciudadanos sobre: horarios y rutas de los camiones, " "separación correcta de residuos (orgánico, inorgánico reciclable, sanitario, " "RAEE, manejo especial), qué hacer si el camión no pasó, cómo reportar un " "problema y cómo usar la app. " "Reglas: 1) responde siempre en español neutro y de manera breve (máximo 4 " "oraciones); 2) si te preguntan algo fuera de este dominio, redirige amablemente " "al tema; 3) nunca inventes horarios ni rutas específicas — si el usuario pide " "datos concretos de su colonia, indícale que los puede ver en la pantalla de mapa " "o ETA dentro de la app; 4) jamás compartas información personal de choferes." ) class ChatMessage(BaseModel): role: str = Field(pattern=r"^(user|assistant)$") content: str = Field(min_length=1, max_length=2000) class ChatHelpIn(BaseModel): messages: list[ChatMessage] = Field(min_length=1, max_length=20) class ChatHelpOut(BaseModel): reply: str @router.post("/help", response_model=ChatHelpOut) def chat_help( body: ChatHelpIn, _user: dict = Depends(get_current_user), ): if not settings.OPENAI_API_KEY: raise HTTPException( status_code=503, detail="El asistente no está configurado (falta OPENAI_API_KEY).", ) try: from openai import OpenAI except ImportError: raise HTTPException( status_code=500, detail="Librería openai no instalada en el servidor." ) client = OpenAI(api_key=settings.OPENAI_API_KEY) payload = [{"role": "system", "content": SYSTEM_PROMPT}] + [ m.model_dump() for m in body.messages ] try: completion = client.chat.completions.create( model=settings.OPENAI_MODEL, messages=payload, temperature=0.4, max_tokens=400, ) reply = completion.choices[0].message.content or "" except Exception as e: raise HTTPException(status_code=502, detail=f"Error con OpenAI: {e}") return ChatHelpOut(reply=reply.strip())