<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Dmitrii Razvozzhaev</title><generator>teletype.in</generator><description><![CDATA[Dmitrii Razvozzhaev]]></description><link>https://teletype.in/@el_cortador?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=el_cortador</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/el_cortador?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/el_cortador?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Wed, 23 Sep 2026 22:33:15 GMT</pubDate><lastBuildDate>Wed, 23 Sep 2026 22:33:15 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@el_cortador/vH2tcFBeVyf</guid><link>https://teletype.in/@el_cortador/vH2tcFBeVyf?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=el_cortador</link><comments>https://teletype.in/@el_cortador/vH2tcFBeVyf?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=el_cortador#comments</comments><dc:creator>el_cortador</dc:creator><title>Я собрал отдел из шести AI-джунов и вот что из этого вышло</title><pubDate>Wed, 03 Jun 2026 15:09:34 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/9f/f4/9ff49b93-5df2-483d-8e74-8e8c8e1da67b.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/55/4d/554dc4ae-7dda-4394-be40-aaba668ec06a.png"></img>В этой статье я расскажу, как сделал своих агентов, что получилось хорошо, а что — нет, и почему это делегирование, а не замена «кожаного».]]></description><content:encoded><![CDATA[
  <h2 id="HtuP">Вначале была мысль</h2>
  <p id="f9Rj">Я технический писатель и моя работа — извлекать смысл из хаоса и превращать этот смысл в документацию, которую действительно читают. Под «хаосом» я подразумеваю множество записей созвонов, постановок от аналитиков, Jira-тикетов.</p>
  <p id="EIam">Дело в том, что между «хаосом» и «документацией, которую читают» есть прослойка в виде «механической» работы: например, несколько раз переслушать запись созвона, чтобы не пропустить ключевые нюансы, вручную пройтись по пачке тикетов, чтобы собрать релиз-ноты или побуквенно сверить текст со стайлгайдом.</p>
  <p id="WDIw">Такая рутинная «механика» съедает время, нужное для смысловой работы, и, осознав это, я подумал: «А что, если такую рутину делегировать агентам?» (коллегам, увы, невозможно — я все-таки один техписатель в отделе)</p>
  <p id="Outk">В этой статье я расскажу, как придумал и сделал своих агентов, что получилось хорошо, а что — нет, и почему это делегирование, а не замена «кожаного» специалиста.</p>
  <h2 id="kKlx">От разрозненных агентов к одному мегаинструменту</h2>
  <p id="DmkH">К единой системе агентов я пришел не сразу и сначала у меня появились отдельные наработки в виде нескольких агентов.</p>
  <p id="19EA">Каждый из них жил сам по себе, хранился и настраивался отдельно, запускались они тоже в отдельных командных строках. Со временем меня начало бесить, что приходится запускать несколько командных строк и переключаться между ними, особенно когда задач много.</p>
  <p id="boOG">И я-таки додумался объединить всех агентов в одном месте и весьма вовремя наткнулся на документацию OpenClaw — это стало отправной точкой для сборки своего «отдела AI-джунов».</p>
  <h2 id="sA32">Почему OpenClaw?</h2>
  <p id="nj7J">Здесь было бы логичным спросить меня: <em>«Дима, а почему ты выбрал OpenClaw, а не Hermes? Почему не делал с помощью LangChain/LangGraph?»</em></p>
  <p id="pI2e">Я не проводил сравнительный анализ фреймворков. На одном из мероприятий я услышал, что OpenClaw — это open-source-шлюз между LLM и мессенджерами, которому можно настраивать skills. Это звучало именно так, как мне было нужно, поэтому я решил попробовать.</p>
  <p id="5RTQ">Если хотите почитать о нем подробнее, оставлю здесь ссылку на <a href="https://docs.openclaw.ai" target="_blank">документацию</a>. А если коротко: OpenClaw — это агент, который принимает запросы пользователя в мессенджере, использует инструкции и skills, умеет вызывать внешние инструменты и жить как долгоживущий процесс.</p>
  <p id="6dpr">Связка OpenClaw с Telegram была очевидной: в этом мессенджере я провожу много времени и хотелось, чтобы все агенты жили в одном чатике.</p>
  <h2 id="3INf">Общая схема: Docker, оркестратор и шесть агентов</h2>
  <p id="sn0N">Решение крутится в Docker. Его я выбрал, чтобы изолировать OpenClaw от файловой системы и глобального окружения, а не сидеть и гадать, не решит ли он что-то «оптимизировать» без спроса.</p>
  <p id="zguw">Кодовую часть я собирал в связке с Claude Code: я писал спецификацию, задавал архитектуру, тестировал поведение и принимал решения, а Claude Code занимался кодом агентов и правил ошибки.</p>
  <figure id="S2TL" class="m_retina" data-caption-align="center">
    <img src="https://img2.teletype.in/files/55/4d/554dc4ae-7dda-4394-be40-aaba668ec06a.png" width="512" />
    <figcaption>Вот так это и было</figcaption>
  </figure>
  <p id="XQNz">В моем супер-агенте OpenClaw играет роль оркестратора, а шесть специализированных агентов работают рядом с ним как отдельные FastAPI-приложения.</p>
  <p id="6a7u">Вот они, слева направо, как говорится:</p>
  <ul id="dN2j">
    <li id="APEo"><strong>agent-spec2doc</strong> — превращает постановки от аналитиков в черновик документации;</li>
    <li id="jvdr"><strong>agent-figma</strong> — генерирует черновик руководства пользователя на основе Figma-макетов;</li>
    <li id="zXuf"><strong>agent-release-notes</strong> — собирает release notes по репозиторию или Jira-тикетам;</li>
    <li id="icB9"><strong>agent-api-docs</strong> — делает API-документацию из OpenAPI-спеки;</li>
    <li id="2Jpp"><strong>agent-reviewer</strong> — ревьюит тексты;</li>
    <li id="DTiV"><strong>agent-transcribe</strong> — делает расшифровку видео или аудио.</li>
  </ul>
  <figure id="c3lk" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/7e/ef/7eef9f48-941b-49d2-9dc5-6cff95cae43b.png" width="947" />
    <figcaption>Схема работы</figcaption>
  </figure>
  <p id="Tazd">Эта архитектура появилась в первом коммите проекта — <em>6ff8379 scaffold super-agent with 6 FastAPI services and OpenClaw config</em>. Там же появился <em>docker-compose.yml</em>:</p>
  <pre id="HcAa">services:
  agent-spec2doc:
    build: ./agent-spec2doc
    ports:
      - &quot;8001:8001&quot;
    env_file: .env
    networks:
      - agent-network
    restart: unless-stopped

  agent-figma:
    build: ./agent-figma
    ports:
      - &quot;8002:8002&quot;
    env_file: .env
    networks:
      - agent-network
    restart: unless-stopped

  agent-transcribe:
    build: ./agent-transcribe
    ports:
      - &quot;8003:8003&quot;
    env_file: .env
    networks:
      - agent-network
    restart: unless-stopped

  agent-release-notes:
    build: ./agent-release-notes
    ports:
      - &quot;8004:8004&quot;
    env_file: .env
    networks:
      - agent-network
    restart: unless-stopped

  agent-api-docs:
    build: ./agent-api-docs
    ports:
      - &quot;8005:8005&quot;
    env_file: .env
    networks:
      - agent-network
    restart: unless-stopped

  agent-reviewer:
    build: ./agent-reviewer
    ports:
      - &quot;8006:8006&quot;
    env_file: .env
    networks:
      - agent-network
    restart: unless-stopped

  openclaw:
    image: ghcr.io/openclaw/openclaw:latest
    volumes:
      - ./openclaw:/home/node/.openclaw
    env_file: .env
    networks:
      - agent-network
    restart: unless-stopped
    depends_on:
      - agent-spec2doc
      - agent-figma
      - agent-transcribe
      - agent-release-notes
      - agent-api-docs
      - agent-reviewer</pre>
  <p id="XZCM">Отмечу, что перечисленные агенты являются агентами по роли, но технически это обычные HTTP-сервисы, а не внутренние субагенты OpenClaw. Об этом пришлось прямо упомянуть в инструкциях оркестратору: вызывать их через curl, использовать имена из docker compose, не ходить через localhost в контейнере и не запускать дополнительных сессий.</p>
  <p id="P41V">Архитектура агентов держится не только на docker compose, но и на четко установленных границах роли оркестратора. Если не объяснить модели, что она только перенаправляет запросы, она начинает искать «творческие способы помочь» (об этом я расскажу далее).</p>
  <p id="Dk4X"><strong>Промптинг OpenClaw и агентов</strong></p>
  <p id="0My9">Еще одна немаловажная часть работы — это инструкции. В OpenClaw поведение оркестратора и отдельных сценариев задается обычными Markdown-файлами: <em>AGENTS.md, SOUL.md, USER.md</em>, а также файлами <em>skills</em> вроде <em>workspace/skills/release-notes/SKILL.md</em> или <em>workspace/skills/spec2doc/SKILL.md</em>.</p>
  <p id="0s0W">В моем случае эти инструкции можно разделить на два уровня.</p>
  <p id="2jHs"><strong>1. Общие правила оркестратора.</strong> Они лежат в <em>AGENTS.md</em> и говорят, как классифицировать входящее сообщение, какие есть агенты, по каким URL их вызывать, что делать с ошибками, чего нельзя показывать пользователю и т.д. </p>
  <p id="8WUx"><strong>2. Skills под конкретные задачи.</strong> Например, <strong>agent-release-notes</strong> знает, что Jira-ссылки нужно передавать только в <em>/generate-jira</em>, <strong>agent-transcribe</strong> — что конвертация видео в текст может занимать несколько минут, а <strong>agent-spec2doc</strong> — что нельзя писать документацию самостоятельно вместо агента.</p>
  <p id="k3Tb">Промптинг здесь похож не на литературное «будь полезным», а на инструкцию диспетчеру:</p>
  <pre id="1HXh">- классифицируй запрос;
