ctsite.cc部落格

Peaberry:AI agent 跑長工作時,別讓 Mac 中途睡著

Peaberry 的選單列面板:上方是兩筆 AI agent 的保持清醒要求,各有一個停止按鈕,下方是四個情境

把要跑很久的工作交給 AI agent,人離開座位,回來卻發現 Mac 早就睡著,工作停在半路。這是因為 macOS 判斷閒置看的是鍵盤和滑鼠,而 agent 從頭到尾都不會碰它們。Peaberry 是我新開發的選單列工具:agent 工作時自己向它要求保持清醒,每個 agent 各拿一份會自己到期的租約;最後一份結束,睡眠就交還給 macOS 原本的設定。

Peaberry 即將在 Mac App Store 上架,這篇先介紹它怎麼運作。

「關掉睡眠」以外的選擇

要讓 Mac 撐過一段長工作,常見的做法是到系統設定把睡眠關掉,或在終端機執行 caffeinate。前者要記得改回來,後者每次都得自己下指令、自己估要撐多久。Peaberry 用的是和 caffeinate 相同的機制(IOKit 的 power assertion),差別在兩件事:提出要求的是正在工作的 agent,而且每一筆要求都一定會結束。

每個 agent 一份租約

agent 用 peaberry:// 網址提出要求。要求可以綁在一個程序上,程序結束就放手;也可以給一段分鐘數,範圍是 1 到 1440 分鐘,也就是最長 24 小時。兩者都給時以先到者為準,都沒給就是 30 分鐘。所以就算 agent 當掉或忘了收尾,它的要求也會自己到期,不會讓 Mac 一直醒著。

# 綁在這個 shell 上:build 跑完,要求也跟著結束
open "peaberry://hold?pid=$$&id=agent&reason=build" && ./build.sh

# 跨好幾個指令的工作,改用時間
open "peaberry://hold?minutes=90&id=agent&reason=render"

# 提早結束
open "peaberry://release?id=agent"

每筆要求用 id 命名,同時最多 16 筆:同名的會取代前一筆,不同名的並存。只要還有一筆在,Mac 就保持清醒。

三筆要求的時間軸:兩個 agent 的工作階段與一個 90 分鐘的算圖各自持有租約,只要還有一筆在,Mac 就保持清醒,最後一筆結束後回到睡眠設定 時間 → agent-1940 直到工作階段結束 agent-2210 直到工作階段結束 render 90 分鐘 你的 Mac 保持清醒 睡眠設定 最後一筆結束,交還睡眠設定

兩個 agent 的工作階段加上一個 90 分鐘的算圖,各自持有租約。Mac 醒著的時間是三者的聯集,最後一筆結束就回到睡眠設定。

開關在你手上

任何程式、甚至網頁都能開啟一個網址,所以 agent 只能「提出」要求,接不接受由你決定。「設定 › AI agent」裡有一個「允許其他程式用 peaberry:// 要求保持清醒」的開關,沒有任何指令能替你打開它。

開關打開之前,預設情境「智能控制」下的第一筆要求會先放行,但最多 15 分鐘,免得工作被睡眠打斷;面板上同時出現一張卡片,讓你選擇停止或永遠允許。選了停止,之後的要求就會排在面板上等你回答。進行中的要求一筆一列,每列都有自己的「停止」按鈕。

一筆要求進來之後的走向:開關已打開就保持清醒,直到程序結束或時間到;還沒打開時第一筆先放行最多 15 分鐘,面板上的卡片可以選停止或永遠允許 agent 送出要求 peaberry://hold 「設定 › AI agent」的開關打開了嗎? 已打開 還沒打開 保持清醒 直到程序結束或時間到 第一筆先放行 最多 15 分鐘 隨時可以提早結束 peaberry://release 面板上的卡片 停止 永遠允許 之後的要求 排隊等你回答 之後直接放行

一筆要求進來之後的走向。面板上的卡片為示意圖。

設定 agent:三個步驟

  1. 打開「設定 › AI agent」,按「複製指示」。
  2. 把指示貼到 agent 的對話框。它會讀取 Peaberry 內附的技能檔案,用自己的方式安裝,再告訴你裝在哪裡。只要能讀檔案、能執行 shell 指令的 agent 都適用。
  3. 打開「允許其他程式用 peaberry:// 要求保持清醒」,要求才能撐到整份工作做完。

技能會請 agent 在每個工作階段一開始就提出一筆要求,綁在它自己的程序上。所以 agent 在思考、還沒輸出任何東西時,Mac 也不會睡;停下來等你回覆時會先釋放,工作階段結束也就跟著結束。Peaberry 沒在執行時,agent 不會去動它;app 更新帶來新版技能時,agent 看到版本號變大,會自己換掉手上那份。

查狀態也很省:--brief 只回一行,--wait 則會一直等到真的有事(要求結束、電量偏低、Peaberry 被關掉)才回一行,實測等一分鐘只用掉 0.03 秒 CPU。

$ /Applications/Peaberry.app/Contents/MacOS/Peaberry --brief
running=1 holding=1 scene=system holds=agent-1940,render:5380 agent-control=on warnings=none skill=5 age=3

電池見底前先收尾

