Skip to content

Repository files navigation

🧠 RINGAN — Super Ringan Agentic AI

Agentic AI yang tools-nya banyak tapi payload-nya kecil. Prinsip: Lazy Tool Loading — model cuma lihat manifest (nama+deskripsi), router yang eksekusi. Bukan 37 schema penuh kayak framework lain.

Install — 1 LINE (dependencies otomatis)

Linux/macOS:

curl -fsSL https://raw.githubusercontent.com/dianrestu/ringan/main/install.sh | bash
cd ~/ringan && python main.py

Windows (PowerShell):

irm https://raw.githubusercontent.com/dianrestu/ringan/main/install.ps1 | iex
cd ~\ringan; python main.py

⚙️ Auto-dependency: installer cek SEMUA kebutuhan sendiri. Kalau Python 3.10+ tidak ada / versinya rendah → download & install otomatis (Linux: apt/dnf/yum/pacman/apk/brew · Windows: python.org silent, system-wide dulu, fallback per-user — exit 1603 itu normal, patokannya python kepanggil). git tidak ada → di-install otomatis, atau fallback download ZIP. Tidak ada langkah manual, cukup satu baris.

Atau manual:

git clone https://github.com/dianrestu/ringan.git && cd ringan
./install.sh            # Linux · Windows: python install.py
python main.py

Semua otomatis: download repo → venv → install deps (httpx, pyyaml, python-telegram-bot, playwright+chromium, pyautogui) → git init → tanya memory cloud. Kalau ada dep yang gagal → agent tetap jalan, cuma fitur itu yang nonaktif.

Wizard setup muncul otomatis pas main.py pertama kali jalan: pilih provider (OpenAI/OpenRouter/Groq/Mistral/Ollama/LM Studio/Custom) → endpoint keisi otomatis → isi API key → pilih model dari list → selesai.

🧠 Kompresi Konteks Otomatis — Token Kecil, Tetap Ingat Semua

Beda dengan /compact-nya Hermes (manual, re-summarize seluruh history tiap kali penuh), RINGAN kompres incremental per pesan — sekali ekstrak, dipakai terus. DB tetap nyimpen pesan LENGKAP; yang dikirim ke AI cuma ringkasannya.

payload ke AI = system prompt + 10 pesan terakhir MENTAH + konteks pesan lawas
  • Konteks per pesan: di jawaban final, AI nempel blok [[KONTEKS]] (USER: ringkasan pesan user · AI: ringkasan jawaban) — diparse & di-strip dari tampilan, disimpan ke data/contexts.db. Model lemah yang gak nurut → fallback rule-based (list-aware: item "1. 2. 3. 4." semuanya kepotong rata biar gak ada yang ilang).
  • Konteks SESSION: akumulasi konteks 1 sesi (dedup, cap 1500 chars), selalu ada di payload — reset tiap /new.
  • Pesan lawas (di luar 10 terakhir): TIDAK dikirim mentah — posisinya diganti konteks per pesannya. Fakta tetep ada, token jauh lebih kecil.
  • Config: compress.keep_recent (10), compress.context_block (true).

Contoh: pesan "gw punya 4 usaha: 1. haircut... 2. print... 3. fashion... 4. store..." (230+ char) → konteks: "Aydin menyebutkan 4 usahanya: haircut, print, fashion, store (PPOB)." — 1 baris, 0 fakta hilang.

🎯 Multi-Agent (delegation)

Tool delegate(goal, context) — spawn sub-agent dengan session & history SENDIRI (memory & approval shared). Yang balik cuma jawaban final — konteks parent gak kebanjiran tool noise sub-agent. Kedalaman maks 3 level (anti infinite loop). Cocok: riset paralel, coding terisolasi, tugas yang bisa dikerjakan independen.

📚 Skills (install dari apa aja, AI yang eksekusi)

Skill = folder berisi SKILL.md (frontmatter name + description, body = instruksi). Agent liat daftar skill di system prompt → pas cocok, panggil load_skill(name) → instruksi masuk konteks → agent ikutin.