- выбери одного агента;
- вызови его через HTTP;
- дождись результата;
- верни результат как есть;
- не переписывай, не суммаризируй, не запускай второй процесс.</pre>
  <p id="zE8k">Вышеперечисленные файлы стали не менее важной частью системы, чем программный код агентов. Код обрабатывает данные, а инструкции удерживают оркестратор в нужной роли.</p>
  <h2 id="denl"><strong>agent-r</strong>elease-notes: разбираем в деталях</h2>
  <p id="g5jf"><strong>agent-release-notes</strong> оказался самым полезным агентом из шести, т.к. работает безотказно и предсказуемо, а также экономит время.</p>
  <p id="yqrA">Агент работает в двух режимах.</p>
  <p id="MCO5"><strong>1. История коммитов</strong>. Агент получает ссылку на репозиторий и промежуток, за который нужно собрать релиз-ноты. Затем он забирает коммиты, нормализует их и формирует release notes/changelog.</p>
  <p id="UfTf"><strong>2. Jira-задачи</strong>. Агент получает пачку ссылок на задачи, идет в Jira API, забирает <em>summary, description, тип задачи, статус, компоненты и fix version</em> и собирает текст release notes/changelog.</p>
  <p id="GGdH"><strong>Пример запроса:</strong></p>
  <pre id="qPb8">Сделай release notes по задачам:
