跳至主要内容

排程任務 API

@grant CAT.agent.task

排程任務 API 讓腳本可以建立基於 Cron 運算式的排程任務,支援兩種執行模式。

執行模式

內部模式

由 Agent 系統自動處理:

  • Cron 排程觸發時自動建立或恢復對話
  • 將設定的 prompt 發送給 LLM
  • 可指定模型和 Skills
  • 執行歷史和 Token 使用量會自動記錄

事件模式

由腳本本身處理:

  • Cron 排程觸發時向腳本發送事件通知
  • 腳本透過 addListener 監聽事件
  • 處理邏輯完全可自訂

create — 建立任務

const task = await CAT.agent.task.create(options);

參數 (AgentTaskCreateOptions):

參數型別必填說明
namestring任務名稱
crontabstring標準 Cron 運算式(5 個欄位:分 時 日 月 星期)
mode"internal" | "event"執行模式
enabledboolean是否啟用,預設為 true
notifyboolean觸發時是否發送瀏覽器通知
promptstring內部模式的提示詞
modelIdstring內部模式使用的模型 ID
skillsstring[]內部模式載入的 Skills
maxIterationsnumber內部模式的最大工具呼叫輪次,預設為 10

回傳 AgentTask

欄位型別說明
idstring任務 ID
namestring任務名稱
crontabstringCron 運算式
modestring執行模式
enabledboolean是否啟用
notifyboolean是否發送通知
nextruntimenumber下次執行時間戳
lastruntimenumber上次執行時間戳
conversationIdstring內部模式的關聯對話 ID(選填)
lastRunStatus"success" | "error"上次執行狀態
lastRunErrorstring上次執行錯誤訊息
createtimenumber建立時間戳

Cron 運算式範例:

運算式說明
* * * * *每分鐘
0 9 * * *每天 09:00
0 */2 * * *每 2 小時
30 8 * * 1-5工作日 08:30
0 0 1 * *每月 1 日 00:00

list — 列出所有任務

const tasks = await CAT.agent.task.list();

回傳目前腳本建立的所有任務。

get — 取得任務詳情

const task = await CAT.agent.task.get(taskId);

如果任務不存在則回傳 undefined

update — 更新任務

const task = await CAT.agent.task.update(taskId, partial);

可更新的欄位:

await CAT.agent.task.update(task.id, {
name: "新名稱",
crontab: "0 10 * * *",
enabled: false,
prompt: "新提示詞",
notify: true
});

更新後 nextruntime 會自動重新計算。

remove — 刪除任務

const success = await CAT.agent.task.remove(taskId);

runNow — 立即執行

await CAT.agent.task.runNow(taskId);

觸發任務立即執行一次,無需等待 Cron 排程(非阻塞,在背景執行)。

addListener — 監聽任務觸發

const listenerId = await CAT.agent.task.addListener(taskId, callback);

僅用於事件模式任務。Cron 排程觸發時執行回呼函數。

回呼函數參數 (AgentTaskTrigger):

欄位型別說明
taskIdstring任務 ID
namestring任務名稱
crontabstringCron 運算式
triggeredAtnumber觸發時間戳

removeListener — 移除監聽器

await CAT.agent.task.removeListener(listenerId);

完整範例

內部模式 — AI 自動執行

// ==UserScript==
// @name 排程新聞摘要
// @match *://*/*
// @grant CAT.agent.task
// ==/UserScript==

const task = await CAT.agent.task.create({
name: "每日新聞摘要",
crontab: "0 9 * * *", // 每天早上 9 點
mode: "internal",
prompt: "請搜尋今日科技新聞並將簡短摘要儲存到 OPFS",
skills: ["web-search"],
maxIterations: 10,
notify: true
});

console.log("任務已建立,下次執行:", new Date(task.nextruntime));

事件模式 — 腳本自行處理

// ==UserScript==
// @name 排程資料收集
// @match *://*/*
// @grant CAT.agent.task
// @grant CAT.agent.dom
// ==/UserScript==

const task = await CAT.agent.task.create({
name: "股票資料收集",
crontab: "*/30 9-15 * * 1-5", // 工作日 9-15 點,每 30 分鐘
mode: "event",
enabled: true,
notify: false
});

await CAT.agent.task.addListener(task.id, async (trigger) => {
console.log(`任務觸發:${trigger.name}${new Date(trigger.triggeredAt)}`);

// 自訂收集邏輯
await CAT.agent.dom.navigate("https://finance.example.com/stock");
const content = await CAT.agent.dom.readPage({ selector: ".stock-table" });

// 處理資料...
console.log("收集完成");
});