ringan --skill-install ./folder-skill    # dari folder/file lokal
ringan --skill-install https://.../SKILL.md   # dari web (raw GitHub dll)
ringan --skill-list / --skill-rm <name>

Di REPL: /skills. Contoh isi skill: cara setup bot PPOB, checklist deploy, konvensi coding project lo — apa aja yang reusable.

⏰ Cron Jobs

Tugas terjadwal ala Hermes:

ringan --cron-daemon            # scheduler headless (jalan di background)
/cron list                                  # daftar job
/cron add 30m 'cek harga pulsa ppob'        # tiap 30 menit
/cron add daily 07:30 'daily briefing singkat'
/cron rm <id>   / cron run <id>

Hasil tiap eksekusi → data/cron-output/<id>_<timestamp>.txt.

👁️ Vision + 🎬 Transkrip Video

  • Vision: kirim foto (Telegram langsung, atau tool vision(image, question) buat path/URL) → model vision (auto/best-vision, config vision.model). Di Telegram, foto user otomatis ke-save ke data/uploads/ & agent bisa deskripsikan.
  • Transkrip: tool video_transcript(url) — subtitle YouTube dkk via yt-dlp (gak download video). ⚠️ IP datacenter kadang kena rate-limit YouTube.

🪶 Lite Mode (model kecil)

--lite (atau lite: true di config) — buat model kecil (7B/3B, Ollama): manifest dipangkas ke 10 tool inti (terminal, calculator, memory, web, skill, vision, delegate), system prompt lebih pendek, blok konteks dimatiin. RINGAN tetep jalan di model sekecil apa pun — endpoint + model name bebas.

Backup — Amankan dari VPS mati

./backup.sh           # Linux → backup.py
python backup.py      # Windows

Otomatis tiap 30 menit (Linux):

crontab -e  # tambah: */30 * * * * /root/agentic/backup.sh >> /root/agentic/data/backup-cron.log 2>&1

Restore setelah install ulang (VPS baru / pindah):

./restore.sh origin        # Linux — memory balik dari cloud
python restore.py origin   # Windows

Atau dari repo memory terpisah: python restore.py https://github.com/lo/ringan-memory.git

🔑 VPS baru & git belum login? Gak usah setup manual — pas restore gagal (atau pas install wizard nanya memory cloud), RINGAN otomatis nawarin sekalian login GitHub: masukin username + PAT sekali → kredensial disimpen (credential.helper=store, ~/.git-credentials chmod 600) → tes koneksi → langsung lanjut restore/push. Satu flow, beres semua.

Setiap chat tercatat realtime (meniru Hermes):

  • data/sessions/YYYY-MM-DD.md — log percakapan lengkap + timestamp
  • data/memories/YYYY-MM-DD.md — ingatan + kategori + timestamp + source
  • data/memory.db + data/sessions.db — versi SQLite terstruktur
  • Export ke Obsidian: python3 -c "from ringan.config import Config; from ringan.agent import Agent; Agent(Config()).export_memory_obsidian('/path/vault')"

Quick Start (User Baru)

python3 main.py

Wizard setup: Endpoint → API Key → API Mode → Fetch models → Pilih model → Aliases.

Fitur

🤖 Telegram Gateway

Bot Telegram via python-telegram-bot. /models nampilin daftar model + tombol inline pilihan (kayak Hermes).

🔗 Kontinuitas Konteks (Hermes-style)

Ganti model / restart / token abis → konteks TETAP, langsung lanjut dari tugas sebelumnya:

  • History ke-save ke sessions.db tiap pertukaran pesan (termasuk tool call/result)
  • /resume atau --resume → load history dari DB → persis lanjut dari yang terakhir
  • /model flash mid-session → client baru tapi history tetep (bisa switch model berkali-kali tanpa lupa)
  • Fallback chain otomatis: model utama gagal → coba fallback → konteks gak ilang
  • /stats → dashboard token per-session, per-model (buktikan payload diet)
  • Fitur unik: Hermes juga punya ini — RINGAN sekarang setara (tapi tetap 100x lebih hemat token)

🌐 Browser Tools (via Playwright, lazy-load)

