跳到正文
GitHub·· 7 天前AI 评分22

JOA:CPU-only 离线优先的本地 AI 编码智能体

TeamLider9141/JOA-AI-CODING-AGENT

AI 导读

JOA 是一个 CPU-only、离线优先的本地 AI 编码智能体,默认通过 Ollama 运行本地 LLM,代码不出本地,也可选用 --backend gemini 切换 Google Gemini。

正文
     ██╗ ██████╗  █████╗
     ██║██╔═══██╗██╔══██╗
     ██║██║   ██║███████║
██   ██║██║   ██║██╔══██║
╚█████╔╝╚██████╔╝██║  ██║
 ╚════╝  ╚═════╝ ╚═╝  ╚═╝
JOA — Lokal AI Coding Agent

Terminalda bu banner har doim ko'k rangda chiqadi — o'rnatishda (install.sh) va joa REPL har ochilganida.

demo1.mp4

Klonlar soni

Klonlar grafigi

CPU-only, offline-first kod-yordamchi. Default holatda Ollama orqali lokal LLM ishlatadi — cloud API'ga bog'liq emas, kod tashqariga chiqmaydi. Xohlasa, tezlik uchun --backend gemini bilan Google Gemini'ga ham o'tish mumkin (ixtiyoriy, cloud API key talab qiladi).

Nima qiladi

  • joa — interaktiv REPL CLI, ko'p bosqichli suhbatni saqlaydi
  • Tool-use agent — fayl o'qish/yozish, buyruq bajarish, kod qidirish
  • Gibrid qidiruv — tree-sitter AST chunking + BM25 (leksik) + Qdrant (vektor semantik) qidiruv, RRF bilan birlashtirilgan
  • LLM reranker — qidiruv natijalarini qayta tartiblash (ishlab chiqilmoqda)
  • Eval harness — gold-standard savol-javoblar bilan avtomatik sifat o'lchash

Texnologiyalar

Python, Typer (CLI), Ollama (qwen2.5-coder, nomic-embed-text), Gemini API (ixtiyoriy ikkinchi chat backend), Qdrant, rank_bm25, tree-sitter, pytest (TDD, 240+ test)

Tezkor o'rnatish (Linux)

curl -fsSL https://raw.githubusercontent.com/TeamLider9141/JOA-AI-CODING-AGENT/main/install.sh | bash
ollama pull qwen2.5-coder:0.5b     # eng tez/yengil; yoki :1.5b / :3b / :7b
joa

joa yangi papkada birinchi marta ochilganda Claude Code'dagidek workspace-trust ekrani chiqadi — strelka tugmalari bilan (↑/↓, Enter) "Ha"/"Yo'q" tanlaysiz, keyin o'sha papka uchun qayta so'ramaydi. Papka hali indekslanmagan bo'lsa, shu yerda hoziroq indekslashni ham taklif qiladi — xuddi shu arrow-key menyu bilan (~ kabi katta/aralash papkalar uchun emas — aniq loyiha papkasi uchun mo'ljallangan).

Indekslash ikki bosqichda ishlaydi: leksik (BM25) qism darhol quriladi (taxminan 0.1s — REPL shu zahoti ishlatishga tayyor), semantik (vektor) qism esa fonda, sizga xalaqit bermay. Fon tugagach ✓ Semantik qidiruv ham tayyor. deb xabar chiqadi — o'shangacha qidiruv faqat leksik (aniq so'z) ishlaydi. Fayllar o'zgarmagan bo'lsa, keyingi joa ochilishlarida semantik qism qayta qurilmaydi (avtomatik aniqlanadi).

Setup (qo'lda, loyihani o'zi ustida ishlash uchun)

python3 -m venv .venv
.venv/bin/pip install -r assistant/requirements.txt
ollama pull qwen2.5-coder:0.5b     # eng tez/yengil; yoki :1.5b / :3b / :7b
ollama pull nomic-embed-text

Gemini backend'ni ishlatmoqchi bo'lsangiz (ixtiyoriy):

cp .env.example .env
# .env faylga GEMINI_API_KEY qo'shing (https://aistudio.google.com/apikey)

Ishlatish

