跳至主要內容

askUserTool

這是一個不限定 Agent 的內建 Tool,會向使用者提問並等待回覆。此 Tool 支援自由文字問題、單選提示與多選提示。

此 Tool 透過原生的 Tool 暫停機制暫停執行:它會使用問題 payload 呼叫 suspend(),讓 Agent 發出 tool-call-suspended 事件並保存執行狀態。使用 agent.resumeStream(answer, { runId }) 繼續執行。

若在 Agent 執行之外使用(無法使用 suspend),此 Tool 會回傳一段便於閱讀的備援字串,其中包含問題與選項。

使用範例
「使用範例」的直接連結

askUserTool 加入 Agent 的 Tool 集合:

src/mastra/agents/index.ts
import { Agent } from '@mastra/core/agent'
import { askUserTool } from '@mastra/core/tools'

const agent = new Agent({
id: 'assistant',
name: 'Assistant',
instructions: 'Ask the user for clarification when the request is ambiguous.',
model,
tools: { askUserTool },
})

處理暫停並繼續執行:

src/run.ts
const stream = await agent.stream('Summarize my project')

for await (const chunk of stream.fullStream) {
if (chunk.type === 'tool-call-suspended') {
const { question, options, selectionMode } = chunk.payload.suspendPayload
// Present the question to the user, collect their answer, then resume:
const resumed = await agent.resumeStream('The main repo', { runId: stream.runId })
for await (const c of resumed.textStream) process.stdout.write(c)
}
}

若是多選提示,請使用字串陣列繼續執行:

await agent.resumeStream(['Add tests', 'Update docs'], { runId: stream.runId })

輸入 schema
「輸入 schema」的直接連結

模型會使用下列參數呼叫此 Tool:

question:

string
要詢問使用者的問題,不得為空。

options?:

AskUserOption[]
提供給使用者的結構化選項。省略時會使用自由文字提示。
AskUserOption

label:

string
此選項的簡短顯示文字。選取後,會將這個值回傳給模型。

description?:

string
此選項含義的說明。

selectionMode?:

'single_select' | 'multi_select'
控制使用者可選取的選項數量。提供 options 時,預設為 'single_select'。必須同時提供 options。

暫停 payload
「暫停 payload」的直接連結

tool-call-suspended 事件會攜帶 suspendPayload,其結構與輸入相同:

question:

string
目前向使用者提出的問題。

options?:

AskUserOption[]
結構化選項(如有)。

selectionMode?:

'single_select' | 'multi_select'
解析後的選取模式。自由文字提示會省略此欄位。

繼續執行的資料
「繼續執行的資料」的直接連結

將使用者的回答傳給 agent.resumeStream()

  • 自由文字與單選: 一個 string
  • 多選: 由所選選項標籤組成的 string[]