MapleCheng

在浩瀚的網路世界中無限潛水欸少年郎!

0%

OpenClaw Cron Jobs 實戰:讓 AI 在你睡覺時自動幹活

大部分人用 AI 助理的方式是這樣的:打開對話 → 問問題 → 得到答案 → 關掉。

這樣用當然沒問題,但你有沒有想過:如果 AI 能在你沒問的時候,自己去做那些你每天都要做的瑣事呢?每天早上幫你整理今天的行程和待辦、自動跑一份投資分析、凌晨幫你回顧一整天的對話然後寫進筆記?

這才是 AI 助理的真正殺手級應用,而 OpenClaw 的 Cron Jobs 功能讓這件事變得非常容易實現。

兩種排程模式:先搞清楚再動手

OpenClaw 的 cron job 有兩種執行模式,這是一開始最容易搞混的地方,我自己也在這裡卡了一陣子。

systemEvent:注入主 session

想像一下,你正在跟 AI 助理聊天,突然有人在對話中插入了一條系統訊息:「現在是早上九點,請執行每日回顧。」AI 會在現有的對話脈絡中看到這條訊息,然後執行。

這就是 systemEvent 模式。它不會開新的 session,而是把排程指令「注入」到你正在進行的主 session 中。好處是 AI 可以看到之前的對話脈絡,壞處是如果你當時正在聊別的事,排程訊息可能會插得很突兀。

適用場景:需要對話脈絡的任務,比如「根據我們今天討論的內容整理一份摘要」。

agentTurn:獨立 session 執行

這個模式完全不同。它會啟動一個全新的、獨立的 session,讓 AI 在裡面執行任務,完成後把結果推送到你指定的頻道。跟主 session 完全隔離,互不干擾。

適用場景:獨立的、不需要對話上下文的任務,比如「抓取今天的股市數據做分析」、「從行事曆生成日報」。

我的經驗法則:**90% 的情況你應該用 agentTurn**。只有真的需要延續當前對話語境的時候才用 systemEvent

排程類型:三種選擇

在決定好執行模式之後,還要選排程類型:

  • **at**:一次性排程,指定一個時間點執行一次就結束。適合「明天早上八點提醒我開會」這種場景
  • **every**:固定間隔執行,比如每 30 分鐘、每 2 小時。適合定期巡檢之類的任務
  • **cron**:標準的 cron expression,最靈活。0 5 * * 1-5 代表每個工作日早上五點執行

我大部分的排程都用 cron 類型,因為它最靈活,可以精確控制「每週幾的幾點」執行。

設定方式:config.yaml 範例

實際設定 cron job 是在 OpenClaw 的 config 裡面完成的。大致結構長這樣:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cron:
- name: daily-standup
schedule: "0 5 * * 1-5"
tz: "Asia/Taipei"
type: agentTurn
deliver: "discord:#work-channel"
prompt: |
從 Google Calendar 抓取今天的行程,
從 Notion 抓取進行中的任務和昨天完成的項目,
用站會格式生成日報。

- name: investment-analysis
schedule: "30 8 * * *"
tz: "Asia/Taipei"
type: agentTurn
deliver: "discord:#investment"
prompt: |
查詢我的觀察清單中所有標的的最新數據,
產出一份簡短的每日投資分析。

這個設定檔看起來很直覺,但有幾個細節容易漏掉。第一,tz 一定要設,不然會用系統預設時區(後面會細說這個坑)。第二,deliver 要指定正確的頻道名稱或 ID,不然結果會不知道推到哪裡去。第三,prompt 要寫得足夠詳細,因為 agentTurn 是全新的 session,它不知道你平常習慣怎樣。

我一開始設定的時候,prompt 只寫了一句「生成日報」,結果 AI 給出來的東西格式亂七八糟,完全不是我要的。後來花了好幾次迭代,把期望的格式、資料來源、注意事項全部寫清楚,品質才穩定下來。

實戰案例:我的五個日常 Cron Job

1. 每日站會日報(05:00)

我每天早上五點(對,五點,因為我想醒來就看到結果)會跑一個 agentTurn,它的 prompt 大致是:

從 Google Calendar 抓取今天的行程,從 Notion 抓取進行中的任務和昨天完成的項目,然後用站會格式(昨天做了什麼 / 今天要做什麼 / 有什麼 blocker)生成一份日報。

