Урок 0005 · Деплой агентов и долгоживущие harness
Как выкатывать агентов в прод и почему compaction не спасает долгие задачи.
Цель урока
Назвать порядок выката (v0 workflow → canary) и нарисовать initializer + coding agent для долгих задач.
1. Агент ли это вообще?
OpenAI: агент = LLM управляет workflow + тулы + guardrails. Не агент: одноразовый чат, классификатор, сентимент.
Строить агента, только если: сложные решения/исключения, правила уже неподдерживаемые, куча неструктуры. Иначе — детерминированный граф.
Источник: OpenAI Practical Guide (PDF).
2. Порядок выката: 8 шагов
- v0 = workflow. Router → RAG / tool / human. Не свободный loop.
- Прототип на сильной модели → baseline eval → подменять дешёвой, где не падает.
- Тулы по типам: data / action / orchestration. Action на деньги — HITL + ретраи + kill switch.
- Guardrails параллельно с генерацией (optimistic execution), fail closed.
- Полный лог: request_id, prompt_version, tool_calls, chunk_ids, tokens, $.
- Canary 5–10% трафика + первичная метрика + гарды + rollback. Промпт — как код: версия, дифф, откат.
- Долгие задачи — очередь и job_id, не в HTTP-запросе.
- Long-running — не полагайся на compaction (см. ниже).
3. Технические детали
- Явный цикл (
while с tool_call) или SDK: OpenAI Agents (Agent/Runner/guardrails/handoffs/sessions), Claude Agent SDK.
- Stateless HTTP + внешний стор диалога (Redis/DB). Не держать 200 ходов в RAM воркера.
- Идемпотентность action-тулов:
idempotency_key. Повтор сети ≠ двойное списание.
- Sandbox для кода/браузера (OpenAI sandbox agents / контейнер), не тот же под, что API банка.
- Secrets — не в промпт. Vendor: no-train + регион; иначе контур.
- Версионируй одним
config_version: prompt, tool schema, index, model id.
4. Долгоживущие агенты: почему compaction недостаточно
Проблема: каждая новая сессия начинается без памяти. Compaction (сжатие контекста) теряет детали, не даёт точки отката и «пересказывает пересказ».
Даже Opus 4.5 на Agent SDK проваливает «собери клон claude.ai», если дать только общий промпт.
Два фейла: one-shot (вылет из контекста на середине) и ложное завершение («что-то уже сделано»).
5. Решение: initializer + coding agent
Initializer (первая сессия) пишет:
init.sh — запуск dev-окружения;
claude-progress.txt — журнал работ;
features.json — список фич со статусами passes;
- начальный git commit.
Coding agent (каждая следующая сессия):
- Читает git log + progress + features.json.
- Запускает
init.sh, проверяет, что всё живо.
- Берёт ОДНУ незакрытую фичу.
- Делает, тестирует как человек, только потом
passes: true.
- Коммитит и обновляет progress.
Почему JSON, а не Markdown для списка фич: модель реже ломает JSON.
Ключевое правило: оставляй окружение в чистом состоянии — следующий агент продолжает без разбора завалов.
Источник: Anthropic — Effective harnesses.
6. Память: три уровня
- Sessions (OpenAI Agents SDK) — персистентный контекст между запусками.
- Filesystem — субагенты пишут артефакты, lead получает ссылку. Лечит «game of telephone».
- MemGPT (paper) — контекст как виртуальная память с paging между контекстом и хранилищем.
Проверь себя
Что делает initializer agent?
Почему features.json, а не .md?
Идемпотентность тула нужна, чтобы?