math-solver / config /settings.py
Cuong2004
Deploy API from GitHub Actions
0772b5a
Raw
History Blame Contribute Delete
3.02 kB
import os
from pathlib import Path
from typing import List, Dict
from pydantic import BaseModel, Field
from dotenv import load_dotenv
# Load from backend/.env if available
_env_path = Path(__file__).parents[1] / ".env"
if _env_path.exists():
load_dotenv(dotenv_path=_env_path)
else:
load_dotenv()
class ProviderCredentials(BaseModel):
provider: str
keys: List[str] = Field(default_factory=list)
def parse_comma_separated_keys(raw: str) -> List[str]:
if not raw:
return []
keys = []
for piece in raw.split(","):
cleaned = piece.strip().strip("'\" ")
if cleaned:
keys.append(cleaned)
return keys
class Settings(BaseModel):
app_env: str = Field(default_factory=lambda: os.getenv("APP_ENV", "development"))
redis_url: str = Field(default_factory=lambda: os.getenv("REDIS_URL", "redis://localhost:6379/0"))
llm_timeout_seconds: int = Field(default_factory=lambda: int(os.getenv("LLM_TIMEOUT_SECONDS", "120")))
llm_cooldown_seconds: int = Field(default_factory=lambda: int(os.getenv("LLM_COOLDOWN_SECONDS", "60")))
default_chat_model: str = Field(default_factory=lambda: os.getenv("DEFAULT_CHAT_MODEL", "gemini/gemini-3.7-flash"))
def get_provider_credentials(self) -> Dict[str, ProviderCredentials]:
"""Parses API keys for all supported providers from environment variables."""
credentials: Dict[str, ProviderCredentials] = {}
# 1. Gemini / Google
gemini_raw = os.getenv("GOOGLE_API_KEY") or os.getenv("GEMINI_API_KEY") or ""
gemini_keys = parse_comma_separated_keys(gemini_raw)
# Also check indexed keys GEMINI_API_KEY_1, GEMINI_API_KEY_2, etc.
for i in range(1, 20):
k = os.getenv(f"GEMINI_API_KEY_{i}") or os.getenv(f"GOOGLE_API_KEY_{i}")
if k and k.strip() and k.strip() not in gemini_keys:
gemini_keys.append(k.strip())
credentials["gemini"] = ProviderCredentials(provider="gemini", keys=gemini_keys)
# 2. OpenAI
openai_raw = os.getenv("OPENAI_API_KEY") or ""
openai_keys = parse_comma_separated_keys(openai_raw)
for i in range(1, 10):
k = os.getenv(f"OPENAI_API_KEY_{i}")
if k and k.strip() and k.strip() not in openai_keys:
openai_keys.append(k.strip())
credentials["openai"] = ProviderCredentials(provider="openai", keys=openai_keys)
# 3. Anthropic
anthropic_raw = os.getenv("ANTHROPIC_API_KEY") or ""
anthropic_keys = parse_comma_separated_keys(anthropic_raw)
credentials["anthropic"] = ProviderCredentials(provider="anthropic", keys=anthropic_keys)
# 4. OpenRouter
openrouter_raw = os.getenv("OPENROUTER_API_KEY") or os.getenv("OPENROUTER_API_KEY_1") or ""
openrouter_keys = parse_comma_separated_keys(openrouter_raw)
credentials["openrouter"] = ProviderCredentials(provider="openrouter", keys=openrouter_keys)
return credentials
settings = Settings()