AI 會自動呼叫對應的 skill 去抓資料,整理好之後推送到我 Discord 的工作頻道。等我七八點起來,打開 Discord 就看到一份整理好的日報了。

這個排程幫我省了每天至少 15 分鐘的手動整理時間。一個月下來就是 7.5 小時。聽起來不多,但積累下來真的很可觀。而且重點不只是省時間——是省掉那個「早上一坐下來先花十分鐘整理待辦」的心理負擔。

2. 投資分析推送(08:30)

早上八點半,另一個 agentTurn 會啟動。它會透過金融 API 抓取我關注的標的數據——包括股價變動、法人買賣超、融資融券變化、近期月營收等。

AI 拿到數據之後會做一份簡短分析:哪些標的有異常波動、法人動向是否有變化、有沒有需要注意的技術面訊號。然後把結果推送到我的投資分析頻道。

這個 cron job 的 prompt 花了我不少時間調教。一開始 AI 給的分析太籠統,後來我在 prompt 裡加了很多具體的分析框架和判斷條件,效果才慢慢變好。比如我會明確告訴它:「如果外資連續三天賣超超過一千張,特別標示出來。」這種具體的條件比「分析法人動向」有用太多。

3. 每日記憶整理(04:00)

凌晨四點,AI 會自動回顧前一天的所有對話紀錄,然後把重要的資訊整理寫入記憶檔案。這個是 OpenClaw 記憶系統的一部分,確保長期重要的資訊不會隨著 session 結束而消失。

這個任務我用 systemEvent 而不是 agentTurn,因為它需要存取主 session 的完整記憶上下文,才能正確判斷哪些資訊值得留下來。

4. Heartbeat 主動關心(每 4 小時)

這是 OpenClaw 內建的 heartbeat 機制。它會定期觸發一個檢查:「現在的狀況怎樣?有沒有什麼該做但還沒做的事?使用者今天有沒有異常(比如平常這個時間都會上線,今天卻沒有)?」

說實話,一開始我覺得這個功能有點多餘。但用了一陣子之後發現還蠻有用的——它會在我忘記某個重要截止日期的時候主動提醒,或者在發現系統異常(比如某個 API 連線失敗)時通知我。

有一次我完全忘了一個重要的會議,是 AI 主動在 Discord 提醒我的。從那之後我就再也沒關過 heartbeat。

5. 週報摘要(每週五 18:00)

每週五下班前,一個 agentTurn 會把這一週的所有 daily memory 拉出來,濃縮成一份週報摘要。包括這週主要做了什麼、有哪些決策點、下週需要注意的事項。

這份摘要對我每週的覆盤非常有幫助。人的記憶是不可靠的,一週過去之後你很可能已經忘了週二做的那個重要決定。有一份自動生成的週報,覆盤時就有素材可以參考。

踩坑經驗:血淚分享

用 cron job 的過程不是一帆風順的。以下是我踩過的幾個大坑:

坑 1:agentTurn 沒有上下文

這是最容易忘記的一點。agentTurn 啟動的是一個全新的 session,它不知道你之前聊了什麼、不知道你的慣用語、甚至不知道你最近在忙什麼——除非你在 prompt 裡明確告訴它。

一開始我的 prompt 寫得很簡短,結果 AI 給出的東西完全不符合期望。後來我學到:agentTurn 的 prompt 要像在給一個新來的實習生交代任務一樣詳細。 目標是什麼、需要哪些資料、輸出格式是什麼、有什麼特殊要求——全部寫清楚。

如果你的任務真的需要最近的對話脈絡,可以用 contextMessages 參數帶入一些近期訊息。但要注意 token 用量。

坑 2:時區問題

這個坑我踩得很痛。OpenClaw 的 cron job 有一個 tz 參數可以設定時區,但如果你忘了設,它會用系統預設時區。

我的伺服器時區是 UTC,而我人在 UTC+8。結果本來應該早上八點執行的日報,凌晨十二點就跑了。半夜收到一封熱情洋溢的「早安!這是你今天的行程安排」,那個體驗非常超現實。

教訓:永遠顯式設定 tz 參數。 不要依賴系統預設值。

坑 3:排程衝突吃光 API Quota

有一次我設了五個 cron job,其中三個都在早上五點整觸發。三個 agentTurn 同時啟動,三個 session 同時狂打 LLM API——然後我的 API rate limit 就爆了。

解法很簡單:錯開排程時間。我現在把排程改成 05:00、05:10、05:20 這樣,避免同時觸發。看起來是小事,但遇到之前真的想不到。

