INTEGRITY Dokumentace

Naplánované úlohy

Použijte getScheduledTasks() když má kód vytvářet opakující se kola Think nebo deterministické naplánované obslužné rutiny. Think při spuštění sladí deklarace, uloží trvalý jednorázový plán pro další výskyt a po každém běhu znovu nastaví další výskyt.

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 podporuje every <n> minutes, every <n> hours, every day at HH:mm, every weekday at HH:mm, a every week on monday,wednesday at HH:mm. Plány podle reálného času (wall-clock) vyžadují buď vloženou časovou zónu, úlohu timezone, nebo getDefaultTimezone(). Pokud se alarm spustí později, Think zamýšlený výskyt spustí jen jednou a naplánuje další budoucí výskyt; zmeškané běhy zpětně nedoplňuje.

Každá úloha musí definovat přesně jedno z prompt nebo handler. Úlohy typu prompt task vytvoří trvalé odeslání s submitMessages(). Úlohy typu handler task přijímají { taskId, scheduledFor, scheduledForDate, occurrenceKey, idempotencyKey, schedule, scheduleKind, timezone, metadata } a jsou určeny pro práci řízenou aplikací, jako je vytvoření běhu Workflow nebo zápis do deníku běhu. Doručení probíhá metodou at-least-once, použijte idempotencyKey nebo occurrenceKey pro vlastní trvalou idempotenci.

Statické deklarace se při spuštění sladí. Pokud getScheduledTasks() čte data vlastněná produktem, která se mohou měnit, zatímco je Durable Object aktivní, zavolejte internal_reconcileScheduledTasks() po aktualizaci těchto dat. Během sesouhlasení Think zaznamená řádek úlohy ještě před vytvořením podkladového plánu Agentu, takže chybějící schedule_id je jen čekající stav sesouhlasení a opraví se při dalším sesouhlasení. Úloha retry možnost opakuje prompt nebo akci handleru před tím, než se selhání zaznamená do logu. Další výskyt je stále naplánován poté, co akce uspěje nebo vyčerpá počet opakování, takže neúspěšné výskyty neblokují budoucí běhy.

Kdy raději použít workflow

Pro opakovanou úlohu, u které záleží na jednotlivých krocích (více deterministických kroků, dlouhá čekání nebo schválení člověkem), použijte handler task k vytvoření Think Workflow běh. Jednoduché opakující se prompty ponechte jako úlohy typu prompt task a jednorázová kola na pozadí ponechte na submitMessages().