Многоагентная иерархическая система для автономной работы над кодовыми базами.
Архитектура вдохновлена исследованием Cursor «Self-Driving Codebases» — три уровня агентов (Planner → Subplanner → Worker) координируются через общую очередь задач. В качестве LLM-бэкенда используется любой OpenAI-compatible API (llama.cpp, Ollama, OpenRouter, и т.д.).
Паттерн loop-оркестратора адаптирован из проекта clancy.
Каждая итерация оркестратора проходит три фазы: Plan → Approve → Execute.
User Prompt
│
▼
┌─────────────────────────────────────────────────────┐
│ Orchestrator Loop │
│ │
│ ┌─────────────────┐ │
│ │ Phase 1: Plan │ Root Planner анализирует │
│ │ (Planner Agent) │ код и создаёт задачи │
│ └────────┬────────┘ │
│ │ create_task calls │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Phase 2: Approve │ Показывает план, ждёт [Y/N/A]│
│ │ (Interactive) │ (пропускается при auto_approve)│
│ └────────┬────────┘ │
│ │ approved │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Phase 3: Execute │ Workers выполняют задачи │
│ │ (Worker Pool) │ параллельно │
│ └────────┬────────┘ │
│ │ handoffs → Planner reassesses │
│ └───────────────────► повтор или DONE │
└─────────────────────────────────────────────────────┘
- Root Planner (Phase 1) — анализирует кодовую базу (
read_file,list_dir,shell_exec) и декомпозирует работу на задачи черезcreate_task - Approval (Phase 2) — показывает план пользователю:
[Y]es / [N]o / [A]mend. Приauto_approve: trueпропускается автоматически - Workers (Phase 3) — пул горутин параллельно выполняет задачи, пишет код, запускает тесты
- Subplanners — обрабатывают крупные задачи (
is_subplan: true), разбивая их на подзадачи - Информация течёт снизу вверх через Handoff-документы
- Planner переоценивает ситуацию, создаёт follow-up задачи, и завершает работу сигналом
CODEAGENTS_DONE
Каждый агент работает во внутреннем tool-use loop (до 20 итераций): LLM → вызов инструментов → выполнение → повтор до завершения задачи или достижения лимита.
Требуется Go 1.25+.
Скачайте бинарник со страницы релизов или соберите из исходников:
go build -o code-agents ./cmd/code-agentscode-agents --initСоздаст файл code-agents.yaml с шаблоном конфигурации.
# Запуск с конфигом по умолчанию (code-agents.yaml)
code-agents
# Явно указать путь к конфигу
code-agents -c /path/to/config.yamldocker build -f Dockerfile.run -t code-agents .docker run --rm -it \
-v /path/to/your/project:/workspace \
-v /path/to/code-agents.yaml:/config/code-agents.yaml:ro \
-e CODEAGENTS_API_KEY=your-api-key \
--network host \
code-agents| Параметр | Описание |
|---|---|
-v /path/to/project:/workspace |
Рабочая директория проекта (сюда агенты пишут код) |
-v /path/to/config.yaml:/config/code-agents.yaml:ro |
Файл конфигурации (read-only) |
-e CODEAGENTS_API_KEY=... |
API ключ для LLM провайдера |
--network host |
Доступ к локальному LLM серверу (llama.cpp и т.д.) |
# Запуск с промптом из конфига
docker run --rm -it \
-v $(pwd):/workspace \
-v $(pwd)/code-agents.yaml:/config/code-agents.yaml:ro \
-e CODEAGENTS_API_KEY=sk-xxx \
--network host \
code-agents
# Запуск с промптом из CLI
docker run --rm -it \
-v $(pwd):/workspace \
-v $(pwd)/code-agents.yaml:/config/code-agents.yaml:ro \
--network host \
code-agents -c /config/code-agents.yaml "Create a REST API server"
# Генерация шаблона конфигурации
docker run --rm -v $(pwd):/workspace code-agents --initВажно: В конфигурации
tools.work_dirдолжен быть установлен в.(по умолчанию), т.к. рабочая директория контейнера —/workspace.
Конфигурация задаётся в YAML-файле. Путь указывается как позиционный аргумент (по умолчанию — code-agents.yaml).
version: 1
provider:
base_url: "http://localhost:8080/v1"
api_key: "env:LLM_API_KEY"
agents:
planner:
model:
model: "qwen3-14b"
temperature: 0.3
max_tokens: 4096
system_prompt: "file:./prompts/planner.md"
subplanner:
model:
model: "qwen3-8b"
temperature: 0.3
max_tokens: 4096
system_prompt: "file:./prompts/subplanner.md"
worker:
model:
model: "qwen2.5-coder-14b"
temperature: 0.2
max_tokens: 8192
system_prompt: "file:./prompts/worker.md"
loop:
max_depth: 3
max_workers: 4
max_steps: 30
timeout: "30m"
step_delay: "2s"
tools:
work_dir: "."
allowed_shell: []
git_enabled: true
input:
prompt: "file:./task.md"| Параметр | Описание | По умолчанию |
|---|---|---|
provider.base_url |
URL OpenAI-compatible API | обязательный |
provider.api_key |
API ключ (поддерживает env:VAR_NAME) |
обязательный |
loop.max_workers |
Параллельных workers | 4 |
loop.max_steps |
Макс. итераций planner loop | 30 |
loop.max_retries |
Макс. повторных попыток при ошибках агента | 2 |
loop.timeout |
Глобальный таймаут (Go duration) | 30m |
loop.step_delay |
Задержка между итерациями planner | 2s |
loop.retry_delay |
Задержка перед повторной попыткой | 5s |
loop.max_depth |
Глубина рекурсии subplanners | 3 |
loop.auto_approve |
Автоматически принимать все задачи | false |
agents.*.max_history_messages |
Макс. сообщений в истории агента | 50 |
agents.*.provider |
Переопределить LLM-провайдер для конкретной роли | — |
tools.work_dir |
Рабочая директория | . |
tools.allowed_shell |
Whitelist shell-команд (пустой = все) | [] |
tools.git_enabled |
Включить git tools | true |
Подробнее: docs/configuration.md
Каждый тип агента имеет свой набор инструментов:
| Инструмент | Planner | Subplanner | Worker |
|---|---|---|---|
create_task |
✓ | ✓ | — |
submit_handoff |
— | ✓ | — |
complete_task |
— | — | ✓ |
read_file |
✓ | — | ✓ |
write_file |
— | — | ✓ |
edit_file |
— | — | ✓ |
replace_lines |
— | — | ✓ |
list_dir |
✓ | — | ✓ |
shell_exec |
✓ | — | ✓ |
git_status |
— | — | ✓ |
git_diff |
— | — | ✓ |
git_commit |
— | — | ✓ |
Planner имеет доступ к read_file, list_dir, shell_exec для анализа кодовой базы перед планированием, но не пишет код — только координирует через create_task.
Подробнее: docs/tools.md
Code-Agents рассчитан на локальный инференс через llama.cpp. Для каждой роли агента запускается отдельный llama-server на своём порту.
| Роль | Модель | VRAM | GPU |
|---|---|---|---|
| Planner | Qwen3-14B (Q4_K_M) | ~12 GB | GPU 0 |
| Subplanner | Qwen3-8B (Q4_K_M) | ~7 GB | GPU 1 |
| Worker | Qwen2.5-Coder-14B (Q4_K_M) | ~11 GB | GPU 1 |
# Planner (порт 8080, GPU 0)
llama-server \
--model Qwen3-14B-Q4_K_M.gguf \
--port 8080 --host 0.0.0.0 \
--jinja --flash-attn -ngl 99 \
--ctx-size 8192 --split-mode none --main-gpu 0
# Subplanner (порт 8081, GPU 1)
llama-server \
--model Qwen3-8B-Q4_K_M.gguf \
--port 8081 --host 0.0.0.0 \
--jinja --flash-attn -ngl 99 \
--ctx-size 8192 --split-mode none --main-gpu 1
# Worker (порт 8082, GPU 1)
llama-server \
--model qwen2.5-coder-14b-instruct-q4_k_m.gguf \
--port 8082 --host 0.0.0.0 \
--jinja --flash-attn -ngl 99 \
--ctx-size 8192 --split-mode none --main-gpu 1Подробнее о вариантах моделей и конфигурациях: docs/models.md
code-agents [OPTIONS] [PROMPT...]
Positional arguments:
PROMPT prompt text (overrides config prompt)
Options:
-c, --config PATH path to configuration file (default: code-agents.yaml)
--init generate a new configuration file
--profile NAME named prompt profile to use (loads profiles/<name>.yaml)
--runs-dir DIR directory to save run logs (default: runs)
--version show version info
--help, -h show help
Subcommands:
compare RUN1 RUN2 compare two run log JSON files (from runs/ directory)
# Запуск с конфигом по умолчанию (code-agents.yaml), промпт из конфига
code-agents
# Передать промпт напрямую через CLI (переопределяет config.input.prompt)
code-agents "Add unit tests for the auth module"
# Явно указать путь к конфигу
code-agents -c /path/to/my-config.yaml "Refactor the database layer"
# Использовать именованный профиль (profiles/backend.yaml)
code-agents --profile backend "Fix the API rate limiting bug"
# Сгенерировать шаблон конфигурации
code-agents --init
# Сравнить два прогона
code-agents compare runs/run-001.json runs/run-002.json- Anti-fragility — падение одного агента не роняет систему; planner создаёт замену
- Throughput > Correctness — стабильный поток задач важнее идеальных коммитов
- Constraints over Instructions — system prompts определяют границы, а не пошаговые инструкции
- Information Flows Upward — никакого shared state, только Handoff-документы вверх по иерархии
- No Static Plans — planner непрерывно переоценивает ситуацию на основе результатов workers
Подробнее: docs/architecture.md
code-agents/
├── cmd/code-agents/ # CLI — точка входа
│ ├── main.go
│ └── template.yaml # embedded шаблон для --init
├── internal/
│ ├── config/ # загрузка YAML, валидация, env:/file: резолвинг
│ ├── llm/ # OpenAI-compatible HTTP клиент + ProviderPool
│ ├── agent/ # абстракция агента с tool-use loop
│ ├── tool/ # реализации инструментов (file, shell, git, task)
│ ├── task/ # Task, Handoff, thread-safe Queue
│ ├── orchestrator/ # координация planner + worker pool
│ ├── runner/ # кросс-платформенный shell (PTY/pipes)
│ ├── runlog/ # метрики и логи запусков (JSON, сравнение прогонов)
│ ├── logging/ # инициализация логгеров (file + console)
│ └── version/ # build-time версия
├── prompts/ # примеры промптов для задач
├── profiles/ # именованные профили конфигурации (опционально)
├── docs/ # документация
└── code-agents.yaml # пример конфигурации
При каждом запуске создаётся
code-agents.logв текущей директории (перезаписывается). Метрики прогонов сохраняются вruns/(JSON, меняется через--runs-dir).
Подробнее: docs/project-structure.md
| Документ | Описание |
|---|---|
| architecture.md | Архитектура, иерархия агентов, поток данных |
| configuration.md | Полная схема конфигурации с примерами |
| tools.md | Описание всех инструментов агентов |
| models.md | Подбор GGUF моделей для локального инференса |
| models-vllm.md | Запуск моделей через vLLM |
| interfaces.md | Ключевые интерфейсы и типы Go |
| orchestration-loop.md | Пошаговое описание оркестрации |
| project-structure.md | Структура проекта и назначение пакетов |
| prompt-measurement.md | Методология измерения качества промптов |
Требуется Go 1.25+.
# Запуск тестов
go test -race -timeout 120s ./...
# Проверка кода
go vet ./...Проект использует .gitlab-ci.yml с тремя стадиями:
| Стадия | Триггер | Действие |
|---|---|---|
test |
Любой push | go vet ./... + go test -race -timeout 120s -v ./... |
build |
Тег vX.Y.Z |
Docker-сборка бинарников для linux/darwin/windows × amd64/arm64/386 |
release |
Тег vX.Y.Z |
Создание GitLab Release с прикреплёнными артефактами |
Для релиза достаточно создать тег по маске v1.2.3:
git tag v1.0.0
git push origin v1.0.0При каждом запуске создаётся файл code-agents.log в текущей директории (перезаписывается). Консоль выводит краткий лог, файл — подробный с микросекундами.
Для разных задач удобно хранить отдельные конфиги в директории profiles/:
profiles/
├── backend.yaml # конфиг для backend-задач
├── frontend.yaml # конфиг для frontend-задач
└── refactor.yaml # конфиг для рефакторинга
Запуск:
code-agents --profile backend "Fix the API rate limiting bug"# Обычная сборка
go build -o code-agents ./cmd/code-agents
# С версией
go build -ldflags "-s -w \
-X gitlab.alexue4.dev/kelnmaari/code-agent/internal/version.Version=1.0.0 \
-X gitlab.alexue4.dev/kelnmaari/code-agent/internal/version.Commit=$(git rev-parse HEAD)" \
-o code-agents ./cmd/code-agents
# Кросс-компиляция
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o code-agents-linux-amd64 ./cmd/code-agentsSee LICENSE for details.
