mcpField
A
ask-many-models

ask-many-models

github.com/hartreeworksAgent 工作流251 次安装12 周前更新
代码仓库

关于 ask-many-models

Ask Many Models 是一项技能,可将提示词并行发送给多个 AI 模型,并综合回复形成分析。它会引导澄清和确认提示词,并要求用户先选择模型,再执行查询。

主要功能

  1. 01澄清并起草初始提示词
  2. 02建议可纳入的相关问题
  3. 03查询前提供模型选择
  4. 04并行查询选定模型
  5. 05综合回复生成统一分析

适用场景

  1. 01收集多个模型对问题的观点
  2. 02通过补充背景完善提示词
  3. 03比较模型对决策或评审的回复

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/hartreeworks/skill--ask-many-models --skill ask-many-models

安装后在 Claude Code 中输入/ask-many-models确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

.gitignore
.env.example
package.json
README.md
models.json
config.example.json
tsconfig.json
yarn.lock
commands/
amm.md
data/
user-defaults.example.json
references/
cli-reference.md
synthesis-prompts.md
scripts/
context.ts
notify.ts
validate-keys.ts
synthesis.ts
resynthesise.ts
models.ts
deep-research-query.ts
query.ts

详细介绍

询问多个模型

将同一提示词并行发送给多个 AI 模型,并综合它们的回复,形成统一分析。

触发此技能时(通过 /amm 或自然语言),请执行以下步骤。不要只描述此技能的作用。

步骤 1:获取种子提示词

A)冷启动(对话刚开始,没有先前讨论): 如果用户提供了提示词或问题,就将其作为种子。否则询问:“你想发送给多个 AI 模型的问题是什么?”

B)对话进行中(此前已有实质性讨论): 将用户的调用消息作为种子,并将此前的对话作为背景信息。

种子确定后,继续执行步骤 1a。

步骤 1a:决定是否需要澄清

仅凭种子很少能写出最有力的提示词。简短的澄清问答通常能带来更好的结果——但对已经具体明确的提示词强行提问,只会增加阻碍。

如果符合以下任一条件,跳过问答,直接开始起草(步骤 1d):

  • 用户明确表示“直接起草”“开始”“跳过问题”“不要提问”或类似意思。
  • 种子已经足够长且具体(大约超过 300 个字符,并说明意图、受众和限制条件)。
  • 对话进行中,且此前的讨论已经明确了意图。

只有这三种情况可以跳过。澄清和构思环节是此技能的关键,因此,笼统认为用户想继续推进——包括在自动模式下运行——并不能作为跳过的理由。

如果情况不明确,只问一次。如果可以使用 AskUserQuestion,就调用一次 AskUserQuestion,提出一个问题。如果无法使用,则输出:“我可以先问 2–3 个简短的澄清问题,也可以直接起草——你选哪种?(1)澄清(2)起草”,然后等待回复。

步骤 1b:明确意图(定制问答)

目标:找出这个问题背后真正的动机,以及什么样的回答会让人觉得有用。提出 2–4 个定制问题。切勿使用套话。

始终包含一个动机问题。 根据具体的种子问题拟定 3–4 个动机选项,再加一个“其他”自由文本字段。定制比面面俱到更重要——泛泛的动机选项还不如不问。

示例——对于类似 “我该重写某个邮件应用的引导流程吗?” 的种子问题:

  1. 决定是否要重写
  2. 对我已经在计划的重写方案进行压力测试
  3. 想出我尚未考虑过的方案
  4. 找出不该这么做的理由

对于类似 “解释 MCP 服务的工作原理” 的种子问题:

  1. 快速建立心智模型,便于快速浏览
  2. 深入理解,以便自己实现一个
  3. 与替代方案(插件、钩子)进行比较
  4. 向非技术人员解释

然后,根据问题类型再添加 1–2 个定制问题:

  • 决策 → 决策标准(成本 / 速度 / 可逆性 / 选择余地)和时间范围。
  • 解释说明 → 深度、受众、已有知识。
  • 批评或评审 → 希望得到哪种质疑(唱反调 / 为替代方案辩护 / 侧重数据 / 发现风险)。
  • 生成方案 → 约束范围(时间限制、预算、还涉及哪些人)。
  • 预测或预判 → 时间范围,以及哪些情况会改变用户的看法。

