Install
openclaw skills install ask-moreMulti-LLM consultation for complex questions. Trigger when user sends "/ask [question]", "/ask" (no args, consult on recent conversation), "/ask --preset NAME [question]", or "/ask --compare [question]" (raw side-by-side, no synthesis). Spawns parallel subagents with different models, collects answers, extracts consensus/differences/conflicts, returns structured diff report with actionable synthesis. Use for second opinions, blind spot detection, and decision support.
openclaw skills install ask-moreConsult multiple LLMs in parallel, then merge answers into a structured diff report: consensus, unique insights, conflicts, and actionable next steps.
Config file: skills/ask-more/config.yaml
If missing, copy from skills/ask-more/config.example.yaml and guide user through setup (see § First-Use Setup).
models — list of model IDs (≥2), must be providers configured in the gatewaypresets — named model groups (see § Presets)synthesis_model — separate model for diff merge (must NOT be in the models pool)enable_logging — log run results to logs/runs.jsonlRun bash skills/ask-more/scripts/load-config.sh skills/ask-more to validate config. It uses proper YAML parsing and checks: model count, preset validity, synthesis_model conflicts.
When /ask is triggered but no models configured:
| Command | Description |
|---|---|
/ask [question] | Consult all configured models |
/ask | Consult on the most recent conversation topic |
/ask --preset <name> [question] | Use a named preset model group |
/ask --compare [question] | Raw compare mode: show responses side-by-side, no synthesis |
If presets is configured in config.yaml, users can select a named group:
presets:
fast:
- google/gemini-2.5-flash
- deepseek/deepseek-chat
deep:
- anthropic/claude-opus-4
- openai/gpt-4o
- google/gemini-2.5-pro
When --preset <name> is used, override the default models with the preset's list for that run. If the preset doesn't exist, list available presets and abort.
/ask <question> → use the provided question/ask (no args) → use the most recent user question/topic from conversation. If the recent topic is ambiguous, ask the user to clarify instead of guessing./ask --preset <name> ... → use preset model group/ask --compare ... → raw compare mode (skip step 6, go directly to step 7b)Pre-flight check: If the question is trivially simple or empty (e.g., /ask hi, /ask ok), warn the user that multi-model consultation may not add value for this type of question, and confirm they want to proceed.
Read config. If privacy_acknowledged is false:
⚠️ 隐私提示: ask-more 会将问题摘要发送给您配置的多个模型 provider(如 OpenAI、Google、Anthropic 等)。请勿在涉及高度敏感信息的场景使用。
继续使用即表示您已知悉。
Set privacy_acknowledged: true in config and proceed.
Before context packing, verify that configured models are likely reachable:
min_models are available, abort early with a clear messageThis prevents users from waiting through the full flow only to discover models are misconfigured.
Rewrite the user's question into a self-contained description:
Summary mode (default, context_mode: summary):
Full mode (context_mode: full):
full_mode_max_turns)Present to user:
📋 背景:[packed background]
❓ 问题:[explicit question]
⚠️ 假设:[any assumptions introduced by packing, if any]
🤖 将咨询:[model list]
💰 预估:[N] 次模型调用,约 $X.XX(rough estimate based on model pricing tiers)
确认发送?你也可以直接修改上面的问题描述。
请注意检查问题描述是否准确、中立、没有偏向性。
Wait for user response:
Dedup check: Hash the packed question. If an identical question was asked in the last 5 minutes, warn user and confirm they want to re-run (saves cost on accidental double-triggers).
For each model, spawn a subagent:
sessions_spawn(
task: <packed question + subagent prompt from references/prompt-templates.md>,
model: <model-id>,
mode: "run",
runTimeoutSeconds: <timeout_seconds>
)
Progress feedback: After spawning, show status. As each model completes, update:
⏳ 已收到 1/3 回复(Claude ✅)...
⏳ 已收到 2/3 回复(Claude ✅ GPT ✅)...
✅ 全部收到,正在合并...
State tracking per model:
pending → spawned, waitingsuccess → response receivedfailed → API error or malformed responsetimed_out → exceeded timeout_secondsAfter all models complete or time out, call sessions_yield() to collect results.
Failure handling:
failed, log reasondegenerate, include in report metadata but exclude from synthesismin_models succeeded (non-degenerate) → inform user, offer to show whatever raw responses are available, abort synthesisRead the merge prompt from references/prompt-templates.md § "Diff Merge Prompt".
If synthesis_model is configured, use it for this step. Verify synthesis_model is NOT in the consultation pool — if it is, warn and fall back to primary model.
Degenerate response handling in merge prompt:
Unanimous agreement shortcut: If all models give substantially the same answer with no meaningful unique insights or conflicts, use a shorter output:
## 🔍 Ask-More 咨询报告
📝 咨询问题:[question]
✅ 高度一致:所有模型观点基本一致。
本次咨询的增量价值有限,以下是综合要点:
- ...
- ...
🎯 综合判断:...
📊 参与模型:[all models] ✅
Normal output structure:
## 🔍 Ask-More 咨询报告
📝 咨询问题:[question]
🤝 共识观点:(多数模型都提到的)
- ...
⚠️ 共识代表被咨询模型之间的一致看法,不等于客观事实。模型可能共享相同的训练偏差。
💡 差异观点:
- 🟦 [Model A]:...
假设前提:...
- 🟩 [Model B]:...
假设前提:...
⚡ 冲突点:(模型之间互相矛盾的)
- [Model A] 认为 X,但 [Model B] 认为 Y
→ 分歧原因:...(不同假设?不同优先级?不同证据?)
⚠️ 如涉及高风险决策,请以人工判断为准,不要直接采信任何一方。
🎯 综合判断:
- 当前最佳判断:...
- 不确定性标签:[高一致性 / 假设敏感 / 证据薄弱 / 价值判断分歧]
- 信息缺口:...
- 建议下一步:...
📊 参与模型:[Model A] ✅ | [Model B] ✅ | [Model C] ⏱️超时
Chat interface adaptation: In Telegram/Discord/WhatsApp, deliver a 3-5 bullet summary first, then the full report. Avoid wall-of-text.
--compare)Skip synthesis entirely. Present each model's response in sequence:
## 🔍 Ask-More 原始对比
📝 问题:[question]
### 🟦 [Model A]
[full response]
### 🟩 [Model B]
[full response]
### 🟨 [Model C]
[full response]
📊 参与模型:[all] ✅
This mode is for users who want to judge themselves without synthesis bias.
When things go wrong, degrade gracefully instead of failing silently:
| Scenario | Action |
|---|---|
| Synthesis model fails | Fall back to primary model for merge. If that also fails, return raw responses (like --compare mode) with a note. |
Only min_models barely respond | Proceed but mark report as "⚠️ 低置信度:仅 N 个模型回复" |
| Only 1 model responds | Abort synthesis, show the single response with note: "仅收到 1 个回复,无法进行多模型对比" |
| All models time out | Abort, suggest user check model config and try again |
| Model returns refusal | Exclude from synthesis, note in report as policy difference |
| Model returns gibberish/extremely short | Exclude from synthesis, note as degenerate response |
If enable_logging: true in config, after each run, log to skills/ask-more/logs/runs.jsonl:
{
"timestamp": "2026-03-25T01:30:00+08:00",
"question_hash": "sha256_first8",
"models": ["claude-sonnet-4", "gpt-5.4", "gemini-2.5-pro"],
"results": [
{"model": "claude-sonnet-4", "status": "success", "latency_ms": 34000, "response_words": 850},
{"model": "gpt-5.4", "status": "success", "latency_ms": 44000, "response_words": 1200},
{"model": "gemini-2.5-pro", "status": "timed_out", "latency_ms": 30000}
],
"synthesis_status": "success",
"total_time_ms": 48000,
"mode": "normal"
}
Use bash skills/ask-more/scripts/log-run.sh <skill-dir> '<json>' to append.
The subagent prompt (in references/prompt-templates.md) explicitly:
The architecture supports pluggable consultation modes beyond normal and compare:
To add a mode: create a new prompt template in references/, add a command flag, and branch in step 7.
For smarter model selection, config could include per-model metadata:
model_meta:
anthropic/claude-sonnet-4:
strengths: [reasoning, nuance, safety]
cost_tier: medium
openai/gpt-4o:
strengths: [breadth, speed, coding]
cost_tier: medium