File size: 5,102 Bytes
4e4a989
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
"""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