Spaces:
Running
Running
| """ | |
| PolicyEye Configuration | |
| Loads environment variables and defines intelligent multi-model routing. | |
| Routing Strategy: | |
| - Groq (Llama 3.3 70B) → Primary for text tasks (case analysis, explanation). Blazing fast, free. | |
| - Gemini Flash → Primary for PDF/vision tasks (policy ingestion). Best free vision model. | |
| - xAI Grok → Primary for long-form writing (grievance letters). $25/mo free credits. | |
| - OpenRouter → Final fallback (multiple free models). | |
| """ | |
| import os | |
| from dotenv import load_dotenv | |
| load_dotenv() | |
| # --- Provider API Keys --- | |
| GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY") | |
| GROQ_API_KEY = os.getenv("GROQ_API_KEY") | |
| XAI_API_KEY = os.getenv("XAI_API_KEY") | |
| OPENROUTER_API_KEY = os.getenv("OPENROUTER_API_KEY") | |
| CEREBRAS_API_KEY = os.getenv("CEREBRAS_API_KEY") | |
| SAMBANOVA_API_KEY = os.getenv("SAMBANOVA_API_KEY") | |
| HUGGINGFACE_API_KEY = os.getenv("HUGGINGFACE_API_KEY") | |
| # --- Cloudflare AI Gateway (Optional) --- | |
| CF_ACCOUNT_ID = os.getenv("CLOUDFLARE_ACCOUNT_ID") | |
| CF_GATEWAY_NAME = os.getenv("CLOUDFLARE_GATEWAY_NAME") | |
| # Providers fully supported by Cloudflare AI Gateway | |
| _CF_SUPPORTED = {"groq", "cerebras", "openrouter"} | |
| def get_gateway_url(provider: str, default_url: str) -> str: | |
| """Route through Cloudflare only for providers it reliably supports. | |
| NOTE: Temporarily bypassing Cloudflare as it may be causing silent drops/timeouts. | |
| """ | |
| return default_url | |
| # --- Provider Base URLs (fallback = direct API) --- | |
| GOOGLE_BASE_URL = "https://generativelanguage.googleapis.com/v1beta/openai" | |
| GROQ_BASE_URL = get_gateway_url("groq", "https://api.groq.com/openai/v1") | |
| XAI_BASE_URL = "https://api.x.ai/v1" | |
| OPENROUTER_BASE_URL = get_gateway_url("openrouter", "https://openrouter.ai/api/v1/chat/completions") | |
| CEREBRAS_BASE_URL = get_gateway_url("cerebras", "https://api.cerebras.ai/v1") | |
| SAMBANOVA_BASE_URL = "https://api.sambanova.ai/v1" | |
| HUGGINGFACE_BASE_URL = "https://api-inference.huggingface.co/v1" | |
| # --- Provider Model Selections --- | |
| GOOGLE_MODELS = { | |
| "default": "gemini-2.0-flash", | |
| "lite": "gemini-2.0-flash-lite", | |
| } | |
| GROQ_MODELS = { | |
| "primary": "llama-3.3-70b-versatile", | |
| "fast": "llama-3.1-8b-instant", | |
| } | |
| XAI_MODELS = { | |
| "primary": "grok-3-mini-fast", | |
| } | |
| OPENROUTER_MODELS = { | |
| "fallback_chain": [ | |
| "qwen/qwen3-coder:free", | |
| "google/gemma-3-27b-it:free", | |
| "meta-llama/llama-3.3-70b-instruct:free", | |
| "microsoft/phi-4-reasoning-plus:free", | |
| "nvidia/llama-3.1-nemotron-70b-instruct:free", | |
| ] | |
| } | |
| CEREBRAS_MODELS = { | |
| "primary": "llama3.3-70b", | |
| "fast": "llama3.3-70b", | |
| } | |
| SAMBANOVA_MODELS = { | |
| "primary": "Meta-Llama-3.3-70B-Instruct", | |
| "fast": "Meta-Llama-3.3-70B-Instruct", | |
| } | |
| HUGGINGFACE_MODELS = { | |
| "primary": "meta-llama/Llama-3.3-70B-Instruct", | |
| } | |
| # --- Intelligent Task-Based Routing --- | |
| # Each role maps to an ordered list of (provider, model) tuples. | |
| # The router tries them in order until one succeeds. | |
| TASK_ROUTING = { | |
| "policy_ingestion": [ | |
| ("cerebras", CEREBRAS_MODELS["primary"]), | |
| ("groq", GROQ_MODELS["primary"]), | |
| ("sambanova", SAMBANOVA_MODELS["primary"]), | |
| ("google", GOOGLE_MODELS["default"]), | |
| ("google", GOOGLE_MODELS["lite"]), | |
| ("huggingface", HUGGINGFACE_MODELS["primary"]), | |
| ("openrouter", None), | |
| ], | |
| "case_analysis": [ | |
| ("cerebras", CEREBRAS_MODELS["primary"]), | |
| ("groq", GROQ_MODELS["primary"]), | |
| ("sambanova", SAMBANOVA_MODELS["primary"]), | |
| ("google", GOOGLE_MODELS["default"]), | |
| ("huggingface", HUGGINGFACE_MODELS["primary"]), | |
| ("openrouter", None), | |
| ], | |
| "explanation": [ | |
| ("cerebras", CEREBRAS_MODELS["primary"]), | |
| ("groq", GROQ_MODELS["primary"]), | |
| ("sambanova", SAMBANOVA_MODELS["primary"]), | |
| ("google", GOOGLE_MODELS["default"]), | |
| ("huggingface", HUGGINGFACE_MODELS["primary"]), | |
| ("openrouter", None), | |
| ], | |
| "grievance": [ | |
| ("cerebras", CEREBRAS_MODELS["primary"]), | |
| ("groq", GROQ_MODELS["primary"]), | |
| ("sambanova", SAMBANOVA_MODELS["primary"]), | |
| ("google", GOOGLE_MODELS["default"]), | |
| ("huggingface", HUGGINGFACE_MODELS["primary"]), | |
| ("openrouter", None), | |
| ], | |
| "chat": [ | |
| ("cerebras", CEREBRAS_MODELS["fast"]), | |
| ("groq", GROQ_MODELS["fast"]), | |
| ("sambanova", SAMBANOVA_MODELS["fast"]), | |
| ("google", GOOGLE_MODELS["lite"]), | |
| ("openrouter", None), | |
| ], | |
| } | |
| # Default routing for any unrecognized role | |
| DEFAULT_ROUTING = [ | |
| ("cerebras", CEREBRAS_MODELS["primary"]), | |
| ("groq", GROQ_MODELS["primary"]), | |
| ("sambanova", SAMBANOVA_MODELS["primary"]), | |
| ("google", GOOGLE_MODELS["default"]), | |
| ("openrouter", None), | |
| ] | |
| # --- Database --- | |
| DATABASE_PATH = os.path.join(os.path.dirname(os.path.dirname(__file__)), "data", "secureshield.db") | |
| # --- App --- | |
| APP_NAME = "PolicyEye" | |
| APP_VERSION = "1.0.0" | |
| # --- Cache --- | |
| CACHE_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), ".cache") | |
| ENABLE_CACHE = os.getenv("ENABLE_CACHE", "true").lower() == "true" | |
| # --- Authentication --- | |
| SUPABASE_JWT_SECRET = os.getenv("SUPABASE_JWT_SECRET") | |
| # --- Email (Resend — HTTP-based, works on HF Spaces) --- | |
| RESEND_API_KEY = os.getenv("RESEND_API_KEY") | |
| MAIL_FROM = os.getenv("MAIL_FROM", "PolicyEye <onboarding@resend.dev>") | |