| name | horangi-analyze |
| description | Analyze one or more Horangi model configs against (1) HuggingFace model card claims, (2) the W&B leaderboard rankings, and (3) category-level peer comparison. Invoke when the user asks to analyze/compare model performance for a config (e.g. "analyze <config>", "compare X and Y", "์ด ๋ชจ๋ธ ์ฑ๋ฅ ๋ถ์ํด์ค"). |
horangi-analyze
Produce a side-by-side analysis of 1..N Horangi model configs. Output goes to chat as markdown โ never create a file unless the user explicitly asks.
Inputs
- One or more config names (YAML filename in
configs/models/ without .yaml).
- W&B
entity/project for the leaderboard. Always ask the user at the start โ do not default to any specific project. .env values (WANDB_ENTITY, WANDB_PROJECT) can be offered as a suggestion, but confirm before using.
- If any input is missing or ambiguous, ask โ don't guess.
Workflow
1. Resolve configs
For each input config:
- Read
configs/models/<name>.yaml
- Extract:
wandb.run_name, model.name (HF ID or hosted model ID), metadata.model_size, metadata.active_params, metadata.context_window, metadata.release_date.
- If
model.name looks like a HuggingFace repo (org/model-id), that's the HF URL path. For hosted-only models (W&B Inference, OpenRouter slugs), the HF upstream may be mentioned in YAML comments or need a quick web search.
2. Fetch HF model card claims (WebFetch)
For each HF repo:
https://huggingface.co/<org>/<model-id>
Extract every numeric benchmark the card reports. Organize by category (reasoning / coding / knowledge / agentic / instruction-following / safety / long-context / multilingual). Capture variants (e.g. "AIME25 no tools" vs "AIME25 with tools", "SWE-Bench Verified OpenHands" vs "Codex"). Note the reported sampling settings if present.
Do not fabricate numbers โ only what's on the page.
3. Query W&B leaderboard (wandb API)
Use this snippet to pull leaderboard-tagged runs:
import os
os.environ.setdefault('WANDB_SILENT', 'true')
from dotenv import load_dotenv
load_dotenv('.env', override=True)
import wandb, pandas as pd
api = wandb.Api()
runs = list(api.runs(f'{entity}/{project}', filters={'tags': {'$in': ['leaderboard']}}))
rows = []
for r in runs:
try:
for art in r.logged_artifacts():
if 'leaderboard_table' in art.name:
t = art.get('leaderboard_table')
if t:
df = t.get_dataframe()
df['run_name'] = r.name
rows.append(df)
break
except Exception:
pass
big = pd.concat(rows, ignore_index=True).drop_duplicates(subset='run_name', keep='last')
big = big.sort_values('FINAL_SCORE', ascending=False).reset_index(drop=True)
big['rank'] = big.index + 1
entity and project must come from the user's invocation โ the skill never assumes a specific W&B path.
leaderboard_table columns include: FINAL_SCORE, ๋ฒ์ฉ์ธ์ด์ฑ๋ฅ(GLP)_AVG, ๊ฐ์น์ ๋ ฌ์ฑ๋ฅ(ALT)_AVG, and 16 category columns (GLP_*, ALT_*).
For each target model, compute:
- Overall rank (out of total leaderboard runs)
- Per-category rank
- Peer comparison (filter similar open-source models by size/family)
Also fetch benchmark_detail_table for per-benchmark raw scores if a deeper HF-vs-measured comparison is needed:
for art in r.logged_artifacts():
if 'benchmark_detail_table' in art.name:
detail_df = art.get('benchmark_detail_table').get_dataframe()
break
4. Match benchmarks for HF-vs-measured comparison
Common overlaps (not exhaustive):
| HF benchmark | Horangi benchmark | Notes |
|---|
| AIME25 (no tools) | ko_aime2025 | Korean translation โ typically -5~10% |
| HLE | ko_hle | Korean subset |
| MMLU-Pro | kmmlu_pro | Different benchmark โ KMMLU-Pro = Korean domain knowledge, not translated MMLU-Pro. Expect -15~25% gap. |
| SWE-Bench Verified | swebench_verified_official_80 | 80-sample subset, variance higher |
| BFCL (v4) | bfcl | Horangi uses text-based variant |
| IFBench (prompt) | ifeval_ko | Different โ IFEval Korean โ IFBench |
| HumanEval+ | humaneval_100 | 100-sample subset |
| BigCodeBench | bigcodebench_100 | 100-sample subset |
Call these out explicitly when deltas look surprising โ often it's a benchmark variant difference, not model behavior.
5. Output format
A single markdown block. Structure scales with N:
For N=1:
- Section 1: "HF claim vs horangi ์ธก์ " (comparison table of comparable benchmarks)
- Section 2: "๋ฆฌ๋๋ณด๋ ์์" (overall rank + category rank table)
- Section 3: "๋๊ธ ํผ์ด ๋น๊ต" (similar-size open-source models)
- Section 4: "๊ฒฐ๋ก " (3-5 bullets)
For Nโฅ2:
- Section 1: "๋ชจ๋ธ ๋น๊ต" (side-by-side table, all Horangi benchmarks)
- Section 2: "HF claim vs ์ธก์ " (per-model comparison table)
- Section 3: "๋ฆฌ๋๋ณด๋ ์์" (all models' ranks side by side)
- Section 4: "์นดํ
๊ณ ๋ฆฌ๋ณ ์ฐ์" (which model wins which category)
- Section 5: "๊ฒฐ๋ก "
Rules:
- Use full model name (e.g.
NVIDIA-Nemotron-3-Super-120B-A12B-FP8) โ never abbreviate.
- Mark deltas โฅ0.05 with bold, โฅ0.10 with ๐ฅ or โ ๏ธ based on direction.
- When a Horangi score suggests the benchmark variant differs from HF, say so in the Notes/๊ฒฐ๋ก โ don't silently compare apples to oranges.
- Rank categories by how informative they are for the model; show top-5 strengths and bottom-3 weaknesses per model, not every category.
- Keep numbers to 3 decimals (0.641 not 0.6413).
- Cite W&B run URLs at the end:
https://wandb.ai/<entity>/<project>/runs/<run_id>.
Follow-up: suggest horangi-fails
After producing the analysis, inspect category rankings for each target model. If any category meets either criterion:
- Absolute: rank falls in the bottom 25% of the leaderboard (e.g. rank 68+ out of 90)
- Relative: score is โฅ 0.15 below the model's own category median (outlier weakness)
...append a "๐ ๊น์ด ๋ถ์ ๊ถ์ฅ" section listing the specific (model, benchmark) pairs to drill into, and suggest:
์ด ์์ญ์ด ์ ๋
๋ฎ์ ๋ณด์ฌ์. ์ค๋ต ๊ฒฝํฅ์ ์์ธํ ๋ณด๊ณ ์ถ์ผ๋ฉด /horangi-fails <config> <benchmark>๋ก ๋ถ๋ฌ์ฃผ์ธ์.
Map each weak category back to the underlying benchmark(s) from ALL_BENCHMARKS:
| ์นดํ
๊ณ ๋ฆฌ | ๋ํ ๋ฒค์น๋งํฌ |
|---|
| GLP_์ผ๋ฐ์ ์ง์ / ์ ๋ฌธ์ ์ง์ | kmmlu, kmmlu_pro, haerae_bench_v1_* |
| GLP_์ํ์ ์ถ๋ก | hrm8k, ko_aime2025 |
| GLP_๋
ผ๋ฆฌ์ ์ถ๋ก / ์ถ์์ ์ถ๋ก | ko_arc_agi, ko_hle |
| GLP_์ฝ๋ฉ๋ฅ๋ ฅ | humaneval_100, bigcodebench_100, swebench_verified_official_80 |
| GLP_ํจ์ํธ์ถ | bfcl |
| GLP_์๋ฏธํด์ / ๊ตฌ๋ฌธํด์ | ko_balt_700_semantic, ko_balt_700_syntax, squad_kor_v1, ko_hellaswag |
| ALT_์ ํด์ฑ๋ฐฉ์ง / ์ค๋ฆฌยท๋๋ | korean_hate_speech, ko_moral, kobbq |
| ALT_ํ๊ฐ๋ฐฉ์ง | ko_hallulens_wikiqa, ko_hallulens_nonexistent, ko_truthful_qa |
| ALT_์ ์ด์ฑ | ifeval_ko, ko_mtbench |
Don't propose horangi-fails for benchmarks that already score well, or for every weak category โ pick the 1โ3 most informative drill-down candidates.
Example invocations
/horangi-analyze NVIDIA-Nemotron-3-Super-120B-A12B-FP8 โ skill asks for entity/project
/horangi-analyze NVIDIA-Nemotron-3-Nano-30B-A3B-BF16 NVIDIA-Nemotron-3-Super-120B-A12B-FP8 --entity myteam --project my-bench
- "Qwen3-30B-A3B-Instruct-2507 ๋ถ์ํด์ค" โ skill asks for entity/project before proceeding
What NOT to do
- Don't create files unprompted โ chat output only. The user will say "md๋ก ์ ์ฅํด์ค" if they want a file, in which case use
analyses/results/<model>-analysis.md.
- Don't compare HF English benchmark numbers directly with Korean Horangi numbers without calling out the language/variant gap.
- Don't skip the HF fetch โ the "NVIDIA ์ฃผ์ฅ๊ณผ ์ผ์น/๋ถ์ผ์น" insight is the whole point of this skill.
- Don't assume any entity/project. Always confirm at the start of the skill invocation.