latapp 9 месяцев назад
Родитель
Сommit
2e3f16a64a

+ 1 - 0
config/settings.py

@@ -24,6 +24,7 @@ logging.basicConfig(
 )
 
 # Configuration
+FEEDBACK_PATH = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'data', 'feedback.json')
 OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
 PORT = int(os.getenv("PORT", 6001))
 PIN_KEY = os.getenv("PIN_KEY", "-1")

+ 7 - 0
data/feedback.json

@@ -0,0 +1,7 @@
+[
+    {
+        "name": "Erwin Jacimino",
+        "email": "erwinjacimino2003@gmail.com",
+        "message": "El cliente mencionó que la aplicación es muy clara, pero le causó problemas de visión."
+    }
+]

Разница между файлами не показана из-за своего большого размера
+ 26 - 0
logs/app.log


+ 3 - 3
routes/chat.py

@@ -2,7 +2,7 @@ from fastapi import Request, HTTPException, Depends
 from fastapi.responses import JSONResponse
 from httpx import get
 from models.chat import ChatCompletionRequest
-from services.openai_service import generate_completion
+from services.openai_service.openai_service import generate_completion
 from services.logging_service import log_llm_response
 from auth.security import get_current_user
 import logging
@@ -13,13 +13,13 @@ chat_router = APIRouter()
 
 
 @chat_router.post("/completions")
-async def chat_completions(request_data: ChatCompletionRequest, request: Request):
+async def chat_completions(request_data: ChatCompletionRequest, request: Request, current_user=Depends(get_current_user)):
     """Get chat completions from OpenAI"""
     # Uses session_token (which is the antiAbuseToken) as an identifier for logging
     session_identifier = request.session.get("antiAbuseToken", "unknown_session")
 
     try:
-        openai_response = await generate_completion(request_data.messages, session_identifier)
+        openai_response = await generate_completion(request_data.messages, session_identifier, current_user.nombre, current_user.email)
         log_llm_response(request_data.user, openai_response)
         return JSONResponse({"response": openai_response})
     except HTTPException as e:

+ 0 - 1
routes/users.py

@@ -59,7 +59,6 @@ async def register_user(request: RegisterUserRequest):
 async def login_user(request: LoginRequest):
     """Login user with email and PIN"""
     logger.debug(f"Login attempt for email: {request.email}")
-    logger.debug(f"Login request: {request.pin}")
     user = user_data_service.login(request.email, request.pin)
     if user:
         # Successful login, return user data and token

+ 0 - 0
services/openai_service/__init__.py


+ 21 - 1
services/openai_service.py → services/openai_service/openai_service.py

@@ -1,3 +1,4 @@
+import json
 from typing import List
 from fastapi import HTTPException
 from openai import OpenAI
@@ -5,12 +6,13 @@ from config.settings import OPENAI_API_KEY
 from models.chat import Message
 from services.data_service import data_bg_loaded
 from logging import getLogger
+from services.openai_service.openai_tools import tools_list, tools
 # Initialize OpenAI client
 openai_client = OpenAI(api_key=OPENAI_API_KEY)
 
 logger = getLogger(__name__)
 
-async def generate_completion(messages_array: List[Message], session_id: str) -> str:
+async def generate_completion(messages_array: List[Message], session_id: str, name: str, email: str) -> str:
     """Generate OpenAI chat completion"""
     if not OPENAI_API_KEY:
         logger.error("Error: OpenAI API key is not configured.")
@@ -33,6 +35,7 @@ tus responsabilidades son:
 - Proporcionar recomendaciones sobre el menú de el bar klein
 - Proporcionar información sobre la comida de el bar klein
 - No puedes tomar pedidos de clientes, solo informar
+- puedes recibir feedback de los clientes, y usar la herramienta feedback para enviar el feedback
 - Debes evadir cualquier pregunta que no sea relacionada con el bar klein
 para esto usaras los siguientes datos:
 {data_string}
@@ -46,8 +49,25 @@ para esto usaras los siguientes datos:
             model="gpt-4o-mini",
             messages=processed_messages,  # type: ignore (OpenAI lib expects list of specific dicts)
             temperature=0.3,
+            tools=tools_list,
+            tool_choice="auto",
         )
+        calls = completion.choices[0].message.tool_calls
+        if calls:
+            logger.info(f"Tool calls: {calls}")
+            for call in calls:
+                if call.function.name in tools:
+                    tool_function = tools[call.function.name]
+                    tool_args = json.loads(call.function.arguments)
+                    logger.info(f"Calling tool: {call.function.name} with args: {tool_args}")
+                    tool_response = tool_function(name=name, email=email, **tool_args)
+                    logger.info(f"Tool response: {tool_response}")
+                    completion.choices[0].message.content = tool_response
+                else:
+                    logger.warning(f"Tool {call.function.name} not found in tools dictionary.")
+
         response_content = completion.choices[0].message.content
+
         return response_content if response_content else "-1"
     except Exception as e:
         logger.error(f"Error calling OpenAI: {e}")

+ 53 - 0
services/openai_service/openai_tools.py

@@ -0,0 +1,53 @@
+import os
+from openai.types.chat import ChatCompletionToolParam
+
+tools_list: list[ChatCompletionToolParam] = [
+    {
+        "type": "function",
+        "function": {
+            "name": "feedback",
+            "description": "Send feedback about the app",
+            "parameters": {
+                "type": "object",
+                "properties": {
+                    "message": {
+                        "type": "string",
+                        "description": "Feedback message"
+                    }
+                },
+                "required": ["message"]
+            }
+    }   }
+]
+
+def feedback(name, email,message: str):
+    """
+    Send feedback about the app.
+    
+    Args:
+        message (str): The feedback message to send.
+    """
+    import json
+    from config.settings import FEEDBACK_PATH
+
+    feedback_data = {
+        "name": name,
+        "email": email,
+        "message": message
+    }
+
+    # Ensure the feedback directory exists
+    os.makedirs(os.path.dirname(FEEDBACK_PATH), exist_ok=True)
+
+    data = json.loads(open(FEEDBACK_PATH, 'r').read()) if os.path.exists(FEEDBACK_PATH) else []
+
+    data.append(feedback_data)
+
+    with open(FEEDBACK_PATH, 'w') as f:
+        f.write(json.dumps(data, indent=4, ensure_ascii=False))
+
+    return "He recibido tu feedback, gracias por ayudarnos a mejorar la app :)"
+
+tools = {
+    "feedback": feedback
+}

Некоторые файлы не были показаны из-за большого количества измененных файлов