Spaces:
Sleeping
Sleeping
| # BEST SCORE: 41/50 (82%) - EXCELLENT | |
| # Model: Gemini-2.0-Flash-001 (via OpenRouter) | |
| # Tested on: 2026-05-02 | |
| # Features: Strict grounding, Trigger primacy, Hinglish support, Source citations. | |
| import os | |
| import json | |
| import logging | |
| import asyncio | |
| import time | |
| import re | |
| from typing import List, Dict, Any, Optional | |
| from fastapi import FastAPI | |
| from pydantic import BaseModel | |
| import httpx | |
| from dotenv import load_dotenv | |
| load_dotenv() | |
| # Lead AI Problem Solver: Sequential Reinforcement Architecture | |
| logging.basicConfig(level=logging.INFO) | |
| logger = logging.getLogger("VeraLeadSolver") | |
| app = FastAPI() | |
| class ContextPayload(BaseModel): | |
| scope: str | |
| context_id: str | |
| version: int | |
| payload: Dict[Any, Any] | |
| class TickRequest(BaseModel): | |
| available_triggers: List[str] | |
| # Distributed Credential Strategy: Round-Robin Key Pool | |
| OPENROUTER_KEYS = [ | |
| os.getenv("OPENROUTER_KEY_1"), | |
| os.getenv("OPENROUTER_KEY_2"), | |
| os.getenv("OPENROUTER_KEY_3"), | |
| os.getenv("OPENROUTER_KEY_4"), | |
| os.getenv("OPENROUTER_KEY_5"), | |
| os.getenv("OPENROUTER_KEY_6") | |
| ] | |
| OPENROUTER_KEYS = [k for k in OPENROUTER_KEYS if k] | |
| class KeyRotator: | |
| def __init__(self, keys: List[str]): | |
| self.keys = keys | |
| self.index = 0 | |
| self.lock = asyncio.Lock() | |
| async def get_key(self) -> str: | |
| if not self.keys: | |
| return "" | |
| async with self.lock: | |
| key = self.keys[self.index] | |
| self.index = (self.index + 1) % len(self.keys) | |
| return key | |
| or_rotator = KeyRotator(OPENROUTER_KEYS) | |
| contexts = {"category": {}, "merchant": {}, "customer": {}, "trigger": {}} | |
| semaphore = asyncio.Semaphore(1) # STRICT SEQUENTIAL | |
| async def call_llm(prompt: str, system: str = "", temperature: float = 0.0) -> Optional[Dict]: | |
| key = await or_rotator.get_key() | |
| url = "https://openrouter.ai/api/v1/chat/completions" | |
| headers = { | |
| "Authorization": f"Bearer {key}", | |
| "Content-Type": "application/json", | |
| "HTTP-Referer": "https://vera.ai", | |
| "X-Title": "Vera Lead Solver" | |
| } | |
| # Using openrouter/free to get the best free model | |
| payload = { | |
| "model": "openrouter/free", | |
| "messages": [ | |
| {"role": "system", "content": system + "\n\nCRITICAL: Return ONLY valid JSON. No markdown, no preambles."}, | |
| {"role": "user", "content": prompt} | |
| ], | |
| "temperature": temperature, | |
| "max_tokens": 1000 | |
| } | |
| async with httpx.AsyncClient() as client: | |
| try: | |
| response = await client.post(url, headers=headers, json=payload, timeout=60.0) | |
| if response.status_code == 200: | |
| resp_json = response.json() | |
| content = resp_json["choices"][0]["message"].get("content") | |
| if not content: | |
| return None | |
| content = re.sub(r'```json\s*|\s*```', '', content).strip() | |
| start = content.find('{') | |
| end = content.rfind('}') | |
| if start != -1 and end != -1: | |
| content = content[start:end+1] | |
| return json.loads(content) | |
| else: | |
| logger.error(f"LLM Error {response.status_code}: {response.text}") | |
| return None | |
| except Exception as e: | |
| logger.error(f"LLM Exception: {e}") | |
| return None | |
| async def compose(category: dict, merchant: dict, trigger: dict, customer: Optional[dict] = None) -> dict: | |
| ident = merchant.get("identity", {}) | |
| perf = merchant.get("performance", {}) | |
| owner_name = ident.get("owner_first_name", "Partner") | |
| sys_prompt = f"""Role: Elite Growth Strategist for magicpin. | |
| Objective: Compose a high-impact WhatsApp message. | |
| STRICT GROUNDING RULES: | |
| 1. NO FABRICATION: Only use numbers present in context. | |
| 2. TRIGGER PRIMACY: Message MUST address the trigger event first. | |
| 3. SPECIFICITY: Use metrics like views, calls, directions, or CTR from Context. | |
| 4. CATEGORY FIT: For dentists, use "Dr." and clinical peer tone. | |
| 5. LANGUAGE: If 'hi' in languages, use Hinglish. | |
| 6. SOURCE: Include source citations (e.g. "JIDA Oct") if present. | |
| Output JSON: {{"body": "...", "cta": "...", "rationale": "..."}} | |
| """ | |
| context_str = f"CATEGORY: {json.dumps(category)}\nMERCHANT: {json.dumps(merchant)}\nTRIGGER: {json.dumps(trigger)}\nCUSTOMER: {json.dumps(customer) if customer else 'None'}" | |
| res = await call_llm(f"Context: {context_str}\n\nCompose a grounded message based on trigger.", system=sys_prompt) | |
| if not res: | |
| v = perf.get('views', '?') | |
| c = perf.get('calls', '?') | |
| return {"body": f"Hi {owner_name}, noticed {v} views and {c} calls on your profile. Important {trigger.get('kind')} update inside. Check?", "cta": "Reply YES", "rationale": "Fallback"} | |
| return res | |
| def healthz(): | |
| return {"status": "ok", "contexts_loaded": {s: len(c) for s, c in contexts.items()}} | |
| def metadata(): | |
| return {"team_name": "Vera Lead Solver", "model": "OpenRouter-Free", "version": "26.0.0"} | |
| def push_context(data: ContextPayload): | |
| contexts[data.scope][data.context_id] = data.payload | |
| return {"accepted": True} | |
| async def process_trigger(trigger_id: str): | |
| async with semaphore: | |
| trigger = contexts["trigger"].get(trigger_id, {}) | |
| merchant_id = trigger.get("merchant_id") | |
| merchant = contexts["merchant"].get(merchant_id, {}) | |
| category_slug = merchant.get("category_slug", "general") | |
| category = contexts["category"].get(category_slug, {"slug": category_slug}) | |
| customer_id = trigger.get("customer_id") | |
| customer = contexts["customer"].get(customer_id, {}) if customer_id else None | |
| composed_data = await compose(category, merchant, trigger, customer) | |
| is_customer_facing = trigger.get("scope") == "customer" | |
| return { | |
| "conversation_id": f"conv_{trigger_id}", | |
| "merchant_id": merchant_id, | |
| "customer_id": customer_id if is_customer_facing else None, | |
| "send_as": "merchant_on_behalf" if is_customer_facing else "vera", | |
| "trigger_id": trigger_id, | |
| "template_name": "vera_v26", | |
| "body": composed_data["body"], | |
| "cta": composed_data["cta"], | |
| "suppression_key": trigger_id, | |
| "rationale": composed_data.get("rationale", "Free Router composition") | |
| } | |
| async def tick(req: TickRequest): | |
| results = [] | |
| for tid in req.available_triggers: | |
| res = await process_trigger(tid) | |
| if res: results.append(res) | |
| return {"actions": results} | |
| async def reply(req: Dict[str, Any]): | |
| return {"action": "send", "body": "Got it. Let me set that up for you.", "cta": "Reply YES"} | |
| if __name__ == "__main__": | |
| import uvicorn | |
| uvicorn.run(app, host="0.0.0.0", port=8080) | |