.venv/bin/python -m assistant.cli index <repo-path>
.venv/bin/python -m assistant.cli search "query" --repo <repo-path>
.venv/bin/python -m assistant.cli ask "question" --repo <repo-path>
.venv/bin/python -m assistant.cli ask "question" --repo <repo-path> --backend gemini
bin/joa                                    # interaktiv REPL (Ollama)
bin/joa --backend gemini                   # interaktiv REPL (Gemini)

--backend — ask, agent, repl buyruqlarida ishlaydi (index/searchda yo'q, chunki ular faqat embedding ishlatadi — embedding doim Ollama'da qoladi, backend tanlovidan qat'i nazar). Default: ollama.

REPL sessiyasi ichida /joamodel yozib, o'rnatilgan Ollama modellari (masalan qwen2.5-coder:1.5b/3b/7b) yoki Gemini orasida almashtirish mumkin — sessiyani qayta ishga tushirmasdan. Tanlov raqam kiritish orqali emas, Claude Code'dagidek strelka tugmalari bilan: ↑/↓ ro'yxat bo'ylab yuradi, Enter tanlaydi, Esc/Ctrl-C bekor qiladi. Joriy model boshlanishda avtomatik belgilangan bo'ladi.

Ro'yxat rangli (Ollama modellari — moviy, gemini — pushti, joriy model — yashil va (joriy) belgisi bilan). Har javobdan keyin qaysi model javob berganini ko'rish uchun footer'da ham model nomi chiqadi: (2.3s · qwen2.5-coder:0.5b).

Oddiy savollar (masalan "bu funksiya nima qiladi?") endi agent protokolisiz, bitta chaqiruv bilan javob oladi (to'liq javob tayyor bo'lgach chiqadi — LaTeX formulalar bo'lsa, avval Unicode'ga tozalanadi: \alpha → α, \frac{1}{2} → 1/2 va h.k). Fayl/buyruq talab qiladigan topshiriqlar avvalgidek to'liq agent orqali bajariladi (model o'zi ajratadi).

Kichik modellar (0.5b/1.5b) kod savollarida yaxshi, lekin umumiy bilim/matematik hisob-kitobda ishonchsiz bo'lishi mumkin (xato javobni ham ishonch bilan aytib yuborishi mumkin). Murakkab/nostandart savollar uchun /joamodel bilan kattaroq modelga (7b) yoki Gemini'ga o'tish tavsiya qilinadi.

Boshqa slash-buyruqlar: / yoki /help — buyruqlar ro'yxati, /clear — suhbat kontekstini tozalash (tarix 0 dan boshlanadi). / bilan boshlangan kiritishlar hech qachon LLM'ga yuborilmaydi. Terminalda / yozganingizda buyruqlar ro'yxati jonli dropdown sifatida chiqadi (yozgan sari filtrlanadi, Tab/strelka bilan tanlanadi).

!buyruq — shell buyrug'ini LLM'siz to'g'ridan-to'g'ri bajaradi, chiqish jonli oqadi (progress-barlar ham to'g'ri ko'rinadi, masalan !ollama pull qwen2.5-coder:0.5b). Timeout yo'q — Ctrl-C bilan to'xtatasiz. Agentning o'z run_cmd vositasi (masalan "buyruq bajar" deb so'raganingizda) ham endi natijani kutmasdan jonli ko'rsatadi.

Ctrl-C — joriy amalni (model javob yozayotgani, agent ishlayotgani, !buyruq bajarilayotgani) to'xtatadi, joadan chiqarmaydi. exit/Ctrl-D esa butun sessiyani yopadi.

Kuzatuvda: Bonsai 27B

PrismML'ning Bonsai 27Bi (1-bit/ternary, 27B, Apache 2.0) diqqatga sazovor — 1-bit versiyasi faqat ~3.5GB, ammo Ollama hali uning Q1_0 GGUF formatini yuklay olmaydi (Ollama'ning ggml build'ida bu tur yo'q). Ollama qo'llab-quvvatlashni qo'shgach, Joa'da qo'shimcha kod kerak bo'lmaydi — /joamodel ollama pulllangan istalgan modelni avtomatik ko'radi.

Testlar

.venv/bin/pytest
.venv/bin/python -m assistant.eval.run_eval --repo <repo-path>

Batafsil: assistant/README.md

来源:GitHub · github.com