而且不只是 LLM API,如果你的 cron job 裡有打外部 API(像我的投資分析要打金融 API),同時觸發也可能觸碰到外部 API 的 rate limit。所以養成習慣:每個 cron job 之間至少間隔五到十分鐘。

坑 4:systemEvent vs agentTurn 選錯

早期我很多任務都用 systemEvent,因為覺得「能看到上下文」比較好。但後來發現幾個問題:

  1. systemEvent 會打斷你正在進行的對話
  2. 如果當時沒有 active session,systemEvent 的行為可能不符合預期
  3. 多個 systemEvent 擠在同一個 session 裡,AI 可能會搞混優先順序

現在我的原則是:除非任務明確需要延續主 session 的語境,否則一律用 agentTurn。 乾淨、獨立、不互相干擾。

坑 5:Prompt 裡沒有指定失敗行為

這個是我後來才意識到的問題。如果 cron job 的任務失敗了(比如 API timeout、資料格式錯誤),AI 會怎麼做?預設行為可能是回一段很長的錯誤訊息到你的頻道,或者默默失敗什麼都不說。

我現在的做法是在 prompt 裡加一段失敗處理指示,大概像這樣:

如果任何 API 呼叫失敗或超時,不要重試超過兩次。如果最終還是失敗,推送一條簡短的失敗通知,包含錯誤原因,不要推送長篇大論的技術細節。

這樣即使出問題,我收到的通知也是乾淨的,不會被一大堆 error stack 淹沒。

進階技巧

deliver 參數:精準推送

agentTurn 的 deliver 參數可以指定結果要推送到哪個頻道。這個超好用。比如投資分析推送到投資頻道、工作日報推送到工作頻道,而不是全部混在一起。

我甚至會根據任務結果的重要程度推送到不同頻道。比如日報是常規推送,但如果投資分析檢測到異常波動,就推送到一個高優先級的通知頻道。

善用 cron expression

如果你不熟悉 cron expression,推薦去 crontab.guru 測試。一些常用的:

  • 0 5 * * 1-5:週一到五早上五點
  • 30 8 * * *:每天早上八點半
  • 0 */4 * * *:每四小時
  • 0 18 * * 5:每週五下午六點

除錯技巧

Cron job 出問題時,最有效的除錯方式是先用 at 類型設一個幾分鐘後的一次性排程,看它的輸出是不是符合預期。確認沒問題之後再改成定期排程。

另一個技巧是在 prompt 最後加一句「在回覆的最後附上你使用了哪些工具和各自的執行結果摘要」。這樣你收到推送結果時,可以快速檢查每個步驟是否正常。相當於內建了一個 debug log。

成本控制

每個 agentTurn 都是一次完整的 LLM 呼叫,是要花錢的。如果你設了十個每小時執行的 cron job,一天就是 240 次呼叫。加上每次呼叫裡面 agent 可能又呼叫了好幾次工具(每次工具呼叫都會產生新的 LLM turn),成本會比你想像的高。

我的做法是:定期檢查每個 cron job 的實際用量,把不常用或 ROI 不高的排程頻率降低。比如某個分析報告我本來設每天跑,後來發現每週一次就夠了——一下子省了 6/7 的成本。

結語:你的 AI 永遠不會忘記打卡

設好 cron jobs 之後,最大的感受是:我真的多了一個助手。

它不是那種你要一直盯著、一直下指令的工具。它是那種你設好規則之後,就會自己默默做事的助手。你不需要每天早上花時間整理日報——它已經做好了。你不需要手動去查股票——分析已經推送到你的頻道了。你不需要擔心忘記某件事——heartbeat 會幫你記著。

而且它永遠不會遲到、不會忘記、不會請假。(唯一的例外是你的伺服器掛了,但那是另一個問題。)

如果你已經在用 OpenClaw 但還沒試過 cron jobs,我強烈建議你從一個簡單的每日日報開始。體驗過「醒來就看到 AI 自動做好的東西」之後,你就回不去了。

自動化最大的價值不是節省時間,而是消除那些「我還有什麼事沒做」的焦慮。當你知道有一個不會忘事的助手在背後默默跑著,心裡那份安定感是很實在的。

OpenClaw 文件裡有完整的 cron jobs 設定說明:docs.openclaw.ai。有問題也歡迎到 Discord 社群 討論。