https://jira.example.com/browse/PROJ-1201
https://jira.example.com/browse/PROJ-1198
https://jira.example.com/browse/PROJ-1187

ИЛИ

Сделай release notes по этому репозиторию [ссылка на репозиторий] за период с ДД.ММ.ГГГГ по ДД.ММ.ГГГГ.</pre>
  <p id="96o5">На выходе получается подробный release notes с описанием новых фич, улучшений и багфиксов:</p>
  <figure id="Yo7g" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/2d/d7/2dd75d9e-2e25-42e5-bddc-d0236951b163.png" width="496" />
    <figcaption>Ну красота же ж!</figcaption>
  </figure>
  <p id="FaIF">В первом варианте GitHub-запрос был низкоуровневым: <em>owner, repo, since, branch</em>. Оркестратор должен был сам разобрать сообщение пользователя и разложить его по полям. Позже, в коммите <em>9a55ac4 feat(agents): refine orchestrator workflows</em>, я приблизил контракт к реальному пользовательскому вводу: API агента стал принимать <em>repository, date_from, date_to,</em> а разбор URL и дат переехал в код.</p>
  <p id="EqrP">Первая версия агента могла возвращать сразу и release notes, и changelog (причем на английском), даже если я просил что-то одно, поэтому пришлось внести фикс в схему: в ней появился <em>output_type</em> со значениями <em>release_notes</em> или <em>changelog</em>. Теперь формат выбирает не настроение модели, а параметр запроса.</p>
  <p id="WbvJ">С Jira была отдельная история. Чтобы агент не передавал гигантский HTML и не забивал контекст, чтение тикетов вынесено в код: агент ходит в <em>/rest/api/3/issue/{KEY}</em> и забирает только нужные поля.</p>
  <pre id="ANPb">resp = requests.get(
    f&quot;{base_url}/rest/api/3/issue/{key}&quot;,
    auth=self._auth,
    params={
        &quot;fields&quot;: &quot;summary,issuetype,status,description,labels,components,fixVersions&quot;
    },
    timeout=REQUEST_TIMEOUT,
)</pre>
  <p id="tBNz">Кроме того, в инструкции оркестратора это закреплено как правило: Jira-ссылки нельзя открывать через браузер или web-fetch, а передавать в release-notes их нужно только через <em>/generate-jira</em>.</p>
  <pre id="OhSl">- For Jira issue URLs, never use &#x60;web_fetch&#x60;, &#x60;web_search&#x60;, browser tools, or direct page scraping.
