浏览代码

chat notification

Erwin Jacimino 8 月之前
父节点
当前提交
a25754dfc3
共有 3 个文件被更改,包括 43 次插入15 次删除
  1. 3 0
      models/chat.py
  2. 9 4
      routes/chat.py
  3. 31 11
      services/openai_service/openai_service.py

+ 3 - 0
models/chat.py

@@ -11,3 +11,6 @@ class Message(BaseModel):
 class ChatCompletionRequest(BaseModel):
     messages: List[Message]
     user: str
+
+class NotifyRequest(BaseModel):
+    message: str

+ 9 - 4
routes/chat.py

@@ -7,6 +7,7 @@ from fastapi.security import HTTPAuthorizationCredentials
 from broadcaster import Broadcast
 
 from config.settings import DEVELOPMENT
+from models.chat import NotifyRequest
 from models.user import User
 from services.openai_service.openai_service import generate_completion, admin_completion
 from auth.security import get_current_user
@@ -99,13 +100,17 @@ async def chat_irc_endpoint(websocket: WebSocket):
                 elif event_type == "ai_message":
                     messages = redis_client.lrange("chat_history", -15, -1)
                     parsed_messages = [json.loads(msg) for msg in messages]
-                    logger.debug(f"IA Message from {payload['username']}: {payload['messages']}")
+                    logger.debug(f"IA Message from {payload['username']}")
                     message_username = payload["username"]
                     response_content = await generate_completion(parsed_messages, current_user)
                     response = {"type": "message", "username": "IAKlein", "message": response_content}
                 elif event_type == "notification":
-                    logger.debug(f"Notification to {payload['username']}: {payload['message']}")
+                    logger.debug(f"Notification to {payload['username']}")
                     notification_message = payload["message"]
+                    messages = redis_client.lrange("chat_history", -15, -1)
+                    parsed_messages = [json.loads(msg) for msg in messages]
+                    response_content = admin_completion(notification_message, parsed_messages)
+                    response = {"type": "message", "username": "IAKlein", "message": response_content}
                     
                 elif event_type == "mention":
                     logger.debug(f"Mention to {payload['username']}")
@@ -140,11 +145,11 @@ async def chat_irc_endpoint(websocket: WebSocket):
         await broadcast.disconnect()
 
 @chat_router.post("/notify")
-async def notify_users(message: str, _: User = Depends(get_current_user)):
+async def notify_users(message: NotifyRequest, _: User = Depends(get_current_user)):
     """Send a notification message to all connected users"""
     broadcast = Broadcast("redis://localhost:6379")
     await broadcast.connect()
-    await broadcast.publish(channel="chat", message=json.dumps({"type": "notification", "message": message}))
+    await broadcast.publish(channel="chat", message=json.dumps({"type": "notification", "message": message.message}))
     await broadcast.disconnect()
     return {"status": "Notification sent"}
 

+ 31 - 11
services/openai_service/openai_service.py

@@ -14,21 +14,26 @@ openai_client = OpenAI(api_key=OPENAI_API_KEY)
 
 logger = getLogger(__name__)
 
+data_for_prompt = [
+    f'{{"pregunta": "{item.get("q", "")}", "respuesta": "{item.get("ans", "")}"}}'
+    for item in data_bg_loaded
+]
+data_string = "\n".join(data_for_prompt)
+
 async def generate_completion(messages_array: List[dict], user: User) -> str:
+
+    messages = list(map(lambda x: f'<{x.get("username", "unknown")}> {x.get("content", "")}', messages_array))
+
     """Generate OpenAI chat completion"""
     if not OPENAI_API_KEY:
         logger.error("Error: OpenAI API key is not configured.")
         raise HTTPException(status_code=500, detail="OpenAI API key not configured on server.")
 
+    logger.debug(f"Generating completion for user {user.email} with messages: {messages}")
 
-    data_for_prompt = [
-        f'{{"pregunta": "{item.get("q", "")}", "respuesta": "{item.get("ans", "")}"}}'
-        for item in data_bg_loaded
-    ]
-    data_string = "\n".join(data_for_prompt)
 
     preprompt = f"""
-Sos IAKlein, el asistente oficial del bar Klein 🍻.
+Eres IAKlein, el asistente oficial del bar Klein 🍻.
 Hablas en estilo de chat corto (como en mensajería o IRC), usando emojis y mucho carisma.
 Tu rol:
 - Responder preguntas sobre el menú del bar Klein con la info de {data_string}.
@@ -38,7 +43,7 @@ Tu rol:
 Reglas:
 - No tomás pedidos, solo informás.
 - Si te preguntan tu nombre, siempre respondés "Soy IAKlein".
-- Aunque uses el chat como contexto, siempre priorizás lo que diga @IAKlein.
+- Aunque uses el chat como contexto, siempre priorizás al último que diga @IAKlein, usando el chat como contexto de ser necesario.
 - No resolvés tareas, cálculos, ni programación: sos un amigo simpático del bar, no un esclavo LLM 🕺.
 Estilo:
 - Todo divertido, breve, con buena onda 😉.
@@ -47,7 +52,7 @@ Estilo:
 
     processed_messages: List[dict] = [{"role": "system", "content": preprompt}]
     processed_messages.append(
-        {"role": "user", "content": json.dumps(messages_array)}
+        {"role": "user", "content": json.dumps(messages)}
     )
 
     try:
@@ -79,8 +84,9 @@ Estilo:
         logger.error(f"Error calling OpenAI: {e}")
         raise HTTPException(status_code=500, detail="Error al procesar tu solicitud con OpenAI.")
 
-def admin_completion(prompt: str) -> str:
+def admin_completion(prompt: str, messages_array: List[dict]) -> str:
     """Generate OpenAI admin completion"""
+    messages = list(map(lambda x: f'<{x.get("username", "unknown")}> {x.get("content", "")}', messages_array))
     if not OPENAI_API_KEY:
         logger.error("Error: OpenAI API key is not configured.")
         raise HTTPException(status_code=500, detail="OpenAI API key not configured on server.")
@@ -89,10 +95,24 @@ def admin_completion(prompt: str) -> str:
         completion = openai_client.chat.completions.create(
             model="gpt-4o-mini",
             messages=[
-                {"role": "system", "content": "Eres un asistente administrativo que ayuda a gestionar el bar Klein. Responde de forma profesional y concisa."},
+                {"role": "system", "content": """
+                 
+Eres IAKlein, el asistente oficial del bar Klein 🍻.
+Hablas en estilo de chat corto (como en mensajería o IRC), usando emojis y mucho carisma.
+Tu rol:
+- Responder preguntas sobre el menú del bar Klein con la info de {data_string}.
+- Hacer bromas y charlar, pero siempre llevás la conversación de vuelta al bar Klein.
+- Dar recomendaciones de comidas y tragos.
+
+- El siguiente mensaje es del Biergarten Klein y debes entregarselo a los usuarios usando tu carisma.
+- Usa los mensajes anteriores como contexto para entrar de forma sutil a la conversación.
+- Mantené tu personalidad carismática y siempre enfocate en el bar Klein.
+
+
+                 """},
                 {"role": "user", "content": prompt}
             ],
-            temperature=0.3,
+            temperature=0.7,
         )
         response_content = completion.choices[0].message.content
         return response_content if response_content else "-1"