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

Запланированные задачи

Используйте getScheduledTasks() когда код должен создавать повторяющиеся ходы Think или детерминированные запланированные обработчики. Think сверяет объявления при запуске, сохраняет устойчивое разовое расписание для следующего момента выполнения и заново активирует следующий момент выполнения после каждого запуска.

import { Think, defineScheduledTasks } from "@cloudflare/think";

export class DigestAgent extends Think {
	getDefaultTimezone() {
		return "Europe/London";
	}

	getScheduledTasks() {
		return defineScheduledTasks({
			weeklyCommitReport: {
				schedule: "every week on monday at 09:00",
				prompt:
					"Compile all my GitHub commits for the last week and send a concise summary.",
			},
			workout: {
				schedule: "every day at 08:00 in Europe/London",
				prompt: "Start my workout.",
			},
			customerDigest: {
				schedule: "every day at 09:00",
				timezone: "America/New_York",
				metadata: { workflowName: "customer-digest" },
				retry: { maxAttempts: 3 },
				handler: async ({
					idempotencyKey,
					scheduledFor,
					scheduleKind,
					timezone,
				}) => {
					await this.env.DIGEST_WORKFLOW.create({
						id: idempotencyKey,
						params: { scheduledFor, scheduleKind, timezone },
					});
				},
			},
		});
	}
}
import { Think, defineScheduledTasks } from "@cloudflare/think";

export class DigestAgent extends Think<Env> {
	getDefaultTimezone() {
		return "Europe/London";
	}

	getScheduledTasks() {
		return defineScheduledTasks({
			weeklyCommitReport: {
				schedule: "every week on monday at 09:00",
				prompt:
					"Compile all my GitHub commits for the last week and send a concise summary.",
			},
			workout: {
				schedule: "every day at 08:00 in Europe/London",
				prompt: "Start my workout.",
			},
			customerDigest: {
				schedule: "every day at 09:00",
				timezone: "America/New_York",
				metadata: { workflowName: "customer-digest" },
				retry: { maxAttempts: 3 },
				handler: async ({
					idempotencyKey,
					scheduledFor,
					scheduleKind,
					timezone,
				}) => {
					await this.env.DIGEST_WORKFLOW.create({
						id: idempotencyKey,
						params: { scheduledFor, scheduleKind, timezone },
					});
				},
			},
		});
	}
}

DSL поддерживает every <n> minutes, every <n> hours, every day at HH:mm, every weekday at HH:mm, а также every week on monday,wednesday at HH:mm. Wall-clock-расписания требуют либо указанного часового пояса, либо задачи timezone, или getDefaultTimezone(). Если alarm запаздывает, Think выполняет запланированное срабатывание один раз и планирует следующее будущее срабатывание; пропущенные запуски не восполняются.

Каждая задача должна определять ровно одно из prompt или handler. Prompt tasks создают устойчивую отправку с submitMessages(). Handler tasks получают { taskId, scheduledFor, scheduledForDate, occurrenceKey, idempotencyKey, schedule, scheduleKind, timezone, metadata } и предназначены для работы на стороне приложения, например создания запуска Workflow или записи в журнал запусков. Доставка гарантируется как минимум один раз; используйте idempotencyKey или occurrenceKey для собственной надёжной идемпотентности.

Статические объявления сверяются при запуске. Если getScheduledTasks() считывает данные, принадлежащие продукту, которые могут изменяться, пока Durable Object активен, вызовите internal_reconcileScheduledTasks() после обновления этих данных. Во время сверки Think записывает строку задачи до создания базового расписания Agent, поэтому отсутствующий schedule_id это лишь состояние ожидающей сверки, которое исправляется при следующей сверке. Задача retry опция повторяет запрос или действие обработчика до того, как сбой будет зафиксирован в журнале. Следующее выполнение по-прежнему запланировано после того, как действие завершится успешно или исчерпает попытки повтора, поэтому неудачные выполнения не блокируют последующие запуски.

Когда лучше использовать workflow

Для периодической задачи, в которой важны отдельные шаги (несколько детерминированных шагов, долгие ожидания или подтверждение человеком), используйте handler task, чтобы создать Think Workflow run. Оставляйте простые повторяющиеся prompts как prompt tasks, а разовые фоновые turns оставляйте на submitMessages().