跳至內容

與代理聊天

本指南說明如何在空間中與代理協作。

  1. 在側邊欄中前往空間
  2. 點擊「空間」標題旁的 + 按鈕
  3. 輸入一個名稱——此為必填。名稱留空會被拒絕; 對話框會保持開啟
  4. 可選擇從工作區加入代理
  5. 如果工作區有任何程式庫,會出現程式庫選擇器。它一開始會選取所有 程式庫;請把它收窄到該空間應為其佈建 worktree 的程式庫(也可以 只取消選取單一程式庫)
  6. 確認

Control Center 會開啟該空間,並在背景為每個選中的程式庫開始佈建一份 寫入時複製 worktree。

在輸入框中輸入你的訊息,然後按 Enter。代理隨即派發,並開始串流它的回覆。

如果空間仍在佈建中,你的訊息會被暫存而不是遺失——輸入框會保留它,並在 worktree 就緒後自動送出。

隨着代理工作,你會看到它的回合以串流方式呈現:推理片段、工具呼叫 (檔案讀取、寫入、shell 指令)與回答文字,全都位於同一則代理回合訊息之中。

當代理正在工作時,普通的對話文字不會排隊成為新的回合。它會變成輸入框 上方橫列中的一張排隊引導卡,並在下一個回合邊界注入正在進行的執行。不會 彈出提示——卡片本身就是回饋。

有三件事會改變這種行為:

  • 包含 @提及的訊息一律作為訊息送出,永遠不會作為引導
  • 以斜線指令開頭的訊息一律按該指令處理
  • 附有附件的訊息一律作為訊息送出——引導佇列只支援文字
  • 如果所有進行中的執行都已結束,該文字會落回常規路徑,作為一般訊息送出

當代理遇上一個由其護欄把關的操作——破壞性指令、特權工具——伺服器會阻止 該執行,並向每個已連接的用戶端發佈一則核准請求。如果你開啟着該對話,請求會 在對話中、輸入框上方出現,形式與 ask_user 所用的編號選項卡相同(拒絕、 核准,還可選擇核准八小時)。沒有跳過這回事:被阻止的代理正等待一個決定。

如果你身處應用程式的其他位置,外殼中一個永遠置頂的面板仍會列出有哪些事項 正在等待,因此你不必到處尋找該空間也能解除代理的阻塞。當該空間的對話出現在 畫面上時,浮層會立即隱藏對應的請求,因此你永遠不會對同一個提示回答兩次。

沒有逾時:被阻止的代理會一直等待,直到有人作出決定。同一則請求也會出現在 收件箱的關注列和手機用戶端上。

當代理需要一項偏好設定、一個缺失的需求,或遇到一個真正的分岔時,它必須 呼叫 ask_user。把問題寫成聊天訊息會結束該回合,你必須重新提示。該工具會在 對話中渲染一張編號卡片——選項、可選的自由文字,或兩者兼具——而執行會等待 你的回答。

點按單一選項即可送出(末尾的數字在游標移上時會變成箭頭)。多選和自行輸入的 回答使用繼續(⌘↵ / Ctrl↵)。跳過會告訴代理選取一個合理的預設值, 並且不再提問。

它與上文的核准卡是兩套不同的機制:核准問的是「我可以這樣做嗎?」,提問問的是 「你說的是其中哪一個?」。在每一種模式下(包括唯讀模式),內建運行器都支援 提問(它不會改動任何東西),而且刻意不把它包裝在核准提示之中——在沒有連接 核准者的情況下,一個對話框前面再放一個對話框會失效即拒絕。沒有對話可供渲染 的執行,根本不會取得這個工具。

當有執行正在進行時,輸入框的傳送按鈕會變成一個停止按鈕。清空輸入框並按 下它——這會停止該對話中所有正在運行的代理。

空間標題欄中沒有停止控制項,也沒有對應的鍵盤快捷鍵。當有多次執行同時進行、 而你只想停止其中一次時,開啟該次執行的活動分頁——它的標題欄帶有針對該次 執行的暫停/繼續與停止(停止會要求你確認)。可觀測性 → 即時會列出工作區 中每個正在運行的代理,並提供相同的控制項。

已停止的執行會標記為已停止。傳送一則新訊息即可再次派發。

在輸入框中輸入 / 即可看到指令清單。以下指令會改變對話的行為:

指令 作用
/plan 將空間切換至計劃模式。單獨一個 /plan 只會啟用該模式;/plan <request> 會啟用該模式,並把其餘內容當作你的訊息送出
/goal <text> 記錄該對話的工作目標
/loop <text> 反覆迭代某項任務,直至完成
/compact 把較舊的歷史收摺成一份附有錨點的摘要,並在壓縮後的上下文上繼續
/todo … 查看並編輯此對話持久化的待辦清單

技能會以各自的 skill: 命名空間出現在同一份清單中,因此永遠不會與上述指令 衝突——名為 plan 或 compact 的技能仍然可以觸達:

指令 它會執行甚麼
/skill:<name> 安裝在工作區中的技能,或附加到該代理的技能
/skill:<repo>:<name> 本空間中已檢出的其中一個程式庫所隨附的技能

程式庫技能會標上其來源程式庫的標記,因為單憑名稱無法說明它編碼的是哪個服務的 慣例,而且兩個程式庫可能各自都隨附一個 testing。你不必輸入前綴也能找到它: 直接輸入技能名稱同樣會匹配帶命名空間的項目。

代理永遠只會攜帶它目前所在程式庫的技能——參見 程式庫範圍技能。輸入框並不這樣 劃分範圍:你可以指名呼叫任何程式庫的技能。

/compact 與 /todo 由用戶端攔截,永遠不會持久化為訊息——轉錄中出現一行 /compact 會把下一次壓縮的切點往回推一個回合。/plan 會切換空間所儲存的 模式,而不是以文字傳遞。所以這三者都不是「你發送給代理的訊息」;不要指望在 歷史記錄中看到它們。

在進行複雜變更之前,用 /plan、輸入框工具列上的模式下拉選單,或 Shift+Tab 把空間切換至計劃模式。接着代理會以唯讀方式研究,並交出一份具型別的計劃,由你 在任何工作開始之前核准。參見使用計劃模式。

你不必為每個代理都建立一個空間。在任意空間中:

@alice can you look at the failing tests in src/auth_test.dart?

被提及的代理會被加入該空間,並帶着該空間的上下文派發。參見 @提及代理,了解名稱如何匹配。