browser_navigate, browser_snapshot, browser_click, browser_type, browser_scroll. Kalau playwright belum keinstall, agent tetep jalan — cuma tool browser yang nonaktif.

🔍 Web Search (gratis, multi-backend)

web_search cari info di web tanpa API key: Bing (primary) → DuckDuckGo (fallback). URL decoded otomatis — hasil bisa langsung di-fetch pakai web_fetch.

🖥️ Computer Use (via pyautogui, lazy-load)

computer_screenshot, computer_click, computer_type, computer_key, computer_scroll, computer_position, computer_windows (Windows/macOS). Kalau pyautogui nggak tersedia / headless → tool nonaktif, agent tetap jalan.

⚖️ Sistem Approval + Smart Gate (ala Hermes)

Agent gak bisa sembarangan eksekusi hal penting — tapi juga gak nanya terus-terusan. Dua lapis:

Lapis 1 — Smart gate (agent yang nilai): command/aksi diklasifikasi otomatis (rule-based, instan, tanpa token):

  • df -h, free -h, ls, cd, cat, git status, ps, dll → auto-jalan, gak nanya (ditandai [auto-aman] di log)
  • rm -rf /, mkfs, dd of=/dev/sd, shutdown, curl | bash, git push --force, apt remove, Remove-Item -Recurse, nulis ke /etc / .ssh / .envapproval
  • Sisanya (ambigu, mis. terraform apply) → tanya (conservative)

Lapis 2 — Approval mode (config.yamlapproval.mode):

  • ask (DEFAULT) — CLI: Jalankan? [y/N] · Telegram: tombol ✅/❌
  • allow — semua langsung jalan (trusted, hati-hati)
  • deny — cuma yang auto-aman yang jalan, sisanya ditolak

Tool berbahaya (yang kena gate): terminal, file_write, browser_click/type, computer_click/type/key/scroll — ditandai ⚠️(butuh approval) di manifest, jadi model juga sadar & gak maksa.

Fail-safe: one-shot -q / bukan tty → yang aman auto-jalan, yang berbahaya/ambigu DITOLAK (agent jelasin & minta izin). Kecuali RINGAN_ALLOW_DANGEROUS=1 untuk scripted/CI trusted. approval.auto_safe: false → matiin smart gate (balik ke tanya semua). Yang ditolak masuk log session (approval: deny <tool>), ada jejak.

🔁 Ganti Model Gak Bikin Lupa (Kontinuitas Konteks)

Skenario: lagi coding → token/kuota model abis → ganti model → langsung lanjut dari tugas sebelumnya.

  • Mid-chat: /model <nama|alias> — history TETAP di agent, cuma client LLM-nya yang diganti. Step berikutnya lanjut dari titik terakhir.
  • Restart / pindah proses: python main.py --resume (atau /resume di REPL) — semua pesan (user, assistant, tool call, tool result) di-load ulang dari sessions.db, konteks kebangun penuh.
  • Error model (429/403/token abis): fallback_chain otomatis coba model cadangan (active → default → auto/coding:free) di step yang sama — konteks gak ilang, tinggal lanjut.
  • Statistik pemakaian: /stats — total/per-model token session ini.

🎯 Lanjutkan TUGAS yang Kepotong — Checkpoint (ala save data game)

Session = nyambungin percakapan. Ini nyambungin PROSES-nya, dengan checkpoint lengkap (data/tasks.json, di-save realtime tiap step):

{
  "goal": "deploy aplikasi...",
  "status": "paused",            // in_progress / paused / done
  "steps": 4,
  "last_message": "...",         // pesan/tugas terakhir
  "process": [                   // FULL proses (max 30 step, ringkas)
    {"tool": "web_search", "args": "...", "ok": true,  "preview": "..."},
    {"tool": "terminal",  "args": "...", "ok": false, "preview": "exit=1..."},
    ...
  ],
  "last_terminal": [             // 2 eksekusi TERMINAL terakhir
    {"cmd": "npm run build",     "exit": 1, "ok": false},
    {"cmd": "npm run build --fix", "exit": 0, "ok": true}
  ]
}
  • Pesan terakhir dicatat (user & assistant) — agent tau persis di mana percakapan berhenti.
  • Full proses — semua tool call + hasilnya (ringkas), biar agent paham konteks dalam.
  • 2 eksekusi terminal terakhir — karena dalam 1 tugas terminal bisa kebuka banyak; yang gagal (exit≠0/ERROR) DITONJOLKAN di checkpoint dengan instruksi: "kalau ada yang GAGAL, ULANGI dulu sampai sukses, baru lanjut" — pas /continue, agent cek eksekusi terakhir & ngulangin yang belum berhasil.
  • DB local (sessions.db) mencatat per pesan (role, content, tool_calls, timestamp) + FTS5 searchable.

