74 lines
2.5 KiB
Python
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())
|