"""STEW v2 — Configuration. All values from Hugging Face Secrets / environment vars.""" import os class Config: # ── OpenRouter ───────────────────────────────────────────────────────────── OPENROUTER_API_KEY = os.environ.get("OPENROUTER_API_KEY", "") OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1" OPENROUTER_SITE_URL = os.environ.get("SPACE_URL", "https://huggingface.co") OPENROUTER_APP_NAME = "STEW-Agent-v2" # ── Models ───────────────────────────────────────────────────────────────── MODELS = { "owl-alpha" : "openrouter/owl-alpha", "gpt-oss-120b" : "openai/gpt-oss-120b:free", "nemotron-nano" : "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free", "deepseek" : "deepseek/deepseek-chat-v3-0324:free", "qwen3" : "qwen/qwen3-235b-a22b:free", "mistral" : "mistralai/mistral-small-3.2-24b-instruct:free", } DEFAULT_MODEL = "owl-alpha" FAST_MODEL = "mistral" # used for swarm speed REASONING_MODEL = "gpt-oss-120b" # ── Telegram ─────────────────────────────────────────────────────────────── TELEGRAM_BOT_TOKEN = os.environ.get("TELEGRAM_BOT_TOKEN", "") SPACE_URL = os.environ.get("SPACE_URL", "") TELEGRAM_WEBHOOK_PATH = "/telegram/webhook" # ── Discord ──────────────────────────────────────────────────────────────── DISCORD_BOT_TOKEN = os.environ.get("DISCORD_BOT_TOKEN", "") # ── GitHub ───────────────────────────────────────────────────────────────── GITHUB_TOKEN = os.environ.get("GITHUB_TOKEN", "") # ── Image Generation ─────────────────────────────────────────────────────── TOGETHER_API_KEY = os.environ.get("TOGETHER_API_KEY", "") # optional, free fallback used # ── Google ───────────────────────────────────────────────────────────────── GOOGLE_CLIENT_ID = os.environ.get("GOOGLE_CLIENT_ID", "") GOOGLE_CLIENT_SECRET = os.environ.get("GOOGLE_CLIENT_SECRET", "") GOOGLE_ACCESS_TOKEN = os.environ.get("GOOGLE_ACCESS_TOKEN", "") GOOGLE_REFRESH_TOKEN = os.environ.get("GOOGLE_REFRESH_TOKEN", "") GOOGLE_REDIRECT_URI = os.environ.get("GOOGLE_REDIRECT_URI", "") GMAIL_CLIENT_ID = os.environ.get("GMAIL_CLIENT_ID", "") GMAIL_CLIENT_SECRET = os.environ.get("GMAIL_CLIENT_SECRET", "") # ── Integrations ─────────────────────────────────────────────────────────── NOTION_TOKEN = os.environ.get("NOTION_TOKEN", "") SLACK_BOT_TOKEN = os.environ.get("SLACK_BOT_TOKEN", "") SLACK_CLIENT_SECRET = os.environ.get("SLACK_CLIENT_SECRET", "") # ── Storage paths ────────────────────────────────────────────────────────── DB_PATH = "/tmp/stew_v2.db" SCHEDULER_DB_URL = "sqlite:////tmp/stew_scheduler.db" VECTOR_DB_PATH = "/tmp/stew_vector_db" SKILLS_DIR = "/tmp/stew_skills" FILES_DIR = "/tmp/stew_files" IMAGES_DIR = "/tmp/stew_images" # ── Limits ───────────────────────────────────────────────────────────────── MAX_SWARM_AGENTS = 50 MAX_MEMORY_TURNS = 30 MAX_RESPONSE_TOKENS = 2048 CODE_EXEC_TIMEOUT = 30 # seconds @classmethod def validate(cls): issues = [] if not cls.OPENROUTER_API_KEY: issues.append("⚠️ OPENROUTER_API_KEY missing") if not cls.TELEGRAM_BOT_TOKEN: issues.append("⚠️ TELEGRAM_BOT_TOKEN missing") if not cls.SPACE_URL: issues.append("⚠️ SPACE_URL missing (Telegram webhook won't register)") for i in issues: print(i) # Create required dirs import os for d in [cls.SKILLS_DIR, cls.FILES_DIR, cls.IMAGES_DIR]: os.makedirs(d, exist_ok=True) return issues