Мы попробовали LangChain, CrewAI, AutoGen. Каждый решал одни проблемы и создавал другие. В итоге мы построили свой рантайм.
Что нам было нужно
- Выполнять DAG агентных задач с разрешением зависимостей
- Обеспечить изоляцию между задачами
- Поддерживать чекпоинтинг и откат на любом узле
- Стримить промежуточные результаты
- Обрабатывать таймауты, повторы и 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. Никакой магии. Только разрешение зависимостей, стриминг событий и чекпоинты.