用電池時,電量剩 20% 或只剩 20 分鐘,來查狀態的 agent 會被提醒把工作做到一個段落、釋放要求,並告訴你做到哪裡。電量再降到下限(預設 10%,可以在「設定 › 一般」調成 5% 到 50%)時,Peaberry 會放開所有保持清醒的要求,agent 的也不例外,讓 Mac 在電力耗盡前照常睡眠;接上電源後,這些要求會自己恢復。

沒有 agent 的時候:四個情境

Peaberry 一次只有一個情境在運作,在面板上點一下就能切換,也可以複製任何一個,改成自己的版本。

四個內建情境:智能控制是預設,只有 agent 的要求會讓 Mac 保持清醒;工作中在指定程序執行或 CPU 忙碌時保持清醒;簡報中兩小時、螢幕開著並遮住桌面;放著讓它跑八小時、螢幕可以睡 智能控制 預設 睡眠照 macOS 的設定 只有 agent 的要求 會讓 Mac 保持清醒 工作中 工作在跑時 指定的程序在執行 或 CPU 忙碌時保持清醒 停止後再等 2 分鐘 簡報中 2 小時 螢幕保持開啟 桌面用桌布、漸層 或單一顏色遮住 放著讓它跑 8 小時 下載、匯出、備份 這類會走開的工作 螢幕可以睡

四個內建情境。預設的「智能控制」在沒有人提出要求時,不改變 macOS 的睡眠行為。

「工作中」怎麼判斷

這個情境會比對程序名稱、argv[0]、腳本檔名或 PID,也支援萬用字元:train.py 比對得到 python3 /work/train.py --epochs 10,python* 比對得到 python3.12,也可以直接從執行中的 app 挑。面板會列出每個比對到的程序和它的 PID、CPU,規則有沒有在作用,一看就知道。

CPU 規則看的是所有核心 15 秒的平均。在 12 核心的機器上,單一執行緒滿載只有約 8%,所以門檻最好參考面板上的即時數值來抓。工作停止後會再等兩分鐘才允許睡眠,一個工作接下一個工作之間的空檔,不會讓 Mac 睡著。

「工作中」情境的面板:train.py 正在執行,列出 Python 程序的 PID 與 CPU,下方是 CPU 忙碌超過 40% 的規則

「工作中」情境:train.py 正在執行,面板列出它的 PID 與 CPU。

有電池的 Mac 上,情境可以設成只在接上電源時運作。留意工作的情境也能在接上外接螢幕時保持清醒,筆電闔上螢幕蓋接著外接螢幕也算;Mac mini、Mac Studio 這類沒有內建螢幕的機型不會觸發。限時情境結束前 5 分鐘會發通知,可以直接延長 30 分鐘;也可以設定全域快捷鍵來開始或停止限時情境,出廠時是關閉的。

選單列豆子的四種狀態:允許系統睡眠、保持清醒中、收尾中、有 AI agent 在等你回答

選單列上的豆子有四種狀態。只有在有東西讓 Mac 保持清醒時,豆子才會動。

Mac 為什麼還醒著?

有時候想知道的是反過來的事:Mac 該睡了卻還醒著,或是不該睡卻睡著了。設定裡的「診斷」分頁一次回答這兩個問題:Peaberry 自己正在做什麼、是哪條規則或哪個 agent 要求的;還有哪些 app 讓 Mac 保持清醒,系統服務收成一列;有沒有排定的睡眠、是誰排的;以及目前的電源、螢幕,和距離上次碰鍵盤或滑鼠多久。

Peaberry 設定裡的「診斷」分頁:上方是 Peaberry 自己的狀態,下方列出 caffeinate、Music 與系統服務等其他讓 Mac 保持清醒的程式

「診斷」分頁也會列出 Peaberry 以外、同樣讓 Mac 保持清醒的程式。

隱私與資源占用

  • 沒有網路存取權限,就算想連線,macOS 的沙盒也會擋下來。
  • 不收集任何資料,沒有分析、帳號或追蹤,App Store 的隱私權標籤是「未收集資料」。
  • 沒有訂閱、App 內購買或廣告。
  • 豆子在動時,實測約占單一核心 1.5% 的 CPU;在「智能控制」下閒置時約 0.1%。選單列動畫也可以關掉。

限制

MacBook 闔上螢幕、又沒接外接螢幕時,系統仍會睡眠。Peaberry 擋的是閒置睡眠,這種情況任何 App Store 上的 app 都改不了。
  • 擋不住其他程式排定的睡眠。
  • 其他使用者(例如 root)的程序只能用名稱比對。

系統需求與取得方式

Peaberry 支援 macOS 15 Sequoia 以上,Apple 晶片與 Intel 的 Mac 用的是同一個通用 app,介面有英文、繁體中文、日文和西班牙文。它住在選單列,沒有 Dock 圖示;第一次打開會出現一個簡短的歡迎視窗,保留「登入時自動啟動」的勾選並按「完成」,就會加入登入項目。VoiceOver 也會念出它目前的狀態。

Peaberry 即將在 Mac App Store 上架。它的原始碼沒有公開,GitHub 上的 repository 放的是網站和 issue tracker,問題、錯誤回報與功能建議都歡迎到那裡提出。

相關連結

Mac 與 macOS 是 Apple Inc. 的商標。

留言