Статьи/Инструменты
ПлейбукИнструменты

Создание агентного рантайма с нуля

Почему существующие фреймворки оркестрации не подошли и что мы построили вместо них. Минимальный рантайм для максимального контроля.

3 февраля 202611 мин

Мы попробовали LangChain, CrewAI, AutoGen. Каждый решал одни проблемы и создавал другие. В итоге мы построили свой рантайм.

Что нам было нужно

  1. Выполнять DAG агентных задач с разрешением зависимостей
  2. Обеспечить изоляцию между задачами
  3. Поддерживать чекпоинтинг и откат на любом узле
  4. Стримить промежуточные результаты
  5. Обрабатывать таймауты, повторы и circuit breaking

Ни один фреймворк не делал все пять хорошо.

Почему фреймворки не подходят

LangChain

Хорош для прототипирования. Слишком категоричен в паттернах LLM, слишком гибок во всём остальном. Дебажить цепочку из 10 шагов мучительно.

CrewAI

Отличная концепция — агенты с ролями. Метафора «команды» ломается на масштабе. 50 агентам нужен оркестратор, а не команда.

AutoGen

Мощные мультиагентные разговоры. Но разговоры — не всегда правильная абстракция. Иногда нужно направленное исполнение.

Наш рантайм: ключевые концепции

Три примитива:

interface Task<TInput, TOutput> {
  id: string;
  spec: AgentSpec;
  execute: (input: TInput, context: RuntimeContext) => Promise<TOutput>;
  validate: (output: TOutput) => ValidationResult;
  recover: (error: TaskError) => RecoveryAction;
}

interface Pipeline {
  tasks: Task[];
  edges: [string, string][];
  checkpoints: CheckpointStrategy;
}

interface Runtime {
  execute: (pipeline: Pipeline) => AsyncIterable<PipelineEvent>;
  pause: (pipelineId: string) => void;
  resume: (pipelineId: string) => void;
  rollback: (pipelineId: string, toCheckpoint: string) => void;
}

События, а не возвраты

Каждая задача эмитит события: наблюдаемость в реальном времени, нижестоящие задачи стартуют раньше, ошибки — просто тип события.

Контекст эксплицитен

Каждая задача получает ровно нужный контекст. Никакого глобального состояния.

// Плохо: неявный контекст
agent.execute({ ...globalContext, task: "refactor" });

// Хорошо: эксплицитный скоуп
pipeline.addEdge("analyze", "refactor");

Что мы поняли

1. Изоляция не обсуждается. Общий контекст = невозможный дебаг.

2. Рантайм должен быть скучным. Интеллект — в спеках. Рантайм — водопровод.

3. Стриминг бьёт батч. При 30-минутном пайплайне нужна видимость на 5-й минуте, а не резюме на 30-й.

«Лучшая инфраструктура — та, которую инженеры забывают что существует.»

2400 строк TypeScript. Никакой магии. Только разрешение зависимостей, стриминг событий и чекпоинты.

CatoCut
CatoCut
Agent-First инженерия