← Создание агентов на Cloudflare / agents / concepts
Использование Agents с Workflows
Что такое Workflows?
Cloudflare Workflows обеспечивают устойчивое многошаговое выполнение задач, которым нужно переживать сбои, автоматически повторяться и ожидать внешних событий. При интеграции с Agents Workflows берут на себя длительную фоновую обработку, а Agents отвечают за коммуникацию в реальном времени.
Agents и Workflows: сравнение
У Agents и Workflows взаимно дополняющие сильные стороны:
| Возможность | Агенты | Workflows |
|---|---|---|
| Модель выполнения | Долгоживущая сущность, пробуждающаяся по событиям | Запуск до завершения |
| Связь в реальном времени | WebSockets, потоковая передача по HTTP | Не поддерживается |
| Сохранение состояния | Встроенная база данных SQL | Персистентность на уровне шага |
| Обработка сбоев | Определяется приложением | Автоматические повторные попытки и восстановление |
| Внешние события | Прямая обработка | Приостановка и ожидание событий |
| Взаимодействие с пользователем | Прямой (чат, UI) | Через колбэки Agent |
Agents умеют выполнять циклы, ветвиться и напрямую взаимодействовать с пользователями. Workflows выполняют шаги последовательно с гарантированной доставкой и могут приостанавливаться на дни в ожидании одобрений или внешних данных.
Когда что использовать
Используйте только Agents для:
- Приложения для чата и обмена сообщениями
- Быстрые вызовы API и ответы на них
- Функции совместной работы в реальном времени
- Задачи короче 30 секунд
- Один устойчивый ход чата Think с
submitMessages()
Используйте Agents вместе с Workflows для:
- Пайплайны обработки данных
- Генерация отчётов
- Потоки подтверждения с участием человека
- Задачи, требующие гарантированной доставки
- Многошаговые операции с требованиями повторных попыток
Используйте только Workflows для:
- Фоновые задачи с подтверждением пользователя или без него
- Запланированная синхронизация данных
- Событийно-ориентированные конвейеры обработки
Как Agents и Workflows взаимодействуют
AgentWorkflow класс (импортированный из agents/workflows) обеспечивает двустороннюю связь между Workflow и их исходным Agent.
Workflow к агенту
Workflows могут взаимодействовать с Agents несколькими способами:
- RPC-вызовы: Вызывайте методы Agent напрямую с полной типобезопасностью через
this.agent - Отчёты о прогрессе: Отправляйте обновления о ходе выполнения через
this.reportProgress()которые запускают колбэки Agent - Обновления состояния: Изменяйте состояние Agent через
step.updateAgentState()илиstep.mergeAgentState(), которая рассылается подключённым клиентам - Клиентские рассылки: Отправляйте сообщения всем клиентам WebSocket через
this.broadcastToClients()
// Inside a workflow's run() method
await this.agent.updateTaskStatus(taskId, "processing"); // RPC call
await this.reportProgress({ step: "process", percent: 0.5 }); // Progress (non-durable)
this.broadcastToClients({ type: "update", taskId }); // Broadcast (non-durable)
await step.mergeAgentState({ taskProgress: 0.5 }); // State update (durable)// Inside a workflow's run() method
await this.agent.updateTaskStatus(taskId, "processing"); // RPC call
await this.reportProgress({ step: "process", percent: 0.5 }); // Progress (non-durable)
this.broadcastToClients({ type: "update", taskId }); // Broadcast (non-durable)
await step.mergeAgentState({ taskProgress: 0.5 }); // State update (durable)От Agent к Workflow
Agents могут взаимодействовать с выполняющимися Workflows следующими способами:
- Запуск workflow: Запускайте новые экземпляры workflow с помощью
runWorkflow() - Отправка событий: Отправляйте события с помощью
sendWorkflowEvent() - Подтверждение/отклонение: Отвечайте на запросы на одобрение с помощью
approveWorkflow()/rejectWorkflow() - Управление Workflow: Приостанавливайте, возобновляйте, завершайте или перезапускайте workflow
- Запросы статуса: Проверяйте прогресс workflow с помощью
getWorkflow()/getWorkflows()
Устойчивые vs. неустойчивые операции
Понимание durability является ключевым для эффективного использования workflow:
Неустойчивые (могут повторяться при повторной попытке)
Эти операции лёгкие и подходят для частых обновлений, но могут выполняться несколько раз, если workflow повторяет попытку:
this.reportProgress(): отчёты о ходе выполненияthis.broadcastToClients(): рассылки через WebSocket- Прямые вызовы RPC к
this.agent
Устойчивое (идемпотентное, не повторяется)
Эти операции используют step параметр и гарантированно выполняются ровно один раз:
step.do(): выполнение устойчивых шаговstep.reportComplete()/step.reportError(): Отчетность о завершенииstep.sendEvent(): Пользовательские событияstep.updateAgentState()/step.mergeAgentState(): синхронизация состояния
Гарантии устойчивости
Workflows обеспечивают устойчивость благодаря пошаговому выполнению:
- Завершение шага необратимо : после завершения шага он не выполняется повторно, даже если workflow перезапускается
- Автоматические повторные попытки : неудачные шаги повторяются с настраиваемым интервалом отката
- Сохранение событий : workflows могут ожидать события до одного года
- Восстановление состояния : состояние workflow сохраняется при сбоях инфраструктуры
Эта модель устойчивости означает, что workflow хорошо подходят для задач, где нужно сохранять частичное выполнение, например для многоэтапной обработки данных или транзакций, охватывающих несколько систем.
Отслеживание Workflow
Когда Agent запускает workflow с помощью runWorkflow(), workflow автоматически отслеживается во внутренней базе данных агента. Это позволяет:
- Запрос статуса workflow по ID, имени или метаданным с курсорной пагинацией
- Отслеживание прогресса через колбэки жизненного цикла (
onWorkflowProgress,onWorkflowComplete,onWorkflowError) - Управление Workflow: пауза, возобновление, завершение, перезапуск
- Очистка завершённых записей Workflows с помощью
deleteWorkflow()/deleteWorkflows() - Сопоставление workflow с пользователями или сессиями через метаданные
Типичные паттерны
Фоновая обработка с отображением прогресса
Agent получает запрос, запускает Workflow для ресурсоёмкой обработки и рассылает подключённым клиентам обновления о ходе выполнения по мере того, как Workflow выполняет каждый шаг.
// Workflow reports progress after each item
for (let i = 0; i < items.length; i++) {
await step.do(`process-${i}`, async () => processItem(items[i]));
await this.reportProgress({
step: `process-${i}`,
percent: (i + 1) / items.length,
message: `Processed ${i + 1}/${items.length}`,
});
}// Workflow reports progress after each item
for (let i = 0; i < items.length; i++) {
await step.do(`process-${i}`, async () => processItem(items[i]));
await this.reportProgress({
step: `process-${i}`,
percent: (i + 1) / items.length,
message: `Processed ${i + 1}/${items.length}`,
});
}Подтверждение с участием человека
Workflow подготавливает запрос и приостанавливается, ожидая подтверждения с помощью waitForApproval(), а Agent предоставляет пользовательский интерфейс, в котором пользователи могут подтвердить или отклонить через approveWorkflow() / rejectWorkflow(). Workflow возобновляется или выбрасывает WorkflowRejectedError на основе решения.
Устойчивые вызовы внешних API
Workflow оборачивает обращения к внешнему API в устойчивые шаги с логикой повторов. Если API возвращает ошибку или workflow перезапускается, завершённые вызовы не повторяются, а неудачные повторяются автоматически.
const result = await step.do(
"call-api",
{
retries: { limit: 5, delay: "10 seconds", backoff: "exponential" },
timeout: "5 minutes",
},
async () => {
const response = await fetch("https://api.example.com/process");
if (!response.ok) throw new Error(`API error: ${response.status}`);
return response.json();
},
);const result = await step.do(
"call-api",
{
retries: { limit: 5, delay: "10 seconds", backoff: "exponential" },
timeout: "5 minutes",
},
async () => {
const response = await fetch("https://api.example.com/process");
if (!response.ok) throw new Error(`API error: ${response.status}`);
return response.json();
},
);Синхронизация состояния
Workflow обновляет состояние Agent на ключевых вехах с помощью step.updateAgentState() или step.mergeAgentState(). Эти изменения состояния рассылаются всем подключённым клиентам, поддерживая синхронизацию интерфейсов без опроса.