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

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

Тогда я решил написать своё. Идея простая: написал задачи, ушёл гулять или спать, вернулся с результатом. Агент работает сессиями, сохраняет состояние, берёт следующую задачу сам. После каждой сессии запускается реальная проверка: pytest, py_compile, проверка файлов на диске. Веб-дашборд показывает что происходит в реальном времени. Основной провайдер Claude Max, плюс Claude API и Ollama как экспериментальные.
Сделан прежде всего для себя. Я реально этим уже пользуюсь, но выложил в open source, вдруг кому-то тоже пригодится.
2. Что такое PocketCoder-A1
Расшифрую странную букву A в названии. Это Authonomous, ну то есть автономный. А 1, как первая версия. Вдруг зайдет , а надо будет писать обновления.
CLI + веб-дашборд. Установка:
pip install pocketcoder-a1
Инициализация на любом проекте:
pca init /path/to/your-project pca ui
Открывается дашборд на http://localhost:7331. Добавляешь задачи, нажимаешь Start Agent, агент работает автономно.
Отличие от PocketCoder v1 (моего предыдущего проекта): v1 это CLI-агент для локальных моделей, интерактивный. A1 это автономный менеджер задач + исполнитель. Нажал кнопку, ушёл. Совсем другой продукт. Мб в будущем подумаю, как его поженить с ним.
И да, скоро обнова выйдет на обычный Pocketcoder!
3. Архитектура
Весь проект это 15 Python-модулей. Ни одного фреймворка. HTTP-сервер на стандартном http.server, JSON это стандартный json, файлы через pathlib. Единственные внешние зависимости это playwright для E2E тестов и опционально anthropic / ollama для альтернативных провайдеров.
3.1 Общая схема
Вот как работает система целиком, от pca start до завершения:

Агент запускается, захватывает baseline (снимок валидации ДО работы), собирает промпт, работает через Claude CLI, парсит результат в реальном времени, верифицирует. Если всё ок, принимает результат. Если нет, инжектит ошибки в следующую сессию и пытается снова. Разберём каждый кусок.
3.2 Claude CLI как subprocess
Ядро системы это запуск 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 типов иконок.
3.3 Верификация: “Не верим на слово”
Самая важная часть системы. Пока тестировал, агент раньше времени писал 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”.
3.4 Провайдеры

Провайдер | Как работает | Требует |
|---|---|---|
claude-max | CLI subprocess, Stream-JSON, все нативные инструменты | Claude Max подписка |
claude-api | Anthropic SDK, agentic loop, 6 инструментов | API ключ |
ollama | Текстовый стриминг, без tool calling | Локальный Ollama |
Claude Max основной. И скажу честно, остальные провайдеры находятся в очень сыром состоянии. Не привык просить о помощи, но кого заинтересовала задумка проекта - помогите и приведите в их нормальный вид :) Я не уверен, что справлюсь.
3.5 Real-time поток данных

Claude CLI выдаёт NDJSON, парсер в loop.py кладёт в AGENT_LOG_BUFFER, AJAX /api/log забирает каждые 2 секунды, браузер рисует. Метрики идут параллельно: rate_limit_event обновляет sessionmetrics, /api/statusотдаёт их каждые 3 секунды в 6 карточек. Таймер тикает через JavaScript каждую секунду.
3.6 Жизненный цикл задачи

Три способа создать задачу. CLI через pca task add. Форма Quick Add на дашборде. Или AI Transform, когда пишешь сырой текст и ИИ разбивает его на структурированные задачи с приоритетами и критериями. Приоритеты меняются через drag-and-drop. Состояния: PENDING, IN PROGRESS, DONE или BLOCKED.
4. Кейс: epotos-templates
Реальный кейс. epotos-templates это проект для компании, обработка документов + генерация шаблонов. Нужно было добавить переключение провайдеров (с Ollama на DeepSeek). Я записал мысли в свободной форме и запустил A1.
Кстати, недавно написал статью с той же компанией про автоматизацию работы с рекламациями с помощью ИИ: https://habr.com/ru/articles/1011494/
Шаг 1: Пустая страница, 5 задач за 30 секунд
Открываю дашборд. Страница Tasks пустая:

Вместо того чтобы вручную формулировать задачи, использую AI Transform. Просто пишу сырой текст: “хочу клонировать epotos-templates, посмотреть как настроены провайдеры, добавить блок переключения с llama на deepseek…”

Нажимаю Transform:

Через несколько секунд 5 структурированных задач с описаниями и критериями успеха:

Нажимаю “Add Selected”, задачи созданы с приоритетами #1-#5:

Шаг 2: Запуск
Dashboard. 0/5 задач, IDLE. Нажимаю Start Agent:

Детали первой задачи до начала работы:

Настройки, выбираю claude-api, ввожу API ключ:

Шаг 3: Агент работает
В логе появляются строки в реальном времени. THINK, BASH, READ:

Task Detail: 11 tool calls, лог заполняется:

Шаг 4: Первый результат
1/5 задач выполнена. Зелёная галочка. Агент автоматически перешёл к следующей:

Агент анализирует кодовую базу, читает ollama.ts, ai-client.ts, грепает localhost:11434:

Шаг 5: Прогресс
2/5 задач выполнены, task_016 in progress:


Агент проектирует архитектуру провайдеров:

Шаг 6: Сообщение агенту
Пока агент работает, печатаю в форму “Message to Agent”, хочу чтобы он ещё и документацию написал:

Сообщение в очереди, агент прочитает на следующей сессии:

Шаг 7: Всё готово
5/5 задач! Агент ещё работает, обрабатывает моё сообщение про документацию:

Верификация пройдена, агент пишет документацию:

Обновляет CLAUDE.md, создаёт MEMORY.md:

Финал
COMPLETED. 5/5 задач, 12 сессий, 23 файла изменено:

Светлая тема
Дашборд работает в обеих темах:




5. Dashboard
3491 строка чистого Python. Ни React, ни Vue, ни Flask. Стандартныйhttp.server + string.Template. Весь CSS, JavaScript и HTML в одном файле.
8 страниц
Страница | 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, задачи |
6 карточек метрик
Карточка | Данные |
|---|---|
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
6. Выводы и что дальше
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
Буду рад за лайк и подписку на канал :) https://t.me/notes_from_cto
Наш сайт: https://bvmax.ru/ai