- Jira URLs must be passed only to &#x60;agent-release-notes&#x60; via &#x60;/generate-jira&#x60;.</pre>
  <p id="0gyT"><strong>Вывод:</strong> LLM хорошо упаковывает смысл, но плохо подходит для всей механики вокруг задачи. URL, даты, форматы, API-ошибки и HTML-страницы лучше отдавать обычному коду.</p>
  <h2 id="Phlz">agent-figma и agent-transcribe: ожидание не совпало с реальностью</h2>
  <p id="bA1g">Конечно, не все было идеально (ну, а как иначе...) и два следующих агента показали, что если что-то работает локально, то не факт, что заработает в Docker.</p>
  <h3 id="BFqb">agent-figma: осторожно, <s>двери закрываются</s> Docker закрывается</h3>
  <p id="ww6V">Этот агент переродился из агента, которого я представлял в этом году в своем докладе на Techwriter Days 3. Тот агент работал так: получал ссылку на Figma-макет, шел в Figma REST API, получал структуру слоев и генерировал черновик руководства пользователя.</p>
  <p id="eFp3">Я попробовал перенести его в Docker и тут начался сущий кошмар. Как можно увидеть из истории проекта, в коммите <em>380cd3f fix(figma): handle API access limitations with fallback</em>: в сообщении прямо указано, что Figma API из Docker блокировался CloudFront с ошибкой 403.</p>
  <p id="41oa">Я попробовал сделать клиент аккуратнее: сначала запрос без токена для публичных файлов, потом повтор с токеном, отдельная обработка 401, 403, 404 и 429. После многих бесплодных попыток я плюнул и сделал вывод: «Не работает Figma API из контейнера? Да и Huyndai с ним!».</p>
  <figure id="DoZK" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/f8/eb/f8eb26bd-c5fd-4f06-90b5-1b5638cf9df3.png" width="433" />
    <figcaption>А так все красиво представлялось...</figcaption>
  </figure>
  <p id="CMFy">В итоге пользовательский путь стал таким: агент получает PNG/JPEG-вариант макета, а агент по нему составляет черновик. Да, топорно и не так элегантно, зато отпадает зависимость от CloudFront и лимитов Figma REST API (а то, честно говоря, раздражало ловить ошибку 429 после пятой генерации).</p>
  <figure id="v0w4" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/14/c8/14c8dac2-d450-46c7-ab86-4186812d11a4.png" width="794" />
    <figcaption>Уот так уот</figcaption>
  </figure>
  <p id="1yxx">Дополнительно в skill для Figma я вынес правило, что если агенту пришла ссылка <em>figma.com/...</em>, то нужно попросить скриншот, а не вызывать <strong>agent-figma</strong>.</p>
  <pre id="aRjm">Если пользователь прислал ссылку &#x60;figma.com/...&#x60;, не вызывай &#x60;agent-figma&#x60;.
