- BrainTools - https://www.braintools.ru -
ИИ не заменяет людей, люди просто больше работают. Так давайте хотя бы ночью пусть работает ИИ.
Так вышло, что я плачу 100 евро в месяц на Claude Code. Солидная сумма, которая растворяется практически момоментально, когда твой аккаунт превращается в полигон из 10+ проектов, где 7-8 мои, а 2-3 моей жены.
Шеринг подписки вообще занятие затратное, но мне не жалко.
Так вышло, что я попал в некую зависимость от написания проектов с Claude – мне постоянно хочется что-то в нем создать. Не скажу, что у меня низкая нагрузка на работе – совсем нет. Просто легкость реализации проектов на Opus 4.6 и высокая подписка на продукт , провоцирует мой мозг [1] нагружать ИИшку 24/7. Доходит до абсурда – перед сном [2] стараюсь делать заготовки задач, которые планирую выполнить завтра, максимально при этом заставляя Claude потратиться в токенах на анализ и изучение проекта. То, чего днем стараюсь избегать, потому что могу попасть на ограничение по использованию.
Именно во время одной из моих “планерок” я подумал – блин, классно было бы Claude настроить на то, чтобы я ему выписывал задачи, а он бы за ночь мне это выполнил, а не просто спланировал, как я делаю это сейчас. Ну и в идеале, чтобы он еще и сам проверил свой результат.
Так появился PocketCoder-A1: автономный coding agent с верификацией, веб-дашбордом и поддержкой нескольких провайдеров. 7086 строк Python, 15 модулей, ни одного фреймворка.

На самом деле, мысли мои пошли еще дальше, хотя первые макеты я сел делать в тот же вечер, когда петух клюнул меня за известное место.
Задумка такая. Я работаю над одним проектом, а в голове крутятся мысли по другому: “надо добавить провайдер DeepSeek”, “переписать конфиг”, “написать тесты”.
И задачи то выписал. Но руки дойдут через неделю. А подписка за one hundred bucks тикает.
Я попробовал OpenClaw. Не сработало, даже с хорошей моделью. С ним , кстати, у меня вообще ничего не вышло. Может криво подключил, может что-то ещё, но результат нулевой. Я бы вообще написал отдельную статью про этих ребят, потому что ни один проект, даже простой парсер сайта, у меня на нем не получился.

