diff --git a/pos/services/ai_chat.py b/pos/services/ai_chat.py index 7b685e7..c8914c4 100644 --- a/pos/services/ai_chat.py +++ b/pos/services/ai_chat.py @@ -60,42 +60,53 @@ def chat(user_message, conversation_history=None): messages.extend(conversation_history) messages.append({"role": "user", "content": user_message}) - try: - resp = requests.post( - OPENROUTER_URL, - headers={ - "Authorization": f"Bearer {OPENROUTER_API_KEY}", - "Content-Type": "application/json", - }, - json={ - "model": MODEL, - "messages": messages, - "max_tokens": 500, - "temperature": 0.3, - }, - timeout=15, - ) - resp.raise_for_status() - data = resp.json() - content = data["choices"][0]["message"]["content"] + import time + max_retries = 3 - # Try to parse JSON response + for attempt in range(max_retries): try: - # Handle markdown-wrapped JSON (```json ... ```) - stripped = content.strip() - if stripped.startswith("```"): - lines = stripped.split("\n") - # Remove first and last lines (``` markers) - json_str = "\n".join(lines[1:-1]) - parsed = json.loads(json_str) - else: - parsed = json.loads(stripped) - return parsed - except (json.JSONDecodeError, IndexError): - return {"message": content, "search_query": None, "vehicle": None} - except Exception as e: - return { - "message": f"Error de conexion: {str(e)}", - "search_query": None, - "vehicle": None, - } + resp = requests.post( + OPENROUTER_URL, + headers={ + "Authorization": f"Bearer {OPENROUTER_API_KEY}", + "Content-Type": "application/json", + }, + json={ + "model": MODEL, + "messages": messages, + "max_tokens": 500, + "temperature": 0.3, + }, + timeout=20, + ) + if resp.status_code == 429: + # Rate limited — wait and retry + wait = (attempt + 1) * 5 # 5s, 10s, 15s + if attempt < max_retries - 1: + time.sleep(wait) + continue + return {"message": "El asistente está ocupado. Intenta de nuevo en unos segundos.", "search_query": None, "vehicle": None} + resp.raise_for_status() + data = resp.json() + content = data["choices"][0]["message"]["content"] + + # Try to parse JSON response + try: + stripped = content.strip() + if stripped.startswith("```"): + lines = stripped.split("\n") + json_str = "\n".join(lines[1:-1]) + parsed = json.loads(json_str) + else: + parsed = json.loads(stripped) + return parsed + except (json.JSONDecodeError, IndexError): + return {"message": content, "search_query": None, "vehicle": None} + except Exception as e: + if attempt < max_retries - 1: + continue + return { + "message": f"Error de conexion: {str(e)}", + "search_query": None, + "vehicle": None, + }