GitHub周趋势2026W25 | Headroom 压缩 95% Token、NVIDIA 开源 AI Agent 安全扫描器、…
2026-07-28
2026-07-31 0
之前研究过 claude code 的设计,用 Java 写了一个乞丐版的 claude code 开源地址 jooj 。Claude code 的 tools 都设计的非常精巧。所以想逐个研究一下。大家共同学习。
是最常见到的 tools 之一。
AskUserQuestion 是 Claude Code 内置的结构化提问工具。它不是让 Claude 输出一段问题字符串等用户回复,而是把问题渲染成一个交互式选择面板 —— 用户看到的是一组预设选项(卡片形式),而不是一段纯文字提问。
它解决的核心问题是「AI 与用户之间的高效对齐」:
在展开触发条件、技术实现、prompt 细节之前,先看一个具体场景,感受一下「不用 AskUserQuestion 会怎样 vs 用了会怎样」。
场景:用户对 Claude 说 「帮我给这个应用加个用户登录」。
这个需求描述得很不完整 —— 用哪种认证方式没定、登录凭证存哪里没定。Claude 既不能瞎猜(用户可能有团队规范),也没法直接从代码里读出来(新功能没先例)。
Claude 只能用一段自由文本把问题甩回去,大概长这样:
用户会遇到几个问题:
核心痛点:这种纯文本形式,让「协作对齐」变成了一次昂贵的自然语言往返。
Claude 会构造一个包含 两个问题 的调用:
第一个问题 ——
之前研究过 claude code 的设计,用 Java 写了一个乞丐版的 claude code 开源地址 jooj 。Claude code 的 tools 都设计的非常精巧。所以想逐个研究一下。大家共同学习。
是最常见到的 tools 之一。
AskUserQuestion 是 Claude Code 内置的结构化提问工具。它不是让 Claude 输出一段问题字符串等用户回复,而是把问题渲染成一个交互式选择面板 —— 用户看到的是一组预设选项(卡片形式),而不是一段纯文字提问。
它解决的核心问题是「AI 与用户之间的高效对齐」:
在展开触发条件、技术实现、prompt 细节之前,先看一个具体场景,感受一下「不用 AskUserQuestion 会怎样 vs 用了会怎样」。
场景:用户对 Claude 说 「帮我给这个应用加个用户登录」。
这个需求描述得很不完整 —— 用哪种认证方式没定、登录凭证存哪里没定。Claude 既不能瞎猜(用户可能有团队规范),也没法直接从代码里读出来(新功能没先例)。
Claude 只能用一段自由文本把问题甩回去,大概长这样:
用户会遇到几个问题:
核心痛点:这种纯文本形式,让「协作对齐」变成了一次昂贵的自然语言往返。
Claude 会构造一个包含 两个问题 的调用:
第一个问题 ——
需要配置第三方服务
第二个问题 ——
用户在界面上看到的是两张卡片,每张卡片顶部是那个短标签(「认证方式」/「凭证存储」),下面是 3 个 / 2 个选项 + 一个自动追加的「其它」。用户点两下选完,Claude 拿到的返回值大致是:
决策时间从几分钟压到几秒。这就是 AskUserQuestion 存在的意义 —— 不是「让 AI 问问题」,而是「让协作的每一次澄清都变得低成本」。
| 反例痛点 | AskUserQuestion 的解法 |
|---|---|
| 认知负担高 | 拆成 2 张独立卡片,一次聚焦一个决策 |
| 回答成本高 | 点选项而不是打字,权衡说明直接标在选项下 |
| Claude 解析成本高 | 返回值是明确的选项文本,不用做自然语言解析 |
| 推荐值淹没在文字里 | 「(推荐)」后缀 + 前置位置,第一眼看到 |
| 没有兜底 | 「其它」自动追加,用户想输入自定义方案永远有出口 |
这个对照本质上就是 AskUserQuestion 每个设计点的存在理由 —— 每一条都对应一个自由文本对话解决不了的痛点。带着这个直觉,再往下看触发条件、技术实现和 prompt 细节,会发现每一条约束都对应到这里的某个具体痛点。
工具的官方说明里明确写了触发边界:只有在你被卡住,而这个决策又真正属于用户时才使用。
三类该问的场景:
三类不该问的场景:
一个典型反模式:避免「这个方案 OK 吗 / 我可以继续吗」这类元问题。ExitPlanMode 本身就是「请求批准」,Ask 用来做这个纯属重复。
从工具的入参定义反推,它的核心结构可以用文字描述如下:
Claude 调用这个工具时,传入一个 问题列表(1 到 4 个问题)。列表里每一项是一个 问题对象,包含四个部分:
每个选项本身又包含三个字段:
几个关键设计点:
视觉预览字段 是一个有意思的进阶点 —— 当选项之间的差异需要「可视化对比」(比如两个界面示意图、两种代码风格),把内容塞在这个字段里,界面会在聚焦某个选项时渲染出来。这对「选哪种 API 设计 / 选哪种排版」这种问题特别有用。
与 EnterPlanMode / ExitPlanMode 的分工:
三个工具串起来是一条完整的决策流水线:Ask 澄清 → EnterPlanMode 展开 → ExitPlanMode 拍板。
工具官方说明里每一句都在给 Claude 塞一条行为约束,逐条拆一下:
约束 1:严格的适用边界(开篇第一句)
这句话在训练 Claude「不要主动打扰」—— 遇到不确定,第一反应应该是先查代码、先用合理默认值,而不是甩问题给用户。
约束 2:「其它」逃生舱的透明化
系统不是把这个选项藏起来让 Claude 假装不知道 —— 而是明确告诉 Claude「其它会自动加,你不用列」。这样 Claude 不会浪费一个选项去手写「自定义」。
约束 3:多选参数的语义
对应场景:选多个功能开关 / 多个环境 / 多个要修的文件。默认单选保护用户不被过多选择卡住。
约束 4:推荐值的表达形式
有意思的点:推荐值不是单独字段,而是通过「约定俗成的位置 + 后缀」实现的。好处:
约束 5:与计划模式的时序关系
这段是最有教学价值的 —— 明确了整套流程的时序:
尤其注意原文最后半句 —— 「用户在你调用 ExitPlanMode 之前根本看不到方案」—— 这才是「不要在计划模式里问『方案 OK 吗』」的真正原因:不是重复,而是用户根本没东西可批。
三个工具各司其职:Ask 澄清 / EnterPlanMode 展开 / ExitPlanMode 拍板。这套约束本质上是在阻止 Claude 在计划模式里绕回来用 Ask 做「批准」这件事。
约束 6:卡片短标签是必填字段(结构层强制)
这是一个交互约束 —— 界面里每个问题渲染成一张卡片,卡片顶端的标签用这个短字符串,而不是完整的问题文本。这就要求 Claude 把长问题浓缩成一个短标签(比如「登录流程应该用哪种认证方式?」的短标签就是「认证方式」)。
约束 7:问题必须以问号结尾
看似很小的一条,但决定了界面的自然度 —— 问句语气 vs 陈述语气对用户的心理暗示完全不同。这也间接强制 Claude 把内容组织成「真正的疑问」而不是「疑似指令」。
小结:AskUserQuestion 的精妙之处,不在于它「让 AI 问用户问题」这个功能本身,而在于它通过入参结构约束 + prompt 约束,把「什么时候问 / 怎么问 / 用什么形式呈现 / 和谁配合」 全都规范住了。相当于把「AI 提问」这个泛用能力,收敛成一个可预测、可组合、可维护的交互原语。
需要配置第三方服务
第二个问题 ——
用户在界面上看到的是两张卡片,每张卡片顶部是那个短标签(「认证方式」/「凭证存储」),下面是 3 个 / 2 个选项 + 一个自动追加的「其它」。用户点两下选完,Claude 拿到的返回值大致是:
决策时间从几分钟压到几秒。这就是 AskUserQuestion 存在的意义 —— 不是「让 AI 问问题」,而是「让协作的每一次澄清都变得低成本」。
| 反例痛点 | AskUserQuestion 的解法 |
|---|---|
| 认知负担高 | 拆成 2 张独立卡片,一次聚焦一个决策 |
| 回答成本高 | 点选项而不是打字,权衡说明直接标在选项下 |
| Claude 解析成本高 | 返回值是明确的选项文本,不用做自然语言解析 |
| 推荐值淹没在文字里 | 「(推荐)」后缀 + 前置位置,第一眼看到 |
| 没有兜底 | 「其它」自动追加,用户想输入自定义方案永远有出口 |
这个对照本质上就是 AskUserQuestion 每个设计点的存在理由 —— 每一条都对应一个自由文本对话解决不了的痛点。带着这个直觉,再往下看触发条件、技术实现和 prompt 细节,会发现每一条约束都对应到这里的某个具体痛点。
工具的官方说明里明确写了触发边界:只有在你被卡住,而这个决策又真正属于用户时才使用。
三类该问的场景:
三类不该问的场景:
一个典型反模式:避免「这个方案 OK 吗 / 我可以继续吗」这类元问题。ExitPlanMode 本身就是「请求批准」,Ask 用来做这个纯属重复。
从工具的入参定义反推,它的核心结构可以用文字描述如下:
Claude 调用这个工具时,传入一个 问题列表(1 到 4 个问题)。列表里每一项是一个 问题对象,包含四个部分:
每个选项本身又包含三个字段:
几个关键设计点:
视觉预览字段 是一个有意思的进阶点 —— 当选项之间的差异需要「可视化对比」(比如两个界面示意图、两种代码风格),把内容塞在这个字段里,界面会在聚焦某个选项时渲染出来。这对「选哪种 API 设计 / 选哪种排版」这种问题特别有用。
与 EnterPlanMode / ExitPlanMode 的分工:
三个工具串起来是一条完整的决策流水线:Ask 澄清 → EnterPlanMode 展开 → ExitPlanMode 拍板。
工具官方说明里每一句都在给 Claude 塞一条行为约束,逐条拆一下:
约束 1:严格的适用边界(开篇第一句)
这句话在训练 Claude「不要主动打扰」—— 遇到不确定,第一反应应该是先查代码、先用合理默认值,而不是甩问题给用户。
约束 2:「其它」逃生舱的透明化
系统不是把这个选项藏起来让 Claude 假装不知道 —— 而是明确告诉 Claude「其它会自动加,你不用列」。这样 Claude 不会浪费一个选项去手写「自定义」。
约束 3:多选参数的语义
对应场景:选多个功能开关 / 多个环境 / 多个要修的文件。默认单选保护用户不被过多选择卡住。
约束 4:推荐值的表达形式
有意思的点:推荐值不是单独字段,而是通过「约定俗成的位置 + 后缀」实现的。好处:
约束 5:与计划模式的时序关系
这段是最有教学价值的 —— 明确了整套流程的时序:
尤其注意原文最后半句 —— 「用户在你调用 ExitPlanMode 之前根本看不到方案」—— 这才是「不要在计划模式里问『方案 OK 吗』」的真正原因:不是重复,而是用户根本没东西可批。
三个工具各司其职:Ask 澄清 / EnterPlanMode 展开 / ExitPlanMode 拍板。这套约束本质上是在阻止 Claude 在计划模式里绕回来用 Ask 做「批准」这件事。
约束 6:卡片短标签是必填字段(结构层强制)
这是一个交互约束 —— 界面里每个问题渲染成一张卡片,卡片顶端的标签用这个短字符串,而不是完整的问题文本。这就要求 Claude 把长问题浓缩成一个短标签(比如「登录流程应该用哪种认证方式?」的短标签就是「认证方式」)。
约束 7:问题必须以问号结尾
看似很小的一条,但决定了界面的自然度 —— 问句语气 vs 陈述语气对用户的心理暗示完全不同。这也间接强制 Claude 把内容组织成「真正的疑问」而不是「疑似指令」。
小结:AskUserQuestion 的精妙之处,不在于它「让 AI 问用户问题」这个功能本身,而在于它通过入参结构约束 + prompt 约束,把「什么时候问 / 怎么问 / 用什么形式呈现 / 和谁配合」 全都规范住了。相当于把「AI 提问」这个泛用能力,收敛成一个可预测、可组合、可维护的交互原语。