moonlight-lupin/agent-skills/model-compare
Claude Code and agent skill by moonlight-lupin/agent-skills
- community
Checking that the SKILL.md file is still in the repository.
Blind side-by-side multi-model comparison. Send one prompt to 2-4 models simultaneously, present responses anonymously (Model A / B / C / D), let the user pick a winner, then reveal identities and show which model won. Supports custom evaluation criteria, synthesis of responses, and vote history logging. Trigger when the user says "compare models", "test these models", "which model is better for", "A/B test", "blind comparison", "model evaluation", or wants to see how different AI models handle the same prompt. Can also be used for prompt engineering — testing how different models interpret the same instructions. Supports reasoning-effort A/B via provider:@effort:model_id specs.
Install
npx vskill@latest install moonlight-lupin/agent-skills/model-compareSKILL.md
Model Compare — Blind Side-by-Side Multi-Model Testing
Send one prompt to multiple models simultaneously, present responses anonymously, let the user pick a winner, then reveal which model is which.
Inspired by the Compare feature in PewDiePie's Odysseus project, adapted for Hermes's multi-provider architecture (OpenRouter, NVIDIA, Ollama Cloud, any OpenAI-compatible endpoint).
When to use
- "Compare these models on..."
- "Which model is better for [task]?"
- "A/B test [model1] vs [model2]"
- "Blind comparison of..."
- "Test how different models handle this prompt"
- User wants to evaluate models before committing to one for a workflow
- Prompt engineering — seeing how different models interpret instructions
When NOT to use
- Benchmarking (MMLU, GSM8K, etc.) → use
evaluating-llms-harnessskill - Cost analysis → just check provider pricing pages
- Single model test → just switch model and ask directly
- Multi-source research synthesis → use
deep-researchskill (iterative research loop, not model comparison)
Architecture
Four comparison modes, all driven by scripts/compare.py:
| Mode | Flag | What it does | API feature | |
|---|---|---|---|---|
| simple | --mode simple (default) | One prompt → one response | Basic chat completion | |
| tools | --mode tools | Multi-turn tool calling with real web_search/web_extract + sandboxed run_python/read_file/write_file. 10-turn max (configurable per-test via max_turns in TEST_BANK). Tracks full trace. | tools array in request, multi-turn messages | |
| coding | --mode coding | Test bank coding prompts (LRU cache, concurrent fetch, debug merge sort, retry decorator) | Basic chat completion | |
| review | --mode review | Code review prompts with planted bugs (SQL injection, clean code, race condition, float-for-money) | Basic chat completion |
Script: scripts/compare.py
The primary interface — a standalone CLI tool (no pip dependencies, pure stdlib + urllib). See references/provider-tool-support.md for which models support tool calling. For empirical model behavior findings from 16 head-to-head tests (GLM 5.2, MiniMax M3, HY3, Laguna), see references/model-behavior.md. (Running the test suite under tests/ needs pytest — see requirements-dev.txt; the skill itself needs nothing installed.)
Tool-mode environment dependency:--mode toolsruns realweb_search. That needs eitherSEARXNG_URLset to a SearXNG instance or the `ddgs` CLI available onPATH(the fallback). Neither is a Python import dependency, but one of them must be present for live search; without both,web_searchreturns an error result. The other three modes (simple,coding,review) need neither.
Key flags: --prompt, --models, --mode, --test (test bank ID), --judge, --efficiency, --reveal, --output, --timeout, --list-providers, --list-models.
Reasoning-effort A/B (:@effort suffix, added 2026-08-29)
Model specs and --judge accept an optional effort marker provider:@effort:model_id, e.g. ollama-cloud:@medium:glm-5.3-flash. Each unique (provider, effort) pair registers a virtual provider (ollama-cloud@medium) that clones the base provider's config — same endpoint, same env key, inherited max_tokens — and injects reasoning_effort into the payload. This enables comparing the SAME model at two reasoning levels in one blind run; the reveal labels the arms provider@effort. Findings from the 2026-08-29 glm-5.3-flash A/B (Codex-judged, 8 tests): effort→thinking-token count is non-monotonic; high was ~3x faster median but non-converged on a 12-turn tool-chain test that medium completed; medium won on judged quality overall (8.6 vs 7.8 avg). See ~/.hermes/data/glm53flash_effort_ab/ab_results.jsonl for full traces.
`--max-turns` CLI override (added 2026-07-17): Pass--max-turns Nto override the test bank'smax_turnsfield at runtime without editing source. If not passed, the test bank default is used. This was added because killing a background run to patchTEST_BANK["A"]["max_turns"]in source code is fragile and disrupts parallel execution.
Available Providers
Three providers are wired in (the canonical config is PROVIDERS in scripts/compare.py):
| Provider | Env Var | Cost | Model families | Endpoint | |
|---|---|---|---|---|---|
| Ollama Cloud | OLLAMA_API_KEY | Free | GLM, Qwen, Kimi, Gemini, Gemma | https://ollama.com/v1/chat/completions | |
| NVIDIA | NVIDIA_API_KEY | Free | Yi, Llama, Nemotron, … | https://integrate.api.nvidia.com/v1/chat/completions | |
| OpenRouter | OPENROUTER_API_KEY | Paid (per-token) | Claude, GPT, Gemini, DeepSeek, Llama, Qwen, Mistral | https://openrouter.ai/api/v1/chat/completions |
Model inventories live elsewhere, on purpose. Exact model counts and IDsdrift constantly, so they are deliberately kept out of this doc. For the livelist runpython3 scripts/compare.py --list-models <provider>(needs thatprovider's key);references/providers.jsonholds a curated, count-freesnapshot with representative model IDs per provider.
Cost-aware provider routing (mandatory)
When the user does not specify a provider, route to free providers first:
- Ollama Cloud — free (GLM, Qwen, Kimi, Gemini, Gemma)
- NVIDIA — free (Yi, Llama, Nemotron)
- OpenRouter — paid (per-token cost). Only use when:
- The user explicitly requests an OpenRouter-only model (e.g. Claude, GPT-4o)
- The user explicitly says to use OpenRouter
- The free providers don't have a suitable model for the task
Before any OpenRouter call, confirm with the user:
"This comparison will use OpenRouter which has per-token costs. Estimated cost: ~$0.01–0.05 per model per call (varies by model). Proceed?"
Only proceed after explicit confirmation. When in doubt, default to free providers.
To call a model, POST to the provider's /v1/chat/completions endpoint with:
Header: Authorization: Bearer <API_KEY>
max_tokens is set to 8192 in bothcall_model_simpleandcall_model_with_tools. The previous default of 4096 caused truncatedcode output on coding test J (LRU cache) — the model generated so muchcode it hit the 4096 limit before finishing the decorator section.If a model still truncates, increase the value in the payload dict.
Step 1 — Resolve Models
Determine which models to compare. The user may specify:
- Explicit model names: "compare claude-sonnet-4.6 vs gpt-4o vs gemini-2.5-flash"
- Provider + model: "compare OpenRouter claude-sonnet-4.6 vs Ollama glm-5.2"
- Task-based: "which model is best for coding?" → suggest 2-4 candidates
- All from a provider: "test 3 OpenRouter models" → pick diverse ones
Model resolution
Map the user's model names to a provider:model_id spec. Free providers (Ollama Cloud, NVIDIA) are preferred. OpenRouter is only used for models not on a free provider (e.g. Claude, GPT) or when the user explicitly asks for it.
The rules, not a hardcoded catalogue (which would rot):
- Free, leave the prefix off or name an Ollama/NVIDIA model → resolve on a
free provider, e.g. ollama-cloud:glm-5.2, ollama-cloud:qwen3-coder:480b, nvidia:meta/llama-3.3-70b-instruct.
- A proprietary model (Claude, GPT, Gemini-Pro, DeepSeek-R1, …) → only
OpenRouter carries it, e.g. openrouter:anthropic/claude-sonnet-4.6, openrouter:openai/gpt-4o — paid, confirm first (see routing rule above).
- Unsure of the exact ID? Run `python3 scripts/compare.py --list-models
<provider> for the live list, or see references/providers.json` for a curated set of representative IDs per provider. Don't hand-maintain a model table here.
When user doesn't specify models:
- Check if the task type maps to free models (e.g. coding → qwen3-coder, glm-5.2; general → glm-5.2, kimi-k2.5)
- Suggest 2-4 free models from Ollama Cloud and NVIDIA
- Only suggest OpenRouter models if the user asks for premium models (Claude, GPT-4o) or the free providers lack suitable options
- If suggesting any paid models, flag the cost before running
If unsure which provider has a model, check with:
Rules:
- 2-4 models per comparison (more = unwieldy in chat)
- If user doesn't specify, suggest a diverse set (different providers/sizes)
- Always confirm the model list with the user before running
Step 2 — Send Prompt to All Models
Send the prompt to all models in parallel. The script handles this automatically via concurrent.futures.ThreadPoolExecutor — no need for delegate_task or manual parallelism.
Simple / coding / review modes
One-shot chat completion per model. All calls fired concurrently by the script.
Tool calling mode
Multi-turn loop per model (also concurrent across models):
Real tool execution — the script executes web_search and web_extract for real:
web_search→ SearXNG (self-hosted, viaSEARXNG_URL) with DDGS fallbackweb_extract→ direct HTTP fetch with HTML-to-text conversion (3000 chars/page)
No mock tools, no fake results. Models must formulate good queries, pick the right URLs, and synthesize from real content. A model that generates a bad search query gets bad results and must recover.
Tool definitions passed via the OpenAI tools parameter:
web_search(query, limit)— returns titles, URLs, snippetsweb_extract(urls)— returns page content as text
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingmlops/model-compare/SKILL.md
Popularity
- Repository stars
- 76
- Repository forks
- 12
- 7-day trend score
- 22
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/moonlight-lupin/agent-skills/model-compare)