Alur: token abis / kill -9 / crash → --resume → deteksi otomatis → /continue → agent lanjut dari posisi EXAK (retry dulu yang gagal).

🧠 Memory Realtime (Hermes-style)

  • Setiap chat langsung ke-log: data/sessions/YYYY-MM-DD.md + SQLite
  • Setiap ingatan langsung ke-save: data/memories/YYYY-MM-DD.md + SQLite
  • Export ke Obsidian vault dengan link structure
  • Backup auto-commit via git (aman dari VPS mati)

Konfigurasi (config.yaml)

agent:
  name: ringan
  max_steps: 15
  window_size: 20
  hard_cap_tokens: 8000
  tool_result_max_chars: 4000
  db_path: data/memory.db

endpoint: <isi endpoint OpenAI-compatible kamu, lihat config.example.yaml>
api_key_env: RINGAN_API_KEY
api_mode: chat_completions      # auto / chat_completions / responses
model_name: auto/coding:free
aliases:
  flash: Gemini_3.6_flash_low

approval:
  mode: ask             # ask / allow / deny — gerbang tool berbahaya
  auto_safe: true       # smart gate: command aman (df -h, ls...) auto-jalan

timeout: 180
max_retries: 3

Lazy Tool Loading

Framework Token per request Tools terlihat
RINGAN ~280-350 1 universal call_tool + manifest ringkas
Hermes 15,000-30,000+ 37 schema penuh
OpenClaw 10,000+ Full function calling
Atomic 5,000-15,000 Full tool schemas

Struktur

agentic/
├── install.sh              # Portable installer (pindah VPS = clone + install)
├── backup.sh               # Auto backup memory + session (git commit)
├── config.yaml             # Konfigurasi (endpoint, model, aliases)
├── main.py                 # Entry point: CLI REPL + one-shot
├── blueprint.md            # Desain arsitektur
├── ringan/
│   ├── config.py           # Config loader + setup wizard + fetch models
│   ├── llm.py              # LLM client (SSE-aware, retry, fallback)
│   ├── context.py          # Lite context builder (budget-aware)
│   ├── router.py           # Tool registry + lazy execution
│   ├── memory.py           # SQLite memory + markdown mirror + Obsidian export
│   ├── sessions.py         # Session logger realtime (SQLite + markdown)
│   ├── agent.py            # Agent loop (realtime recording)
│   ├── gateway/
│   │   └── telegram.py     # Telegram adapter (inline model buttons)
│   └── tools/
│       ├── terminal.py     # shell exec
│       ├── file.py         # read/write/list
│       ├── web.py          # web fetch
│       ├── calculator.py   # math eval
│       ├── memory_tool.py  # memory add/search
│       └── browser.py      # Playwright (lazy, opsional)
└── data/
    ├── memory.db           # Memory SQLite
    ├── memories/*.md       # Memory markdown (per hari)
    ├── sessions.db         # Session SQLite
    └── sessions/*.md       # Session log markdown (per hari)

Roadmap

Phase Status Isi
1. MVP Core loop, router, tools, CLI, wizard, memory
2. Gateway + Browser Telegram adapter (inline buttons), Playwright (lazy)
3. Memory Upgrade Realtime session log, markdown mirror, Obsidian export, git backup
4. Power TODO Computer use, delegation, cron, skills

License

MIT

About

RINGAN - super ringan agentic AI. Lazy tool loading (~300 token/request), memory cloud per-user, session search, cross-platform.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages