О себе Портфолио Кейсы Услуги Блог Контакт 🎙 Поговорить с AI
EN DE RU
🎙 Поговорить с AI
September 15, 2026 · 3 min read

Открытый стандарт для координации AI-агентов: как Cotal решает проблему совместной работы агентов в проде

Я — Denis Shokhirev, архитектор агентных AI-систем из Фрайбурга, Германия. В DennisCraft AI Studio я внедряю агентные решения для B2B-клиентов из DACH: логистика, финтех, промышленная автоматизация. В проде работаю на стеке Claude, Supabase, n8n, Doppler, self-hosted Postgres. Недавно словил баг: два LLM-агента спорили за доступ к очереди задач — один из них завис, второй зациклился. В демо такого не поймать, но в проде это сразу тормозит бизнес-процесс. Почему координация агентов — это не игр

Denis Shokhirev
Denis Shokhirev
Agentic AI Systems Architect
Telegram LinkedIn

Я — Denis Shokhirev, архитектор агентных AI-систем из Фрайбурга, Германия. В DennisCraft AI Studio я внедряю агентные решения для B2B-клиентов из DACH: логистика, финтех, промышленная автоматизация. В проде работаю на стеке Claude, Supabase, n8n, Doppler, self-hosted Postgres. Недавно словил баг: два LLM-агента спорили за доступ к очереди задач — один из них завис, второй зациклился. В демо такого не поймать, но в проде это сразу тормозит бизнес-процесс.

Почему координация агентов — это не игрушка

Когда запускаешь не одного, а целую команду AI-агентов, проблемы начинаются не на этапе prompt engineering, а на уровне синхронизации действий и обмена состояниями. В демках часто все ок — агенты болтают через memory, но в реальных задачах это приводит к гонкам, рассинхронизации, потере идемпотентности. На практике:

  • LLM-агенты параллельно берут один и тот же task из Supabase, оба отправляют запросы — дублируют работу.
  • Логика очереди на n8n ломается при одновременных транзакциях.
  • Один агент теряет контекст, другой не обновляет статус — возникает deadlock.

Банальные mutex-замки тут не помогают: агенты — распределённые сущности, часто работают через API, могут быть написаны на разных языках, а LLM вообще не гарантирует стабильность output. Нужен стандарт обмена — как раз то, что предлагает Cotal.

Что такое Cotal и зачем он нужен в проде

Cotal — это открытый протокол описания взаимодействия AI-агентов, ориентированный на production-сценарии. Его задача — формализовать, как агенты обмениваются задачами, статусами, результатами, чтобы минимизировать баги на стыке коммуникаций. В отличие от ad-hoc JSON/REST контрактов, Cotal задаёт явную схему:

  • Описание типов задач и допустимых статусов
  • Явные триггеры переходов между состояниями
  • Событийная модель обмена (event-driven, а не polling)
  • Возможность аудита действий каждого агента

Это не библиотека, а спецификация. Пример схемы задачи на Cotal:


task:
  id: "invoice_456"
  type: "payment_processing"
  status: "awaiting_review"
  assigned_agent: "claude-ops-3"
  allowed_transitions:
    - "awaiting_review" → "approved"
    - "awaiting_review" → "rejected"
events:
  - type: "status_changed"
    timestamp: "2026-09-15T09:23:00Z"
    agent: "claude-ops-3"
    from: "awaiting_review"
    to: "approved"

В результате каждый агент чётко знает, что он может делать, а что нет, и что произойдёт при смене статуса.

Реализация Cotal в стеке: Claude, n8n, Supabase, Postgres

В моих прод-сценариях Cotal-совместимую логику удобно реализовать через Supabase (как storage+auth), n8n (workflow), Postgres (источник правды) и Claude (LLM-агенты). Основная задача — обеспечить атомарность транзакций и аудит событий. Схема взаимодействия:

КомпонентРольКритичный баг без Cotal
ClaudeLLM-агент, выполняет задачиДублирует исполнение одной задачи
SupabaseХранилище задач и статусовПотеря идемпотентности, гонки
n8nОркестрация событий и триггеровНепредсказуемый порядок вызова
PostgresЖурнал событий, источник правдыНеотслеженные переходы статусов

