← Создание агентов на Cloudflare / agents / harnesses / think
Запланированные задачи
Используйте 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().