«Лучший AI-ассистент — тот, который никуда не уходит из твоей сети.»
Полностью локальный коддинг-агент, который запускается на потребительском железе и работает без облачных API. Аналог Claude Code и Cursor, но веса, контекст и история — только у тебя на диске.
Установка · Архитектура · Маршрутизация · Производительность · Модели · Документация · Релиз v0.1.0
Стек объединяет четыре компонента в единый workflow для локальной разработки с AI-ассистентом:
- OpenCode CLI — TUI-агент с tool-calling и поддержкой MCP.
- llama.cpp с CUDA — backend инференса с гибридным размещением MoE-экспертов между GPU и CPU.
- llama-swap + smart router — автоматический выбор контекста (65K / 128K / 256K) под размер запроса.
- MCP-инструменты — приватный поиск, чтение URL, GitHub, persistent memory, filesystem.
🛠 Локальная разработка — код, рефакторинг, дебаг с AI без отправки исходников в облако 🔍 Research — приватный поиск через SearXNG, без трекинга и логирования 📚 Анализ длинных документов — до 256K токенов на одну сессию (Qwen3.6 hybrid arch) 🤖 Эксперименты с локальными LLM — гибкая инфра для подключения любых GGUF-моделей
- Smart context routing — router считает токены и переключает llama-server между пресетами автоматически
- Speculative decoding через draft-модель Qwen3.5-0.8B (×1.5-2 на коротком контексте)
- MoE override-tensor — эксперты на CPU, attention на GPU (35B-модель влезает в 8 GB VRAM)
- DRY sampler против зацикливаний без поломки JSON tool-calls
- Disk-backed prompt cache — холодный старт ускоряется в 10-30 раз
- Восемь MCP-серверов из коробки (searxng, fetch, github, memory, filesystem, time, context7, sequential-thinking)
- Четыре кастомных subagent: researcher, reviewer, tester, debugger
┌──────────────────┐
│ OpenCode (TUI) │ ← пользовательский интерфейс
│ npm: opencode │
└────────┬─────────┘
│ POST /v1/chat/completions
▼
┌────────────────────────┐
│ Smart Router :8081 │ ← FastAPI, оценка токенов,
│ router.py │ выбор пресета (short/mid/long)
└────────────┬───────────┘
│ переписывает body["model"]
▼
┌────────────────────────┐
│ llama-swap :8090 │ ← Go-бинарь, on-demand load/unload
│ load/unload models │ с TTL 30 минут
└────────────┬───────────┘
│ spawn
▼
┌────────────────────────────────────────────┐
│ llama-server (один пресет в памяти) │
│ │
│ ┌─────────┐ ┌─────────┐ ┌──────────┐ │
│ │ short │ │ mid │ │ long │ │
│ │ ctx 65K │ │ ctx 128K│ │ ctx 256K │ │
│ │ + spec │ │ │ │ │ │
│ └─────────┘ └─────────┘ └──────────┘ │
│ │
│ override-tensor: experts → CPU/RAM │
│ attention/embeds/KV → GPU │
└────────────────────────────────────────────┘
Параллельно (запускает OpenCode):
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌──────┐ ┌──────────┐
│searxng │ │ fetch │ │ github │ │ memory │ │ time │ │ ctx7+seq │
└───┬────┘ └────────┘ └────────┘ └────────┘ └──────┘ └──────────┘
│
▼
┌──────────────────┐
│ SearXNG :8888 │ ← приватный мета-поиск,
│ + Valkey (Docker)│ агрегирует Google/DDG/Bing/Brave
└──────────────────┘
Подробное описание компонентов: docs/architecture.md.
SVG-версия диаграммы: docs/screenshots/architecture.svg.
Smart router — тонкий слой Python/FastAPI между OpenCode и llama-swap. На каждом запросе оценивает размер промпта (включая tools и messages) и выбирает оптимальный пресет. Один llama-server одновременно в RAM, переключение через TTL=30 минут.
Incoming request
│
▼
┌──────────────────────┐
│ estimate_tokens() │ считает символы в messages + tools
│ chars / 2.2 │ + фиксированный overhead 12K
│ + OVERHEAD_TOKENS │ под Jinja-template и system prompt
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ pick_model(n) │ three buckets:
│ │ n ≤ 35K → qwen36-short
│ THRESHOLDS lookup │ n ≤ 85K → qwen36-mid
│ │ n > 85K → qwen36-long
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ rewrite body[model] │ переписывает поле model
│ forward to llama- │ и стримит ответ обратно
│ swap (8090) │ клиенту через SSE
└──────────────────────┘
| Bucket | ctx | Speculative | Use-case |
|---|---|---|---|
qwen36-short |
65K | ON (×1.5-2 boost) | Агентские циклы, tool-loops, CRUD-задачи |
qwen36-mid |
128K | OFF | Чтение средних файлов, multi-file refactor |
qwen36-long |
256K | OFF | Анализ репозитория целиком, длинные документы |
При желании пресет можно зафиксировать вручную в TUI через Ctrl+P — например, qwen36-long для one-shot анализа большого PDF.
Замеры на RTX 2080 (8 GB VRAM) + Ryzen 9 9950X + 32 GB DDR5, контекст 32K:
| Метрика | Значение |
|---|---|
| Prompt processing | 200-465 t/s |
| Token generation | 30-49 t/s |
| Speculative accept rate | 60-83% |
| Эффективная скорость с speculative | ~70-90 t/s |
| RAM (модель + кэши) | ~22 GB |
| VRAM (активный slot) | ~6 GB |
Прогноз для RTX 5070 Ti (16 GB) — рост в 2-3 раза за счёт большего VRAM, нативной FP4 на Blackwell и возможности перенести часть экспертов обратно на GPU.
Подбор моделей под другой бюджет VRAM: docs/models.md.
| Компонент | Минимум | Рекомендуется |
|---|---|---|
| GPU | NVIDIA 8 GB VRAM (Turing+) | RTX 5070 Ti / 4080 (16 GB) |
| CPU | 8 cores | Ryzen 9 9950X / Intel i9 |
| RAM | 32 GB DDR4 | 32+ GB DDR5 |
| Disk | 50 GB SSD | 100+ GB NVMe |
| OS | Windows 10/11 | Windows 11 + WSL2 |
Должны быть установлены: Node.js LTS, Docker Desktop, aria2, Python 3.10+, CUDA 12.x toolkit.
git clone https://github.com/Siesher/opencode-homelab.git C:\OpenCode
cd C:\OpenCode
# Базовая установка (OpenCode CLI, llama.cpp, llama-swap, конфиги)
.\scripts\install.ps1
# Скачивание моделей (~22 GB, 30-60 минут)
.\scripts\install.ps1 -DownloadModels
# Лимиты памяти WSL2 для Docker
Copy-Item .\.wslconfig.example $env:USERPROFILE\.wslconfig
wsl --shutdown# Окно 1: SearXNG
docker compose -f .\searxng\docker-compose.yml up -d
# Окно 2: основной стек (llama-swap + router)
.\scripts\start-stack.ps1
# Окно 3: интерфейс
opencodeВ TUI: Ctrl+P → llama-server / qwen36-auto. Router сам подберёт контекст.
Полный гайд установки: docs/installation.md.
Простой запрос:
Прочитай файл README.md и сделай краткое содержание в трёх предложениях.
В окне router-а будет видно решение маршрутизатора:
[router] ~3500 tokens estimated → routing to 'qwen36-short'
Запрос с большим объёмом данных:
Проанализируй все .py файлы в папке project/ и предложи рефакторинг.
[router] ~95000 tokens estimated → routing to 'qwen36-mid'
Использование кастомных subagent:
@reviewer проверь diff последнего коммита
@researcher найди последние benchmark-ы для Qwen3.6-35B-A3B
@tester напиши тесты для модуля utils.py
@debugger почему этот тест флякует через раз
opencode-homelab/
├── README.md, README.en.md, LICENSE, CHANGELOG.md, CITATION.cff
├── .gitignore, .wslconfig.example
│
├── scripts/ PowerShell-скрипты
│ ├── install.ps1 Главный установщик
│ ├── install-llama-swap.ps1 Скачивает llama-swap бинарь
│ ├── start-stack.ps1 Запуск llama-swap + router
│ └── stop-stack.ps1 Остановка всех процессов
│
├── llama-swap/
│ └── llama-swap.example.yaml Три пресета модели (short/mid/long)
│
├── opencode/
│ ├── opencode.example.json Провайдеры и MCP-серверы
│ ├── AGENTS.example.md Шаблон правил агента
│ └── agents/ Custom subagents
│ ├── researcher.md
│ ├── reviewer.md
│ ├── tester.md
│ └── debugger.md
│
├── searxng/
│ ├── docker-compose.yml SearXNG + Valkey
│ └── settings.example.yml Конфиг с включённым JSON API
│
├── router/
│ ├── router.py FastAPI smart router
│ └── requirements.txt
│
├── docs/
│ ├── installation.md Подробная установка
│ ├── architecture.md Описание компонентов
│ ├── models.md Подбор моделей под VRAM
│ ├── troubleshooting.md Частые проблемы
│ └── screenshots/ SVG-диаграммы и UI-mockup
│
└── .github/
├── ISSUE_TEMPLATE/ Шаблоны bug-report и feature-request
├── PULL_REQUEST_TEMPLATE.md
└── workflows/validate.yml CI: валидация конфигов
| Layer | Stack |
|---|---|
| Agent CLI | OpenCode (npm: opencode-ai) |
| Inference | llama.cpp (CUDA 12.4) · llama-server · llama-swap v197 |
| Router | Python 3.10+ · FastAPI · uvicorn · httpx |
| Model | Qwen3.6-35B-A3B Q4_K_M (hybrid attention + Gated Delta Net + MoE) |
| Draft model | Qwen3.5-0.8B Q4_K_M (для speculative decoding) |
| Search | SearXNG · Valkey (Redis fork) · Docker Compose |
| MCP | searxng · fetch · github · memory · filesystem · time · context7 · sequential-thinking |
| Subagents | researcher · reviewer · tester · debugger |
| Deploy | Windows 10/11 (PowerShell) + WSL2 для Docker |
| CI | GitHub Actions (validate YAML/JSON, encoding check, ruff) |
- v0.1.0 — initial release: OpenCode + llama.cpp + Qwen3.6 + smart router + 8 MCP + 4 subagents
- v0.2.0 — multimodal preset (Qwen2.5-VL-32B для vision-задач)
- v0.3.0 — vLLM backend для NVFP4-квантов на Blackwell GPU
- v0.4.0 — live GIF demo маршрутизации, реальные скриншоты TUI
- v1.0.0 — стабильный API, dockerized one-command launcher
Проект построен поверх следующих компонентов:
- OpenCode — TUI агент с tool-calling URL: https://github.com/anomalyco/opencode
- llama.cpp — backend для LLM с GPU-ускорением URL: https://github.com/ggml-org/llama.cpp
- llama-swap — переключение моделей по запросу URL: https://github.com/mostlygeek/llama-swap
- Qwen3.6-35B-A3B — основная модель URL: https://huggingface.co/Qwen/Qwen3.6-35B-A3B
- SearXNG — приватный поисковик URL: https://docs.searxng.org/
- Model Context Protocol — протокол tool-серверов URL: https://modelcontextprotocol.io/
Архитектурная база и оптимизации:
- DeepSeek-V2 / V3: A Strong, Economical, and Efficient Mixture-of-Experts Language Model URL: https://arxiv.org/abs/2405.04434
- Mamba: Linear-Time Sequence Modeling with Selective State Spaces URL: https://arxiv.org/abs/2312.00752
- Speculative Decoding via Big Little Decoder URL: https://arxiv.org/abs/2302.07863
- DRY Sampling: Penalty-based Repetition Suppression URL: oobabooga/textgen#5677
MIT License — свободно используй, форкай, модифицируй. См. LICENSE.
Для академического цитирования: CITATION.cff.
Каждый промпт — твой. Каждый токен — твой. Каждая модель — на твоём диске.
Сухацкий Максим · МГТУ им. Н. Э. Баумана (Калужский филиал) · 2026