Ответь:
&#x60;Figma-ссылки сейчас не разбираю напрямую. Пришли скриншот нужного экрана или фрейма — я составлю user guide по изображению.&#x60;</pre>
  <p id="fDk2">Проще говоря, лучше устойчивый сценарий с небольшими «телодвижениями», чем красивый, но нерабочий.</p>
  <h3 id="9n70">agent-transcribe: размеры, форматы и болтливый оркестратор</h3>
  <p id="5OIQ">В случае с этим агентом все уперлось в более приземленные ограничения.</p>
  <p id="4SFo">Первое — размер. Telegram API не пропускает большие файлы и никаким промптом это не починить. Второе — формат. В моем сценарии MOV-файлы не проходили, поэтому приходилось переконвертировать видео в поддерживаемый формат.</p>
  <figure id="qHkp" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/f8/d5/f8d5a63b-dd7d-4213-ba4b-ea314b0656a9.png" width="439" />
    <figcaption>Если долго мучиться...</figcaption>
  </figure>
  <figure id="eRM7" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/cc/70/cc7017f3-be49-499a-8f9b-1e3b7564cb18.png" width="413" />
    <figcaption>...то фигня получится</figcaption>
  </figure>
  <p id="SMWN">Позже в коммите <em>d5f2602 feat(agents): add media link transcription</em> для больших файлов появился обходной путь: я добавил эндпоинт <em>/transcribe/url</em>. За счет этого можно было отправлять публичную ссылку на медиафайл, а агент ее сам скачивает, конвертирует, распознает в текст, обрабатывает и выдает пересказ видео.</p>
  <p id="EOmL">В коде также появилась нормализация Google Drive-ссылок и проверка размера не только по <em>content-length</em>, но и по фактически скачанным байтам. Это как раз та механика, которую лучше держать в коде, а не объяснять модели словами.</p>
  <p id="42pl">Еще один прикол выкинул оркестратор. Пока <strong>agent-transcribe</strong> работал над медиафайлом, OpenClaw начинал присылать в Telegram промежуточные статусы <em>Sifting...</em>, <em>Process: fast-shell</em>, <em>Process: young-forest</em>. Выглядело как лишний шум и заставляло психовать от обилия сообщений.</p>
  <figure id="apPV" class="m_retina" data-caption-align="center">
    <img src="https://img4.teletype.in/files/f0/11/f011ce29-b186-42cb-a505-7c66190fe7dc.jpeg" width="288" />
    <figcaption>ааааааааа</figcaption>
  </figure>
  <figure id="bqYw" class="m_retina" data-caption-align="center">
    <img src="https://img1.teletype.in/files/05/2c/052c967f-5d78-47ac-973e-ee062c500c5c.jpeg" width="288" />
    <figcaption>АААААААААААААА</figcaption>
  </figure>
  <p id="Q1Lj">Вылечился этот «недуг» изменением конфигурации OpenClaw и инструкций оркестратора. Я отключил потоковые статусы и уведомления о завершении команд, а в инструкциях отдельно прописал, что при распознавании нужно ждать до 900 секунд, не запускать повторный запрос, не говорить, что процесс не завершился, пока агент сам не вернет ошибку:</p>
  <pre id="HFiY">- Таймаут для &#x60;/transcribe&#x60; и &#x60;/transcribe/url&#x60; — не меньше 900 секунд.
