Skip to content

Commit 461d254

Browse files
committed
chore: production hardening, openrouter fallbacks, and database stabilization
1 parent 5862381 commit 461d254

5 files changed

Lines changed: 57 additions & 12 deletions

File tree

app/api/routes.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,15 @@ async def health(db: AsyncSession = Depends(get_async_session)):
9999
celery_app.backend.client.ping()
100100
health_status["checks"]["redis"] = {"status": "healthy", "message": "Connected"}
101101
except Exception as e:
102-
health_status["status"] = "unhealthy"
103-
health_status["checks"]["redis"] = {"status": "unhealthy", "message": str(e)}
102+
if not settings.run_jobs_inline:
103+
health_status["status"] = "unhealthy"
104+
health_status["checks"]["redis"] = {"status": "unhealthy", "message": str(e)}
105+
else:
106+
# Under inline execution, redis is non-blocking for core workflows
107+
health_status["checks"]["redis"] = {
108+
"status": "degraded",
109+
"message": f"Non-blocking connection failure in inline mode: {str(e)}"
110+
}
104111

105112
# Check LLM providers (basic check - just verify keys are configured)
106113
llm_checks = {}

app/celery_app.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,18 @@
2525
broker_use_ssl={"ssl_cert_reqs": "none"} if settings.redis_url.startswith("rediss://") else None,
2626
redis_backend_use_ssl={"ssl_cert_reqs": "none"} if settings.redis_url.startswith("rediss://") else None,
2727

28+
# Resilient Redis settings for Upstash/Serverless stability
29+
redis_socket_timeout=5.0,
30+
redis_socket_connect_timeout=5.0,
31+
broker_pool_limit=10,
32+
broker_connection_retry_on_startup=True,
33+
broker_transport_options={
34+
"socket_timeout": 5.0,
35+
"socket_connect_timeout": 5.0,
36+
"retry_on_timeout": True,
37+
"visibility_timeout": 3600,
38+
},
39+
2840
# Task settings
2941
task_serializer="json",
3042
result_serializer="json",

app/llm_client.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,8 @@ async def _call_openrouter(
303303
{"role": "system", "content": system_prompt},
304304
{"role": "user", "content": user_prompt}
305305
],
306-
"temperature": temperature
306+
"temperature": temperature,
307+
"max_tokens": config.max_tokens or 2048
307308
},
308309
timeout=45.0
309310
)

app/llm_router.py

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,26 @@ def exceeds_budget(self) -> bool:
9292
),
9393
"openrouter-free": ModelConfig(
9494
provider="openrouter",
95-
model="openrouter/auto",
96-
cost_per_1m_input=0.0, # Free tier
97-
cost_per_1m_output=0.0,
98-
max_tokens=8192,
95+
model="google/gemini-2.5-flash",
96+
cost_per_1m_input=0.075,
97+
cost_per_1m_output=0.30,
98+
max_tokens=2048,
99+
temperature=0.7,
100+
),
101+
"openrouter-flash": ModelConfig(
102+
provider="openrouter",
103+
model="google/gemini-2.5-flash",
104+
cost_per_1m_input=0.075,
105+
cost_per_1m_output=0.30,
106+
max_tokens=2048,
107+
temperature=0.7,
108+
),
109+
"openrouter-pro": ModelConfig(
110+
provider="openrouter",
111+
model="meta-llama/llama-3.3-70b-instruct",
112+
cost_per_1m_input=0.59,
113+
cost_per_1m_output=0.79,
114+
max_tokens=2048,
99115
temperature=0.7,
100116
),
101117
# --- Tier 3 (Heavy Reasoning) ---
@@ -147,13 +163,13 @@ def exceeds_budget(self) -> bool:
147163

148164
TASK_ROUTING: dict[TaskType, list[str]] = {
149165
# Lightweight tasks (Tier 1 -> Tier 2 -> Fallback)
150-
TaskType.SUMMARIZATION: ["groq-llama-8b", "gemini-flash", "openrouter-free"],
151-
TaskType.ORCHESTRATION: ["groq-llama-8b", "gemini-flash", "openrouter-free"],
152-
TaskType.STRUCTURED_EXTRACTION: ["gemini-flash", "groq-llama-8b", "openrouter-free"],
166+
TaskType.SUMMARIZATION: ["groq-llama-8b", "gemini-flash", "openrouter-flash"],
167+
TaskType.ORCHESTRATION: ["groq-llama-8b", "gemini-flash", "openrouter-flash"],
168+
TaskType.STRUCTURED_EXTRACTION: ["gemini-flash", "groq-llama-8b", "openrouter-flash"],
153169

154170
# Complex tasks (Tier 3 -> Tier 2 -> Fallback)
155-
TaskType.STRATEGIC_REASONING: ["groq-llama-70b", "gemini-flash", "openrouter-free"],
156-
TaskType.CRITIQUE: ["groq-llama-70b", "gemini-flash", "openrouter-free"],
171+
TaskType.STRATEGIC_REASONING: ["groq-llama-70b", "gemini-flash", "openrouter-pro"],
172+
TaskType.CRITIQUE: ["groq-llama-70b", "gemini-flash", "openrouter-pro"],
157173

158174
# Embeddings
159175
TaskType.EMBEDDING: ["openrouter-embedding", "gemini-embedding"],

app/main.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@
1010
from fastapi import FastAPI
1111
from fastapi.middleware.cors import CORSMiddleware
1212

13+
# Monkey-patch chromadb telemetry to silence upstream signature errors in production
14+
try:
15+
import chromadb.telemetry
16+
if hasattr(chromadb.telemetry, "Telemetry"):
17+
chromadb.telemetry.Telemetry.capture = lambda *args, **kwargs: None
18+
except Exception:
19+
pass
20+
21+
1322
from app.config import settings
1423
from app.database import init_db
1524
from app.observability import configure_logging

0 commit comments

Comments
 (0)