Тогда я решил написать своё. Идея простая: написал задачи, ушёл гулять или спать, вернулся с результатом. Агент работает сессиями, сохраняет состояние, берёт следующую задачу сам. После каждой сессии запускается реальная проверка: pytest, py_compile, проверка файлов на диске. Веб-дашборд показывает что происходит в реальном времени. Основной провайдер Claude Max, плюс Claude API и Ollama как экспериментальные.
Сделан прежде всего для себя. Я реально этим уже пользуюсь, но выложил в open source, вдруг кому-то тоже пригодится.
Расшифрую странную букву A в названии. Это Authonomous, ну то есть автономный. А 1, как первая версия. Вдруг зайдет , а надо будет писать обновления.
CLI + веб-дашборд. Установка:
pip install pocketcoder-a1
Инициализация на любом проекте:
pca init /path/to/your-project
pca ui
Открывается дашборд на http://localhost:7331 [3]. Добавляешь задачи, нажимаешь Start Agent, агент работает автономно.
Отличие от PocketCoder v1 (моего предыдущего проекта [4]): v1 это CLI-агент для локальных моделей, интерактивный. A1 это автономный менеджер задач + исполнитель. Нажал кнопку, ушёл. Совсем другой продукт. Мб в будущем подумаю, как его поженить с ним.
И да, скоро обнова выйдет на обычный Pocketcoder!
Весь проект это 15 Python-модулей. Ни одного фреймворка. HTTP-сервер на стандартном http.server, JSON это стандартный json, файлы через pathlib. Единственные внешние зависимости это playwright для E2E тестов и опционально anthropic / ollama для альтернативных провайдеров.
Вот как работает система целиком, от pca start до завершения:
Агент запускается, захватывает baseline (снимок валидации ДО работы), собирает промпт, работает через Claude CLI, парсит результат в реальном времени, верифицирует. Если всё ок, принимает результат. Если нет, инжектит ошибки [5] в следующую сессию и пытается снова. Разберём каждый кусок.
Ядро системы это запуск Claude CLI как subprocess. Звучит просто, но в этой части скрывались самые коварные проблемы.
Финальный вариант запуска:
import os, subprocess
env = os.environ.copy()
env.pop("CLAUDECODE", None) # без этого nested sessions падают
proc = subprocess.Popen(
["claude", "-p", prompt,
"--dangerously-skip-permissions",
"--no-session-persistence",
"--max-turns", "25",
"--verbose",
"--output-format", "stream-json"],
cwd=str(project_dir),
env=env,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True,
bufsize=1,
)
Почему именно так? Claude Code ставит переменную CLAUDECODE=1 в окружении. Subprocess наследует это, внутренний claude видит переменную и падает: “cannot launch inside another session”.
|
Флаг |
Зачем |
|---|---|
|
|
Неинтерактивный режим |
|
|
Автоподтверждение всех tool_use |
|
|
Не засорять историю сессий |
|
|
Защита от бесконечной работы |
|
|
Обязательно с stream-json + -p |
|
|
NDJSON поток вместо буферизации |
С stream-json Claude выдаёт NDJSON, по одному JSON-объекту на строку:
{"type":"assistant","message":{"content":[{"type":"tool_use","name":"Read","input":{"file_path":"/src/app.py"}}]}}
{"type":"rate_limit_event","usage":{"input_tokens":12400,"output_tokens":3200}}
{"type":"result","result":"Task completed successfully."}
Парсер классифицирует каждое событие и отправляет в дашборд.tool_use с именем Read становится типом “read” (синий), Bash это “bash” (фиолетовый), thinking это жёлтый. Всего 8 типов иконок.
Самая важная часть системы. Пока тестировал, агент раньше времени писал completed. Ну то есть сделал 1-2 запроса и хватит с меня – ИИ считает, что доделал свою работу. Тут на самом деле есть объяснение. Когда делаешь запрос по API, то у тебя идет 1 запрос=1 ответ. А когда запрос поступает из WEBа, то система под капотом автоматом делает минимальный reasoning, а где-то может свои кастомные skills подтянуть(инсутркции как работать с теми или иными модулями эффективнее. Популярно очень на Excel/Word, но на самом деле не только).
Когда агент говорит “COMPLETED”, мы не верим. Запускается трёхуровневая проверка.
Уровень 1, BLOCKING. Если хоть одна проверка не прошла, сессия не принимается: py_compile на все .py файлы, pytest, проверка что файлы реально на диске, проверка success_criteria из задачи.
Уровень 2, WARNING. Результат только логируется: ruff, build, git diff.
Уровень 3, ANTI-LOOP. Защита от бесконечного цикла. Мы тут сжигать токены хотим, но все таки эффективно :)
Перед первой сессией делаем baseline, снимок всех существующих проблем. Старые баги не считаются. Если агент не может починить проблему за 5 попыток, задача помечается BLOCKED, агент переходит к следующей. При retry ошибки инжектятся прямо в промпт: “VERIFICATION FAILED, attempt 2/5, BLOCKING: tests 2 failed”.
|
Провайдер |
Как работает |
Требует |
|---|---|---|
|
claude-max |
CLI subprocess, Stream-JSON, все нативные инструменты |
Claude Max подписка |
|
claude-api |
Anthropic SDK, agentic loop, 6 инструментов |
API ключ |
|
ollama |
Текстовый стриминг, без tool calling |
Локальный Ollama |
Claude Max основной. И скажу честно, остальные провайдеры находятся в очень сыром состоянии. Не привык просить о помощи, но кого заинтересовала задумка проекта – помогите и приведите в их нормальный вид :) Я не уверен, что справлюсь.
Claude CLI выдаёт NDJSON, парсер в loop.py [6] кладёт в AGENT_LOG_BUFFER, AJAX /api/log забирает каждые 2 секунды, браузер рисует. Метрики идут параллельно: rate_limit_event обновляет sessionmetrics, /api/statusотдаёт их каждые 3 секунды в 6 карточек. Таймер тикает через JavaScript каждую секунду.
Три способа создать задачу. CLI через pca task add. Форма Quick Add на дашборде. Или AI Transform, когда пишешь сырой текст и ИИ разбивает его на структурированные задачи с приоритетами и критериями. Приоритеты меняются через drag-and-drop. Состояния: PENDING, IN PROGRESS, DONE или BLOCKED.
Реальный кейс. epotos-templates это проект для компании, обработка документов + генерация шаблонов. Нужно было добавить переключение провайдеров (с Ollama на DeepSeek). Я записал мысли в свободной форме и запустил A1.
Кстати, недавно написал статью с той же компанией про автоматизацию работы с рекламациями с помощью ИИ: https://habr.com/ru/articles/1011494/ [7]
Открываю дашборд. Страница Tasks пустая:
Вместо того чтобы вручную формулировать задачи, использую AI Transform. Просто пишу сырой текст: “хочу клонировать epotos-templates, посмотреть как настроены провайдеры, добавить блок переключения с llama на deepseek…”
Нажимаю Transform:
Через несколько секунд 5 структурированных задач с описаниями и критериями успеха:
Нажимаю “Add Selected”, задачи созданы с приоритетами #1-#5:
Dashboard. 0/5 задач, IDLE. Нажимаю Start Agent:
Детали первой задачи до начала работы:
Настройки, выбираю claude-api, ввожу API ключ:
В логе появляются строки в реальном времени. THINK, BASH, READ:
Task Detail: 11 tool calls, лог заполняется:
1/5 задач выполнена. Зелёная галочка. Агент автоматически перешёл к следующей:
Агент анализирует кодовую базу, читает ollama.ts, ai-client.ts, грепает localhost:11434:
2/5 задач выполнены, task_016 in progress:
Агент проектирует архитектуру провайдеров:
Пока агент работает, печатаю в форму “Message to Agent”, хочу чтобы он ещё и документацию написал:
Сообщение в очереди, агент прочитает на следующей сессии:
5/5 задач! Агент ещё работает, обрабатывает моё сообщение про документацию:
Верификация пройдена, агент пишет документацию:
Обновляет CLAUDE.md [8], создаёт MEMORY.md [9]:
COMPLETED. 5/5 задач, 12 сессий, 23 файла изменено:
Дашборд работает в обеих темах:
3491 строка чистого Python. Ни React, ни Vue, ни Flask. Стандартныйhttp.server + string.Template. Весь CSS, JavaScript и HTML в одном файле.
|
Страница |
URL |
Что делает |
|---|---|---|
|
Dashboard |
|
6 карточек метрик, Start/Stop, live log, Quick Add |
|
Tasks |
|
Список + drag-and-drop + bulk add + AI Transform |
|
Task Detail |
|
Полный вид + логи + метрики + Start/Stop/Delete |
|
Sessions |
|
История сессий с метриками |
|
Activity Log |
|
Хронология действий |
|
Settings |
|
Провайдер, API ключ, параметры |
|
Commits |
|
Git история с иконками типов |
|
Transform |
|
Сырой текст, AI, задачи |
|
Карточка |
Данные |
|---|---|
|
Tasks |
|
|
Session |
|
|
Tokens |
|
|
Cost |
|
|
Duration |
|
|
Files |
|
Лог стилизован под macOS Terminal. Тёмный фон, моноширинный шрифт, 8 типов иконок (read/edit/write/bash/thinking/text/metric/verify). Обновляется через AJAX каждые 2 секунды.
Полный REST API на 24 endpoints. Можно мониторить из скриптов:
curl http://localhost:7331/api/status | python -m json.tool
curl "http://localhost:7331/api/log?since=0" | python -m json.tool
PocketCoder-A1 работает. 5 задач на реальном проекте за 13 минут автономно. С верификацией, с live-логом, с возможностью отправить сообщение агенту прямо во время работы.
Автономные сессии работают: нажал Start, ушёл, вернулся к результату, а верификация реально ловит врущего агента за руку на трёх уровнях: blocking, warning, anti-loop. Dashboard показывает всё в реальном времени. Queue Message позволяет писать агенту пока он работает.
В разработке: auto-checkpoint при 70% контекста, git integration (ветки + atomic commits), PyPI + uv release.
PocketCoder-A1 это про open source.
GitHub: github.com/Chashchin-Dmitry/pocketcoder-a1 [10]
Буду рад за лайк и подписку на канал :) https://t.me/notes_from_cto [11]
Наш сайт: https://bvmax.ru/ai [12]
Автор: Dmitrii-Chashchin
Источник [13]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/28315
URLs in this post:
[1] мозг: http://www.braintools.ru/parts-of-the-brain
[2] сном: http://www.braintools.ru/article/9809
[3] http://localhost:7331: http://localhost:7331
[4] предыдущего проекта: https://habr.com/ru/articles/991022/
[5] ошибки: http://www.braintools.ru/article/4192
[6] loop.py: http://loop.py
[7] https://habr.com/ru/articles/1011494/: https://habr.com/ru/articles/1011494/
[8] CLAUDE.md: http://CLAUDE.md
[9] MEMORY.md: http://MEMORY.md
[10] github.com/Chashchin-Dmitry/pocketcoder-a1: https://github.com/Chashchin-Dmitry/pocketcoder-a1
[11] https://t.me/notes_from_cto: https://t.me/notes_from_cto
[12] https://bvmax.ru/ai: https://bvmax.ru/ai
[13] Источник: https://habr.com/ru/articles/1019256/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1019256
Нажмите здесь для печати.