ModelShow — Professional Multi-Model Evaluation
ModelShow provides a sophisticated framework for comparing AI model responses through double-blind evaluation. The system queries multiple models in parallel, anonymizes their outputs, and uses an independent judge model to rank responses purely on merit.
Key Features
- - Architecturally Guaranteed De-anonymization: The judge sub-agent automatically de-anonymizes results before returning them—orchestrators never see placeholder labels
- Cryptographic Randomization: Responses are presented to the judge in cryptographically secure random order using INLINECODE0
- Holistic Judge Analysis: Judges provide both per-model rankings and comprehensive "Overall Assessment" analyzing cross-model patterns
- Intelligent Polling: Automatic progress monitoring with content-free status updates and immediate completion detection
- Professional Output: Formatted results with scores, judge commentary, and actionable insights
Detection
Trigger: Message starts with mdls or modelshow (case-insensitive). Extract the prompt by removing the trigger keyword.
Example: mdls explain quantum entanglement → prompt = INLINECODE4
Workflow
CODEBLOCK0
Step 1: Acknowledge & Load Configuration
Immediate Response:
CODEBLOCK1
Load Configuration: Read {baseDir}/config.json for model list, judge model, timeouts, and other settings.
Step 2: Spawn Parallel Model Agents
For each model in config.models:
- - Model: The model alias (e.g.,
pro, grok, kimi) - Label:
mdls-{model}-{timestamp} (unique identifier) - Timeout:
config.timeoutSeconds (default: 360 seconds) - Task:
CODEBLOCK2
Parallel Execution: If config.parallel is true, spawn all agents simultaneously.
Context Handling: If the prompt references external content (URLs, files, preferences), fetch and prepend this context to the task.
Step 3: Collect Responses with Intelligent Polling
Polling Strategy:
- - Poll every 20 seconds
- Exit immediately when all agents complete
- Minimum 3 polls before considering timeout
- Maximum runtime: INLINECODE14
Status Updates (content-free):
- - INLINECODE15
- INLINECODE16
Response Collection:
CODEBLOCK3
Minimum Success Check: If successful responses < config.minSuccessful, abort with informative message.
Step 4: Anonymize with Cryptographic Randomization
Execute the anonymization pipeline:
CODEBLOCK4
Key Features:
- -
shuffle: true ensures cryptographically random response order - Labels are assigned as "Response A", "Response B", etc.
- INLINECODE19 tracks label-to-model mapping for later de-anonymization
Step 5: Spawn Judge+Deanon Sub-Agent
The judge sub-agent performs both evaluation and de-anonymization in a single atomic operation:
Judge Task Structure:
CODEBLOCK5
Judge Model: Uses config.judgeModel (e.g. sonnet, gemini31or)
Step 6: Parse De-anonymized Results
The judge sub-agent returns:
- -
deanonymized_judge_output: Full judgment with real model names - INLINECODE24 : Structured ranking data
- INLINECODE25 : Boolean verification
Architectural Guarantee: The orchestrator never receives placeholder labels—only de-anonymized results.
Step 7: Build Formatted Output
Create professional presentation:
CODEBLOCK6
⚠️ WARNING: Step 8 is MANDATORY.
Sending results to the user is NOT the end of the task.
You MUST execute Step 8 (save_results) immediately after sending.
The task is NOT complete until save_results.py returns {"success": true}.
Do NOT skip, defer, or omit Step 8 under any circumstances.
Step 8: Save Results
🚨 THIS STEP IS REQUIRED. DO NOT SKIP.
After every ModelShow run, you MUST save the results using save_results.py.
Failure to save means the results are not persisted for later use.
Save to config.outputDir (default: ~/.openclaw/workspace/modelshow-results):
- - JSON: INLINECODE31
- Markdown: INLINECODE32
Exact JSON payload to pipe into save_results.py:
CODEBLOCK7
Execute the save command:
CODEBLOCK8
Verify success: The script MUST return {"success": true, ...}. If it returns an error, fix and retry. Do NOT proceed without a successful save.
Optional: For building a local index of result files (e.g. for a custom dashboard or static site) or for web display (e.g. rexuvia.com), see update_modelshow_index.py. This is not part of the mandatory workflow.
✅ Only after save_results.py returns success is the ModelShow task complete.
Configuration (config.json)
| Key | Description | Default |
|---|
| INLINECODE38 | Primary trigger | INLINECODE39 |
| INLINECODE40 |
Also trigger on |
["modelshow"] |
|
models | List of model aliases to compare |
["pro", "sonnet", "deepseek", "gpt4", "grok", "kimi"] |
|
judgeModel | Model for double-blind evaluation |
"sonnet" |
|
outputDir | Where to save result files |
"~/.openclaw/workspace/modelshow-results" |
|
timeoutSeconds | Maximum wait time per model |
360 |
|
minSuccessful | Minimum responses to proceed |
2 |
|
parallel | Run models in parallel |
true |
|
showTopN | Number of top results to display |
10 |
|
includeResponseText | Include full responses in output |
true |
|
blindJudging | Enable anonymization |
true |
|
blindJudgingLabels | Label style for anonymization |
"alphabetic" |
|
shuffleBlindOrder | Randomize response order |
true |
File Structure
CODEBLOCK9
Scripts
judge_pipeline.py
Core pipeline for anonymization and de-anonymization:
- -
action: "anonymize": Creates cryptographically randomized blind responses action: "finalize": De-anonymizes judge output and extracts rankings
save_results.py
Saves results in both JSON and Markdown formats with specialized extraction of the "Overall Assessment" section from judge output. Results are written to
config.outputDir for local use, scripting, or your own tooling.
update_modelshow_index.py
Optional utility to build a local index of result JSON files (e.g. for a custom dashboard or static site) or to update the web index for rexuvia.com. Not required for the core workflow.
Usage Examples
Basic Comparison:
CODEBLOCK10
Creative Task:
CODEBLOCK11
Technical Analysis:
CODEBLOCK12
Code Review:
CODEBLOCK13
Best Practices
- 1. Prompt Clarity: Provide clear, specific prompts for meaningful comparisons
- Model Selection: Choose models with complementary strengths for the task type
- Context Inclusion: Reference relevant context when appropriate
- Result Interpretation: Consider both scores and the judge's holistic assessment
- Tailor config: Update
config.json to match the models available on your instance - Web Integration: Optionally use
update_modelshow_index.py to publish results
Integration Points
- - Local storage: Results are saved as JSON and Markdown in
config.outputDir for local use, scripting, or your own tooling - Web display: Use
update_modelshow_index.py to make results available online - Cron Automation: Can be scheduled for regular comparative analysis
- API Access: JSON results enable programmatic analysis
ModelShow represents state-of-the-art in AI model comparison, combining rigorous methodology with practical usability for both casual exploration and professional evaluation.
ModelShow — 专业多模型评估
ModelShow 提供了一个精密的框架,通过双盲评估来比较 AI 模型的响应。该系统并行查询多个模型,对其输出进行匿名化处理,并使用独立的评判模型纯粹根据质量对响应进行排名。
主要特性
- - 架构级去匿名化保证:评判子代理在返回结果前自动进行去匿名化处理——编排器永远不会看到占位标签
- 加密随机化:使用 secrets.SystemRandom() 以加密安全的随机顺序向评判者呈现响应
- 整体评判分析:评判者提供每个模型的排名以及分析跨模型模式的综合总体评估
- 智能轮询:自动进度监控,提供无内容的状态更新和即时完成检测
- 专业输出:格式化的结果,包含分数、评判评论和可操作的见解
检测
触发条件:消息以 mdls 或 modelshow 开头(不区分大小写)。通过移除触发关键词来提取提示。
示例:mdls explain quantum entanglement → 提示 = explain quantum entanglement
工作流程
步骤 1 → 确认并加载配置
步骤 2 → 生成并行模型代理
步骤 3 → 通过智能轮询收集响应
步骤 4 → 使用加密随机化进行匿名化
步骤 5 → 生成评判+去匿名化子代理
步骤 6 → 解析去匿名化结果
步骤 7 → 构建格式化输出
步骤 8 → 保存结果(可选通过 updatemodelshowindex.py 更新网页索引)
步骤 1:确认并加载配置
即时响应:
🔄 ModelShow 正在启动——并行查询模型。
评判完成后结果将自动显示。
加载配置:读取 {baseDir}/config.json 获取模型列表、评判模型、超时设置和其他配置。
步骤 2:生成并行模型代理
对于 config.models 中的每个模型:
- - 模型:模型别名(例如 pro、grok、kimi)
- 标签:mdls-{model}-{timestamp}(唯一标识符)
- 超时:config.timeoutSeconds(默认:360 秒)
- 任务:
{config.systemPrompt}
{提取的用户提示}
并行执行:如果 config.parallel 为 true,则同时生成所有代理。
上下文处理:如果提示引用了外部内容(URL、文件、偏好设置),则获取并将此上下文前置到任务中。
步骤 3:通过智能轮询收集响应
轮询策略:
- - 每 20 秒轮询一次
- 所有代理完成后立即退出
- 考虑超时前至少进行 3 次轮询
- 最大运行时间:config.timeoutSeconds
状态更新(无内容):
- - ⏳ 模型正在响应... {done}/{total} 完成。(已用 {elapsed} 秒)
- ✅ 所有 {N} 个模型已响应。正在发送给评判者...
响应收集:
python
collected_responses = {
model_name: {
status: completed | failed | timeout,
text: response text or empty string,
duration_seconds: duration
}
}
最低成功检查:如果成功响应数 < config.minSuccessful,则中止并显示信息性消息。
步骤 4:使用加密随机化进行匿名化
执行匿名化管道:
bash
echo {
action: anonymize,
responses: {model: response_dict},
label_style: alphabetic,
shuffle: true
} | python3 {baseDir}/judge_pipeline.py
主要特性:
- - shuffle: true 确保加密安全的随机响应顺序
- 标签分配为响应 A、响应 B等
- anonymization_map 跟踪标签到模型的映射,用于后续去匿名化
步骤 5:生成评判+去匿名化子代理
评判子代理在单个原子操作中执行评估和去匿名化:
评判任务结构:
你是一个公正的评判者兼数据处理者。
你的任务包含两部分。在返回任何内容之前完成两部分。
═══════════════════════════════════════════════════════════
第 1 部分:评判响应
═══════════════════════════════════════════════════════════
[带有占位标签的盲响应]
═══════════════════════════════════════════════════════════
第 2 部分:处理你的评判
═══════════════════════════════════════════════════════════
- 1. 撰写你的评判,评估响应 A、响应 B 等
- 为每个响应包含分数(1-10)
- 提供分析跨模型模式的总体评估部分
撰写完你的评判后,运行此命令:
echo {
action: finalize,
judge_output: [你的评判文本],
anonymizationmap: {anonymizationmap}
} | python3 {baseDir}/judge_pipeline.py
仅返回该命令的 JSON 输出。
评判模型:使用 config.judgeModel(例如 sonnet、gemini31or)
步骤 6:解析去匿名化结果
评判子代理返回:
- - deanonymizedjudgeoutput:包含真实模型名称的完整评判
- rankedmodelsdeanonymized:结构化排名数据
- deanonymization_complete:布尔验证
架构级保证:编排器永远不会收到占位标签——只收到去匿名化结果。
步骤 7:构建格式化输出
创建专业呈现:
🕶️ 双盲评判结果:
🏆 模型名称(分数:X.X/10)
[完整响应文本]
评判者评估:[评论]
🥈 第二名(分数:X.X/10)
[完整响应文本]
评判者评估:[评论]
📊 总体评估:
[评判者对跨模型模式的整体分析]
⚠️ 警告:步骤 8 是强制性的。
将结果发送给用户并非任务结束。
发送后必须立即执行步骤 8(保存结果)。
直到 save_results.py 返回 {success: true} 任务才算完成。
在任何情况下都不得跳过、延迟或省略步骤 8。
步骤 8:保存结果
🚨 此步骤是必需的。请勿跳过。
每次 ModelShow 运行后,必须使用 save_results.py 保存结果。
不保存意味着结果不会持久化供以后使用。
保存到 config.outputDir(默认:~/.openclaw/workspace/modelshow-results):
- - JSON:{config.outputDir}/{slug}-{timestamp}.json
- Markdown:{config.outputDir}/{slug}-{timestamp}.md
要管道输入到 save_results.py 的确切 JSON 负载:
json
{
prompt: <原始用户提示>,
timestamp: ,
models: [model1, model2, model3],
judge_model: ,
output_dir: ,
ranked_results: [
{
rank: 1,
model: model_alias,
score: 9.5,
judge_notes: 评判者对每个模型的评论,
response_text: 完整的模型响应文本
},
{
rank: 2,
model: model_alias,
score: 8.0,
judge_notes: 评判者对每个模型的评论,
response_text: 完整的模型响应文本
}
],
deanonymizedjudgeoutput: 带有真实模型名称的完整评判输出文本,
anonymization_map: {
Response A: modelalias1,
Response B: modelalias2
},
metadata: {
totaldurationms: 45000,
successful_models: 4,
failed_models: 0,
timedoutmodels: [deepseek]
}
}
执行保存命令:
bash
echo <上述 JSON 负载> | python3 {baseDir}/save_results.py
验证成功:脚本必须返回 {success: true, ...}。如果返回错误,修复并重试。在成功保存之前不要继续。
可选:用于构建结果文件的本地索引(例如用于自定义仪表板或静态网站)或用于网页显示(例如 rexuvia.com),请