跳到主要内容

askUserTool

这是一个内置且与 Agent 无关的 Tool,用于向用户提问并等待回答。该 Tool 支持自由文本问题、单选提示和多选提示。

该 Tool 通过原生的 Tool 暂停机制实现暂停:它会使用问题载荷调用 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'
控制用户可以选择多少个选项。提供选项时默认为 'single_select'。必须同时提供选项。

暂停载荷
暂停载荷的直接链接

tool-call-suspended 事件携带一个 suspendPayload,其结构与输入相同:

question:

string
正在询问的问题。

options?:

AskUserOption[]
结构化选项(如果有)。

selectionMode?:

'single_select' | 'multi_select'
解析后的选择模式。自由文本提示会省略此项。

恢复数据
恢复数据的直接链接

将用户的回答传给 agent.resumeStream()

  • 自由文本和单选: 一个 string
  • 多选: 一个由所选选项标签组成的 string[]