Files

74 lines
2.5 KiB
Python

"""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())