不好的示例(套话——不要这样做):

  1. “背景是什么?”
  2. “受众是谁?”
  3. “回答要多长?”

好的示例(针对 “我该淘汰 Outlook 插件吗?”):

  1. 真正的驱动因素是什么?(4 个动机选项 + 其他)
  2. 哪个更重要:减轻维护负担,还是让用户群满意?
  3. 时间范围——接下来 3 个月,还是接下来 2 年?

提问方式:

当 AskUserQuestion 可用时(Claude Code),使用一次 AskUserQuestion 调用,包含全部 2–4 个问题。采用单选(multiSelect: false)。每个选项都要有一个简短标签和一行说明。每个问题只提供 3–4 个实际选项——运行时会自动添加“其他”自由文本字段。不要手动添加“其他”选项(这会使问题超过 4 个选项的上限)。

当 AskUserQuestion 不可用时(Codex 或其他运行环境),以编号列表形式列出问题。为每个问题明确添加“其他(自由填写)”选项,因为运行时不会自动添加。请用户每个问题回复一行。格式示例:

A few quick clarifying questions:

Q1 — What's really driving this?
  1. Decide whether to do the rewrite at all
  2. Stress-test a rewrite I'm already planning
  3. Generate options I haven't considered
  4. Find reasons NOT to do it
  5. Other (type freely)

Q2 — Which matters more: cutting maintenance burden, or keeping the user base happy?
  1. Cutting maintenance burden
  2. Keeping the user base happy
  3. Other (type freely)

Reply with one line per question, e.g.:
  Q1: 2
  Q2: 1
or use free text where Other applies, e.g. "Q1: I want to compare against alternatives I haven't thought of".
步骤 1c:构思延伸角度(相关角度)

澄清后,拟定 3–5 个种子问题未明确提出、但通常很有帮助的相关角度或子问题。每个选项都需要一行理由说明。

针对 “我该淘汰 Outlook 插件吗?” 的示例:

  • “还可以问:要看到什么,我才会改变主意?”——找出观点更新的条件。
  • “还可以问:无论如何,最主要的 3 个失败模式是什么?”——对称地分析风险。
  • “换个角度:如果我今天才开始,会不会开发这个?”——厘清沉没成本。
  • “还可以问:先验证这个假设的最低成本实验是什么?”——找出成本更低的替代方案。

以多选形式呈现。始终包含一个“都不选——只回答原始问题”选项。

当 AskUserQuestion 可用时,使用一次 AskUserQuestion 调用,并设置 multiSelect: true。

当 AskUserQuestion 不可用时,以编号列表形式列出选项,并要求用户用逗号分隔的数字回复(或回复“都不选”):

Adjacent angles I could bundle in (pick any, comma-separated, or "none"):

  1. Also ask: what would I need to see to change my mind?
     — surfaces update conditions, useful for forecasting decisions
  2. Also ask: top 3 failure modes either way
     — symmetric risk analysis
  3. Reframe as: if I were starting today, would I build this?
     — disentangles sunk cost from forward-looking value
  4. Also ask: cheapest experiment to test the hypothesis first
     — surfaces lower-cost alternatives
  5. None

Reply with numbers (e.g. "1, 3") or "none".

如果用户选择都不选或跳过,也没关系——继续处理。

Step 1d:起草并批准提示词

起草一份全面的提示词。直接纳入 Step 1b 的回答:用它们填充草稿中的动机、标准、受众、深度和时间范围。根据 Step 1c 中选择和跳过的延伸问题,决定要将哪些子问题合并进去。

提示词应:

  1. 涵盖完整背景 —— 相关背景、约束和目标。
  2. 包含实质内容 —— 实际摘录、代码片段或数据,而不只是文件引用。
  3. 说明明确的动机 —— 从 Step 1b 的动机回答中提炼出一行明确表述:"我想做 X,因为 Y。"
  4. 清楚说明核心问题 —— 主要问题,以及 Step 1c 中合并的任何延伸问题。
  5. 注明约束或偏好 —— 深度、格式、受众、时间范围(根据 Step 1b 的回答提取)。