- Если &#x60;exec&#x60; вернул активную process-сессию, продолжай ждать эту же сессию.
- Не запускай повторный запрос, пока первый еще выполняется.
- Не называй процесс упавшим, пока команда или агент реально не вернули ошибку.</pre>
  <h2 id="Ie23">Еще немного про поехавший оркестратор</h2>
  <p id="tXrt">С <strong>agent-spec2doc</strong> тоже произошла забавная история. Первое время агент иногда возвращал пустой ответ по непонятным причинам. Оркестратор видел, что задача вроде бы не выполнена, писал в чат что-то в духе «агент не отвечает, сделаю работу за него» и начинал генерировать документацию самостоятельно.</p>
  <figure id="Up3E" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/25/b5/25b5d6d9-e918-4257-963d-46dc0ebecd66.png" width="1004" />
    <figcaption>Инициативный какой!</figcaption>
  </figure>
  <p id="AxVD">Как уже и говорилось выше, оркестратор должен оркестрировать, а агенты — выполнять запросы. Если оркестратор начнет подхватывать чужую работу, то выйдет черт-те что.</p>
  <p id="fzw5">Поэтому я внес фикс <em>5676d00 fix(agents): harden documentation workflows. </em>До него <strong>agent-spec2doc</strong> мог вернуть пустую строку как будто это нормальный результат:</p>
  <pre id="c4K3">return response.choices[0].message.content or &quot;&quot;</pre>
  <p id="jzFE">После фикса пустой ответ стал ошибкой:</p>
  <pre id="GG6X">content = (response.choices[0].message.content or &quot;&quot;).strip()
if not content:
    raise GenerationError(&quot;LLM вернул пустой черновик документации&quot;)</pre>
  <p id="bfr5">Одновременно в инструкциях появился прямой запрет на составление черновика вместо <strong>agent-spec2doc</strong>:</p>
  <pre id="GeuL">- Service &#x60;result&#x60; must be returned exactly as provided: no prefixes, no commentary, no bullet conversion, no summarizing.
