Spaces:
Build error
Build error
| 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": "<what you'll do next>"} | |
| Set continue=false if there is nothing meaningful left to do. | |
| """ | |