提示词起草检查清单:

  • 背景信息(至少 2–4 个段落)
  • 任何相关文件内容或代码(包含实际内容,而不是“参见附件”)
  • 明确说明动机(摘自 Step 1b)
  • 主要问题 + 合并的延伸问题(摘自 Step 1c)
  • 约束/受众/时间范围(摘自 Step 1b)
  • 有用的回复格式/深度

宁可提供更多背景,也不要少于所需。其他模型无法访问这段对话,它们只能看到提示词。看起来“太长”的提示词通常长度刚好。

使用 heredoc 将草稿保存到一个独一无二的文件名,以避免与并发会话冲突,并保留格式:

slug="$(date +%s)"
cat > "/tmp/amm-prompt-draft-$slug.md" <<'EOF'
<paste full prompt text here>
EOF
open "/tmp/amm-prompt-draft-$slug.md"

打开文件后,还要用 2–3 句话在线总结,让用户无需切换窗口即可反馈。

批准消息取决于已执行的步骤:

  • 如果 Step 1b 和 Step 1c 都已执行,且用户至少选择了一个延伸问题:

    "已起草。**已包含的延伸问题:**失败模式、成本最低的实验。**已跳过:**重新界定问题、改变主意的条件。如果你想修改,请告诉我;或者回复“go”继续。"

  • 如果已执行 Step 1c,但用户选择了“none”:

    "已根据你的澄清回答起草——未合并额外延伸问题。如果你想修改,请告诉我;或者回复“go”继续。"

  • 如果 Step 1a 跳过了澄清:

    "我已起草提示词。请检查并告诉我是否需要修改,或者回复“go”继续。"

Step 2:模型选择

始终显示模型选择菜单,并在运行任何查询前等待用户选择。绝不要假设用户想用哪些模型,即使用户提供了提示词文件路径或似乎想要快速回答。始终由用户选择。

通过运行命令来打印菜单——models.json 是唯一可信来源,切勿凭记忆转录选项:

cd "$HOME/.claude/skills/ask-many-models" && yarn query menu

向用户显示其输出并等待用户输入数字。此处不要使用 AskUserQuestion;它最多只能显示四个选项。

用户可以只输入数字(例如 1),也可以输入数字后跟 SYS(例如 1 SYS、2 sys)。解析数字以选择模型。如果存在 SYS(不区分大小写),则在确定模型后继续执行 Step 2b。

最后一个选项是选择单个模型。如果用户选择此项,则打印选择器并要求用户输入以逗号分隔的数字:

cd "$HOME/.claude/skills/ask-many-models" && yarn query menu --pick

根据该输出将用户输入的数字映射回模型 ID,并像上面一样检查是否包含 SYS。

步骤 2b:系统提示词(仅当用户输入了 SYS)

仅当用户在模型选择输入中包含 SYS 时才运行此步骤。否则跳至步骤 3。

  1. 检查已保存的提示词:查看 $HOME/.claude/skills/ask-many-models/data/system-prompts.json。如果文件不存在,则将已保存提示词列表视为空。
  2. 如果存在已保存的提示词,使用字母标签显示:
Saved system prompts:

  A) Expert VC analyst — You are an experienced venture capital...
  B) Devil's advocate — Challenge every assumption...

  N) Write a new system prompt

Select (A/B/.../N):
  1. 如果用户选择了一个字母,则将对应已保存提示词的内容用作系统提示词。
  2. 如果用户选择 N,请让他们输入或粘贴系统提示词。然后询问他们是否要保存:
    • 如果要保存,请询问名称,然后使用以下命令将其添加到 system-prompts.json:
      mkdir -p "$HOME/.claude/skills/ask-many-models/data"
      if [ ! -f "$HOME/.claude/skills/ask-many-models/data/system-prompts.json" ]; then printf '{"prompts":[]}\n' > "$HOME/.claude/skills/ask-many-models/data/system-prompts.json"; fi
      jq --arg name "<name>" --arg content "<content>" '.prompts += [{"name": $name, "content": $content}]' "$HOME/.claude/skills/ask-many-models/data/system-prompts.json" > /tmp/amm-sysprompts-tmp.json && mv /tmp/amm-sysprompts-tmp.json "$HOME/.claude/skills/ask-many-models/data/system-prompts.json"
      
  3. 将系统提示词保存到临时文件,并在步骤 4 中通过 --system-prompt <path> 传入。