Пример атомарного обновления статуса задачи в Postgres:


import psycopg2
from psycopg2.extras import RealDictCursor

def update_task_status(task_id, new_status, agent_id):
    with psycopg2.connect(...) as conn:
        with conn.cursor(cursor_factory=RealDictCursor) as cur:
            cur.execute("SELECT status FROM tasks WHERE id=%s FOR UPDATE", (task_id,))
            row = cur.fetchone()
            if row["status"] != "awaiting_review":
                raise Exception("Invalid status transition")
            cur.execute("UPDATE tasks SET status=%s WHERE id=%s", (new_status, task_id))
            cur.execute(
                "INSERT INTO events (task_id, agent, action) VALUES (%s, %s, %s)",
                (task_id, agent_id, f"{row['status']}→{new_status}")
            )
        conn.commit()

Этот паттерн позволяет избежать классических гонок: если статус не тот — ошибка, переход невозможен.

Плюсы Cotal для production AI

  • Снимает хаос в коммуникациях: агенты не спорят за задачи, а действуют по схеме
  • Легко заводить аудит: кто что делал, когда и почему
  • Миграция между агентами (Claude ↔ OpenAI) не требует переписывать всё взаимодействие
  • Упрощает compliance: аудит trail и формализованные статусы — must-have для финтеха/логистики

Согласно отчету Anthropic (2024, Anthropic docs), риски LLM-агентов в production связаны именно с неявными контрактами и неатомарными действиями. Cotal решает эти проблемы на уровне схемы.

Типовые проблемы внедрения и решения

  • LLM-agent "забыл" обновить статус — добавляю post-processing check на n8n, который ловит несоответствия
  • Агент генерирует невалидный output — валидирую schema через JSON Schema до записи в Supabase
  • Ограничение по скорости — перехожу с polling на event-driven пайплайн (n8n поддерживает)

В проде эти паттерны сокращают ручной разбор инцидентов минимум в 2 раза — по личной статистике за последние 5 запусков.

FAQ

Можно ли внедрять Cotal без миграции всех агентов?

Да, стандарт совместим с поэтапной интеграцией. Можно обернуть существующих агентов через adapter.

Зачем нужен event-driven, если есть polling?

Polling повышает нагрузку и увеличивает вероятность гонок. Event-driven модель решает эти проблемы и ускоряет реакцию.

Работает ли Cotal только с Claude/OpenAI?

Нет, стандарт описывает взаимодействие на уровне схемы, не завязан на конкретный LLM.

Что делать с legacy пайплайнами?

Можно внедрять Cotal только на критичных участках, где нужны строгие статусы и аудит.

Нужно ли менять базу данных?

Нет, Cotal работает поверх существующих хранилищ, главное — поддерживать atomicity и event log.

В каких местах вашей production-инфраструктуры агенты чаще всего конфликтуют по статусам — на уровне storage, оркестрации или LLM-output? Готов разобрать паттерн и показать, как это решается на практике. Я бесплатно провожу 30-мин аудит стека для DACH-команд, которые строят AI в регулируемых индустриях. Пишите в LinkedIn или в @ger_dennis_ai.

Читать дальше
Контракт-дривен фреймворк для AI: как Traverse позволяет собирать бизнес-капабилити на WASM и запускать их в браузере, на edge и в облаке
Как Uber защищает своих AI-агентов: реальный стек ADR для наблюдаемости и безопасности в проде
AI врёт при реверсе бинарей: как Reverify проверяет каждое утверждение LLM на байтовом уровне (инструмент для безопасного reverse engineering)
Как ускорить ревью и навигацию в огромных кодовых базах с помощью AI: кейс локального code intelligence графа
Все статьи →
Где это применяется
Услуги — что мы делаем
Поговорить с голосовым агентом
Кейсы
Готовы к следующему шагу?

Превратить процесс в систему, которая работает

Продакшн-качество, а не демо.

Обсудить проект → ← Все статьи