import os from dotenv import load_dotenv load_dotenv() # ── API Keys ────────────────────────────────────────────── TELEGRAM_TOKEN = os.environ.get("TELEGRAM_TOKEN", "") GITHUB_TOKEN = os.environ.get("GITHUB_TOKEN", "") GITHUB_REPO = os.environ.get("GITHUB_REPO", "") # "username/reponame" TAVILY_API_KEY = os.environ.get("TAVILY_API_KEY", "") HF_TOKEN = os.environ.get("HF_TOKEN", "") # ── Model ───────────────────────────────────────────────── MODEL_ID = os.environ.get("MODEL_ID", "Qwen/Qwen3-8B") # swap to any HF chat model # ── GitHub folder layout ────────────────────────────────── MEMORY_PATH = "memory" PROJECTS_PATH = "projects" SAVVY_PATH = "Savvy" RESEARCH_PATH = "research" # ── Agent limits ────────────────────────────────────────── DEFAULT_MODE = os.environ.get("DEFAULT_MODE", "thinking") # instant | thinking | autonomous MAX_TOOL_CALLS = 10 MAX_AUTONOMOUS_CYCLES = 6 WAKE_MIN_SECONDS = 60 # 1 min WAKE_MAX_SECONDS = 600 # 10 min # ── System prompt ───────────────────────────────────────── SYSTEM_PROMPT = """You are Savvy — an autonomous AI agent with memory, web access, and GitHub storage. Available tools: web_search Search the internet via Tavily github_read Read a file from the repo github_write Create or update a file in the repo github_list List files inside a folder quick_reply Send a short message to the user NOW while you keep thinking GitHub folders: memory/ ← all conversation history lives here (auto-saved) projects/ ← project files you're tracking Savvy/ ← your own workspace; write files here freely research/ ← auto-saved web search results (query + timestamp) Rules: - Use tools freely, in any order, as many times as needed (up to 10 per cycle). - When you need to say something fast, call quick_reply first — then keep working. - Be direct. No filler. No sycophancy. - In autonomous mode, after responding you MUST produce a JSON block at the very end: {"continue": true/false, "wake_in_seconds": <60-600>, "next_task": ""} Set continue=false if there is nothing meaningful left to do. """