INTEGRITY Документация

Использование Agents с Workflows

Что такое Workflows?

Cloudflare Workflows обеспечивают устойчивое многошаговое выполнение задач, которым нужно переживать сбои, автоматически повторяться и ожидать внешних событий. При интеграции с Agents Workflows берут на себя длительную фоновую обработку, а Agents отвечают за коммуникацию в реальном времени.

Agents и Workflows: сравнение

У Agents и Workflows взаимно дополняющие сильные стороны:

Возможность Агенты Workflows
Модель выполнения Долгоживущая сущность, пробуждающаяся по событиям Запуск до завершения
Связь в реальном времени WebSockets, потоковая передача по HTTP Не поддерживается
Сохранение состояния Встроенная база данных SQL Персистентность на уровне шага
Обработка сбоев Определяется приложением Автоматические повторные попытки и восстановление
Внешние события Прямая обработка Приостановка и ожидание событий
Взаимодействие с пользователем Прямой (чат, UI) Через колбэки Agent

Agents умеют выполнять циклы, ветвиться и напрямую взаимодействовать с пользователями. Workflows выполняют шаги последовательно с гарантированной доставкой и могут приостанавливаться на дни в ожидании одобрений или внешних данных.

Когда что использовать

Используйте только Agents для:

Используйте Agents вместе с Workflows для:

Используйте только Workflows для:

Как Agents и Workflows взаимодействуют

AgentWorkflow класс (импортированный из agents/workflows) обеспечивает двустороннюю связь между Workflow и их исходным Agent.

Workflow к агенту

Workflows могут взаимодействовать с Agents несколькими способами:

// 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 следующими способами:

Устойчивые vs. неустойчивые операции

Понимание durability является ключевым для эффективного использования workflow:

Неустойчивые (могут повторяться при повторной попытке)

Эти операции лёгкие и подходят для частых обновлений, но могут выполняться несколько раз, если workflow повторяет попытку:

Устойчивое (идемпотентное, не повторяется)

Эти операции используют step параметр и гарантированно выполняются ровно один раз:

Гарантии устойчивости

Workflows обеспечивают устойчивость благодаря пошаговому выполнению:

  1. Завершение шага необратимо : после завершения шага он не выполняется повторно, даже если workflow перезапускается
  2. Автоматические повторные попытки : неудачные шаги повторяются с настраиваемым интервалом отката
  3. Сохранение событий : workflows могут ожидать события до одного года
  4. Восстановление состояния : состояние workflow сохраняется при сбоях инфраструктуры

Эта модель устойчивости означает, что workflow хорошо подходят для задач, где нужно сохранять частичное выполнение, например для многоэтапной обработки данных или транзакций, охватывающих несколько систем.

Отслеживание Workflow

Когда Agent запускает workflow с помощью runWorkflow(), 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(). Эти изменения состояния рассылаются всем подключённым клиентам, поддерживая синхронизацию интерфейсов без опроса.

Запуск Workflows API

Подробности реализации рабочих процессов агентов.

Cloudflare Workflows

Основы Workflow и документация.

Участие человека

Потоки подтверждения и ручное вмешательство.