import os from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): # LLM DEFAULT_MODEL: str = "gpt-5.4" BACKGROUND_MODEL: str = "vercel:google/gemma-4-31b-it" OPENAI_API_KEY: str = "" OPENAI_BASE_URL: str = "https://api.openai.com/v1" OPENROUTER_API_KEY: str = "" OPENROUTER_BASE_URL: str = "https://openrouter.ai/api/v1" VERCEL_API_KEY: str = "" VERCEL_BASE_URL: str = "https://ai-gateway.vercel.sh/v1" HUGGINGFACE_API_KEY: str = "" HUGGINGFACE_BASE_URL: str = "https://router.huggingface.co/hf-inference/v1" GITHUB_TOKEN: str = "" # Telegram TG_BOT_TOKEN: str = "" OWNER_TELEGRAM_CHAT_ID: str = "" # Telegram user ID of the bot owner for approval requests ELEVENLABS_API_KEY: str = "" ELEVENLABS_VOICE_ID: str = "" ELEVENLABS_MODEL: str = "eleven_multilingual_v2" # Auth AUTH_TOKEN: str = "" # Integrations VIKUNJA_API_URL: str = "" VIKUNJA_API_KEY: str = "" VIKUNJA_MEMORY_PATH: str = "" KARAKEEP_API_URL: str = "" KARAKEEP_API_KEY: str = "" # User identity & provisioning CREDENTIAL_VAULT_KEY: str = "" VIKUNJA_ADMIN_API_KEY: str = "" KARAKEEP_ADMIN_API_KEY: str = "" ALLOW_CREDENTIAL_REVEAL_IN_CHAT: bool = False EVENT_POLL_INTERVAL_SECONDS: int = 300 # Advisor ADVISOR_ENABLED: bool = False ADVISOR_DEFAULT_MODEL: str = "claude-opus-4.6" ADVISOR_MAX_USES: int = 3 ADVISOR_MAX_TOKENS: int = 700 # Paths REPOS_DIR: str = "/repo" DATA_DIR: str = "/data" TG_PERSISTENCE_DIR: str = "" # Telegram webhook — leave empty to use polling mode WEBHOOK_BASE_URL: str = "" # BetterBot — site directories SITE_DIR: str = "/site" MEMORAIZ_DIR: str = "/memoraiz" model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore") settings = Settings() if not settings.VERCEL_API_KEY: settings.VERCEL_API_KEY = os.getenv("AI_GATEWAY_API_KEY", "") if not settings.HUGGINGFACE_API_KEY: settings.HUGGINGFACE_API_KEY = os.getenv("HF_ACCESS_TOKEN", "")