File size: 2,650 Bytes
a6e3889
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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.
"""