跳至主要内容

下一句建議

Agent 回完話之後,後端可能會預測「使用者接下來大概想問什麼」,用 asgard.prompt_suggestion 事件推過來。SDK 把它顯示在輸入框的 placeholder 裡,按 Tab 就採用。

用內建 <Chatbot> 完全不必接線。

什麼時候會出現

建議只在空的、可用的輸入框上現身:

  • 使用者已經打了字 → 不顯示。建議永遠不會蓋掉使用者寫到一半的內容。
  • 預覽模式、或正在等待工具授權(輸入框被鎖住)→ 不顯示。把 Tab 捷徑指向一個按不了的 欄位是死路。
  • run 進行中照樣顯示。這是刻意的:回覆還在串流時輸入框仍可打字,而「一邊看答案一邊排下一個 問題」正是建議最有用的時刻。

採用與清除

Tab 把建議填進輸入框——不是送出。焦點留在原地,要不要送仍然是使用者的決定, 輸入框會自己長高。

Tab 只在真的有建議可採用時被攔截。其他情況一律讓它照常移動焦點(那是鍵盤使用者離開 輸入框的唯一方法,無條件吞掉會把人困住),Shift+Tab 則永遠不攔。

建議在三種情況下被清掉:使用者採用了它(文字已經在輸入框裡,再提示一次等於重複)、送出了訊息、 或新的一輪 run 讓它過期。失去焦點刻意不算

Headless 取用

自訂外殼要自己接的話,channel 上有對應的 store:

channel.promptSuggestion$; // Observable<string | null>
channel.getPromptSuggestion(); // 快照,給非 React 的 getSnapshot() 橋接用
channel.clearPromptSuggestion(); // 採用/送出/過期時自己呼叫

React 端 useChannel() 直接給 promptSuggestionclearPromptSuggestion

這是 live-only,重新連線後不會回來

asgard.prompt_suggestion 每輪至多一則,在回覆之後、run 終止事件之前推出,而且不持久化—— 重新連線的 replay 不會帶它,所以重整之後停在 null 是正常的,不是掉幀。也沒有任何 metadata 來源可以拿來初始化它。

suggestion 保證非空字串(後端會把空的預測丟掉而不是送出),而且用對話當下的語言寫成, 前端不需要、也不應該翻譯它。

也看看