- If a service returns &#x60;result&#x60;, send exactly that &#x60;result&#x60; to the user without rewriting, evaluating, or adding commentary.
- If a service returns &#x60;error&#x60;, reply in Russian with a short &quot;service error&quot; message and include the error text.
- If &#x60;result&#x60; is empty and &#x60;error&#x60; is empty, reply in Russian that the service returned an empty result and ask the user to repeat the request or send the source material again.</pre>
  <p id="QS8A">Позже это правило было перенесено на всех агентов: если агент вернул <em>result</em>, оркестратор должен вернуть именно <em>result</em>, без префиксов, комментариев, пересказа и «улучшений». А если процесс еще выполняется — ждать, а не отправлять пользователю промежуточные статусы.</p>
  <p id="2RAt">Короче говоря, промптинг в некоторых случаях — по-прежнему наше все. Оркестратору мало сказать «перенаправляй запросы», нужно ж еще прописать, чего не стоит делать, когда агент молчит или возвращает пустой ответ.</p>
  <h2 id="1j2U">Еще два агента: api-docs и reviewer</h2>
  <p id="kGko">Про <strong>agent-spec2doc</strong> и <strong>agent-figma</strong> я уже рассказал выше, поэтому здесь коротко остановлюсь на двух оставшихся агентах, которые закрывают более точечные задачи.</p>
  <p id="r66G"><strong>agent-spec2doc</strong> я создавал для ситуаций, когда вместо нормальной документации на руках есть только OpenAPI-спецификация в YAML или JSON. Формально это уже «документация», но на практике читать такую спеку как пользовательский материал неудобно: много служебных полей, схем, параметров, кодов ответа, но мало нормального объяснения.</p>
  <p id="sUSz">Агент принимает OpenAPI-файл, разбирает эндпоинты и возвращает более человекочитаемый черновик: назначение метода, параметры запроса, тело, ответы, ошибки и примеры. Это не заменяет полноценную API-документацию, но хорошо закрывает первый проход: вместо пустого листа уже есть структура, которую можно проверить, уточнить и привести к стилю проекта.</p>
  <figure id="QKxa" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/b6/de/b6debc2c-b76f-49fe-9119-04f357055120.png" width="671" />
    <figcaption>Типа API-дока</figcaption>
  </figure>
  <p id="XPDV"><strong>agent-reviewer</strong> — это «проверятор», который сверяет текст со стайлгайдом и возвращает список замечаний.</p>
  <p id="15iB">Сценарий такой: сначала агенту нужно скормить стайлгайд, потом ему можно отправлять текст, а он возвращает замечания и рекомендации по исправлению.</p>
  <p id="6inJ">Собственно, вот как это выглядит:</p>
  <figure id="yBML" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/0e/07/0e07d332-735d-4ee0-8e46-f950ad794c29.png" width="487" />
    <figcaption>Типа ревью</figcaption>
  </figure>
  <p id="yYeq">Причем стайлгайд не нужно передавать при каждом ревью, он загружается один раз и хранится в памяти.</p>
  <p id="WJsw">Этот ревьюер хорош для первого прохода по формальным правилам. Но финальное решение все равно остается за автором (то бишь мной): иногда стайлгайд нужно применить строго, а иногда осознанно отступить от него ради смысла или читаемости.</p>
  <h2 id="uVxn">Делегирование и замена. В чем разница?</h2>
  <p id="Qmvh">Дабы упредить возможные упреки вроде <em>«Из-за тебя скоро нас, техписателей, заменят на ИИ-шницу»</em>, подчеркну: это не замена, а делегирование. И вот в чем разница:</p>
  <p id="lGZo"><strong>Замена</strong> — это когда ИИ делает все работы по документации, от сбора знаний до финального результата, а специалист превращается в «технического читателя»: видит, что выдала машина, и все. В итоге смысл утерян, ответственность размыта и ничего хорошего из этого не будет.</p>
  <p id="AiFC"><strong>Делегирование</strong> — это когда механическую работу делает ИИ, а смысловую — специалист. Агент разбирает артефакты, готовит черновики и делает за несколько минут то, что вручную заняло бы полчаса-час. Специалист получает черновик, проверяет галлюцинации, принимает финальное решение и несет ответственность за результат целиком.</p>
  <p id="xzHZ">Ключевое слово здесь — «ответственность», которую целиком и полностью несу я. Именно поэтому все, что выдает агент — это всегда черновик, а не финальный документ.</p>
  <h2 id="ZUEm">Бэклог: что планирую доделать</h2>
  <p id="2Ndh">Сейчас проект находится в состоянии <s>«работает — не трожь»</s> «работает, но есть куда расти». И вот в какие стороны планируется расти:</p>
  <ul id="qdxP">
    <li id="KILQ">реализовать хранение контекста предыдущих задач, чтобы заново не объяснять одно и то же (дополнительно подключал внешний OpenClaw-скилл self-improving-agent, но пока что не увидел от него существенной пользы);</li>
    <li id="KOsv">довести до ума сценарий, когда бот долго молчит во время работы и пишет только финальный результат;</li>
    <li id="y6rr">прикрутить версионирование промптов, чтобы откатываться к рабочим версиям промптов, если вдруг что-то ломается;</li>
    <li id="ecx1">встроить автоматическую проверку результата другой LLM перед тем, как черновик попадет ко мне;</li>
    <li id="ij6v">унифицировать промпты по агентам и оркестратору, т.к. сейчас часть из них на русском, часть — на английском;</li>
    <li id="yjEN">возможно, вынесу все на сервер для доступа 24/7, но вопрос пока открытый, т.к. с одной стороны, хочется автономности, а с другой, вроде бы и нет смысла платить за сервер, если агентом пользуюсь в основном в рабочее время.</li>
  </ul>
  <p id="fGct">Надеюсь, статья вам понравилась. Если у вас есть опыт с похожими решениями или идеи по любому из этих пунктов — пишите в комментарии или личные сообщения.</p>

]]></content:encoded></item></channel></rss>