JOA:CPU-only 离线优先的本地 AI 编码智能体
TeamLider9141/JOA-AI-CODING-AGENT
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
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