ИИ не заменяет людей, люди просто больше работают. Так давайте хотя бы ночью пусть работает ИИ.


Так вышло, что я плачу 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. Звучит просто, но в этой части скрывались самые коварные проблемы.

Claude CLI subprocess: флаги, парсинг, callback
Claude CLI subprocess: флаги, парсинг, callback

Финальный вариант запуска:

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”.

Флаг

Зачем

-p prompt

Неинтерактивный режим

--dangerously-skip-permissions

Автоподтверждение всех tool_use

--no-session-persistence

Не засорять историю сессий

--max-turns 25

Защита от бесконечной работы

--verbose

Обязательно с stream-json + -p

--output-format stream-json

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. Результат только логируется: ruffbuildgit diff.

Уровень 3, ANTI-LOOP. Защита от бесконечного цикла. Мы тут сжигать токены хотим, но все таки эффективно :)
Перед первой сессией делаем baseline, снимок всех существующих проблем. Старые баги не считаются. Если агент не может починить проблему за 5 попыток, задача помечается BLOCKED, агент переходит к следующей. При retry ошибки инжектятся прямо в промпт: “VERIFICATION FAILED, attempt 2/5, BLOCKING: tests 2 failed”.

3.4 Провайдеры

Три провайдера, общий pipeline
Три провайдера, общий pipeline

Провайдер

Как работает

Требует

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…”

Ввод текста в AI Transform
Ввод текста в AI Transform

Нажимаю Transform:

Обработка
Обработка

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

Предпросмотр 5 задач
Предпросмотр 5 задач

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

5 задач созданы
5 задач созданы

Шаг 2: Запуск

Dashboard. 0/5 задач, IDLE. Нажимаю Start Agent:

Dashboard перед стартом
Dashboard перед стартом

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

Детали задачи
Детали задачи

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

Настройки провайдера
Настройки провайдера

Шаг 3: Агент работает

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

Агент работает, live log
Агент работает, live log

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

Детали задачи, агент работает
Детали задачи, агент работает

Шаг 4: Первый результат

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

1 задача выполнена
1 задача выполнена

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

Анализ кодовой базы
Анализ кодовой базы

Шаг 5: Прогресс

2/5 задач выполнены, task_016 in progress:

2 выполнены, 1 в работе
2 выполнены, 1 в работе
Чистый вид
Чистый вид

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

Проектирование архитектуры
Проектирование архитектуры

Шаг 6: Сообщение агенту

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

Набираю сообщение
Набираю сообщение

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

Сообщение отправлено
Сообщение отправлено

Шаг 7: Всё готово

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

5/5 задач, агент ещё работает
5/5 задач, агент ещё работает

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

Верификация + документация
Верификация + документация

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

Пишет документацию
Пишет документацию

Финал

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

COMPLETED
COMPLETED

Светлая тема

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

Задачи, светлая
Задачи, светлая
Dashboard, светлая
Dashboard, светлая
Лог, светлая
Лог, светлая
Детали задачи, светлая
Детали задачи, светлая

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

/tasks

Список + drag-and-drop + bulk add + AI Transform

Task Detail

/task/{id}

Полный вид + логи + метрики + Start/Stop/Delete

Sessions

/sessions

История сессий с метриками

Activity Log

/log

Хронология действий

Settings

/settings

Провайдер, API ключ, параметры

Commits

/commits

Git история с иконками типов

Transform

/transform

Сырой текст, AI, задачи

6 карточек метрик

Карточка

Данные

Tasks

2/5 done + прогресс-бар

Session

#3 + WORKING/IDLE/COMPLETED

Tokens

12.4K in / 3.2K out + прогресс контекста

Cost

$0.08 за сессию

Duration

48s (live timer, тикает каждую секунду)

Files

3 modified

Лог стилизован под 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