fix(pos): retry con backoff para rate limit 429 de OpenRouter

3 reintentos con espera 5s/10s/15s. Si agota reintentos,
muestra mensaje amigable en vez de error.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-02 19:48:13 +00:00
parent d32de87d5f
commit 8539720645

View File

@@ -60,6 +60,10 @@ def chat(user_message, conversation_history=None):
messages.extend(conversation_history)
messages.append({"role": "user", "content": user_message})
import time
max_retries = 3
for attempt in range(max_retries):
try:
resp = requests.post(
OPENROUTER_URL,
@@ -73,19 +77,24 @@ def chat(user_message, conversation_history=None):
"max_tokens": 500,
"temperature": 0.3,
},
timeout=15,
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:
# 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:
@@ -94,6 +103,8 @@ def chat(user_message, conversation_history=None):
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,