如果用户直接按 Enter(输入为空),则跳过,不使用系统提示词。

步骤 3:检查图片

如果对话中包含图片,将其保存到: $HOME/.claude/skills/ask-many-models/data/model-outputs/image-TIMESTAMP.png

不支持视觉的模型只会收到文本提示词,以及一条说明已提供图片的备注。menu --pick 的输出会标记哪些模型支持图片。

步骤 4:运行查询

如果用户选择了预设,则传入预设名称;如果用户自行选择了模型,则传入明确的模型 ID。

不要使用 --synthesise 运行——综合结果会在步骤 4b 中通过会话内子 Agent 生成,这样使用的是操作者现有的计划额度,而不是按量计费的 Anthropic API:

cd "$HOME/.claude/skills/ask-many-models" && yarn query \
  --preset "<preset-name>" \
  --output-format both \
  [--image "<path>"] \
  [--system-prompt "<path>"] \
  "<prompt>"

对于用户单独选择的模型集合,将 --preset 替换为 --models "<id1>,<id2>,..."。

脚本会打印自动生成的输出目录路径(data/model-outputs/<timestamp>-<slug>/),并写入 results.md、results.html、responses.json、prompt.md 和 individual/<model>.md 文件。

开始运行深度研究预设之前,请提醒用户所需时长——这些模型每个需要 10–20 分钟。

步骤 4b:在会话内综合结果(子 Agent)

从步骤 4 的标准输出中获取输出目录路径,然后启动一个通用子 Agent 来生成综合结果:

Agent tool with subagent_type: "general-purpose"
description: "Synthesise multi-model responses"
prompt: |
  Read the following files and produce a synthesis of the model responses.

  Prompt: <output-dir>/prompt.md
  Individual model responses: <output-dir>/individual/*.md
  (Skip any file whose content starts with "**Error:**" — that model failed.)

  Produce an executive-depth synthesis with these sections, using British English
  and sentence-case headings:

  ## Overview
  (1 short paragraph — the core question and the shape of the answer.)

  ## Points of consensus
  (Bullets — points where 2+ models agree, with [model] attribution tags.)

  ## Points of disagreement
  (Bullets — contradictions with a short pros/cons. Tag each view with [model].)

  ## Unique insights
  (Bullets — valuable points only one model raised. Tag with [model].)

  ## Confidence level
  (One paragraph — how much to trust this synthesis and why.)

  Write the synthesis to /tmp/amm-synthesis-<slug>.md and return only the file path.
  Do NOT edit results.md, results.html, or any file in the output directory —
  the orchestrator will handle insertion.

子 Agent 返回综合结果文件路径后,运行插入辅助程序:

cd "$HOME/.claude/skills/ask-many-models" && \
  npx tsx scripts/resynthesise.ts "<output-dir>" --file "<synthesis-file>"

这会将综合结果插入 results.md 顶部(位于 # Multi-Model Query 元数据之后、首个模型部分之前),并重新生成 results.html。

备用方案——如果因任何原因需要通过 API 综合结果(无人值守运行,或会话内上下文卡住),省略 --file:

npx tsx scripts/resynthesise.ts "<output-dir>"

这会通过 Anthropic API 调用 Claude Opus 4.8,并消耗令牌。

步骤 5:打开结果

告知用户“正在查询:[models]”,然后打开结果文件。如果 data/user-defaults.json 存在,请检查其中的 open_preference:

  • "html" → open "<output-dir>/results.html"
  • "markdown"(或未设置)→ open "<output-dir>/results.md"

资源

  • references/cli-reference.md — 完整的命令和选项参考、模型配置、API 密钥、输出结构、综合结果、深度研究和错误处理。
  • models.json — 模型和预设的唯一事实来源。只需在其中添加模型;菜单会据此生成。

评论

支持 Markdown