agent-duelist 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/scorers/latency.ts","../src/pricing/catalog.json","../src/pricing/lookup.ts","../src/scorers/cost.ts","../src/scorers/correctness.ts","../src/scorers/schema-correctness.ts","../src/scorers/fuzzy-similarity.ts","../src/scorers/llm-judge.ts","../src/providers/openai.ts","../src/providers/shared.ts","../src/scorers/tool-usage.ts","../src/scorers/index.ts","../src/runner.ts","../src/utils/format.ts","../src/reporter/shared.ts","../src/reporter/console.ts","../src/reporter/json.ts","../src/arena.ts","../src/providers/anthropic.ts","../src/reporter/markdown.ts","../src/reporter/html.ts","../src/ci.ts","../src/github.ts"],"sourcesContent":["import type { ScorerFn } from './types.js'\n\n// Normalizes latency to 0–1 where 1 = fast (≤500ms), 0 = slow (≥10s)\nconst MIN_MS = 500\nconst MAX_MS = 10_000\n\nexport const latencyScorer: ScorerFn = ({ result }) => {\n const clamped = Math.max(MIN_MS, Math.min(MAX_MS, result.latencyMs))\n const value = 1 - (clamped - MIN_MS) / (MAX_MS - MIN_MS)\n\n return {\n name: 'latency',\n value: Math.round(value * 100) / 100,\n details: { ms: result.latencyMs },\n }\n}\n","{\n \"_meta\": {\n \"source\": \"OpenRouter API — all providers (https://openrouter.ai/api/v1/models)\",\n \"updatedAt\": \"2026-02-28\",\n \"unit\": \"USD per token\"\n },\n \"models\": {\n \"ai21/jamba-large-1.7\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000008\n },\n \"aion-labs/aion-1.0\": {\n \"inputPerToken\": 0.000004,\n \"outputPerToken\": 0.000008\n },\n \"aion-labs/aion-1.0-mini\": {\n \"inputPerToken\": 7e-7,\n \"outputPerToken\": 0.0000014\n },\n \"aion-labs/aion-2.0\": {\n \"inputPerToken\": 8e-7,\n \"outputPerToken\": 0.0000016\n },\n \"aion-labs/aion-rp-llama-3.1-8b\": {\n \"inputPerToken\": 8e-7,\n \"outputPerToken\": 0.0000016\n },\n \"alfredpros/codellama-7b-instruct-solidity\": {\n \"inputPerToken\": 8e-7,\n \"outputPerToken\": 0.0000012\n },\n \"alibaba/tongyi-deepresearch-30b-a3b\": {\n \"inputPerToken\": 9e-8,\n \"outputPerToken\": 4.5e-7\n },\n \"allenai/molmo-2-8b\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 2e-7\n },\n \"allenai/olmo-2-0325-32b-instruct\": {\n \"inputPerToken\": 5e-8,\n \"outputPerToken\": 2e-7\n },\n \"allenai/olmo-3-32b-think\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 5e-7\n },\n \"allenai/olmo-3-7b-instruct\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 2e-7\n },\n \"allenai/olmo-3-7b-think\": {\n \"inputPerToken\": 1.2e-7,\n \"outputPerToken\": 2e-7\n },\n \"allenai/olmo-3.1-32b-instruct\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 6e-7\n },\n \"alpindale/goliath-120b\": {\n \"inputPerToken\": 0.00000375,\n \"outputPerToken\": 0.0000075\n },\n \"amazon/nova-2-lite-v1\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 0.0000025\n },\n \"amazon/nova-lite-v1\": {\n \"inputPerToken\": 6e-8,\n \"outputPerToken\": 2.4e-7\n },\n \"amazon/nova-micro-v1\": {\n \"inputPerToken\": 3.5e-8,\n \"outputPerToken\": 1.4e-7\n },\n \"amazon/nova-premier-v1\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.0000125\n },\n \"amazon/nova-pro-v1\": {\n \"inputPerToken\": 8e-7,\n \"outputPerToken\": 0.0000032\n },\n \"anthracite-org/magnum-v4-72b\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000005\n },\n \"anthropic/claude-3-haiku\": {\n \"inputPerToken\": 2.5e-7,\n \"outputPerToken\": 0.00000125\n },\n \"anthropic/claude-3.5-haiku\": {\n \"inputPerToken\": 8e-7,\n \"outputPerToken\": 0.000004\n },\n \"anthropic/claude-3.5-sonnet\": {\n \"inputPerToken\": 0.000006,\n \"outputPerToken\": 0.00003\n },\n \"anthropic/claude-3.7-sonnet\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000015\n },\n \"anthropic/claude-3.7-sonnet:thinking\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000015\n },\n \"anthropic/claude-haiku-4.5\": {\n \"inputPerToken\": 0.000001,\n \"outputPerToken\": 0.000005\n },\n \"anthropic/claude-opus-4\": {\n \"inputPerToken\": 0.000015,\n \"outputPerToken\": 0.000075\n },\n \"anthropic/claude-opus-4.1\": {\n \"inputPerToken\": 0.000015,\n \"outputPerToken\": 0.000075\n },\n \"anthropic/claude-opus-4.5\": {\n \"inputPerToken\": 0.000005,\n \"outputPerToken\": 0.000025\n },\n \"anthropic/claude-opus-4.6\": {\n \"inputPerToken\": 0.000005,\n \"outputPerToken\": 0.000025\n },\n \"anthropic/claude-sonnet-4\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000015\n },\n \"anthropic/claude-sonnet-4.5\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000015\n },\n \"anthropic/claude-sonnet-4.6\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000015\n },\n \"arcee-ai/coder-large\": {\n \"inputPerToken\": 5e-7,\n \"outputPerToken\": 8e-7\n },\n \"arcee-ai/maestro-reasoning\": {\n \"inputPerToken\": 9e-7,\n \"outputPerToken\": 0.0000033\n },\n \"arcee-ai/spotlight\": {\n \"inputPerToken\": 1.8e-7,\n \"outputPerToken\": 1.8e-7\n },\n \"arcee-ai/trinity-mini\": {\n \"inputPerToken\": 4.5e-8,\n \"outputPerToken\": 1.5e-7\n },\n \"arcee-ai/virtuoso-large\": {\n \"inputPerToken\": 7.5e-7,\n \"outputPerToken\": 0.0000012\n },\n \"baidu/ernie-4.5-21b-a3b\": {\n \"inputPerToken\": 7e-8,\n \"outputPerToken\": 2.8e-7\n },\n \"baidu/ernie-4.5-21b-a3b-thinking\": {\n \"inputPerToken\": 7e-8,\n \"outputPerToken\": 2.8e-7\n },\n \"baidu/ernie-4.5-300b-a47b\": {\n \"inputPerToken\": 2.8e-7,\n \"outputPerToken\": 0.0000011\n },\n \"baidu/ernie-4.5-vl-28b-a3b\": {\n \"inputPerToken\": 1.4e-7,\n \"outputPerToken\": 5.6e-7\n },\n \"baidu/ernie-4.5-vl-424b-a47b\": {\n \"inputPerToken\": 4.2e-7,\n \"outputPerToken\": 0.00000125\n },\n \"bytedance/seed-1.6\": {\n \"inputPerToken\": 2.5e-7,\n \"outputPerToken\": 0.000002\n },\n \"bytedance/seed-1.6-flash\": {\n \"inputPerToken\": 7.5e-8,\n \"outputPerToken\": 3e-7\n },\n \"bytedance/seed-2.0-mini\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 4e-7\n },\n \"bytedance/ui-tars-1.5-7b\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 2e-7\n },\n \"cohere/command-a\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.00001\n },\n \"cohere/command-r-08-2024\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 6e-7\n },\n \"cohere/command-r-plus-08-2024\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.00001\n },\n \"cohere/command-r7b-12-2024\": {\n \"inputPerToken\": 3.75e-8,\n \"outputPerToken\": 1.5e-7\n },\n \"deepcogito/cogito-v2.1-671b\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00000125\n },\n \"deepseek/deepseek-chat\": {\n \"inputPerToken\": 3.2e-7,\n \"outputPerToken\": 8.9e-7\n },\n \"deepseek/deepseek-chat-v3-0324\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 7.7e-7\n },\n \"deepseek/deepseek-chat-v3.1\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 7.5e-7\n },\n \"deepseek/deepseek-r1\": {\n \"inputPerToken\": 7e-7,\n \"outputPerToken\": 0.0000025\n },\n \"deepseek/deepseek-r1-0528\": {\n \"inputPerToken\": 4.5e-7,\n \"outputPerToken\": 0.00000215\n },\n \"deepseek/deepseek-r1-distill-llama-70b\": {\n \"inputPerToken\": 7e-7,\n \"outputPerToken\": 8e-7\n },\n \"deepseek/deepseek-r1-distill-qwen-32b\": {\n \"inputPerToken\": 2.9e-7,\n \"outputPerToken\": 2.9e-7\n },\n \"deepseek/deepseek-v3\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 8.8e-7\n },\n \"deepseek/deepseek-v3.1-terminus\": {\n \"inputPerToken\": 2.1e-7,\n \"outputPerToken\": 7.9e-7\n },\n \"deepseek/deepseek-v3.1-terminus:exacto\": {\n \"inputPerToken\": 2.1e-7,\n \"outputPerToken\": 7.9e-7\n },\n \"deepseek/deepseek-v3.2\": {\n \"inputPerToken\": 2.5e-7,\n \"outputPerToken\": 4e-7\n },\n \"deepseek/deepseek-v3.2-exp\": {\n \"inputPerToken\": 2.7e-7,\n \"outputPerToken\": 4.1e-7\n },\n \"deepseek/deepseek-v3.2-speciale\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.0000012\n },\n \"eleutherai/llemma_7b\": {\n \"inputPerToken\": 8e-7,\n \"outputPerToken\": 0.0000012\n },\n \"essentialai/rnj-1-instruct\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 1.5e-7\n },\n \"google/gemini-2.0-flash\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 4e-7\n },\n \"google/gemini-2.0-flash-001\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 4e-7\n },\n \"google/gemini-2.0-flash-lite-001\": {\n \"inputPerToken\": 7.5e-8,\n \"outputPerToken\": 3e-7\n },\n \"google/gemini-2.5-flash\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 0.0000025\n },\n \"google/gemini-2.5-flash-image\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 0.0000025\n },\n \"google/gemini-2.5-flash-lite\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 4e-7\n },\n \"google/gemini-2.5-flash-lite-preview-09-2025\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 4e-7\n },\n \"google/gemini-2.5-pro\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00001\n },\n \"google/gemini-2.5-pro-preview\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00001\n },\n \"google/gemini-2.5-pro-preview-05-06\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00001\n },\n \"google/gemini-3-flash-preview\": {\n \"inputPerToken\": 5e-7,\n \"outputPerToken\": 0.000003\n },\n \"google/gemini-3-pro-image-preview\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000012\n },\n \"google/gemini-3-pro-preview\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000012\n },\n \"google/gemini-3.1-flash-image-preview\": {\n \"inputPerToken\": 2.5e-7,\n \"outputPerToken\": 0.0000015\n },\n \"google/gemini-3.1-pro-preview\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000012\n },\n \"google/gemini-3.1-pro-preview-customtools\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000012\n },\n \"google/gemma-2-27b-it\": {\n \"inputPerToken\": 6.5e-7,\n \"outputPerToken\": 6.5e-7\n },\n \"google/gemma-2-9b-it\": {\n \"inputPerToken\": 3e-8,\n \"outputPerToken\": 9e-8\n },\n \"google/gemma-3-12b-it\": {\n \"inputPerToken\": 4e-8,\n \"outputPerToken\": 1.3e-7\n },\n \"google/gemma-3-27b-it\": {\n \"inputPerToken\": 4e-8,\n \"outputPerToken\": 1.5e-7\n },\n \"google/gemma-3-4b-it\": {\n \"inputPerToken\": 4e-8,\n \"outputPerToken\": 8e-8\n },\n \"google/gemma-3n-e4b-it\": {\n \"inputPerToken\": 2e-8,\n \"outputPerToken\": 4e-8\n },\n \"gryphe/mythomax-l2-13b\": {\n \"inputPerToken\": 6e-8,\n \"outputPerToken\": 6e-8\n },\n \"ibm-granite/granite-4.0-h-micro\": {\n \"inputPerToken\": 1.7e-8,\n \"outputPerToken\": 1.1e-7\n },\n \"inception/mercury\": {\n \"inputPerToken\": 2.5e-7,\n \"outputPerToken\": 0.000001\n },\n \"inception/mercury-coder\": {\n \"inputPerToken\": 2.5e-7,\n \"outputPerToken\": 0.000001\n },\n \"inflection/inflection-3-pi\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.00001\n },\n \"inflection/inflection-3-productivity\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.00001\n },\n \"kwaipilot/kat-coder-pro\": {\n \"inputPerToken\": 2.07e-7,\n \"outputPerToken\": 8.28e-7\n },\n \"liquid/lfm-2-24b-a2b\": {\n \"inputPerToken\": 3e-8,\n \"outputPerToken\": 1.2e-7\n },\n \"liquid/lfm-2.2-6b\": {\n \"inputPerToken\": 1e-8,\n \"outputPerToken\": 2e-8\n },\n \"liquid/lfm2-8b-a1b\": {\n \"inputPerToken\": 1e-8,\n \"outputPerToken\": 2e-8\n },\n \"mancer/weaver\": {\n \"inputPerToken\": 7.5e-7,\n \"outputPerToken\": 0.000001\n },\n \"meituan/longcat-flash-chat\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 8e-7\n },\n \"meta/llama-3-70b-instruct\": {\n \"inputPerToken\": 5.1e-7,\n \"outputPerToken\": 7.4e-7\n },\n \"meta/llama-3-8b-instruct\": {\n \"inputPerToken\": 3e-8,\n \"outputPerToken\": 4e-8\n },\n \"meta/llama-3.1-405b\": {\n \"inputPerToken\": 0.000004,\n \"outputPerToken\": 0.000004\n },\n \"meta/llama-3.1-405b-instruct\": {\n \"inputPerToken\": 0.000004,\n \"outputPerToken\": 0.000004\n },\n \"meta/llama-3.1-70b-instruct\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 4e-7\n },\n \"meta/llama-3.1-8b-instruct\": {\n \"inputPerToken\": 2e-8,\n \"outputPerToken\": 5e-8\n },\n \"meta/llama-3.2-11b-vision-instruct\": {\n \"inputPerToken\": 4.9e-8,\n \"outputPerToken\": 4.9e-8\n },\n \"meta/llama-3.2-1b-instruct\": {\n \"inputPerToken\": 2.7e-8,\n \"outputPerToken\": 2e-7\n },\n \"meta/llama-3.2-3b-instruct\": {\n \"inputPerToken\": 2e-8,\n \"outputPerToken\": 2e-8\n },\n \"meta/llama-3.3-70b\": {\n \"inputPerToken\": 1.2e-7,\n \"outputPerToken\": 3e-7\n },\n \"meta/llama-3.3-70b-instruct\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 3.2e-7\n },\n \"meta/llama-4-maverick\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 6e-7\n },\n \"meta/llama-4-scout\": {\n \"inputPerToken\": 8e-8,\n \"outputPerToken\": 3e-7\n },\n \"meta/llama-guard-2-8b\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 2e-7\n },\n \"meta/llama-guard-3-8b\": {\n \"inputPerToken\": 2e-8,\n \"outputPerToken\": 6e-8\n },\n \"meta/llama-guard-4-12b\": {\n \"inputPerToken\": 1.8e-7,\n \"outputPerToken\": 1.8e-7\n },\n \"microsoft/phi-4\": {\n \"inputPerToken\": 6e-8,\n \"outputPerToken\": 1.4e-7\n },\n \"microsoft/wizardlm-2-8x22b\": {\n \"inputPerToken\": 6.2e-7,\n \"outputPerToken\": 6.2e-7\n },\n \"minimax/minimax-01\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 0.0000011\n },\n \"minimax/minimax-m1\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.0000022\n },\n \"minimax/minimax-m2\": {\n \"inputPerToken\": 2.55e-7,\n \"outputPerToken\": 0.000001\n },\n \"minimax/minimax-m2-her\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 0.0000012\n },\n \"minimax/minimax-m2.1\": {\n \"inputPerToken\": 2.7e-7,\n \"outputPerToken\": 9.5e-7\n },\n \"minimax/minimax-m2.5\": {\n \"inputPerToken\": 2.95e-7,\n \"outputPerToken\": 0.0000012\n },\n \"mistral/codestral-2508\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 9e-7\n },\n \"mistral/devstral-2512\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.000002\n },\n \"mistral/devstral-medium\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.000002\n },\n \"mistral/devstral-small\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 3e-7\n },\n \"mistral/ministral-14b-2512\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 2e-7\n },\n \"mistral/ministral-3b-2512\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 1e-7\n },\n \"mistral/ministral-8b-2512\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 1.5e-7\n },\n \"mistral/mistral-7b-instruct\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 2e-7\n },\n \"mistral/mistral-7b-instruct-v0.1\": {\n \"inputPerToken\": 1.1e-7,\n \"outputPerToken\": 1.9e-7\n },\n \"mistral/mistral-7b-instruct-v0.3\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 2e-7\n },\n \"mistral/mistral-large\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000006\n },\n \"mistral/mistral-large-2407\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000006\n },\n \"mistral/mistral-large-2411\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000006\n },\n \"mistral/mistral-large-2512\": {\n \"inputPerToken\": 5e-7,\n \"outputPerToken\": 0.0000015\n },\n \"mistral/mistral-medium-3\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.000002\n },\n \"mistral/mistral-medium-3.1\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.000002\n },\n \"mistral/mistral-nemo\": {\n \"inputPerToken\": 2e-8,\n \"outputPerToken\": 4e-8\n },\n \"mistral/mistral-saba\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 6e-7\n },\n \"mistral/mistral-small\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 3e-7\n },\n \"mistral/mistral-small-24b-instruct-2501\": {\n \"inputPerToken\": 5e-8,\n \"outputPerToken\": 8e-8\n },\n \"mistral/mistral-small-3.1-24b-instruct\": {\n \"inputPerToken\": 3.5e-7,\n \"outputPerToken\": 5.6e-7\n },\n \"mistral/mistral-small-3.2-24b-instruct\": {\n \"inputPerToken\": 6e-8,\n \"outputPerToken\": 1.8e-7\n },\n \"mistral/mistral-small-creative\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 3e-7\n },\n \"mistral/mixtral-8x22b-instruct\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000006\n },\n \"mistral/mixtral-8x7b-instruct\": {\n \"inputPerToken\": 5.4e-7,\n \"outputPerToken\": 5.4e-7\n },\n \"mistral/pixtral-large-2411\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000006\n },\n \"mistral/voxtral-small-24b-2507\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 3e-7\n },\n \"moonshotai/kimi-k2\": {\n \"inputPerToken\": 5.5e-7,\n \"outputPerToken\": 0.0000022\n },\n \"moonshotai/kimi-k2-0905\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.000002\n },\n \"moonshotai/kimi-k2-0905:exacto\": {\n \"inputPerToken\": 6e-7,\n \"outputPerToken\": 0.0000025\n },\n \"moonshotai/kimi-k2-thinking\": {\n \"inputPerToken\": 4.7e-7,\n \"outputPerToken\": 0.000002\n },\n \"moonshotai/kimi-k2.5\": {\n \"inputPerToken\": 4.5e-7,\n \"outputPerToken\": 0.0000022\n },\n \"morph/morph-v3-fast\": {\n \"inputPerToken\": 8e-7,\n \"outputPerToken\": 0.0000012\n },\n \"morph/morph-v3-large\": {\n \"inputPerToken\": 9e-7,\n \"outputPerToken\": 0.0000019\n },\n \"neversleep/llama-3.1-lumimaid-8b\": {\n \"inputPerToken\": 9e-8,\n \"outputPerToken\": 6e-7\n },\n \"neversleep/noromaid-20b\": {\n \"inputPerToken\": 0.000001,\n \"outputPerToken\": 0.00000175\n },\n \"nex-agi/deepseek-v3.1-nex-n1\": {\n \"inputPerToken\": 2.7e-7,\n \"outputPerToken\": 0.000001\n },\n \"nousresearch/hermes-2-pro-llama-3-8b\": {\n \"inputPerToken\": 1.4e-7,\n \"outputPerToken\": 1.4e-7\n },\n \"nousresearch/hermes-3-llama-3.1-405b\": {\n \"inputPerToken\": 0.000001,\n \"outputPerToken\": 0.000001\n },\n \"nousresearch/hermes-3-llama-3.1-70b\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 3e-7\n },\n \"nousresearch/hermes-4-405b\": {\n \"inputPerToken\": 0.000001,\n \"outputPerToken\": 0.000003\n },\n \"nousresearch/hermes-4-70b\": {\n \"inputPerToken\": 1.3e-7,\n \"outputPerToken\": 4e-7\n },\n \"nvidia/llama-3.1-nemotron-70b-instruct\": {\n \"inputPerToken\": 0.0000012,\n \"outputPerToken\": 0.0000012\n },\n \"nvidia/llama-3.3-nemotron-super-49b-v1.5\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 4e-7\n },\n \"nvidia/nemotron-3-nano-30b-a3b\": {\n \"inputPerToken\": 5e-8,\n \"outputPerToken\": 2e-7\n },\n \"nvidia/nemotron-nano-12b-v2-vl\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 6e-7\n },\n \"nvidia/nemotron-nano-9b-v2\": {\n \"inputPerToken\": 4e-8,\n \"outputPerToken\": 1.6e-7\n },\n \"openai/gpt-3.5-turbo\": {\n \"inputPerToken\": 5e-7,\n \"outputPerToken\": 0.0000015\n },\n \"openai/gpt-3.5-turbo-0613\": {\n \"inputPerToken\": 0.000001,\n \"outputPerToken\": 0.000002\n },\n \"openai/gpt-3.5-turbo-16k\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000004\n },\n \"openai/gpt-3.5-turbo-instruct\": {\n \"inputPerToken\": 0.0000015,\n \"outputPerToken\": 0.000002\n },\n \"openai/gpt-4\": {\n \"inputPerToken\": 0.00003,\n \"outputPerToken\": 0.00006\n },\n \"openai/gpt-4-0314\": {\n \"inputPerToken\": 0.00003,\n \"outputPerToken\": 0.00006\n },\n \"openai/gpt-4-1106-preview\": {\n \"inputPerToken\": 0.00001,\n \"outputPerToken\": 0.00003\n },\n \"openai/gpt-4-turbo\": {\n \"inputPerToken\": 0.00001,\n \"outputPerToken\": 0.00003\n },\n \"openai/gpt-4-turbo-preview\": {\n \"inputPerToken\": 0.00001,\n \"outputPerToken\": 0.00003\n },\n \"openai/gpt-4.1\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000008\n },\n \"openai/gpt-4.1-mini\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.0000016\n },\n \"openai/gpt-4.1-nano\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 4e-7\n },\n \"openai/gpt-4o\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-4o-2024-05-13\": {\n \"inputPerToken\": 0.000005,\n \"outputPerToken\": 0.000015\n },\n \"openai/gpt-4o-2024-08-06\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-4o-2024-11-20\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-4o-audio-preview\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-4o-mini\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 6e-7\n },\n \"openai/gpt-4o-mini-2024-07-18\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 6e-7\n },\n \"openai/gpt-4o-mini-search-preview\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 6e-7\n },\n \"openai/gpt-4o-search-preview\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-4o:extended\": {\n \"inputPerToken\": 0.000006,\n \"outputPerToken\": 0.000018\n },\n \"openai/gpt-5\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-5-chat\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-5-codex\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-5-image\": {\n \"inputPerToken\": 0.00001,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-5-image-mini\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.000002\n },\n \"openai/gpt-5-mini\": {\n \"inputPerToken\": 2.5e-7,\n \"outputPerToken\": 0.000002\n },\n \"openai/gpt-5-nano\": {\n \"inputPerToken\": 5e-8,\n \"outputPerToken\": 4e-7\n },\n \"openai/gpt-5-pro\": {\n \"inputPerToken\": 0.000015,\n \"outputPerToken\": 0.00012\n },\n \"openai/gpt-5.1\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-5.1-chat\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-5.1-codex\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-5.1-codex-max\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-5.1-codex-mini\": {\n \"inputPerToken\": 2.5e-7,\n \"outputPerToken\": 0.000002\n },\n \"openai/gpt-5.2\": {\n \"inputPerToken\": 0.00000175,\n \"outputPerToken\": 0.000014\n },\n \"openai/gpt-5.2-chat\": {\n \"inputPerToken\": 0.00000175,\n \"outputPerToken\": 0.000014\n },\n \"openai/gpt-5.2-codex\": {\n \"inputPerToken\": 0.00000175,\n \"outputPerToken\": 0.000014\n },\n \"openai/gpt-5.2-pro\": {\n \"inputPerToken\": 0.000021,\n \"outputPerToken\": 0.000168\n },\n \"openai/gpt-5.3-codex\": {\n \"inputPerToken\": 0.00000175,\n \"outputPerToken\": 0.000014\n },\n \"openai/gpt-audio\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-audio-mini\": {\n \"inputPerToken\": 6e-7,\n \"outputPerToken\": 0.0000024\n },\n \"openai/gpt-oss-120b\": {\n \"inputPerToken\": 3.9e-8,\n \"outputPerToken\": 1.9e-7\n },\n \"openai/gpt-oss-120b:exacto\": {\n \"inputPerToken\": 3.9e-8,\n \"outputPerToken\": 1.9e-7\n },\n \"openai/gpt-oss-20b\": {\n \"inputPerToken\": 3e-8,\n \"outputPerToken\": 1.4e-7\n },\n \"openai/gpt-oss-safeguard-20b\": {\n \"inputPerToken\": 7.5e-8,\n \"outputPerToken\": 3e-7\n },\n \"openai/o1\": {\n \"inputPerToken\": 0.000015,\n \"outputPerToken\": 0.00006\n },\n \"openai/o1-pro\": {\n \"inputPerToken\": 0.00015,\n \"outputPerToken\": 0.0006\n },\n \"openai/o3\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000008\n },\n \"openai/o3-deep-research\": {\n \"inputPerToken\": 0.00001,\n \"outputPerToken\": 0.00004\n },\n \"openai/o3-mini\": {\n \"inputPerToken\": 0.0000011,\n \"outputPerToken\": 0.0000044\n },\n \"openai/o3-mini-high\": {\n \"inputPerToken\": 0.0000011,\n \"outputPerToken\": 0.0000044\n },\n \"openai/o3-pro\": {\n \"inputPerToken\": 0.00002,\n \"outputPerToken\": 0.00008\n },\n \"openai/o4-mini\": {\n \"inputPerToken\": 0.0000011,\n \"outputPerToken\": 0.0000044\n },\n \"openai/o4-mini-deep-research\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000008\n },\n \"openai/o4-mini-high\": {\n \"inputPerToken\": 0.0000011,\n \"outputPerToken\": 0.0000044\n },\n \"opengvlab/internvl3-78b\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 6e-7\n },\n \"perplexity/sonar\": {\n \"inputPerToken\": 0.000001,\n \"outputPerToken\": 0.000001\n },\n \"perplexity/sonar-deep-research\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000008\n },\n \"perplexity/sonar-pro\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000015\n },\n \"perplexity/sonar-pro-search\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000015\n },\n \"perplexity/sonar-reasoning-pro\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000008\n },\n \"prime-intellect/intellect-3\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 0.0000011\n },\n \"qwen/qwen-2.5-72b-instruct\": {\n \"inputPerToken\": 1.2e-7,\n \"outputPerToken\": 3.9e-7\n },\n \"qwen/qwen-2.5-7b-instruct\": {\n \"inputPerToken\": 4e-8,\n \"outputPerToken\": 1e-7\n },\n \"qwen/qwen-2.5-coder-32b-instruct\": {\n \"inputPerToken\": 2.0000000000000002e-7,\n \"outputPerToken\": 2.0000000000000002e-7\n },\n \"qwen/qwen-2.5-vl-7b-instruct\": {\n \"inputPerToken\": 2.0000000000000002e-7,\n \"outputPerToken\": 2.0000000000000002e-7\n },\n \"qwen/qwen-max\": {\n \"inputPerToken\": 0.0000016,\n \"outputPerToken\": 0.0000064\n },\n \"qwen/qwen-plus\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.0000012\n },\n \"qwen/qwen-plus-2025-07-28\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.0000012\n },\n \"qwen/qwen-plus-2025-07-28:thinking\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.0000012\n },\n \"qwen/qwen-turbo\": {\n \"inputPerToken\": 5e-8,\n \"outputPerToken\": 2e-7\n },\n \"qwen/qwen-vl-max\": {\n \"inputPerToken\": 8e-7,\n \"outputPerToken\": 0.0000032\n },\n \"qwen/qwen-vl-plus\": {\n \"inputPerToken\": 2.1e-7,\n \"outputPerToken\": 6.3e-7\n },\n \"qwen/qwen2.5-coder-7b-instruct\": {\n \"inputPerToken\": 3e-8,\n \"outputPerToken\": 9e-8\n },\n \"qwen/qwen2.5-vl-32b-instruct\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 6e-7\n },\n \"qwen/qwen2.5-vl-72b-instruct\": {\n \"inputPerToken\": 8e-7,\n \"outputPerToken\": 8e-7\n },\n \"qwen/qwen3-14b\": {\n \"inputPerToken\": 6e-8,\n \"outputPerToken\": 2.4e-7\n },\n \"qwen/qwen3-235b-a22b\": {\n \"inputPerToken\": 4.55e-7,\n \"outputPerToken\": 0.00000182\n },\n \"qwen/qwen3-235b-a22b-2507\": {\n \"inputPerToken\": 7.1e-8,\n \"outputPerToken\": 1e-7\n },\n \"qwen/qwen3-30b-a3b\": {\n \"inputPerToken\": 8e-8,\n \"outputPerToken\": 2.8e-7\n },\n \"qwen/qwen3-30b-a3b-instruct-2507\": {\n \"inputPerToken\": 9e-8,\n \"outputPerToken\": 3e-7\n },\n \"qwen/qwen3-30b-a3b-thinking-2507\": {\n \"inputPerToken\": 5.1e-8,\n \"outputPerToken\": 3.4e-7\n },\n \"qwen/qwen3-32b\": {\n \"inputPerToken\": 8e-8,\n \"outputPerToken\": 2.4e-7\n },\n \"qwen/qwen3-8b\": {\n \"inputPerToken\": 5e-8,\n \"outputPerToken\": 4e-7\n },\n \"qwen/qwen3-coder\": {\n \"inputPerToken\": 2.2e-7,\n \"outputPerToken\": 0.000001\n },\n \"qwen/qwen3-coder-30b-a3b-instruct\": {\n \"inputPerToken\": 7e-8,\n \"outputPerToken\": 2.7e-7\n },\n \"qwen/qwen3-coder-flash\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 0.0000015\n },\n \"qwen/qwen3-coder-next\": {\n \"inputPerToken\": 1.2e-7,\n \"outputPerToken\": 7.5e-7\n },\n \"qwen/qwen3-coder-plus\": {\n \"inputPerToken\": 0.000001,\n \"outputPerToken\": 0.000005\n },\n \"qwen/qwen3-coder:exacto\": {\n \"inputPerToken\": 2.2e-7,\n \"outputPerToken\": 0.0000018\n },\n \"qwen/qwen3-max\": {\n \"inputPerToken\": 0.0000012,\n \"outputPerToken\": 0.000006\n },\n \"qwen/qwen3-max-thinking\": {\n \"inputPerToken\": 0.0000012,\n \"outputPerToken\": 0.000006\n },\n \"qwen/qwen3-next-80b-a3b-instruct\": {\n \"inputPerToken\": 9e-8,\n \"outputPerToken\": 0.0000011\n },\n \"qwen/qwen3-next-80b-a3b-thinking\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 0.0000012\n },\n \"qwen/qwen3-vl-235b-a22b-instruct\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 8.8e-7\n },\n \"qwen/qwen3-vl-30b-a3b-instruct\": {\n \"inputPerToken\": 1.3e-7,\n \"outputPerToken\": 5.2e-7\n },\n \"qwen/qwen3-vl-32b-instruct\": {\n \"inputPerToken\": 1.04e-7,\n \"outputPerToken\": 4.16e-7\n },\n \"qwen/qwen3-vl-8b-instruct\": {\n \"inputPerToken\": 8e-8,\n \"outputPerToken\": 5e-7\n },\n \"qwen/qwen3-vl-8b-thinking\": {\n \"inputPerToken\": 1.17e-7,\n \"outputPerToken\": 0.000001365\n },\n \"qwen/qwen3.5-122b-a10b\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.0000032\n },\n \"qwen/qwen3.5-27b\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 0.0000024\n },\n \"qwen/qwen3.5-35b-a3b\": {\n \"inputPerToken\": 2.5e-7,\n \"outputPerToken\": 0.000002\n },\n \"qwen/qwen3.5-397b-a17b\": {\n \"inputPerToken\": 5.5e-7,\n \"outputPerToken\": 0.0000035\n },\n \"qwen/qwen3.5-flash-02-23\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 4e-7\n },\n \"qwen/qwen3.5-plus-02-15\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.0000024\n },\n \"qwen/qwq-32b\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 4e-7\n },\n \"raifle/sorcererlm-8x22b\": {\n \"inputPerToken\": 0.0000045,\n \"outputPerToken\": 0.0000045\n },\n \"relace/relace-apply-3\": {\n \"inputPerToken\": 8.5e-7,\n \"outputPerToken\": 0.00000125\n },\n \"relace/relace-search\": {\n \"inputPerToken\": 0.000001,\n \"outputPerToken\": 0.000003\n },\n \"sao10k/l3-euryale-70b\": {\n \"inputPerToken\": 0.00000148,\n \"outputPerToken\": 0.00000148\n },\n \"sao10k/l3-lunaris-8b\": {\n \"inputPerToken\": 4e-8,\n \"outputPerToken\": 5e-8\n },\n \"sao10k/l3.1-70b-hanami-x1\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000003\n },\n \"sao10k/l3.1-euryale-70b\": {\n \"inputPerToken\": 6.5e-7,\n \"outputPerToken\": 7.5e-7\n },\n \"sao10k/l3.3-euryale-70b\": {\n \"inputPerToken\": 6.5e-7,\n \"outputPerToken\": 7.5e-7\n },\n \"stepfun/step-3.5-flash\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 3e-7\n },\n \"switchpoint/router\": {\n \"inputPerToken\": 8.5e-7,\n \"outputPerToken\": 0.0000034\n },\n \"tencent/hunyuan-a13b-instruct\": {\n \"inputPerToken\": 1.4e-7,\n \"outputPerToken\": 5.7e-7\n },\n \"thedrummer/cydonia-24b-v4.1\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 5e-7\n },\n \"thedrummer/rocinante-12b\": {\n \"inputPerToken\": 1.7e-7,\n \"outputPerToken\": 4.3e-7\n },\n \"thedrummer/skyfall-36b-v2\": {\n \"inputPerToken\": 5.5e-7,\n \"outputPerToken\": 8e-7\n },\n \"thedrummer/unslopnemo-12b\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 4e-7\n },\n \"tngtech/deepseek-r1t2-chimera\": {\n \"inputPerToken\": 2.5e-7,\n \"outputPerToken\": 8.5e-7\n },\n \"undi95/remm-slerp-l2-13b\": {\n \"inputPerToken\": 4.5e-7,\n \"outputPerToken\": 6.5e-7\n },\n \"writer/palmyra-x5\": {\n \"inputPerToken\": 6e-7,\n \"outputPerToken\": 0.000006\n },\n \"xai/grok-3\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000015\n },\n \"xai/grok-3-beta\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000015\n },\n \"xai/grok-3-mini\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 5e-7\n },\n \"xai/grok-3-mini-beta\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 5e-7\n },\n \"xai/grok-4\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000015\n },\n \"xai/grok-4-fast\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 5e-7\n },\n \"xai/grok-4.1-fast\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 5e-7\n },\n \"xai/grok-code-fast-1\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 0.0000015\n },\n \"xiaomi/mimo-v2-flash\": {\n \"inputPerToken\": 9e-8,\n \"outputPerToken\": 2.9e-7\n },\n \"z-ai/glm-4-32b\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 1e-7\n },\n \"z-ai/glm-4.5\": {\n \"inputPerToken\": 5.5e-7,\n \"outputPerToken\": 0.000002\n },\n \"z-ai/glm-4.5-air\": {\n \"inputPerToken\": 1.3e-7,\n \"outputPerToken\": 8.5e-7\n },\n \"z-ai/glm-4.5v\": {\n \"inputPerToken\": 6e-7,\n \"outputPerToken\": 0.0000018\n },\n \"z-ai/glm-4.6\": {\n \"inputPerToken\": 3.5e-7,\n \"outputPerToken\": 0.00000171\n },\n \"z-ai/glm-4.6:exacto\": {\n \"inputPerToken\": 4.4e-7,\n \"outputPerToken\": 0.00000176\n },\n \"z-ai/glm-4.6v\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 9e-7\n },\n \"z-ai/glm-4.7\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 0.0000014\n },\n \"z-ai/glm-4.7-flash\": {\n \"inputPerToken\": 6e-8,\n \"outputPerToken\": 4e-7\n },\n \"z-ai/glm-5\": {\n \"inputPerToken\": 9.5e-7,\n \"outputPerToken\": 0.00000255\n }\n }\n}\n","import catalog from './catalog.json' with { type: 'json' }\n\nexport interface ModelPricing {\n inputPerToken: number\n outputPerToken: number\n}\n\nconst models = catalog.models as Record<string, ModelPricing>\n\n// Reverse index: model name (after slash) → first catalog key that contains it.\n// Enables cross-provider lookups (e.g. groq/llama-4-scout → meta/llama-4-scout).\nconst modelNameIndex = new Map<string, string>()\nfor (const key of Object.keys(models)) {\n const name = key.split('/').slice(1).join('/')\n if (name && !modelNameIndex.has(name)) {\n modelNameIndex.set(name, key)\n }\n}\n\n/**\n * Look up pricing for a provider ID (e.g. \"openai/gpt-4o\", \"azure/gpt-5-mini\").\n *\n * Resolution order:\n * 1. Exact match on provider ID\n * 2. Strip provider prefix, try \"openai/{model}\" (covers Azure deployments)\n * 3. Cross-provider model-name fallback (covers hosting providers like Groq, Together, Fireworks)\n * 4. undefined (no pricing available)\n */\nexport function lookupPricing(providerId: string): ModelPricing | undefined {\n // 1. Exact match\n if (models[providerId]) return models[providerId]\n\n const model = providerId.split('/').slice(1).join('/')\n if (!model) return undefined\n\n // 2. Try as openai/{model} (covers azure/* deployments)\n const asOpenai = `openai/${model}`\n if (models[asOpenai]) return models[asOpenai]\n\n // 3. Cross-provider: look up by model name alone\n const crossKey = modelNameIndex.get(model)\n if (crossKey) return models[crossKey]\n\n return undefined\n}\n\nexport function registerPricing(providerId: string, pricing: ModelPricing): void {\n models[providerId] = pricing\n}\n\nexport function estimateCost(\n pricing: ModelPricing,\n promptTokens: number,\n completionTokens: number,\n): number {\n return pricing.inputPerToken * promptTokens + pricing.outputPerToken * completionTokens\n}\n","import type { ScorerFn } from './types.js'\nimport { lookupPricing, estimateCost } from '../pricing/lookup.js'\n\nexport const costScorer: ScorerFn = ({ result }, providerId) => {\n const promptTokens = result.usage?.promptTokens ?? 0\n const completionTokens = result.usage?.completionTokens ?? 0\n const totalTokens = promptTokens + completionTokens\n\n const pricing = lookupPricing(providerId)\n\n if (!pricing) {\n return {\n name: 'cost',\n value: -1,\n details: {\n estimatedUsd: null,\n promptTokens,\n completionTokens,\n totalTokens,\n note: 'No pricing data available for this model',\n },\n }\n }\n\n const usd = estimateCost(pricing, promptTokens, completionTokens)\n\n return {\n name: 'cost',\n value: usd,\n details: {\n estimatedUsd: usd,\n promptTokens,\n completionTokens,\n totalTokens,\n },\n }\n}\n","import type { ScorerFn } from './types.js'\n\n/**\n * Simple exact-match correctness for v0.1.\n *\n * For strings: case-insensitive trimmed comparison.\n * For objects: key-order-independent deep equality.\n * Returns 1 (match) or 0 (no match / no expected value).\n */\nexport const correctnessScorer: ScorerFn = ({ task, result }) => {\n if (task.expected === undefined) {\n return { name: 'correctness', value: 0.5, details: { reason: 'no expected value' } }\n }\n\n const match = deepEqual(task.expected, result.output)\n\n return {\n name: 'correctness',\n value: match ? 1 : 0,\n details: { expected: task.expected, actual: result.output },\n }\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true\n\n if (typeof a === 'string' && typeof b === 'string') {\n return a.trim().toLowerCase() === b.trim().toLowerCase()\n }\n\n if (typeof a !== typeof b) return false\n if (a === null || b === null) return a === b\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false\n return a.every((val, i) => deepEqual(val, b[i]))\n }\n\n if (typeof a === 'object' && typeof b === 'object') {\n const objA = a as Record<string, unknown>\n const objB = b as Record<string, unknown>\n const keysA = Object.keys(objA)\n const keysB = Object.keys(objB)\n if (keysA.length !== keysB.length) return false\n return keysA.every((key) => key in objB && deepEqual(objA[key], objB[key]))\n }\n\n return a === b\n}\n","import type { ScorerFn } from './types.js'\n\nexport const schemaCorrectnessScorer: ScorerFn = ({ task, result }) => {\n if (!task.schema) {\n return { name: 'schema-correctness', value: -1, details: { reason: 'no schema defined' } }\n }\n\n let data = result.output\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data) as Record<string, unknown>\n } catch {\n return {\n name: 'schema-correctness',\n value: 0,\n details: { reason: 'output is not valid JSON' },\n }\n }\n }\n\n const parsed = task.schema.safeParse(data)\n\n return {\n name: 'schema-correctness',\n value: parsed.success ? 1 : 0,\n details: parsed.success\n ? { valid: true }\n : { valid: false, errors: parsed.error.issues.map((i) => i.message) },\n }\n}\n","import type { ScorerFn } from './types.js'\n\nexport const fuzzySimilarityScorer: ScorerFn = ({ task, result }) => {\n if (task.expected === undefined) {\n return { name: 'fuzzy-similarity', value: -1, details: { reason: 'no expected value' } }\n }\n\n const a = stringify(task.expected)\n const b = stringify(result.output)\n const setA = tokenize(a)\n const setB = tokenize(b)\n\n const similarity = jaccardSimilarity(setA, setB)\n\n return {\n name: 'fuzzy-similarity',\n value: Math.round(similarity * 100) / 100,\n details: { method: 'jaccard', expectedTokens: setA.size, actualTokens: setB.size },\n }\n}\n\nfunction stringify(value: unknown): string {\n if (typeof value === 'string') return value.toLowerCase()\n return JSON.stringify(value).toLowerCase()\n}\n\nfunction tokenize(text: string): Set<string> {\n return new Set(text.match(/\\w+/g) ?? [])\n}\n\nfunction jaccardSimilarity(a: Set<string>, b: Set<string>): number {\n if (a.size === 0 && b.size === 0) return 1\n\n let intersection = 0\n for (const token of a) {\n if (b.has(token)) intersection++\n }\n\n const union = a.size + b.size - intersection\n return union === 0 ? 1 : intersection / union\n}\n","import OpenAI, { AzureOpenAI } from 'openai'\nimport { REQUEST_TIMEOUT_MS } from '../providers/openai.js'\nimport type { ScorerFn } from './types.js'\n\nconst JUDGE_PROMPT = `You are a strict scoring judge. Evaluate the actual output against the expected output on three criteria. Score each from 0.0 to 1.0 using the full range (not just 0, 0.5, 1).\n\nCriteria:\n1. Accuracy — are the facts, entities, and claims correct? Penalize hallucinations or wrong details.\n2. Completeness — does it capture all key information from the expected output? Penalize missing points.\n3. Conciseness — is it free of unnecessary filler, repetition, or tangential content? Penalize verbosity.\n\nRespond with ONLY this exact format — three lines, no other text:\naccuracy: <number>\ncompleteness: <number>\nconciseness: <number>\n\nTask: {task}\nExpected: {expected}\nActual: {actual}`\n\ninterface JudgeClientResult {\n client: OpenAI\n model: string\n}\n\nfunction resolveJudgeClient(configModel?: string, timeoutMs = REQUEST_TIMEOUT_MS): JudgeClientResult | undefined {\n const model = configModel ?? process.env.DUELIST_JUDGE_MODEL ?? 'gpt-5-mini'\n\n // If the judge model starts with \"gemini\", use Google's OpenAI-compatible endpoint\n if (model.startsWith('gemini') && process.env.GOOGLE_API_KEY) {\n return {\n client: new OpenAI({\n apiKey: process.env.GOOGLE_API_KEY,\n baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/',\n timeout: timeoutMs,\n }),\n model,\n }\n }\n\n // Azure OpenAI fallback\n if (!process.env.OPENAI_API_KEY && process.env.AZURE_OPENAI_API_KEY) {\n return {\n client: new AzureOpenAI({\n apiKey: process.env.AZURE_OPENAI_API_KEY,\n endpoint: process.env.AZURE_OPENAI_ENDPOINT,\n apiVersion: process.env.AZURE_OPENAI_API_VERSION ?? '2024-12-01-preview',\n deployment: model,\n timeout: timeoutMs,\n }),\n model,\n }\n }\n\n // OpenAI\n const apiKey = process.env.OPENAI_API_KEY\n if (!apiKey) return undefined\n\n return { client: new OpenAI({ apiKey, timeout: timeoutMs }), model }\n}\n\n/**\n * Create an LLM-as-judge scorer configured with a specific model.\n *\n * The model can also be set via DUELIST_JUDGE_MODEL env var.\n * Requires OPENAI_API_KEY, AZURE_OPENAI_API_KEY, or GOOGLE_API_KEY\n * depending on the model prefix.\n */\nexport function createLlmJudgeScorer(judgeModel?: string, timeoutMs = REQUEST_TIMEOUT_MS): ScorerFn {\n let cached: JudgeClientResult | undefined | null = undefined\n\n return async ({ task, result }) => {\n if (task.expected === undefined) {\n return { name: 'llm-judge-correctness', value: -1, details: { reason: 'no expected value' } }\n }\n\n // Lazy-init and cache the client\n if (cached === undefined) {\n cached = resolveJudgeClient(judgeModel, timeoutMs) ?? null\n }\n\n if (!cached) {\n return {\n name: 'llm-judge-correctness',\n value: -1,\n details: { reason: 'no API key available for judge model' },\n }\n }\n\n const { client, model } = cached\n\n const prompt = JUDGE_PROMPT\n .replace('{task}', task.prompt)\n .replace('{expected}', JSON.stringify(task.expected))\n .replace('{actual}', JSON.stringify(result.output))\n\n try {\n const response = await client.chat.completions.create({\n model,\n messages: [{ role: 'user', content: prompt }],\n max_completion_tokens: 2048,\n })\n\n const content = response.choices[0]?.message?.content?.trim() ?? ''\n const parsed: Record<string, number> = {}\n for (const line of content.split('\\n')) {\n const match = line.match(/^(accuracy|completeness|conciseness)\\s*:\\s*([\\d.]+)/i)\n if (match) parsed[match[1].toLowerCase()] = parseFloat(match[2])\n }\n\n const accuracy = parsed.accuracy\n const completeness = parsed.completeness\n const conciseness = parsed.conciseness\n\n if (accuracy == null || completeness == null || conciseness == null ||\n [accuracy, completeness, conciseness].some((s) => isNaN(s) || s < 0 || s > 1)) {\n return {\n name: 'llm-judge-correctness',\n value: -1,\n details: { reason: `judge returned unparseable scores: \"${content}\"`, model },\n }\n }\n\n const composite = Math.round(((accuracy + completeness + conciseness) / 3) * 100) / 100\n\n return {\n name: 'llm-judge-correctness',\n value: composite,\n details: { model, accuracy, completeness, conciseness },\n }\n } catch (err) {\n return {\n name: 'llm-judge-correctness',\n value: -1,\n details: { reason: `judge call failed: ${err instanceof Error ? err.message : String(err)}` },\n }\n }\n }\n}\n","import OpenAI, { AzureOpenAI } from 'openai'\nimport { zodToJsonSchema } from 'zod-to-json-schema'\nimport { registerPricing } from '../pricing/lookup.js'\nimport type { ToolDefinition } from '../tasks/types.js'\nimport type { ArenaProvider, TaskInput, TaskResult, ToolCall } from './types.js'\nimport { SCHEMA_SYSTEM_MESSAGE, parseSchemaOutput } from './shared.js'\n\n/** Default per-request timeout in ms (60 s). Prevents hanging on unresponsive APIs. */\nexport const REQUEST_TIMEOUT_MS = 60_000\n\nexport interface OpenAIProviderOptions {\n apiKey?: string\n baseURL?: string\n timeoutMs?: number\n}\n\nexport interface AzureOpenAIProviderOptions {\n apiKey?: string\n endpoint?: string\n apiVersion?: string\n deployment?: string\n timeoutMs?: number\n}\n\nexport function openai(model: string, options?: OpenAIProviderOptions): ArenaProvider {\n const client = new OpenAI({\n apiKey: options?.apiKey ?? process.env.OPENAI_API_KEY,\n baseURL: options?.baseURL,\n timeout: options?.timeoutMs ?? REQUEST_TIMEOUT_MS,\n })\n\n return makeProvider(`openai/${model}`, 'OpenAI', model, client, model)\n}\n\nexport interface OpenAICompatibleOptions {\n id: string\n name: string\n model: string\n baseURL: string\n apiKey?: string\n apiKeyEnv?: string\n /** Strip `<think>...</think>` blocks from reasoning models (e.g. DeepSeek-R1, MiniMax M2.5) */\n stripThinking?: boolean\n /** Mark this provider as free (e.g. local Ollama models) so it registers zero-cost pricing */\n free?: boolean\n timeoutMs?: number\n}\n\nexport function openaiCompatible(options: OpenAICompatibleOptions): ArenaProvider {\n const apiKey = options.apiKey\n ?? (options.apiKeyEnv ? process.env[options.apiKeyEnv] : undefined)\n ?? 'no-key'\n\n const client = new OpenAI({\n apiKey,\n baseURL: options.baseURL,\n timeout: options.timeoutMs ?? REQUEST_TIMEOUT_MS,\n })\n\n if (options.free) {\n registerPricing(options.id, { inputPerToken: 0, outputPerToken: 0 })\n }\n\n return makeProvider(options.id, options.name, options.model, client, options.model, options.stripThinking)\n}\n\n/**\n * Create an Azure OpenAI provider.\n *\n * @param model - The model or deployment name (e.g. \"gpt-4o\", \"gpt-5-mini\").\n * Used as the deployment name unless `options.deployment` overrides it.\n */\nexport function azureOpenai(model: string, options?: AzureOpenAIProviderOptions): ArenaProvider {\n const deployment = options?.deployment ?? model\n\n const client = new AzureOpenAI({\n apiKey: options?.apiKey ?? process.env.AZURE_OPENAI_API_KEY,\n endpoint: options?.endpoint ?? process.env.AZURE_OPENAI_ENDPOINT,\n apiVersion: options?.apiVersion ?? process.env.AZURE_OPENAI_API_VERSION ?? '2024-12-01-preview',\n deployment,\n timeout: options?.timeoutMs ?? REQUEST_TIMEOUT_MS,\n })\n\n return makeProvider(`azure/${model}`, 'Azure OpenAI', model, client, deployment)\n}\n\nexport function makeProvider(\n id: string,\n name: string,\n model: string,\n client: OpenAI | AzureOpenAI,\n requestModel: string,\n stripThinking?: boolean,\n): ArenaProvider {\n return {\n id,\n name,\n model,\n\n async run(input: TaskInput): Promise<TaskResult> {\n const start = Date.now()\n\n const params: OpenAI.ChatCompletionCreateParams = {\n model: requestModel,\n messages: [{ role: 'user', content: input.prompt }],\n }\n\n // If a Zod schema is provided, use structured output via response_format\n if (input.schema) {\n params.response_format = { type: 'json_object' }\n params.messages = [\n { role: 'system', content: SCHEMA_SYSTEM_MESSAGE },\n ...params.messages,\n ]\n }\n\n // If tools are provided, convert to OpenAI tool format\n if (input.tools?.length) {\n params.tools = input.tools.map(toolDefToOpenAI)\n params.tool_choice = 'auto'\n }\n\n const response = await client.chat.completions.create(params, { signal: input.signal })\n let totalPromptTokens = response.usage?.prompt_tokens ?? 0\n let totalCompletionTokens = response.usage?.completion_tokens ?? 0\n\n const choice = response.choices[0]\n const toolCallsRaw = choice?.message?.tool_calls\n const collectedToolCalls: ToolCall[] = []\n let finalResponse = response\n\n // If the model made tool calls, execute handlers and send results back\n if (toolCallsRaw?.length && input.tools?.length) {\n const toolMessages: OpenAI.ChatCompletionMessageParam[] = [\n ...params.messages,\n choice!.message,\n ]\n\n for (const tc of toolCallsRaw) {\n const toolDef = input.tools.find((t) => t.name === tc.function.name)\n let args: unknown\n try {\n args = JSON.parse(tc.function.arguments)\n } catch {\n args = tc.function.arguments\n }\n\n let result: unknown\n if (toolDef?.handler) {\n result = await toolDef.handler(args)\n }\n\n collectedToolCalls.push({ name: tc.function.name, arguments: args, result })\n\n toolMessages.push({\n role: 'tool' as const,\n tool_call_id: tc.id,\n content: JSON.stringify(result ?? {}),\n })\n }\n\n // Follow-up call with tool results\n const followUp = await client.chat.completions.create({\n model: requestModel,\n messages: toolMessages,\n }, { signal: input.signal })\n\n totalPromptTokens += followUp.usage?.prompt_tokens ?? 0\n totalCompletionTokens += followUp.usage?.completion_tokens ?? 0\n finalResponse = followUp\n }\n\n const latencyMs = Date.now() - start\n const finalChoice = finalResponse.choices[0]\n let rawContent = finalChoice?.message?.content ?? ''\n\n if (stripThinking) {\n rawContent = rawContent.replace(/<think>[\\s\\S]*?<\\/think>\\s*/, '')\n }\n\n const output = parseSchemaOutput(rawContent, !!input.schema)\n\n return {\n output,\n usage: {\n promptTokens: totalPromptTokens || undefined,\n completionTokens: totalCompletionTokens || undefined,\n },\n latencyMs,\n raw: finalResponse,\n toolCalls: collectedToolCalls.length > 0 ? collectedToolCalls : undefined,\n }\n },\n }\n}\n\n// ── Gemini (OpenAI-compatible) ──────────────────────────────────────\n\nexport interface GeminiProviderOptions {\n apiKey?: string\n timeoutMs?: number\n}\n\nexport function gemini(model: string, options?: GeminiProviderOptions): ArenaProvider {\n const apiKey = options?.apiKey ?? process.env.GOOGLE_API_KEY\n\n if (!apiKey) {\n throw new Error(\n `Missing API key for google/${model}. Set GOOGLE_API_KEY or pass apiKey option.`,\n )\n }\n\n const client = new OpenAI({\n apiKey,\n baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/',\n timeout: options?.timeoutMs ?? REQUEST_TIMEOUT_MS,\n })\n\n return makeProvider(`google/${model}`, 'Google AI', model, client, model)\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────\n\nfunction toolDefToOpenAI(tool: ToolDefinition): OpenAI.ChatCompletionTool {\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: zodToJsonSchema(tool.parameters, { target: 'openAi' }) as Record<string, unknown>,\n },\n }\n}\n","/** System message injected when a JSON schema is expected. */\nexport const SCHEMA_SYSTEM_MESSAGE = 'Respond with valid JSON matching the requested schema.'\n\n/** Try to parse raw content as JSON when a schema is expected, falling back to the raw string. */\nexport function parseSchemaOutput(rawContent: string, hasSchema: boolean): string | Record<string, unknown> {\n if (!hasSchema) return rawContent\n try {\n return JSON.parse(rawContent)\n } catch {\n return rawContent\n }\n}\n","import type { ScorerFn } from './types.js'\n\nexport const toolUsageScorer: ScorerFn = ({ task, result }) => {\n const expectedToolName = task.tools?.[0]?.name\n if (!expectedToolName) {\n return { name: 'tool-usage', value: -1, details: { reason: 'no tools configured on task' } }\n }\n\n const usedTool = result.toolCalls?.some((c) => c.name === expectedToolName) ?? false\n\n return {\n name: 'tool-usage',\n value: usedTool ? 1 : 0,\n details: { expectedToolName, usedTool, toolCalls: result.toolCalls ?? [] },\n }\n}\n","import type { BuiltInScorerName, ScorerFn } from './types.js'\nimport { latencyScorer } from './latency.js'\nimport { costScorer } from './cost.js'\nimport { correctnessScorer } from './correctness.js'\nimport { schemaCorrectnessScorer } from './schema-correctness.js'\nimport { fuzzySimilarityScorer } from './fuzzy-similarity.js'\nimport { createLlmJudgeScorer } from './llm-judge.js'\nimport { toolUsageScorer } from './tool-usage.js'\n\nconst staticScorers: Partial<Record<BuiltInScorerName, ScorerFn>> = {\n latency: latencyScorer,\n cost: costScorer,\n correctness: correctnessScorer,\n 'schema-correctness': schemaCorrectnessScorer,\n 'fuzzy-similarity': fuzzySimilarityScorer,\n 'tool-usage': toolUsageScorer,\n}\n\nexport function resolveScorers(names: BuiltInScorerName[], judgeModel?: string, timeoutMs?: number): ScorerFn[] {\n return names.map((name) => {\n if (name === 'llm-judge-correctness') {\n return createLlmJudgeScorer(judgeModel, timeoutMs)\n }\n const scorer = staticScorers[name]\n if (!scorer) {\n throw new Error(`Unknown scorer: \"${name}\"`)\n }\n return scorer\n })\n}\n\nexport type { BuiltInScorerName, ScorerFn, ScoreResult, ScorerContext } from './types.js'\n","import type { ArenaProvider, ToolCall } from './providers/types.js'\nimport type { ArenaTask } from './tasks/types.js'\nimport type { ScoreResult, ScorerFn } from './scorers/types.js'\n\nexport interface BenchmarkResult {\n providerId: string\n taskName: string\n run: number\n scores: ScoreResult[]\n error?: string\n raw: {\n output: string | Record<string, unknown>\n latencyMs: number\n usage?: { promptTokens?: number; completionTokens?: number }\n toolCalls?: ToolCall[]\n }\n}\n\nconst DEFAULT_TIMEOUT_MS = 60_000\n\nexport interface RunOptions {\n providers: ArenaProvider[]\n tasks: ArenaTask[]\n scorers: ScorerFn[]\n runs: number\n timeout?: number\n onResult?: (result: BenchmarkResult) => void\n}\n\nfunction withTimeout<T>(run: (signal: AbortSignal) => Promise<T>, ms: number): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const controller = new AbortController()\n const timer = setTimeout(() => {\n controller.abort()\n reject(new Error(`Request timed out after ${ms}ms`))\n }, ms)\n run(controller.signal).then(\n (v) => { clearTimeout(timer); resolve(v) },\n (e) => { clearTimeout(timer); reject(e) },\n )\n })\n}\n\nexport async function runBenchmarks(options: RunOptions): Promise<BenchmarkResult[]> {\n const { providers, tasks, scorers, runs, onResult } = options\n const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS\n\n const results: BenchmarkResult[] = []\n\n // Tasks run sequentially so every provider faces the same conditions per task.\n // Providers within each task run in parallel — fair head-to-head comparison\n // without queue-induced timeout penalties from full parallelism.\n for (const task of tasks) {\n for (let run = 1; run <= runs; run++) {\n const runResults = await Promise.all(\n providers.map(async (provider) => {\n let result: BenchmarkResult\n\n try {\n const taskResult = await withTimeout((signal) => provider.run({\n prompt: task.prompt,\n schema: task.schema,\n tools: task.tools,\n signal,\n }), timeout)\n\n const scores = await Promise.all(\n scorers.map((scorer) => scorer({ task, result: taskResult }, provider.id))\n )\n\n result = {\n providerId: provider.id,\n taskName: task.name,\n run,\n scores,\n raw: {\n output: taskResult.output,\n latencyMs: taskResult.latencyMs,\n usage: taskResult.usage,\n toolCalls: taskResult.toolCalls,\n },\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n\n result = {\n providerId: provider.id,\n taskName: task.name,\n run,\n scores: [],\n error: message,\n raw: { output: '', latencyMs: 0 },\n }\n }\n\n onResult?.(result)\n return result\n })\n )\n\n results.push(...runResults)\n }\n }\n\n return results\n}\n","/** Format a USD cost with adaptive precision (always 2+ significant figures). */\nconst MAX_FRACTION_DIGITS = 100\nexport function formatCost(usd: number | undefined): string {\n if (usd === undefined) return '—'\n if (usd === 0) return '$0.00'\n if (usd >= 0.01) return `~$${usd.toFixed(2)}`\n const digits = Math.min(\n MAX_FRACTION_DIGITS,\n Math.max(4, -Math.floor(Math.log10(Math.abs(usd))) + 1),\n )\n return `~$${usd.toFixed(digits).replace(/0+$/, '')}`\n}\n\n/** Format a numeric delta with explicit sign. */\nexport function formatDelta(delta: number, precision: number = 4): string {\n const sign = delta >= 0 ? '+' : ''\n return `${sign}${delta.toFixed(precision)}`\n}\n","import type { BenchmarkResult } from '../runner.js'\n\n// ── Shared types ────────────────────────────────────────────────────\n\nexport interface AggregatedDetails {\n costUsd: number | undefined\n totalTokens: number | undefined\n}\n\nexport interface ProviderTaskData {\n providerId: string\n avgScores: Record<string, number>\n avgDetails: AggregatedDetails\n latencyMs: number | undefined\n allErrors: boolean\n errorCount: number\n}\n\nexport interface ColumnStats {\n values: Map<string, number | undefined>\n best: number | undefined\n worst: number | undefined\n}\n\nexport type Medal = 'gold' | 'silver' | 'bronze' | 'none'\n\nexport interface GroupedResults {\n tasks: string[]\n providers: string[]\n scorerNames: string[]\n grouped: Map<string, BenchmarkResult[]>\n byProvider: Map<string, BenchmarkResult[]>\n hasErrors: boolean\n maxRun: number\n}\n\n// ── Grouping ────────────────────────────────────────────────────────\n\nexport function groupResults(results: BenchmarkResult[]): GroupedResults {\n const taskSet = new Set<string>()\n const providerSet = new Set<string>()\n const scorerSet = new Set<string>()\n const grouped = new Map<string, BenchmarkResult[]>()\n const byProvider = new Map<string, BenchmarkResult[]>()\n let hasErrors = false\n let maxRun = 0\n\n for (const r of results) {\n taskSet.add(r.taskName)\n providerSet.add(r.providerId)\n for (const s of r.scores) scorerSet.add(s.name)\n if (r.error) hasErrors = true\n if (r.run > maxRun) maxRun = r.run\n\n const key = `${r.taskName}::${r.providerId}`\n let group = grouped.get(key)\n if (!group) { group = []; grouped.set(key, group) }\n group.push(r)\n\n let provGroup = byProvider.get(r.providerId)\n if (!provGroup) { provGroup = []; byProvider.set(r.providerId, provGroup) }\n provGroup.push(r)\n }\n\n return {\n tasks: [...taskSet],\n providers: [...providerSet],\n scorerNames: [...scorerSet],\n grouped,\n byProvider,\n hasErrors,\n maxRun,\n }\n}\n\n// ── Aggregation ─────────────────────────────────────────────────────\n\nexport function aggregateProviderTask(\n providerId: string,\n grouped: Map<string, BenchmarkResult[]>,\n task: string\n): ProviderTaskData {\n const taskResults = grouped.get(`${task}::${providerId}`) ?? []\n const errorResults = taskResults.filter(r => r.error)\n const successResults = taskResults.filter(r => !r.error)\n\n if (successResults.length === 0) {\n return {\n providerId,\n avgScores: {},\n avgDetails: { costUsd: undefined, totalTokens: undefined },\n latencyMs: undefined,\n allErrors: errorResults.length > 0,\n errorCount: errorResults.length,\n }\n }\n\n return {\n providerId,\n avgScores: averageScores(successResults),\n avgDetails: averageDetails(successResults),\n latencyMs: average(successResults.map(r => r.raw.latencyMs)),\n allErrors: false,\n errorCount: errorResults.length,\n }\n}\n\nexport function averageScores(results: BenchmarkResult[]): Record<string, number> {\n const sums: Record<string, number> = {}\n const counts: Record<string, number> = {}\n\n for (const result of results) {\n for (const score of result.scores) {\n if (score.value < 0) continue\n sums[score.name] = (sums[score.name] ?? 0) + score.value\n counts[score.name] = (counts[score.name] ?? 0) + 1\n }\n }\n\n const avgs: Record<string, number> = {}\n for (const name of Object.keys(sums)) {\n avgs[name] = sums[name]! / counts[name]!\n }\n return avgs\n}\n\nexport function averageDetails(results: BenchmarkResult[]): AggregatedDetails {\n let costSum = 0\n let costCount = 0\n let tokenSum = 0\n let tokenCount = 0\n\n for (const result of results) {\n const costScore = result.scores.find((s) => s.name === 'cost')\n const details = costScore?.details as {\n estimatedUsd?: number | null\n totalTokens?: number\n } | undefined\n\n if (details?.estimatedUsd != null) {\n costSum += details.estimatedUsd\n costCount++\n }\n if (details?.totalTokens != null) {\n tokenSum += details.totalTokens\n tokenCount++\n }\n }\n\n return {\n costUsd: costCount > 0 ? costSum / costCount : undefined,\n totalTokens: tokenCount > 0 ? Math.round(tokenSum / tokenCount) : undefined,\n }\n}\n\nexport function average(nums: number[]): number | undefined {\n if (nums.length === 0) return undefined\n return nums.reduce((a, b) => a + b, 0) / nums.length\n}\n\n// ── Column statistics & medals ──────────────────────────────────────\n\nexport function computeColumnStats(\n providerData: ProviderTaskData[],\n scorerNames: string[]\n): Map<string, ColumnStats> {\n const stats = new Map<string, ColumnStats>()\n const valid = providerData.filter(p => !p.allErrors)\n\n if (scorerNames.includes('latency')) {\n const values = new Map<string, number | undefined>()\n for (const p of providerData) {\n values.set(p.providerId, p.allErrors ? undefined : p.latencyMs)\n }\n const nums = valid.map(p => p.latencyMs).filter((v): v is number => v !== undefined)\n stats.set('latency', {\n values,\n best: nums.length > 0 ? Math.min(...nums) : undefined,\n worst: nums.length > 0 ? Math.max(...nums) : undefined,\n })\n }\n\n if (scorerNames.includes('cost')) {\n const costValues = new Map<string, number | undefined>()\n const tokenValues = new Map<string, number | undefined>()\n for (const p of providerData) {\n costValues.set(p.providerId, p.allErrors ? undefined : p.avgDetails.costUsd)\n tokenValues.set(p.providerId, p.allErrors ? undefined : p.avgDetails.totalTokens)\n }\n const costNums = valid.map(p => p.avgDetails.costUsd).filter((v): v is number => v !== undefined)\n const tokenNums = valid.map(p => p.avgDetails.totalTokens).filter((v): v is number => v !== undefined)\n stats.set('cost', {\n values: costValues,\n best: costNums.length > 0 ? Math.min(...costNums) : undefined,\n worst: costNums.length > 0 ? Math.max(...costNums) : undefined,\n })\n stats.set('tokens', {\n values: tokenValues,\n best: tokenNums.length > 0 ? Math.min(...tokenNums) : undefined,\n worst: tokenNums.length > 0 ? Math.max(...tokenNums) : undefined,\n })\n }\n\n for (const name of scorerNames) {\n if (name === 'latency' || name === 'cost') continue\n const values = new Map<string, number | undefined>()\n for (const p of providerData) {\n values.set(p.providerId, p.allErrors ? undefined : p.avgScores[name])\n }\n const nums = valid.map(p => p.avgScores[name]).filter((v): v is number => v !== undefined)\n stats.set(name, {\n values,\n best: nums.length > 0 ? Math.max(...nums) : undefined,\n worst: nums.length > 0 ? Math.min(...nums) : undefined,\n })\n }\n\n return stats\n}\n\nexport function computeMedals(\n columnStats: Map<string, ColumnStats>,\n providerIds: string[]\n): Map<string, Medal> {\n const medals = new Map<string, Medal>()\n\n if (providerIds.length < 2) {\n for (const id of providerIds) medals.set(id, 'none')\n return medals\n }\n\n const wins = new Map<string, number>()\n for (const id of providerIds) wins.set(id, 0)\n\n for (const [, colStats] of columnStats) {\n if (colStats.best === undefined) continue\n const bestProviders = [...colStats.values.entries()]\n .filter(([, v]) => v !== undefined && v === colStats.best)\n if (bestProviders.length === 1) {\n wins.set(bestProviders[0]![0], (wins.get(bestProviders[0]![0]) ?? 0) + 1)\n }\n }\n\n const totalWins = [...wins.values()].reduce((a, b) => a + b, 0)\n if (totalWins === 0) {\n for (const id of providerIds) medals.set(id, 'none')\n return medals\n }\n\n const sorted = [...wins.entries()].sort((a, b) =>\n b[1] - a[1] || a[0].localeCompare(b[0])\n )\n\n const medalList: Medal[] = ['gold', 'silver', 'bronze']\n let rank = 0\n for (let i = 0; i < sorted.length; i++) {\n if (i > 0 && sorted[i]![1] < sorted[i - 1]![1]) {\n rank = i\n }\n const hasWins = sorted[i]![1] > 0\n medals.set(sorted[i]![0], hasWins && rank < medalList.length ? medalList[rank]! : 'none')\n }\n\n return medals\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────\n\nexport function providerLabel(providerId: string): string {\n const prefix = providerId.split('/')[0]\n switch (prefix) {\n case 'azure': return '(OpenAI via Azure)'\n case 'openai': return '(OpenAI)'\n case 'anthropic': return '(Anthropic)'\n case 'google': return '(Google)'\n case 'mistral': return '(Mistral)'\n case 'meta': return '(Meta)'\n case 'deepseek': return '(DeepSeek)'\n case 'cohere': return '(Cohere)'\n case 'qwen': return '(Qwen)'\n case 'xai': return '(xAI)'\n case 'minimax': return '(MiniMax)'\n case 'moonshot': return '(Moonshot / Kimi)'\n case 'perplexity': return '(Perplexity)'\n case 'amazon': return '(Amazon)'\n case 'nvidia': return '(NVIDIA)'\n case 'microsoft': return '(Microsoft)'\n case 'ai21': return '(AI21 Labs)'\n case 'bytedance': return '(ByteDance)'\n case 'together': return '(Together AI)'\n case 'fireworks': return '(Fireworks AI)'\n case 'groq': return '(Groq)'\n case 'cerebras': return '(Cerebras)'\n default: return `(${prefix})`\n }\n}\n\nexport function apiKeyHint(providerId: string, error: string): string | undefined {\n const lower = error.toLowerCase()\n const isAuthError = lower.includes('api key') || lower.includes('401') ||\n lower.includes('unauthorized') || lower.includes('authentication') ||\n lower.includes('incorrect api key') || lower.includes('apikey')\n\n if (!isAuthError) return undefined\n\n const prefix = providerId.split('/')[0]\n switch (prefix) {\n case 'openai': return 'Set: export OPENAI_API_KEY=sk-...'\n case 'azure': return 'Set: export AZURE_OPENAI_API_KEY=... and AZURE_OPENAI_ENDPOINT=...'\n case 'anthropic': return 'Set: export ANTHROPIC_API_KEY=sk-ant-...'\n case 'google': return 'Set: export GOOGLE_API_KEY=...'\n default: return `Check the API key for ${providerId}`\n }\n}\n\nexport function rankProviders(\n successByProvider: Map<string, BenchmarkResult[]>,\n providers: string[],\n scorerName: string\n): { id: string; avg: number } | undefined {\n const ranked = providers\n .map((id) => {\n const runs = successByProvider.get(id) ?? []\n const scores = runs\n .flatMap((r) => r.scores.filter((s) => s.name === scorerName && s.value >= 0))\n .map((s) => s.value)\n const avg = scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : undefined\n return { id, avg }\n })\n .filter((p) => p.avg !== undefined)\n .sort((a, b) => b.avg! - a.avg!)\n\n return ranked[0] ? { id: ranked[0].id, avg: ranked[0].avg! } : undefined\n}\n\nexport function scorerLabel(name: string): string {\n switch (name) {\n case 'correctness': return 'Match'\n case 'schema-correctness': return 'Schema'\n case 'fuzzy-similarity': return 'Fuzzy'\n case 'llm-judge-correctness': return 'Judge'\n case 'tool-usage': return 'Tool'\n default: return name\n }\n}\n\n/** Medal emoji for display */\nexport function medalEmoji(medal: Medal): string {\n switch (medal) {\n case 'gold': return '🥇'\n case 'silver': return '🥈'\n case 'bronze': return '🥉'\n case 'none': return ''\n }\n}\n","import type { BenchmarkResult } from '../runner.js'\nimport { formatCost } from '../utils/format.js'\nimport {\n type ProviderTaskData,\n type ColumnStats,\n groupResults,\n aggregateProviderTask,\n average,\n computeColumnStats,\n computeMedals,\n providerLabel,\n apiKeyHint,\n rankProviders,\n medalEmoji,\n scorerLabel,\n} from './shared.js'\n\n// ── ANSI color palette ──────────────────────────────────────────────────────\n\nconst reset = '\\x1b[0m'\nconst boldCode = '\\x1b[1m'\nconst dimCode = '\\x1b[2m'\nconst green = '\\x1b[32m'\nconst red = '\\x1b[31m'\nconst yellow = '\\x1b[33m'\nconst cyan = '\\x1b[36m'\nconst brightGreen = '\\x1b[92m'\nconst brightWhite = '\\x1b[97m'\n\nfunction bold(s: string) { return `${boldCode}${s}${reset}` }\nfunction dim(s: string) { return `${dimCode}${s}${reset}` }\n\n// ── String utilities ────────────────────────────────────────────────────────\n\nfunction stripAnsi(s: string): string {\n return s.replace(/\\x1b\\[[0-9;]*m/g, '')\n}\n\n/** Display width accounting for wide emoji (medals, trophy = 2 columns) */\nfunction displayWidth(s: string): number {\n const stripped = stripAnsi(s)\n let width = 0\n for (const ch of stripped) {\n const code = ch.codePointAt(0) ?? 0\n if (code >= 0x1F000) width += 2\n else if (code >= 0x2600 && code <= 0x27BF) width += 2\n else width += 1\n }\n return width\n}\n\n/** Pad string to target display width, accounting for ANSI codes and wide chars */\nfunction padCell(str: string, targetWidth: number, align: 'left' | 'right'): string {\n const dw = displayWidth(str)\n const padding = Math.max(0, targetWidth - dw)\n if (align === 'right') return ' '.repeat(padding) + str\n return str + ' '.repeat(padding)\n}\n\n// ── Sparkline bar ───────────────────────────────────────────────────────────\n\ninterface SparkBarParts { fill: string; track: string }\n\nfunction sparkBar(ratio: number, width: number = 8): SparkBarParts {\n const clamped = Math.max(0, Math.min(1, ratio))\n const fillLen = Math.round(clamped * width)\n const fill = '▓'.repeat(fillLen)\n const track = '░'.repeat(width - fillLen)\n return { fill, track }\n}\n\n// ── Box-drawing ─────────────────────────────────────────────────────────────\n\ntype LinePosition = 'top' | 'header' | 'bottom' | 'merge'\n\nfunction drawTableLine(widths: number[], position: LinePosition): string {\n const totalInner = widths.reduce((sum, w) => sum + w + 2, 0) + widths.length - 1\n\n if (position === 'bottom') {\n return dim(`└${'─'.repeat(totalInner)}┘`)\n }\n if (position === 'merge') {\n return dim(`├${'─'.repeat(totalInner)}┤`)\n }\n\n const segments = widths.map(w => '─'.repeat(w + 2))\n if (position === 'top') {\n return dim(`┌${segments.join('┬')}┐`)\n }\n // header separator\n return dim(`├${segments.join('┼')}┤`)\n}\n\nfunction drawTableRow(\n cells: string[],\n widths: number[],\n aligns: ('left' | 'right')[]\n): string {\n const parts = cells.map((cell, i) =>\n ' ' + padCell(cell, widths[i]!, aligns[i]!) + ' '\n )\n return dim('│') + parts.join(dim('│')) + dim('│')\n}\n\n/** Single-cell row spanning the full table width */\nfunction drawSpanRow(content: string, widths: number[]): string {\n const totalInner = widths.reduce((sum, w) => sum + w + 2, 0) + widths.length - 1\n const dw = displayWidth(content)\n const padding = Math.max(0, totalInner - dw - 1)\n return dim('│') + ' ' + content + ' '.repeat(padding) + dim('│')\n}\n\n// ── Column layout ───────────────────────────────────────────────────────────\n\ninterface TableCol {\n label: string\n width: number\n align: 'left' | 'right'\n statsKey?: string\n}\n\nfunction colorByRank(\n text: string,\n value: number | undefined,\n colStats: ColumnStats,\n providerCount: number\n): string {\n if (value === undefined) return dim('—')\n if (providerCount < 2) return text\n if (colStats.best === undefined || colStats.worst === undefined) return text\n if (colStats.best === colStats.worst) return text\n\n if (value === colStats.best) return `${brightGreen}${boldCode}${text}${reset}`\n if (value === colStats.worst) return `${red}${text}${reset}`\n return `${yellow}${text}${reset}`\n}\n\n\n// ── Main reporter ───────────────────────────────────────────────────────────\n\nexport interface ConsoleReporterOptions {\n sparklines?: boolean\n}\n\nexport function consoleReporter(results: BenchmarkResult[], options?: ConsoleReporterOptions): void {\n const showSparklines = options?.sparklines ?? true\n if (results.length === 0) {\n console.log('\\nNo results to display.\\n')\n return\n }\n\n const { tasks, providers, scorerNames, grouped, byProvider, hasErrors, maxRun } = groupResults(results)\n const hasCost = scorerNames.includes('cost')\n const multi = providers.length >= 2\n\n // Title\n const runsPerCell = maxRun\n const runLabel = runsPerCell > 1 ? ` ${dim(`(${runsPerCell} runs each)`)}` : ''\n console.log('')\n console.log(` ${brightWhite}${boldCode}⬡ Agent Duelist${reset}${runLabel}`)\n console.log(` ${dim('━'.repeat(72))}`)\n console.log('')\n\n // Per-task tables\n for (const task of tasks) {\n console.log(` ${bold(`Task: ${task}`)}`)\n console.log('')\n\n // Gather per-provider data for this task (using pre-grouped map)\n const providerData: ProviderTaskData[] = providers.map(providerId =>\n aggregateProviderTask(providerId, grouped, task)\n )\n\n // Compute column stats and medals\n const columnStats = computeColumnStats(providerData, scorerNames)\n const medals = computeMedals(columnStats, providers)\n\n // Build columns — provider width is dynamic, score columns accommodate sparklines\n const maxProviderLen = Math.max(...providers.map(id => id.length))\n const providerWidth = Math.min(35, Math.max(22, maxProviderLen + 5))\n\n const cols: TableCol[] = [\n { label: 'Provider', width: providerWidth, align: 'left' }\n ]\n\n for (const name of scorerNames) {\n if (name === 'latency') {\n cols.push({ label: 'Latency', width: 10, align: 'right', statsKey: 'latency' })\n } else if (name === 'cost') {\n cols.push({ label: 'Cost', width: 12, align: 'right', statsKey: 'cost' })\n cols.push({ label: 'Tokens', width: 9, align: 'right', statsKey: 'tokens' })\n } else {\n cols.push({ label: scorerLabel(name), width: showSparklines ? 15 : 8, align: 'right', statsKey: name })\n }\n }\n\n if (hasErrors) {\n cols.push({ label: 'Status', width: 8, align: 'left' })\n }\n\n const widths = cols.map(c => c.width)\n const aligns = cols.map(c => c.align)\n\n // ┌ top border ┐\n console.log(` ${drawTableLine(widths, 'top')}`)\n\n // │ header row │\n const headerCells = cols.map(c => bold(c.label))\n console.log(` ${drawTableRow(headerCells, widths, aligns)}`)\n\n // ├ header separator ┤\n console.log(` ${drawTableLine(widths, 'header')}`)\n\n // │ data rows │\n for (const pd of providerData) {\n const medal = medalEmoji(medals.get(pd.providerId) ?? 'none')\n const providerCell = medal ? `${medal} ${pd.providerId}` : pd.providerId\n const cells: string[] = [providerCell]\n\n if (pd.allErrors) {\n // All runs failed — dashes everywhere\n for (const col of cols.slice(1)) {\n if (col.label === 'Status') {\n cells.push(`${red}FAIL${reset}`)\n } else {\n cells.push(dim('—'))\n }\n }\n } else {\n for (const col of cols.slice(1)) {\n if (col.label === 'Status') {\n cells.push(\n pd.errorCount > 0\n ? `${yellow}${pd.errorCount} err${reset}`\n : `${green}OK${reset}`\n )\n continue\n }\n\n const statsKey = col.statsKey!\n const colStats = columnStats.get(statsKey)\n\n if (statsKey === 'latency') {\n const ms = pd.latencyMs\n if (ms === undefined) {\n cells.push(dim('—'))\n } else {\n const text = `${Math.round(ms)}ms`\n cells.push(colStats ? colorByRank(text, ms, colStats, providers.length) : text)\n }\n } else if (statsKey === 'cost') {\n const cost = pd.avgDetails.costUsd\n if (cost === undefined) {\n cells.push(dim('—'))\n } else {\n const text = formatCost(cost)\n cells.push(colStats ? colorByRank(text, cost, colStats, providers.length) : text)\n }\n } else if (statsKey === 'tokens') {\n const tokens = pd.avgDetails.totalTokens\n if (tokens === undefined) {\n cells.push(dim('—'))\n } else {\n const text = `${tokens}`\n cells.push(colStats ? colorByRank(text, tokens, colStats, providers.length) : text)\n }\n } else {\n // Score column (0-1 scale) with optional sparkline bar\n const val = pd.avgScores[statsKey]\n if (val === undefined) {\n cells.push(dim('—'))\n } else {\n const pctStr = `${Math.round(val * 100)}%`.padStart(4)\n let coloredPct: string\n if (multi && colStats) {\n coloredPct = colorByRank(pctStr, val, colStats, providers.length)\n } else {\n // Single provider: threshold-based coloring\n if (val >= 0.8) coloredPct = `${green}${pctStr}${reset}`\n else if (val >= 0.5) coloredPct = `${yellow}${pctStr}${reset}`\n else coloredPct = `${red}${pctStr}${reset}`\n }\n if (showSparklines) {\n const { fill, track } = sparkBar(val)\n const barColor = val >= 0.8 ? green : val >= 0.5 ? yellow : red\n cells.push(`${coloredPct} ${barColor}${fill}${reset}${dim(track)}`)\n } else {\n cells.push(coloredPct)\n }\n }\n }\n }\n }\n\n console.log(` ${drawTableRow(cells, widths, aligns)}`)\n }\n\n // Winner row (2+ providers, at least one success)\n if (multi && providerData.some(p => !p.allErrors)) {\n const winnerId = [...medals.entries()].find(([, m]) => m === 'gold')?.[0]\n if (winnerId) {\n console.log(` ${drawTableLine(widths, 'merge')}`)\n const winnerText = `${brightGreen}${boldCode}🏆 Winner: ${winnerId}${reset} ${dim(providerLabel(winnerId))}`\n console.log(` ${drawSpanRow(winnerText, widths)}`)\n }\n }\n\n // └ bottom border ┘\n console.log(` ${drawTableLine(widths, 'bottom')}`)\n console.log('')\n }\n\n // Summary\n printSummary(results, providers, byProvider)\n\n // Errors — deduplicate by provider + error message and add hints\n const errorResults = results.filter((r) => r.error)\n if (errorResults.length > 0) {\n console.log(` ${bold('Errors')}`)\n console.log(` ${dim('━'.repeat(72))}`)\n\n const seen = new Set<string>()\n for (const r of errorResults) {\n const key = `${r.providerId}::${r.error}`\n if (seen.has(key)) continue\n seen.add(key)\n\n const count = errorResults.filter((e) => e.providerId === r.providerId && e.error === r.error).length\n const suffix = count > 1 ? ` (×${count})` : ''\n console.log(` ${red}✖${reset} ${r.providerId}: ${r.error}${suffix}`)\n\n const hint = apiKeyHint(r.providerId, r.error ?? '')\n if (hint) console.log(` ${dim(hint)}`)\n }\n console.log('')\n }\n\n if (hasCost) {\n console.log(dim(` Costs estimated from OpenRouter pricing catalog. Run npx tsx scripts/update-pricing.ts to refresh.`))\n console.log('')\n }\n}\n\n// ── Summary section ─────────────────────────────────────────────────────────\n\nfunction printSummary(results: BenchmarkResult[], providers: string[], byProvider: Map<string, BenchmarkResult[]>) {\n const successResults = results.filter((r) => !r.error)\n if (successResults.length === 0) return\n\n // Pre-compute success results per provider from the grouped map\n const successByProvider = new Map<string, BenchmarkResult[]>()\n for (const id of providers) {\n successByProvider.set(id, (byProvider.get(id) ?? []).filter((r) => !r.error))\n }\n\n console.log(` ${bold('Summary')}`)\n console.log(` ${dim('━'.repeat(72))}`)\n console.log('')\n\n const single = providers.length === 1\n\n // Best correctness (prefer llm-judge, fallback to correctness)\n const correctnessKey = successResults.some((r) => r.scores.some((s) => s.name === 'llm-judge-correctness' && s.value >= 0))\n ? 'llm-judge-correctness'\n : 'correctness'\n\n const byCorrectness = rankProviders(successByProvider, providers, correctnessKey)\n if (byCorrectness) {\n const medal = single ? `${cyan}◆${reset}` : '🥇'\n const pctStr = `${Math.round(byCorrectness.avg * 100)}%`\n if (single) {\n console.log(` ${medal} Avg correctness: ${brightGreen}${boldCode}${pctStr}${reset}`)\n } else {\n console.log(` ${medal} Most correct: ${bold(byCorrectness.id)} ${dim(providerLabel(byCorrectness.id))} ${brightGreen}${boldCode}${pctStr}${reset}`)\n }\n }\n\n // Fastest\n const byLatency = providers\n .map((id) => {\n const runs = successByProvider.get(id) ?? []\n const avg = average(runs.map((r) => r.raw.latencyMs))\n return { id, avg: avg ?? Infinity }\n })\n .sort((a, b) => a.avg - b.avg)[0]\n\n if (byLatency && byLatency.avg !== Infinity) {\n const medal = single ? `${cyan}◆${reset}` : '🥇'\n const msStr = `${Math.round(byLatency.avg)}ms`\n if (single) {\n console.log(` ${medal} Avg latency: ${brightGreen}${boldCode}${msStr}${reset}`)\n } else {\n console.log(` ${medal} Fastest: ${bold(byLatency.id)} ${dim(providerLabel(byLatency.id))} ${brightGreen}${boldCode}${msStr}${reset}`)\n }\n }\n\n // Cheapest\n const byCost = providers\n .map((id) => {\n const runs = successByProvider.get(id) ?? []\n const costs = runs\n .map((r) => {\n const s = r.scores.find((s) => s.name === 'cost')\n return s && s.value >= 0 ? s.value : undefined\n })\n .filter((c): c is number => c !== undefined)\n const avg = costs.length > 0 ? costs.reduce((a, b) => a + b, 0) / costs.length : undefined\n return { id, avg }\n })\n .filter((p) => p.avg !== undefined)\n .sort((a, b) => a.avg! - b.avg!)[0]\n\n if (byCost?.avg !== undefined) {\n const medal = single ? `${cyan}◆${reset}` : '🥇'\n const costStr = formatCost(byCost.avg)\n if (single) {\n console.log(` ${medal} Avg cost: ${brightGreen}${boldCode}${costStr}${reset}`)\n } else {\n console.log(` ${medal} Cheapest: ${bold(byCost.id)} ${dim(providerLabel(byCost.id))} ${brightGreen}${boldCode}${costStr}${reset}`)\n }\n }\n\n // Overall winner (2+ providers) — most category wins\n if (!single) {\n const wins = new Map<string, number>()\n for (const id of providers) wins.set(id, 0)\n\n if (byCorrectness) wins.set(byCorrectness.id, (wins.get(byCorrectness.id) ?? 0) + 1)\n if (byLatency && byLatency.avg !== Infinity) wins.set(byLatency.id, (wins.get(byLatency.id) ?? 0) + 1)\n if (byCost?.avg !== undefined) wins.set(byCost.id, (wins.get(byCost.id) ?? 0) + 1)\n\n const maxWins = Math.max(...wins.values())\n if (maxWins > 0) {\n const topProviders = [...wins.entries()].filter(([, w]) => w === maxWins)\n console.log('')\n if (topProviders.length === 1) {\n const [winnerId, winCount] = topProviders[0]!\n console.log(` 🏆 Overall: ${brightGreen}${boldCode}${winnerId}${reset} ${dim(providerLabel(winnerId))} ${dim(`(${winCount}/3 categories)`)}`)\n } else {\n const names = topProviders.map(([id]) => bold(id)).join(dim(', '))\n console.log(` 🏆 Overall: ${names} ${dim(`(tied at ${maxWins}/3)`)}`)\n }\n }\n }\n\n console.log('')\n}\n\n","import type { BenchmarkResult } from '../runner.js'\n\nexport function jsonReporter(results: BenchmarkResult[]): string {\n return JSON.stringify(\n {\n timestamp: new Date().toISOString(),\n summary: buildSummary(results),\n results,\n },\n null,\n 2\n )\n}\n\nfunction buildSummary(results: BenchmarkResult[]) {\n const tasks = [...new Set(results.map((r) => r.taskName))]\n const providers = [...new Set(results.map((r) => r.providerId))]\n\n return {\n totalBenchmarks: results.length,\n tasks: tasks.length,\n providers: providers.length,\n providerIds: providers,\n taskNames: tasks,\n }\n}\n","import type { ArenaProvider } from './providers/types.js'\nimport type { ArenaTask } from './tasks/types.js'\nimport type { BuiltInScorerName } from './scorers/types.js'\nimport { resolveScorers } from './scorers/index.js'\nimport { runBenchmarks, type BenchmarkResult } from './runner.js'\nimport { consoleReporter } from './reporter/console.js'\nimport { jsonReporter } from './reporter/json.js'\n\nexport interface ArenaConfig {\n providers: ArenaProvider[]\n tasks: ArenaTask[]\n scorers?: BuiltInScorerName[]\n runs?: number\n /** Model to use for llm-judge-correctness (e.g. 'gemini-3.1-pro-preview'). Falls back to DUELIST_JUDGE_MODEL env var, then gpt-5-mini. */\n judgeModel?: string\n /** Show sparkline bars next to percentage scores. Disable if your terminal doesn't render Unicode blocks. Default: true */\n sparklines?: boolean\n /** Per-request timeout in milliseconds. Requests exceeding this are marked as failures. Default: 60000 (60s) */\n timeout?: number\n}\n\nexport interface RunOptions {\n /** Called after each individual benchmark completes */\n onResult?: (result: BenchmarkResult) => void\n}\n\nexport interface Arena {\n config: ArenaConfig\n run(options?: RunOptions): Promise<BenchmarkResult[]>\n}\n\nexport function defineArena(config: ArenaConfig): Arena {\n if (config.providers.length === 0) {\n throw new Error('At least one provider is required')\n }\n if (config.tasks.length === 0) {\n throw new Error('At least one task is required')\n }\n\n const scorerNames = config.scorers ?? ['latency', 'cost', 'correctness']\n const scorerFns = resolveScorers(scorerNames, config.judgeModel, config.timeout)\n const runs = config.runs ?? 1\n\n return {\n config,\n\n async run(options?: RunOptions): Promise<BenchmarkResult[]> {\n return runBenchmarks({\n providers: config.providers,\n tasks: config.tasks,\n scorers: scorerFns,\n runs,\n timeout: config.timeout,\n onResult: options?.onResult,\n })\n },\n }\n}\n\n// Also export reporters for programmatic use\nexport { consoleReporter, jsonReporter }\n","import Anthropic from '@anthropic-ai/sdk'\nimport type { ArenaProvider, TaskInput, TaskResult } from './types.js'\nimport { SCHEMA_SYSTEM_MESSAGE, parseSchemaOutput } from './shared.js'\n\nexport interface AnthropicProviderOptions {\n apiKey?: string\n maxTokens?: number\n}\n\nexport function anthropic(model: string, options?: AnthropicProviderOptions): ArenaProvider {\n const client = new Anthropic({\n apiKey: options?.apiKey ?? process.env.ANTHROPIC_API_KEY,\n })\n\n const maxTokens = options?.maxTokens ?? 1024\n\n return {\n id: `anthropic/${model}`,\n name: 'Anthropic',\n model,\n\n async run(input: TaskInput): Promise<TaskResult> {\n const start = Date.now()\n\n const systemMessage = input.schema ? SCHEMA_SYSTEM_MESSAGE : undefined\n\n const response = await client.messages.create({\n model,\n max_tokens: maxTokens,\n system: systemMessage,\n messages: [{ role: 'user', content: input.prompt }],\n }, { signal: input.signal })\n\n const latencyMs = Date.now() - start\n\n const textBlock = response.content.find((b) => b.type === 'text')\n const rawContent = textBlock?.type === 'text' ? textBlock.text : ''\n\n const output = parseSchemaOutput(rawContent, !!input.schema)\n\n return {\n output,\n usage: {\n promptTokens: response.usage.input_tokens,\n completionTokens: response.usage.output_tokens,\n },\n latencyMs,\n raw: response,\n }\n },\n }\n}\n","import type { CiReport, ScorerComparison, CostSummary, ScorerStats } from '../ci.js'\nimport type { BenchmarkResult } from '../runner.js'\nimport { formatDelta } from '../utils/format.js'\n\nexport const COMMENT_MARKER = '<!-- duelist-ci-report -->'\n\nexport function markdownReporter(report: CiReport, _current: BenchmarkResult[]): string {\n const lines: string[] = [COMMENT_MARKER, '']\n\n // Header\n const status = report.failed ? '🔴 Failed' : '🟢 Passed'\n lines.push(`## ⬡ Agent Duelist CI — ${status}`)\n lines.push('')\n\n // Comparison table\n if (report.comparisons.length > 0) {\n lines.push(markdownComparisonTable(report.comparisons))\n lines.push('')\n }\n\n // Cost summary\n if (report.cost.totalUsd > 0 || report.cost.budget !== undefined) {\n lines.push(markdownCostSummary(report.cost))\n lines.push('')\n }\n\n // Flakiness warnings\n if (report.flakyResults.length > 0) {\n lines.push('### ⚠️ Flaky Results')\n lines.push('')\n lines.push('These scorer/task combinations have high variance (CV > 0.3). Consider increasing `runs` or tightening prompts.')\n lines.push('')\n for (const f of report.flakyResults) {\n lines.push(`- **${f.providerId}** × ${f.taskName} → ${f.scorerName} (CV = ${f.current.cv.toFixed(2)})`)\n }\n lines.push('')\n }\n\n // Failure reasons\n if (report.failureReasons.length > 0) {\n lines.push('### Failure Reasons')\n lines.push('')\n for (const reason of report.failureReasons) {\n lines.push(`- ${reason}`)\n }\n lines.push('')\n }\n\n lines.push('---')\n lines.push('*Generated by [agent-duelist](https://github.com/DataGobes/agent-duelist) CI*')\n\n return lines.join('\\n')\n}\n\nexport function markdownComparisonTable(comparisons: ScorerComparison[]): string {\n const lines: string[] = []\n\n lines.push('| Provider | Task | Scorer | Baseline | Current | Delta | Status |')\n lines.push('|----------|------|--------|----------|---------|-------|--------|')\n\n for (const c of comparisons) {\n const baselineStr = c.baseline ? formatStats(c.baseline) : '—'\n const currentStr = formatStats(c.current)\n const deltaStr = c.delta !== null ? formatDelta(c.delta, 3) : '—'\n const status = statusIndicator(c)\n\n lines.push(`| ${c.providerId} | ${c.taskName} | ${c.scorerName} | ${baselineStr} | ${currentStr} | ${deltaStr} | ${status} |`)\n }\n\n return lines.join('\\n')\n}\n\nexport function markdownCostSummary(cost: CostSummary): string {\n const lines: string[] = []\n\n lines.push('### 💰 Cost Summary')\n lines.push('')\n lines.push(`**Total:** $${cost.totalUsd.toFixed(4)}`)\n\n if (cost.budget !== undefined) {\n const pct = cost.budget > 0 ? ((cost.totalUsd / cost.budget) * 100).toFixed(0) : '∞'\n const indicator = cost.overBudget ? '🔴' : '🟢'\n lines.push(`**Budget:** $${cost.budget.toFixed(2)} (${pct}% used) ${indicator}`)\n }\n\n if (cost.perProvider.size > 1) {\n lines.push('')\n lines.push('| Provider | Cost |')\n lines.push('|----------|------|')\n for (const [provider, usd] of cost.perProvider) {\n lines.push(`| ${provider} | $${usd.toFixed(4)} |`)\n }\n }\n\n return lines.join('\\n')\n}\n\nfunction formatStats(stats: ScorerStats): string {\n if (stats.n > 1) {\n const margin = (stats.ci95Upper - stats.ci95Lower) / 2\n return `${stats.mean.toFixed(3)} ± ${margin.toFixed(3)}`\n }\n return stats.mean.toFixed(3)\n}\n\nfunction statusIndicator(c: ScorerComparison): string {\n if (c.regressed) return '🔴 regressed'\n if (c.improved) return '🟢 improved'\n if (c.baseline === null) return '🆕 new'\n return '⚪ unchanged'\n}\n","import type { BenchmarkResult } from '../runner.js'\nimport { formatCost } from '../utils/format.js'\nimport {\n type ProviderTaskData,\n type Medal,\n groupResults,\n aggregateProviderTask,\n average,\n computeColumnStats,\n computeMedals,\n providerLabel,\n apiKeyHint,\n rankProviders,\n medalEmoji,\n scorerLabel,\n} from './shared.js'\n\n// ── XSS prevention ──────────────────────────────────────────────────\n\nfunction esc(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;')\n}\n\n// ── Main reporter ───────────────────────────────────────────────────\n\nexport function htmlReporter(results: BenchmarkResult[]): string {\n if (results.length === 0) {\n return emptyReport()\n }\n\n const { tasks, providers, scorerNames, grouped, byProvider, maxRun } = groupResults(results)\n const hasCost = scorerNames.includes('cost')\n const multi = providers.length >= 2\n const runsLabel = maxRun > 1 ? `${maxRun} runs each` : '1 run'\n\n // Build per-task table data\n const taskSections = tasks.map(task => {\n const providerData = providers.map(id => aggregateProviderTask(id, grouped, task))\n const columnStats = computeColumnStats(providerData, scorerNames)\n const medals = computeMedals(columnStats, providers)\n const winnerId = multi\n ? [...medals.entries()].find(([, m]) => m === 'gold')?.[0]\n : undefined\n return { task, providerData, columnStats, medals, winnerId }\n })\n\n // Summary stats\n const successResults = results.filter(r => !r.error)\n const successByProvider = new Map<string, BenchmarkResult[]>()\n for (const id of providers) {\n successByProvider.set(id, (byProvider.get(id) ?? []).filter(r => !r.error))\n }\n\n const correctnessKey = successResults.some(r =>\n r.scores.some(s => s.name === 'llm-judge-correctness' && s.value >= 0)\n ) ? 'llm-judge-correctness' : 'correctness'\n\n const byCorrectness = rankProviders(successByProvider, providers, correctnessKey)\n const byLatency = providers\n .map(id => {\n const runs = successByProvider.get(id) ?? []\n const avg = average(runs.map(r => r.raw.latencyMs))\n return { id, avg: avg ?? Infinity }\n })\n .sort((a, b) => a.avg - b.avg)[0]\n\n const byCost = providers\n .map(id => {\n const runs = successByProvider.get(id) ?? []\n const costs = runs\n .map(r => {\n const s = r.scores.find(s => s.name === 'cost')\n return s && s.value >= 0 ? s.value : undefined\n })\n .filter((c): c is number => c !== undefined)\n const avg = costs.length > 0 ? costs.reduce((a, b) => a + b, 0) / costs.length : undefined\n return { id, avg }\n })\n .filter(p => p.avg !== undefined)\n .sort((a, b) => a.avg! - b.avg!)[0]\n\n // Overall winner\n let overallWinner: string | undefined\n if (multi) {\n const wins = new Map<string, number>()\n for (const id of providers) wins.set(id, 0)\n if (byCorrectness) wins.set(byCorrectness.id, (wins.get(byCorrectness.id) ?? 0) + 1)\n if (byLatency && byLatency.avg !== Infinity) wins.set(byLatency.id, (wins.get(byLatency.id) ?? 0) + 1)\n if (byCost?.avg !== undefined) wins.set(byCost.id, (wins.get(byCost.id) ?? 0) + 1)\n const maxWins = Math.max(...wins.values())\n if (maxWins > 0) {\n const tops = [...wins.entries()].filter(([, w]) => w === maxWins)\n if (tops.length === 1) overallWinner = tops[0]![0]\n }\n }\n\n // Error details\n const errorResults = results.filter(r => r.error)\n const deduped = dedupeErrors(errorResults)\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Agent Duelist Report</title>\n<meta name=\"description\" content=\"LLM provider benchmark results — ${providers.length} provider${providers.length !== 1 ? 's' : ''}, ${tasks.length} task${tasks.length !== 1 ? 's' : ''}\">\n<meta property=\"og:title\" content=\"Agent Duelist Report\">\n<meta property=\"og:description\" content=\"LLM provider benchmark: ${providers.map(esc).join(' vs ')}\">\n<meta property=\"og:type\" content=\"website\">\n${renderStyle()}\n</head>\n<body>\n<div class=\"bg-mesh\"><div class=\"bg-mesh-extra\"></div></div>\n<div class=\"report\">\n\n${renderHeader(runsLabel, providers.length, tasks.length)}\n\n${tasks.length > 1 ? renderTabs(tasks) : ''}\n\n<main>\n${taskSections.map((s, i) => renderTaskSection(\n s.task, s.providerData, s.columnStats, s.medals, s.winnerId,\n scorerNames, hasCost, multi, i\n )).join('\\n')}\n</main>\n\n${renderSummary(byCorrectness, byLatency, byCost, overallWinner, multi)}\n\n${deduped.length > 0 ? renderErrors(deduped) : ''}\n\n${renderFooter()}\n\n</div>\n${renderScript(tasks.length)}\n</body>\n</html>`\n}\n\n// ── Empty report ────────────────────────────────────────────────────\n\nfunction emptyReport(): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Agent Duelist Report</title>\n${renderStyle()}\n</head>\n<body>\n<div class=\"bg-mesh\"><div class=\"bg-mesh-extra\"></div></div>\n<div class=\"report\">\n${renderHeader('0 runs', 0, 0)}\n<main><p class=\"empty-msg\">No results to display.</p></main>\n${renderFooter()}\n</div>\n</body>\n</html>`\n}\n\n// ── Error deduplication ─────────────────────────────────────────────\n\ninterface DedupedError {\n providerId: string\n error: string\n count: number\n hint?: string\n}\n\nfunction dedupeErrors(errorResults: BenchmarkResult[]): DedupedError[] {\n const seen = new Map<string, DedupedError>()\n for (const r of errorResults) {\n const key = `${r.providerId}::${r.error}`\n const existing = seen.get(key)\n if (existing) {\n existing.count++\n } else {\n seen.set(key, {\n providerId: r.providerId,\n error: r.error ?? 'Unknown error',\n count: 1,\n hint: apiKeyHint(r.providerId, r.error ?? ''),\n })\n }\n }\n return [...seen.values()]\n}\n\n// ── Render: style ───────────────────────────────────────────────────\n\nfunction renderStyle(): string {\n return `<style>\n:root {\n --bg: #0f172a;\n --bg-deep: #020617;\n --panel: rgba(15, 23, 42, 0.85);\n --accent: #f59e0b;\n --accent-soft: rgba(245, 158, 11, 0.15);\n --text: #e2e8f0;\n --muted: #94a3b8;\n --border: rgba(148, 163, 184, 0.15);\n --green: #22c55e;\n --red: #ef4444;\n --yellow: #eab308;\n --radius: 12px;\n --mono: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Monaco, Consolas, monospace;\n --sans: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n}\n*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\nhtml, body {\n font-family: var(--sans);\n background: var(--bg);\n color: var(--text);\n min-height: 100vh;\n}\nbody { padding: 24px; display: flex; justify-content: center; }\n\n/* Animated gradient mesh */\n.bg-mesh {\n position: fixed; inset: 0; z-index: 0;\n overflow: hidden; pointer-events: none;\n}\n.bg-mesh::before, .bg-mesh::after {\n content: \"\"; position: absolute; border-radius: 50%;\n filter: blur(120px); opacity: 0.4;\n}\n.bg-mesh::before {\n width: 600px; height: 600px;\n background: radial-gradient(circle, rgba(245,158,11,0.18), transparent 70%);\n top: -10%; left: -5%;\n animation: meshDrift1 18s ease-in-out infinite alternate;\n}\n.bg-mesh::after {\n width: 500px; height: 500px;\n background: radial-gradient(circle, rgba(139,92,246,0.12), transparent 70%);\n bottom: -10%; right: -5%;\n animation: meshDrift2 22s ease-in-out infinite alternate;\n}\n.bg-mesh-extra {\n position: absolute; width: 400px; height: 400px;\n border-radius: 50%; filter: blur(100px); opacity: 0.3;\n background: radial-gradient(circle, rgba(56,189,248,0.12), transparent 70%);\n top: 50%; left: 60%;\n animation: meshDrift3 15s ease-in-out infinite alternate;\n}\n@keyframes meshDrift1 { from { transform: translate(0,0) scale(1); } to { transform: translate(80px,60px) scale(1.15); } }\n@keyframes meshDrift2 { from { transform: translate(0,0) scale(1); } to { transform: translate(-60px,-50px) scale(1.1); } }\n@keyframes meshDrift3 { from { transform: translate(0,0) scale(1); } to { transform: translate(-40px,40px) scale(1.2); } }\n\n/* Report container */\n.report {\n position: relative; z-index: 1;\n width: 100%; max-width: 960px;\n}\n\n/* Header */\n.report-header {\n display: flex; justify-content: space-between; align-items: center;\n padding: 20px 0; margin-bottom: 8px;\n}\n.report-brand {\n display: flex; align-items: center; gap: 10px;\n text-decoration: none; color: var(--muted);\n font-weight: 600; font-size: 14px;\n letter-spacing: 0.04em; text-transform: uppercase;\n}\n.report-brand:hover { color: var(--text); }\n.brand-icon {\n width: 32px; height: 32px; border-radius: 8px;\n background: linear-gradient(135deg, var(--accent-soft), rgba(245,158,11,0.05));\n border: 1px solid rgba(245,158,11,0.3);\n display: flex; align-items: center; justify-content: center;\n font-size: 16px;\n}\n.report-meta {\n font-size: 12px; color: var(--muted);\n text-align: right; line-height: 1.6;\n}\n\n/* Task tabs */\n.task-tabs {\n display: flex; gap: 6px; margin-bottom: 16px; flex-wrap: wrap;\n}\n.task-tab {\n padding: 6px 16px; border-radius: 999px;\n border: 1px solid var(--border);\n background: transparent; color: var(--muted);\n font-size: 13px; font-weight: 500; cursor: pointer;\n transition: all 150ms ease;\n}\n.task-tab:hover { border-color: rgba(245,158,11,0.3); color: var(--text); }\n.task-tab.active {\n background: var(--accent-soft);\n border-color: rgba(245,158,11,0.4);\n color: var(--accent);\n}\n\n/* Task sections */\n.task-section { display: none; }\n.task-section.active { display: block; }\n.task-name {\n font-size: 18px; font-weight: 600;\n margin-bottom: 12px; letter-spacing: -0.01em;\n}\n\n/* Results table */\n.results-table {\n width: 100%; border-collapse: collapse;\n font-size: 13px; margin-bottom: 16px;\n border-radius: var(--radius); overflow: hidden;\n border: 1px solid var(--border);\n}\n.results-table th, .results-table td {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--border);\n}\n.results-table th {\n background: rgba(0,0,0,0.3);\n font-size: 11px; font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.05em;\n color: var(--muted); cursor: pointer;\n user-select: none; white-space: nowrap;\n}\n.results-table th:hover { color: var(--text); }\n.results-table th .sort-arrow { margin-left: 4px; font-size: 10px; }\n.results-table tbody tr {\n background: var(--panel);\n transition: background 120ms ease;\n}\n.results-table tbody tr:hover { background: rgba(15,23,42,0.95); }\n.results-table tbody tr:last-child td { border-bottom: none; }\n\n/* Score cell with progress bar */\n.score-cell { position: relative; min-width: 90px; }\n.score-bar {\n position: absolute; left: 0; bottom: 0;\n height: 3px; border-radius: 2px;\n transition: width 300ms ease;\n}\n.score-val { position: relative; z-index: 1; font-family: var(--mono); font-size: 12px; }\n\n/* Color ranking */\n.rank-best { color: var(--green); font-weight: 600; }\n.rank-worst { color: var(--red); }\n.rank-mid { color: var(--yellow); }\n.rank-neutral { color: var(--text); }\n.rank-error { color: var(--muted); }\n\n/* Winner banner */\n.task-winner {\n display: flex; align-items: center; gap: 10px;\n padding: 12px 18px; margin-bottom: 20px;\n border-radius: var(--radius);\n background: linear-gradient(135deg, rgba(34,197,94,0.08), rgba(34,197,94,0.02));\n border: 1px solid rgba(34,197,94,0.2);\n font-size: 14px; font-weight: 500;\n}\n.task-winner .trophy { font-size: 20px; }\n.task-winner .winner-name { color: var(--green); font-weight: 600; }\n.task-winner .winner-label { color: var(--muted); font-size: 12px; margin-left: 4px; }\n\n/* Summary cards */\n.summary-section { margin-top: 32px; }\n.summary-title {\n font-size: 16px; font-weight: 600;\n margin-bottom: 12px; color: var(--text);\n}\n.summary-cards {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 12px;\n}\n.summary-card {\n padding: 16px; border-radius: var(--radius);\n border: 1px solid var(--border);\n background: var(--panel);\n}\n.summary-card .card-label {\n font-size: 11px; font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.05em;\n color: var(--muted); margin-bottom: 6px;\n}\n.summary-card .card-value {\n font-size: 20px; font-weight: 700;\n color: var(--green); font-family: var(--mono);\n}\n.summary-card .card-provider {\n font-size: 12px; color: var(--muted); margin-top: 4px;\n}\n\n/* Errors */\n.errors-section { margin-top: 24px; }\n.errors-title {\n font-size: 16px; font-weight: 600;\n margin-bottom: 8px; color: var(--red);\n cursor: pointer;\n}\n.errors-list {\n border-radius: var(--radius);\n border: 1px solid rgba(239,68,68,0.2);\n background: rgba(239,68,68,0.04);\n overflow: hidden;\n}\n.error-item {\n padding: 10px 16px;\n border-bottom: 1px solid rgba(239,68,68,0.1);\n font-size: 13px;\n}\n.error-item:last-child { border-bottom: none; }\n.error-provider { font-weight: 600; color: var(--text); }\n.error-msg { color: var(--muted); margin-left: 8px; }\n.error-count { color: var(--muted); font-size: 11px; }\n.error-hint { color: var(--muted); font-size: 12px; margin-top: 4px; font-style: italic; }\n\n/* Footer */\n.report-footer {\n margin-top: 40px; padding: 20px 0;\n border-top: 1px solid var(--border);\n display: flex; justify-content: space-between; align-items: center;\n flex-wrap: wrap; gap: 12px;\n}\n.footer-brand {\n font-size: 13px; color: var(--muted);\n}\n.footer-brand a {\n color: var(--accent); text-decoration: none; font-weight: 500;\n}\n.footer-brand a:hover { text-decoration: underline; }\n.footer-cta {\n display: inline-flex; align-items: center; gap: 6px;\n padding: 6px 14px; border-radius: 8px;\n background: var(--accent-soft);\n border: 1px solid rgba(245,158,11,0.3);\n color: var(--accent); font-size: 12px; font-weight: 500;\n text-decoration: none;\n transition: transform 120ms ease, box-shadow 120ms ease;\n}\n.footer-cta:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(245,158,11,0.2); }\n\n/* Empty state */\n.empty-msg {\n text-align: center; color: var(--muted);\n padding: 60px 20px; font-size: 16px;\n}\n\n/* Responsive */\n@media (max-width: 640px) {\n body { padding: 12px; }\n .report-header { flex-direction: column; align-items: flex-start; gap: 8px; }\n .report-meta { text-align: left; }\n .summary-cards { grid-template-columns: 1fr; }\n .results-table { font-size: 12px; }\n .results-table th, .results-table td { padding: 8px 10px; }\n .report-footer { flex-direction: column; align-items: flex-start; }\n}\n</style>`\n}\n\n// ── Render: header ──────────────────────────────────────────────────\n\nfunction renderHeader(runsLabel: string, providerCount: number, taskCount: number): string {\n const now = new Date().toISOString().replace('T', ' ').slice(0, 19) + ' UTC'\n return `<header class=\"report-header\">\n <a class=\"report-brand\" href=\"https://github.com/DataGobes/agent-duelist\" target=\"_blank\" rel=\"noopener\">\n <div class=\"brand-icon\">&#x2B21;</div>\n <span>Agent Duelist</span>\n </a>\n <div class=\"report-meta\">\n ${providerCount} provider${providerCount !== 1 ? 's' : ''} &middot;\n ${taskCount} task${taskCount !== 1 ? 's' : ''} &middot;\n ${esc(runsLabel)}<br>\n ${esc(now)}\n </div>\n</header>`\n}\n\n// ── Render: tabs ────────────────────────────────────────────────────\n\nfunction renderTabs(tasks: string[]): string {\n const buttons = tasks.map((t, i) =>\n `<button class=\"task-tab${i === 0 ? ' active' : ''}\" data-task=\"${i}\">${esc(t)}</button>`\n ).join('\\n ')\n return `<nav class=\"task-tabs\">\n ${buttons}\n </nav>`\n}\n\n// ── Render: task section ────────────────────────────────────────────\n\nfunction renderTaskSection(\n task: string,\n providerData: ProviderTaskData[],\n columnStats: Map<string, import('./shared.js').ColumnStats>,\n medals: Map<string, Medal>,\n winnerId: string | undefined,\n scorerNames: string[],\n _hasCost: boolean,\n multi: boolean,\n index: number\n): string {\n // Build columns\n const cols: { label: string; key: string; isScore: boolean }[] = [\n { label: 'Provider', key: 'provider', isScore: false },\n ]\n\n for (const name of scorerNames) {\n if (name === 'latency') {\n cols.push({ label: 'Latency', key: 'latency', isScore: false })\n } else if (name === 'cost') {\n cols.push({ label: 'Cost', key: 'cost', isScore: false })\n cols.push({ label: 'Tokens', key: 'tokens', isScore: false })\n } else {\n cols.push({ label: scorerLabel(name), key: name, isScore: true })\n }\n }\n\n // Header row\n const ths = cols.map(c =>\n `<th data-col=\"${esc(c.key)}\">${esc(c.label)}<span class=\"sort-arrow\"></span></th>`\n ).join('')\n\n // Data rows\n const rows = providerData.map(pd => {\n const medal = medalEmoji(medals.get(pd.providerId) ?? 'none')\n const cells: string[] = []\n\n // Provider cell\n const medalHtml = medal ? `${medal} ` : ''\n cells.push(`<td>${medalHtml}${esc(pd.providerId)}</td>`)\n\n if (pd.allErrors) {\n for (let ci = 1; ci < cols.length; ci++) {\n cells.push(`<td class=\"rank-error\">&mdash;</td>`)\n }\n } else {\n for (const col of cols.slice(1)) {\n cells.push(renderDataCell(col.key, col.isScore, pd, columnStats, multi))\n }\n }\n\n return `<tr>${cells.join('')}</tr>`\n }).join('\\n')\n\n // Winner banner\n const winnerHtml = winnerId\n ? `<div class=\"task-winner\">\n <span class=\"trophy\">&#x1F3C6;</span>\n <span>Winner: <span class=\"winner-name\">${esc(winnerId)}</span>\n <span class=\"winner-label\">${esc(providerLabel(winnerId))}</span></span>\n </div>`\n : ''\n\n return `<section class=\"task-section${index === 0 ? ' active' : ''}\" data-task-idx=\"${index}\">\n <h2 class=\"task-name\">${esc(task)}</h2>\n <table class=\"results-table\">\n <thead><tr>${ths}</tr></thead>\n <tbody>${rows}</tbody>\n </table>\n ${winnerHtml}\n</section>`\n}\n\n// ── Render: data cell ───────────────────────────────────────────────\n\nfunction renderDataCell(\n key: string,\n _isScore: boolean,\n pd: ProviderTaskData,\n columnStats: Map<string, import('./shared.js').ColumnStats>,\n multi: boolean\n): string {\n const colStats = columnStats.get(key)\n\n if (key === 'latency') {\n const ms = pd.latencyMs\n if (ms === undefined) return `<td class=\"rank-error\">&mdash;</td>`\n const rankClass = multi && colStats ? rankClass_(ms, colStats) : 'rank-neutral'\n return `<td class=\"${rankClass}\" data-sort-val=\"${ms}\">${Math.round(ms)}ms</td>`\n }\n\n if (key === 'cost') {\n const cost = pd.avgDetails.costUsd\n if (cost === undefined) return `<td class=\"rank-error\">&mdash;</td>`\n const rankClass = multi && colStats ? rankClass_(cost, colStats) : 'rank-neutral'\n return `<td class=\"${rankClass}\" data-sort-val=\"${cost}\">${esc(formatCost(cost))}</td>`\n }\n\n if (key === 'tokens') {\n const tokens = pd.avgDetails.totalTokens\n if (tokens === undefined) return `<td class=\"rank-error\">&mdash;</td>`\n const rankClass = multi && colStats ? rankClass_(tokens, colStats) : 'rank-neutral'\n return `<td class=\"${rankClass}\" data-sort-val=\"${tokens}\">${tokens}</td>`\n }\n\n // Score column (0-1)\n const val = pd.avgScores[key]\n if (val === undefined) return `<td class=\"rank-error\">&mdash;</td>`\n\n const pct = Math.round(val * 100)\n let rankCls: string\n if (multi && colStats) {\n rankCls = rankClass_(val, colStats)\n } else {\n rankCls = val >= 0.8 ? 'rank-best' : val >= 0.5 ? 'rank-mid' : 'rank-worst'\n }\n\n const barColor = val >= 0.8 ? 'var(--green)' : val >= 0.5 ? 'var(--yellow)' : 'var(--red)'\n\n return `<td class=\"score-cell ${rankCls}\" data-sort-val=\"${val}\">\n <span class=\"score-val\">${pct}%</span>\n <div class=\"score-bar\" style=\"width:${pct}%;background:${barColor}\"></div>\n </td>`\n}\n\nfunction rankClass_(value: number, colStats: import('./shared.js').ColumnStats): string {\n if (colStats.best === undefined || colStats.worst === undefined) return 'rank-neutral'\n if (colStats.best === colStats.worst) return 'rank-neutral'\n if (value === colStats.best) return 'rank-best'\n if (value === colStats.worst) return 'rank-worst'\n return 'rank-mid'\n}\n\n// ── Render: summary ─────────────────────────────────────────────────\n\nfunction renderSummary(\n byCorrectness: { id: string; avg: number } | undefined,\n byLatency: { id: string; avg: number } | undefined,\n byCost: { id: string; avg: number | undefined } | undefined,\n overallWinner: string | undefined,\n multi: boolean\n): string {\n const cards: string[] = []\n\n if (byCorrectness) {\n const pct = `${Math.round(byCorrectness.avg * 100)}%`\n const provider = multi\n ? `<div class=\"card-provider\">${esc(byCorrectness.id)} ${esc(providerLabel(byCorrectness.id))}</div>`\n : ''\n cards.push(`<div class=\"summary-card\">\n <div class=\"card-label\">${multi ? 'Most Correct' : 'Avg Correctness'}</div>\n <div class=\"card-value\">${pct}</div>\n ${provider}\n </div>`)\n }\n\n if (byLatency && byLatency.avg !== Infinity) {\n const ms = `${Math.round(byLatency.avg)}ms`\n const provider = multi\n ? `<div class=\"card-provider\">${esc(byLatency.id)} ${esc(providerLabel(byLatency.id))}</div>`\n : ''\n cards.push(`<div class=\"summary-card\">\n <div class=\"card-label\">${multi ? 'Fastest' : 'Avg Latency'}</div>\n <div class=\"card-value\">${ms}</div>\n ${provider}\n </div>`)\n }\n\n if (byCost?.avg !== undefined) {\n const cost = esc(formatCost(byCost.avg))\n const provider = multi\n ? `<div class=\"card-provider\">${esc(byCost.id)} ${esc(providerLabel(byCost.id))}</div>`\n : ''\n cards.push(`<div class=\"summary-card\">\n <div class=\"card-label\">${multi ? 'Cheapest' : 'Avg Cost'}</div>\n <div class=\"card-value\">${cost}</div>\n ${provider}\n </div>`)\n }\n\n if (overallWinner) {\n cards.push(`<div class=\"summary-card\">\n <div class=\"card-label\">Overall Winner</div>\n <div class=\"card-value\">&#x1F3C6;</div>\n <div class=\"card-provider\">${esc(overallWinner)} ${esc(providerLabel(overallWinner))}</div>\n </div>`)\n }\n\n if (cards.length === 0) return ''\n\n return `<section class=\"summary-section\">\n <h2 class=\"summary-title\">Summary</h2>\n <div class=\"summary-cards\">\n ${cards.join('\\n ')}\n </div>\n</section>`\n}\n\n// ── Render: errors ──────────────────────────────────────────────────\n\nfunction renderErrors(errors: DedupedError[]): string {\n const items = errors.map(e => {\n const suffix = e.count > 1 ? ` <span class=\"error-count\">(&times;${e.count})</span>` : ''\n const hint = e.hint ? `<div class=\"error-hint\">${esc(e.hint)}</div>` : ''\n return `<div class=\"error-item\">\n <span class=\"error-provider\">${esc(e.providerId)}:</span>\n <span class=\"error-msg\">${esc(e.error)}</span>${suffix}\n ${hint}\n </div>`\n }).join('\\n')\n\n return `<section class=\"errors-section\">\n <h2 class=\"errors-title\" onclick=\"this.nextElementSibling.style.display=this.nextElementSibling.style.display==='none'?'block':'block'\">Errors</h2>\n <div class=\"errors-list\">\n ${items}\n </div>\n</section>`\n}\n\n// ── Render: footer ──────────────────────────────────────────────────\n\nfunction renderFooter(): string {\n return `<footer class=\"report-footer\">\n <div class=\"footer-brand\">\n Powered by <a href=\"https://github.com/DataGobes/agent-duelist\" target=\"_blank\" rel=\"noopener\">Agent Duelist</a>\n </div>\n <a class=\"footer-cta\" href=\"https://github.com/DataGobes/agent-duelist\" target=\"_blank\" rel=\"noopener\">\n &#x2B50; Star on GitHub\n </a>\n</footer>`\n}\n\n// ── Render: script ──────────────────────────────────────────────────\n\nfunction renderScript(taskCount: number): string {\n return `<script>\n(function() {\n /* Tab switching */\n ${taskCount > 1 ? `\n var tabs = document.querySelectorAll('.task-tab');\n var sections = document.querySelectorAll('.task-section');\n tabs.forEach(function(tab) {\n tab.addEventListener('click', function() {\n var idx = parseInt(tab.getAttribute('data-task'));\n tabs.forEach(function(t) { t.classList.remove('active'); });\n sections.forEach(function(s) { s.classList.remove('active'); });\n tab.classList.add('active');\n sections[idx].classList.add('active');\n });\n });` : ''}\n\n /* Column sorting */\n document.querySelectorAll('.results-table th').forEach(function(th, colIdx) {\n var table = th.closest('table');\n var asc = true;\n th.addEventListener('click', function() {\n var tbody = table.querySelector('tbody');\n var rows = Array.from(tbody.querySelectorAll('tr'));\n rows.sort(function(a, b) {\n var aCell = a.children[colIdx];\n var bCell = b.children[colIdx];\n var aVal = aCell.getAttribute('data-sort-val');\n var bVal = bCell.getAttribute('data-sort-val');\n if (aVal !== null && bVal !== null) {\n return asc ? parseFloat(aVal) - parseFloat(bVal) : parseFloat(bVal) - parseFloat(aVal);\n }\n var aText = aCell.textContent || '';\n var bText = bCell.textContent || '';\n return asc ? aText.localeCompare(bText) : bText.localeCompare(aText);\n });\n rows.forEach(function(row) { tbody.appendChild(row); });\n\n /* Update sort arrows */\n table.querySelectorAll('th .sort-arrow').forEach(function(a) { a.textContent = ''; });\n th.querySelector('.sort-arrow').textContent = asc ? ' \\\\u25B2' : ' \\\\u25BC';\n asc = !asc;\n });\n });\n})();\n</script>`\n}\n","import { readFileSync, writeFileSync, mkdirSync } from 'node:fs'\nimport { dirname } from 'node:path'\nimport type { BenchmarkResult } from './runner.js'\nimport { formatDelta } from './utils/format.js'\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport interface CiOptions {\n configPath: string\n baselinePath: string\n budget?: number\n thresholds: Map<string, number>\n updateBaseline: boolean\n comment: boolean\n quiet: boolean\n}\n\nexport interface ScorerStats {\n mean: number\n stddev: number\n cv: number // coefficient of variation\n n: number\n ci95Lower: number\n ci95Upper: number\n}\n\nexport interface ScorerComparison {\n providerId: string\n taskName: string\n scorerName: string\n baseline: ScorerStats | null\n current: ScorerStats\n delta: number | null // current.mean - baseline.mean (null when no baseline)\n regressed: boolean\n improved: boolean\n flaky: boolean\n}\n\nexport interface CostSummary {\n totalUsd: number\n perProvider: Map<string, number>\n budget: number | undefined\n overBudget: boolean\n}\n\nexport interface CiReport {\n comparisons: ScorerComparison[]\n cost: CostSummary\n failed: boolean\n flakyResults: ScorerComparison[]\n failureReasons: string[]\n}\n\n// ── Constants ────────────────────────────────────────────────────────\n\n/** Scorers where lower values are better */\nconst LOWER_IS_BETTER = new Set(['cost'])\n\n/** CV threshold above which a scorer is flagged as flaky */\nconst FLAKY_CV_THRESHOLD = 0.3\n\n/**\n * T-distribution critical values for 95% two-tailed CI.\n * Index = degrees of freedom (df). For df > 30 we use z ≈ 1.96.\n */\nconst T_CRITICAL_95: Record<number, number> = {\n 1: 12.706, 2: 4.303, 3: 3.182, 4: 2.776, 5: 2.571,\n 6: 2.447, 7: 2.365, 8: 2.306, 9: 2.262, 10: 2.228,\n 15: 2.131, 20: 2.086, 25: 2.060, 30: 2.042,\n}\n\nconst T_CRITICAL_KEYS = Object.keys(T_CRITICAL_95).map(Number).sort((a, b) => a - b)\n\nfunction tCritical(df: number): number {\n if (df <= 0) return 1.96\n if (T_CRITICAL_95[df] !== undefined) return T_CRITICAL_95[df]!\n // Interpolate between known values or fall back to z-approximation\n const keys = T_CRITICAL_KEYS\n if (df > keys[keys.length - 1]!) return 1.96\n // Find surrounding keys and linearly interpolate\n for (let i = 0; i < keys.length - 1; i++) {\n if (df > keys[i]! && df < keys[i + 1]!) {\n const low = keys[i]!, high = keys[i + 1]!\n const ratio = (df - low) / (high - low)\n return T_CRITICAL_95[low]! + ratio * (T_CRITICAL_95[high]! - T_CRITICAL_95[low]!)\n }\n }\n return 1.96\n}\n\n// ── Stats ────────────────────────────────────────────────────────────\n\nexport function computeScorerStats(samples: number[]): ScorerStats {\n const n = samples.length\n if (n === 0) {\n return { mean: 0, stddev: 0, cv: 0, n: 0, ci95Lower: 0, ci95Upper: 0 }\n }\n\n const mean = samples.reduce((a, b) => a + b, 0) / n\n\n if (n === 1) {\n return { mean, stddev: 0, cv: 0, n: 1, ci95Lower: mean, ci95Upper: mean }\n }\n\n const variance = samples.reduce((sum, x) => sum + (x - mean) ** 2, 0) / (n - 1)\n const stddev = Math.sqrt(variance)\n const cv = mean !== 0 ? stddev / Math.abs(mean) : 0\n const se = stddev / Math.sqrt(n)\n const t = tCritical(n - 1)\n\n return {\n mean,\n stddev,\n cv,\n n,\n ci95Lower: mean - t * se,\n ci95Upper: mean + t * se,\n }\n}\n\n// ── Grouping ─────────────────────────────────────────────────────────\n\n/** Group key: providerId::taskName::scorerName */\nfunction groupKey(providerId: string, taskName: string, scorerName: string): string {\n return `${providerId}::${taskName}::${scorerName}`\n}\n\nexport function computeStats(results: BenchmarkResult[]): Map<string, ScorerStats> {\n const grouped = new Map<string, number[]>()\n\n for (const r of results) {\n if (r.error) continue\n for (const score of r.scores) {\n if (score.value < 0) continue // skip unavailable scores (e.g., cost = -1)\n const key = groupKey(r.providerId, r.taskName, score.name)\n if (!grouped.has(key)) grouped.set(key, [])\n grouped.get(key)!.push(score.value)\n }\n }\n\n const stats = new Map<string, ScorerStats>()\n for (const [key, samples] of grouped) {\n stats.set(key, computeScorerStats(samples))\n }\n return stats\n}\n\n// ── Cost ─────────────────────────────────────────────────────────────\n\nexport function computeCostSummary(results: BenchmarkResult[], budget?: number): CostSummary {\n let totalUsd = 0\n const perProvider = new Map<string, number>()\n\n for (const r of results) {\n if (r.error) continue\n const costScore = r.scores.find((s) => s.name === 'cost')\n if (!costScore || costScore.value < 0) continue\n\n const details = costScore.details as { estimatedUsd?: number } | undefined\n const usd = details?.estimatedUsd ?? 0\n if (usd <= 0) continue\n\n totalUsd += usd\n perProvider.set(r.providerId, (perProvider.get(r.providerId) ?? 0) + usd)\n }\n\n return {\n totalUsd,\n perProvider,\n budget,\n overBudget: budget !== undefined && totalUsd > budget,\n }\n}\n\n// ── Comparison ───────────────────────────────────────────────────────\n\nexport function compareResults(\n baselineStats: Map<string, ScorerStats> | null,\n currentStats: Map<string, ScorerStats>,\n thresholds: Map<string, number>,\n budget?: number,\n currentResults?: BenchmarkResult[],\n): CiReport {\n const comparisons: ScorerComparison[] = []\n const failureReasons: string[] = []\n\n for (const [key, current] of currentStats) {\n const [providerId, taskName, scorerName] = key.split('::') as [string, string, string]\n const baseline = baselineStats?.get(key) ?? null\n\n let delta: number | null = null\n let regressed = false\n let improved = false\n\n if (baseline) {\n delta = current.mean - baseline.mean\n const threshold = thresholds.get(scorerName)\n\n if (threshold !== undefined) {\n const lowerIsBetter = LOWER_IS_BETTER.has(scorerName)\n regressed = detectRegression(baseline, current, threshold, lowerIsBetter)\n improved = detectImprovement(baseline, current, threshold, lowerIsBetter)\n }\n }\n\n const flaky = current.n > 1 && current.cv > FLAKY_CV_THRESHOLD\n\n comparisons.push({\n providerId, taskName, scorerName,\n baseline, current, delta,\n regressed, improved, flaky,\n })\n }\n\n // Cost check\n const cost = computeCostSummary(currentResults ?? [], budget)\n\n // Determine failure\n const regressions = comparisons.filter((c) => c.regressed)\n if (regressions.length > 0) {\n for (const r of regressions) {\n failureReasons.push(\n `${r.providerId} × ${r.taskName}: ${r.scorerName} regressed by ${formatDelta(r.delta!)}`\n )\n }\n }\n if (cost.overBudget) {\n failureReasons.push(\n `Total cost $${cost.totalUsd.toFixed(4)} exceeds budget $${cost.budget!.toFixed(2)}`\n )\n }\n\n const flakyResults = comparisons.filter((c) => c.flaky)\n const failed = failureReasons.length > 0\n\n return { comparisons, cost, failed, flakyResults, failureReasons }\n}\n\nfunction detectRegression(\n baseline: ScorerStats,\n current: ScorerStats,\n threshold: number,\n lowerIsBetter: boolean,\n): boolean {\n // For single-run comparisons: simple delta\n if (baseline.n === 1 && current.n === 1) {\n const delta = current.mean - baseline.mean\n if (lowerIsBetter) return delta > threshold\n return delta < -threshold\n }\n\n // Multi-run: conservative CI comparison\n if (lowerIsBetter) {\n // Cost-like: regresses if current lower bound is significantly above baseline upper bound\n return current.ci95Lower - baseline.ci95Upper > threshold\n }\n // Quality-like: regresses if current lower bound is significantly below baseline upper bound\n return baseline.ci95Upper - current.ci95Lower > threshold && current.mean < baseline.mean\n}\n\nfunction detectImprovement(\n baseline: ScorerStats,\n current: ScorerStats,\n threshold: number,\n lowerIsBetter: boolean,\n): boolean {\n if (baseline.n === 1 && current.n === 1) {\n const delta = current.mean - baseline.mean\n if (lowerIsBetter) return delta < -threshold\n return delta > threshold\n }\n\n if (lowerIsBetter) {\n return baseline.ci95Lower - current.ci95Upper > threshold\n }\n return current.ci95Lower - baseline.ci95Upper > threshold\n}\n\n// ── Baseline I/O ─────────────────────────────────────────────────────\n\nexport interface BaselineData {\n timestamp: string\n results: BenchmarkResult[]\n}\n\nexport function loadBaseline(path: string): BaselineData | null {\n try {\n const raw = readFileSync(path, 'utf-8')\n const data = JSON.parse(raw) as Record<string, unknown>\n\n // Support both formats: { results: [...] } and { results: [...], timestamp: ... }\n const results = (data.results ?? data) as BenchmarkResult[]\n if (!Array.isArray(results)) return null\n\n return {\n timestamp: (data.timestamp as string) ?? 'unknown',\n results,\n }\n } catch {\n return null\n }\n}\n\nexport function saveBaseline(path: string, results: BenchmarkResult[]): void {\n mkdirSync(dirname(path), { recursive: true })\n const data: BaselineData = {\n timestamp: new Date().toISOString(),\n results,\n }\n writeFileSync(path, JSON.stringify(data, null, 2))\n}\n","import { readFileSync } from 'node:fs'\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport interface GitHubContext {\n token: string\n owner: string\n repo: string\n prNumber: number\n}\n\ninterface GitHubComment {\n id: number\n body?: string\n}\n\n// ── Context detection ────────────────────────────────────────────────\n\nexport function detectGitHubContext(): GitHubContext | null {\n const token = process.env.GITHUB_TOKEN\n const repository = process.env.GITHUB_REPOSITORY\n const eventPath = process.env.GITHUB_EVENT_PATH\n\n if (!token || !repository) return null\n\n const [owner, repo] = repository.split('/')\n if (!owner || !repo) return null\n\n let prNumber: number | undefined\n\n // Try to get PR number from event payload\n if (eventPath) {\n try {\n const event = JSON.parse(readFileSync(eventPath, 'utf-8')) as Record<string, unknown>\n\n // pull_request event\n if (event.pull_request && typeof event.pull_request === 'object') {\n const pr = event.pull_request as Record<string, unknown>\n prNumber = pr.number as number\n }\n\n // issue_comment or other events with issue.pull_request\n if (!prNumber && event.issue && typeof event.issue === 'object') {\n const issue = event.issue as Record<string, unknown>\n if (issue.pull_request) {\n prNumber = issue.number as number\n }\n }\n } catch {\n // Can't read event file — not fatal\n }\n }\n\n // Fallback: DUELIST_PR_NUMBER env var for manual use\n if (!prNumber && process.env.DUELIST_PR_NUMBER) {\n prNumber = parseInt(process.env.DUELIST_PR_NUMBER, 10)\n }\n\n if (!prNumber) return null\n\n return { token, owner, repo, prNumber }\n}\n\n// ── PR comment helpers ───────────────────────────────────────────────\n\nconst API_BASE = 'https://api.github.com'\n\nfunction ghHeaders(token: string, extra?: Record<string, string>): Record<string, string> {\n return {\n Authorization: `Bearer ${token}`,\n Accept: 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n ...extra,\n }\n}\n\nexport async function findExistingComment(\n ctx: GitHubContext,\n marker: string,\n): Promise<number | null> {\n let page = 1\n const perPage = 50\n\n while (true) {\n const url = `${API_BASE}/repos/${ctx.owner}/${ctx.repo}/issues/${ctx.prNumber}/comments?per_page=${perPage}&page=${page}`\n const res = await fetch(url, { headers: ghHeaders(ctx.token) })\n\n if (!res.ok) return null\n\n const comments = (await res.json()) as GitHubComment[]\n if (comments.length === 0) break\n\n for (const comment of comments) {\n if (comment.body?.includes(marker)) {\n return comment.id\n }\n }\n\n if (comments.length < perPage) break\n page++\n }\n\n return null\n}\n\nexport async function upsertPrComment(\n ctx: GitHubContext,\n body: string,\n marker: string,\n): Promise<void> {\n const existingId = await findExistingComment(ctx, marker)\n\n if (existingId) {\n // Update existing comment\n const url = `${API_BASE}/repos/${ctx.owner}/${ctx.repo}/issues/comments/${existingId}`\n const res = await fetch(url, {\n method: 'PATCH',\n headers: ghHeaders(ctx.token, { 'Content-Type': 'application/json' }),\n body: JSON.stringify({ body }),\n })\n\n if (!res.ok) {\n const text = await res.text()\n console.warn(`Failed to update PR comment: ${res.status} ${text}`)\n }\n } else {\n // Create new comment\n const url = `${API_BASE}/repos/${ctx.owner}/${ctx.repo}/issues/${ctx.prNumber}/comments`\n const res = await fetch(url, {\n method: 'POST',\n headers: ghHeaders(ctx.token, { 'Content-Type': 'application/json' }),\n body: JSON.stringify({ body }),\n })\n\n if (!res.ok) {\n const text = await res.text()\n console.warn(`Failed to create PR comment: ${res.status} ${text}`)\n }\n }\n}\n"],"mappings":"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","names":["OpenAI","AzureOpenAI","OpenAI","AzureOpenAI","s","s","readFileSync"]}
1
+ {"version":3,"sources":["../src/scorers/latency.ts","../src/pricing/catalog.json","../src/pricing/lookup.ts","../src/scorers/cost.ts","../src/utils/deep-equal.ts","../src/scorers/correctness.ts","../src/scorers/schema-correctness.ts","../src/scorers/fuzzy-similarity.ts","../src/scorers/llm-judge.ts","../src/providers/openai.ts","../src/providers/shared.ts","../src/scorers/tool-usage.ts","../src/scorers/index.ts","../src/runner.ts","../src/utils/format.ts","../src/reporter/shared.ts","../src/reporter/console.ts","../src/reporter/json.ts","../src/arena.ts","../src/providers/anthropic.ts","../src/reporter/markdown.ts","../src/reporter/html.ts","../src/packs/structured-output.ts","../src/packs/tool-calling.ts","../src/packs/reasoning.ts","../src/packs/index.ts","../src/ci.ts","../src/github.ts"],"sourcesContent":["import type { ScorerFn } from './types.js'\n\n// Normalizes latency to 0–1 where 1 = fast (≤500ms), 0 = slow (≥10s)\nconst MIN_MS = 500\nconst MAX_MS = 10_000\n\nexport const latencyScorer: ScorerFn = ({ result }) => {\n const clamped = Math.max(MIN_MS, Math.min(MAX_MS, result.latencyMs))\n const value = 1 - (clamped - MIN_MS) / (MAX_MS - MIN_MS)\n\n return {\n name: 'latency',\n value: Math.round(value * 100) / 100,\n details: { ms: result.latencyMs },\n }\n}\n","{\n \"_meta\": {\n \"source\": \"OpenRouter API — all providers (https://openrouter.ai/api/v1/models)\",\n \"updatedAt\": \"2026-02-28\",\n \"unit\": \"USD per token\"\n },\n \"models\": {\n \"ai21/jamba-large-1.7\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000008\n },\n \"aion-labs/aion-1.0\": {\n \"inputPerToken\": 0.000004,\n \"outputPerToken\": 0.000008\n },\n \"aion-labs/aion-1.0-mini\": {\n \"inputPerToken\": 7e-7,\n \"outputPerToken\": 0.0000014\n },\n \"aion-labs/aion-2.0\": {\n \"inputPerToken\": 8e-7,\n \"outputPerToken\": 0.0000016\n },\n \"aion-labs/aion-rp-llama-3.1-8b\": {\n \"inputPerToken\": 8e-7,\n \"outputPerToken\": 0.0000016\n },\n \"alfredpros/codellama-7b-instruct-solidity\": {\n \"inputPerToken\": 8e-7,\n \"outputPerToken\": 0.0000012\n },\n \"alibaba/tongyi-deepresearch-30b-a3b\": {\n \"inputPerToken\": 9e-8,\n \"outputPerToken\": 4.5e-7\n },\n \"allenai/molmo-2-8b\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 2e-7\n },\n \"allenai/olmo-2-0325-32b-instruct\": {\n \"inputPerToken\": 5e-8,\n \"outputPerToken\": 2e-7\n },\n \"allenai/olmo-3-32b-think\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 5e-7\n },\n \"allenai/olmo-3-7b-instruct\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 2e-7\n },\n \"allenai/olmo-3-7b-think\": {\n \"inputPerToken\": 1.2e-7,\n \"outputPerToken\": 2e-7\n },\n \"allenai/olmo-3.1-32b-instruct\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 6e-7\n },\n \"alpindale/goliath-120b\": {\n \"inputPerToken\": 0.00000375,\n \"outputPerToken\": 0.0000075\n },\n \"amazon/nova-2-lite-v1\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 0.0000025\n },\n \"amazon/nova-lite-v1\": {\n \"inputPerToken\": 6e-8,\n \"outputPerToken\": 2.4e-7\n },\n \"amazon/nova-micro-v1\": {\n \"inputPerToken\": 3.5e-8,\n \"outputPerToken\": 1.4e-7\n },\n \"amazon/nova-premier-v1\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.0000125\n },\n \"amazon/nova-pro-v1\": {\n \"inputPerToken\": 8e-7,\n \"outputPerToken\": 0.0000032\n },\n \"anthracite-org/magnum-v4-72b\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000005\n },\n \"anthropic/claude-3-haiku\": {\n \"inputPerToken\": 2.5e-7,\n \"outputPerToken\": 0.00000125\n },\n \"anthropic/claude-3.5-haiku\": {\n \"inputPerToken\": 8e-7,\n \"outputPerToken\": 0.000004\n },\n \"anthropic/claude-3.5-sonnet\": {\n \"inputPerToken\": 0.000006,\n \"outputPerToken\": 0.00003\n },\n \"anthropic/claude-3.7-sonnet\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000015\n },\n \"anthropic/claude-3.7-sonnet:thinking\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000015\n },\n \"anthropic/claude-haiku-4.5\": {\n \"inputPerToken\": 0.000001,\n \"outputPerToken\": 0.000005\n },\n \"anthropic/claude-opus-4\": {\n \"inputPerToken\": 0.000015,\n \"outputPerToken\": 0.000075\n },\n \"anthropic/claude-opus-4.1\": {\n \"inputPerToken\": 0.000015,\n \"outputPerToken\": 0.000075\n },\n \"anthropic/claude-opus-4.5\": {\n \"inputPerToken\": 0.000005,\n \"outputPerToken\": 0.000025\n },\n \"anthropic/claude-opus-4.6\": {\n \"inputPerToken\": 0.000005,\n \"outputPerToken\": 0.000025\n },\n \"anthropic/claude-sonnet-4\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000015\n },\n \"anthropic/claude-sonnet-4.5\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000015\n },\n \"anthropic/claude-sonnet-4.6\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000015\n },\n \"arcee-ai/coder-large\": {\n \"inputPerToken\": 5e-7,\n \"outputPerToken\": 8e-7\n },\n \"arcee-ai/maestro-reasoning\": {\n \"inputPerToken\": 9e-7,\n \"outputPerToken\": 0.0000033\n },\n \"arcee-ai/spotlight\": {\n \"inputPerToken\": 1.8e-7,\n \"outputPerToken\": 1.8e-7\n },\n \"arcee-ai/trinity-mini\": {\n \"inputPerToken\": 4.5e-8,\n \"outputPerToken\": 1.5e-7\n },\n \"arcee-ai/virtuoso-large\": {\n \"inputPerToken\": 7.5e-7,\n \"outputPerToken\": 0.0000012\n },\n \"baidu/ernie-4.5-21b-a3b\": {\n \"inputPerToken\": 7e-8,\n \"outputPerToken\": 2.8e-7\n },\n \"baidu/ernie-4.5-21b-a3b-thinking\": {\n \"inputPerToken\": 7e-8,\n \"outputPerToken\": 2.8e-7\n },\n \"baidu/ernie-4.5-300b-a47b\": {\n \"inputPerToken\": 2.8e-7,\n \"outputPerToken\": 0.0000011\n },\n \"baidu/ernie-4.5-vl-28b-a3b\": {\n \"inputPerToken\": 1.4e-7,\n \"outputPerToken\": 5.6e-7\n },\n \"baidu/ernie-4.5-vl-424b-a47b\": {\n \"inputPerToken\": 4.2e-7,\n \"outputPerToken\": 0.00000125\n },\n \"bytedance/seed-1.6\": {\n \"inputPerToken\": 2.5e-7,\n \"outputPerToken\": 0.000002\n },\n \"bytedance/seed-1.6-flash\": {\n \"inputPerToken\": 7.5e-8,\n \"outputPerToken\": 3e-7\n },\n \"bytedance/seed-2.0-mini\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 4e-7\n },\n \"bytedance/ui-tars-1.5-7b\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 2e-7\n },\n \"cohere/command-a\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.00001\n },\n \"cohere/command-r-08-2024\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 6e-7\n },\n \"cohere/command-r-plus-08-2024\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.00001\n },\n \"cohere/command-r7b-12-2024\": {\n \"inputPerToken\": 3.75e-8,\n \"outputPerToken\": 1.5e-7\n },\n \"deepcogito/cogito-v2.1-671b\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00000125\n },\n \"deepseek/deepseek-chat\": {\n \"inputPerToken\": 3.2e-7,\n \"outputPerToken\": 8.9e-7\n },\n \"deepseek/deepseek-chat-v3-0324\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 7.7e-7\n },\n \"deepseek/deepseek-chat-v3.1\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 7.5e-7\n },\n \"deepseek/deepseek-r1\": {\n \"inputPerToken\": 7e-7,\n \"outputPerToken\": 0.0000025\n },\n \"deepseek/deepseek-r1-0528\": {\n \"inputPerToken\": 4.5e-7,\n \"outputPerToken\": 0.00000215\n },\n \"deepseek/deepseek-r1-distill-llama-70b\": {\n \"inputPerToken\": 7e-7,\n \"outputPerToken\": 8e-7\n },\n \"deepseek/deepseek-r1-distill-qwen-32b\": {\n \"inputPerToken\": 2.9e-7,\n \"outputPerToken\": 2.9e-7\n },\n \"deepseek/deepseek-v3\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 8.8e-7\n },\n \"deepseek/deepseek-v3.1-terminus\": {\n \"inputPerToken\": 2.1e-7,\n \"outputPerToken\": 7.9e-7\n },\n \"deepseek/deepseek-v3.1-terminus:exacto\": {\n \"inputPerToken\": 2.1e-7,\n \"outputPerToken\": 7.9e-7\n },\n \"deepseek/deepseek-v3.2\": {\n \"inputPerToken\": 2.5e-7,\n \"outputPerToken\": 4e-7\n },\n \"deepseek/deepseek-v3.2-exp\": {\n \"inputPerToken\": 2.7e-7,\n \"outputPerToken\": 4.1e-7\n },\n \"deepseek/deepseek-v3.2-speciale\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.0000012\n },\n \"eleutherai/llemma_7b\": {\n \"inputPerToken\": 8e-7,\n \"outputPerToken\": 0.0000012\n },\n \"essentialai/rnj-1-instruct\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 1.5e-7\n },\n \"google/gemini-2.0-flash\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 4e-7\n },\n \"google/gemini-2.0-flash-001\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 4e-7\n },\n \"google/gemini-2.0-flash-lite-001\": {\n \"inputPerToken\": 7.5e-8,\n \"outputPerToken\": 3e-7\n },\n \"google/gemini-2.5-flash\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 0.0000025\n },\n \"google/gemini-2.5-flash-image\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 0.0000025\n },\n \"google/gemini-2.5-flash-lite\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 4e-7\n },\n \"google/gemini-2.5-flash-lite-preview-09-2025\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 4e-7\n },\n \"google/gemini-2.5-pro\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00001\n },\n \"google/gemini-2.5-pro-preview\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00001\n },\n \"google/gemini-2.5-pro-preview-05-06\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00001\n },\n \"google/gemini-3-flash-preview\": {\n \"inputPerToken\": 5e-7,\n \"outputPerToken\": 0.000003\n },\n \"google/gemini-3-pro-image-preview\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000012\n },\n \"google/gemini-3-pro-preview\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000012\n },\n \"google/gemini-3.1-flash-image-preview\": {\n \"inputPerToken\": 2.5e-7,\n \"outputPerToken\": 0.0000015\n },\n \"google/gemini-3.1-pro-preview\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000012\n },\n \"google/gemini-3.1-pro-preview-customtools\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000012\n },\n \"google/gemma-2-27b-it\": {\n \"inputPerToken\": 6.5e-7,\n \"outputPerToken\": 6.5e-7\n },\n \"google/gemma-2-9b-it\": {\n \"inputPerToken\": 3e-8,\n \"outputPerToken\": 9e-8\n },\n \"google/gemma-3-12b-it\": {\n \"inputPerToken\": 4e-8,\n \"outputPerToken\": 1.3e-7\n },\n \"google/gemma-3-27b-it\": {\n \"inputPerToken\": 4e-8,\n \"outputPerToken\": 1.5e-7\n },\n \"google/gemma-3-4b-it\": {\n \"inputPerToken\": 4e-8,\n \"outputPerToken\": 8e-8\n },\n \"google/gemma-3n-e4b-it\": {\n \"inputPerToken\": 2e-8,\n \"outputPerToken\": 4e-8\n },\n \"gryphe/mythomax-l2-13b\": {\n \"inputPerToken\": 6e-8,\n \"outputPerToken\": 6e-8\n },\n \"ibm-granite/granite-4.0-h-micro\": {\n \"inputPerToken\": 1.7e-8,\n \"outputPerToken\": 1.1e-7\n },\n \"inception/mercury\": {\n \"inputPerToken\": 2.5e-7,\n \"outputPerToken\": 0.000001\n },\n \"inception/mercury-coder\": {\n \"inputPerToken\": 2.5e-7,\n \"outputPerToken\": 0.000001\n },\n \"inflection/inflection-3-pi\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.00001\n },\n \"inflection/inflection-3-productivity\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.00001\n },\n \"kwaipilot/kat-coder-pro\": {\n \"inputPerToken\": 2.07e-7,\n \"outputPerToken\": 8.28e-7\n },\n \"liquid/lfm-2-24b-a2b\": {\n \"inputPerToken\": 3e-8,\n \"outputPerToken\": 1.2e-7\n },\n \"liquid/lfm-2.2-6b\": {\n \"inputPerToken\": 1e-8,\n \"outputPerToken\": 2e-8\n },\n \"liquid/lfm2-8b-a1b\": {\n \"inputPerToken\": 1e-8,\n \"outputPerToken\": 2e-8\n },\n \"mancer/weaver\": {\n \"inputPerToken\": 7.5e-7,\n \"outputPerToken\": 0.000001\n },\n \"meituan/longcat-flash-chat\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 8e-7\n },\n \"meta/llama-3-70b-instruct\": {\n \"inputPerToken\": 5.1e-7,\n \"outputPerToken\": 7.4e-7\n },\n \"meta/llama-3-8b-instruct\": {\n \"inputPerToken\": 3e-8,\n \"outputPerToken\": 4e-8\n },\n \"meta/llama-3.1-405b\": {\n \"inputPerToken\": 0.000004,\n \"outputPerToken\": 0.000004\n },\n \"meta/llama-3.1-405b-instruct\": {\n \"inputPerToken\": 0.000004,\n \"outputPerToken\": 0.000004\n },\n \"meta/llama-3.1-70b-instruct\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 4e-7\n },\n \"meta/llama-3.1-8b-instruct\": {\n \"inputPerToken\": 2e-8,\n \"outputPerToken\": 5e-8\n },\n \"meta/llama-3.2-11b-vision-instruct\": {\n \"inputPerToken\": 4.9e-8,\n \"outputPerToken\": 4.9e-8\n },\n \"meta/llama-3.2-1b-instruct\": {\n \"inputPerToken\": 2.7e-8,\n \"outputPerToken\": 2e-7\n },\n \"meta/llama-3.2-3b-instruct\": {\n \"inputPerToken\": 2e-8,\n \"outputPerToken\": 2e-8\n },\n \"meta/llama-3.3-70b\": {\n \"inputPerToken\": 1.2e-7,\n \"outputPerToken\": 3e-7\n },\n \"meta/llama-3.3-70b-instruct\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 3.2e-7\n },\n \"meta/llama-4-maverick\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 6e-7\n },\n \"meta/llama-4-scout\": {\n \"inputPerToken\": 8e-8,\n \"outputPerToken\": 3e-7\n },\n \"meta/llama-guard-2-8b\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 2e-7\n },\n \"meta/llama-guard-3-8b\": {\n \"inputPerToken\": 2e-8,\n \"outputPerToken\": 6e-8\n },\n \"meta/llama-guard-4-12b\": {\n \"inputPerToken\": 1.8e-7,\n \"outputPerToken\": 1.8e-7\n },\n \"microsoft/phi-4\": {\n \"inputPerToken\": 6e-8,\n \"outputPerToken\": 1.4e-7\n },\n \"microsoft/wizardlm-2-8x22b\": {\n \"inputPerToken\": 6.2e-7,\n \"outputPerToken\": 6.2e-7\n },\n \"minimax/minimax-01\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 0.0000011\n },\n \"minimax/minimax-m1\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.0000022\n },\n \"minimax/minimax-m2\": {\n \"inputPerToken\": 2.55e-7,\n \"outputPerToken\": 0.000001\n },\n \"minimax/minimax-m2-her\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 0.0000012\n },\n \"minimax/minimax-m2.1\": {\n \"inputPerToken\": 2.7e-7,\n \"outputPerToken\": 9.5e-7\n },\n \"minimax/minimax-m2.5\": {\n \"inputPerToken\": 2.95e-7,\n \"outputPerToken\": 0.0000012\n },\n \"mistral/codestral-2508\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 9e-7\n },\n \"mistral/devstral-2512\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.000002\n },\n \"mistral/devstral-medium\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.000002\n },\n \"mistral/devstral-small\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 3e-7\n },\n \"mistral/ministral-14b-2512\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 2e-7\n },\n \"mistral/ministral-3b-2512\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 1e-7\n },\n \"mistral/ministral-8b-2512\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 1.5e-7\n },\n \"mistral/mistral-7b-instruct\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 2e-7\n },\n \"mistral/mistral-7b-instruct-v0.1\": {\n \"inputPerToken\": 1.1e-7,\n \"outputPerToken\": 1.9e-7\n },\n \"mistral/mistral-7b-instruct-v0.3\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 2e-7\n },\n \"mistral/mistral-large\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000006\n },\n \"mistral/mistral-large-2407\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000006\n },\n \"mistral/mistral-large-2411\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000006\n },\n \"mistral/mistral-large-2512\": {\n \"inputPerToken\": 5e-7,\n \"outputPerToken\": 0.0000015\n },\n \"mistral/mistral-medium-3\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.000002\n },\n \"mistral/mistral-medium-3.1\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.000002\n },\n \"mistral/mistral-nemo\": {\n \"inputPerToken\": 2e-8,\n \"outputPerToken\": 4e-8\n },\n \"mistral/mistral-saba\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 6e-7\n },\n \"mistral/mistral-small\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 3e-7\n },\n \"mistral/mistral-small-24b-instruct-2501\": {\n \"inputPerToken\": 5e-8,\n \"outputPerToken\": 8e-8\n },\n \"mistral/mistral-small-3.1-24b-instruct\": {\n \"inputPerToken\": 3.5e-7,\n \"outputPerToken\": 5.6e-7\n },\n \"mistral/mistral-small-3.2-24b-instruct\": {\n \"inputPerToken\": 6e-8,\n \"outputPerToken\": 1.8e-7\n },\n \"mistral/mistral-small-creative\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 3e-7\n },\n \"mistral/mixtral-8x22b-instruct\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000006\n },\n \"mistral/mixtral-8x7b-instruct\": {\n \"inputPerToken\": 5.4e-7,\n \"outputPerToken\": 5.4e-7\n },\n \"mistral/pixtral-large-2411\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000006\n },\n \"mistral/voxtral-small-24b-2507\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 3e-7\n },\n \"moonshotai/kimi-k2\": {\n \"inputPerToken\": 5.5e-7,\n \"outputPerToken\": 0.0000022\n },\n \"moonshotai/kimi-k2-0905\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.000002\n },\n \"moonshotai/kimi-k2-0905:exacto\": {\n \"inputPerToken\": 6e-7,\n \"outputPerToken\": 0.0000025\n },\n \"moonshotai/kimi-k2-thinking\": {\n \"inputPerToken\": 4.7e-7,\n \"outputPerToken\": 0.000002\n },\n \"moonshotai/kimi-k2.5\": {\n \"inputPerToken\": 4.5e-7,\n \"outputPerToken\": 0.0000022\n },\n \"morph/morph-v3-fast\": {\n \"inputPerToken\": 8e-7,\n \"outputPerToken\": 0.0000012\n },\n \"morph/morph-v3-large\": {\n \"inputPerToken\": 9e-7,\n \"outputPerToken\": 0.0000019\n },\n \"neversleep/llama-3.1-lumimaid-8b\": {\n \"inputPerToken\": 9e-8,\n \"outputPerToken\": 6e-7\n },\n \"neversleep/noromaid-20b\": {\n \"inputPerToken\": 0.000001,\n \"outputPerToken\": 0.00000175\n },\n \"nex-agi/deepseek-v3.1-nex-n1\": {\n \"inputPerToken\": 2.7e-7,\n \"outputPerToken\": 0.000001\n },\n \"nousresearch/hermes-2-pro-llama-3-8b\": {\n \"inputPerToken\": 1.4e-7,\n \"outputPerToken\": 1.4e-7\n },\n \"nousresearch/hermes-3-llama-3.1-405b\": {\n \"inputPerToken\": 0.000001,\n \"outputPerToken\": 0.000001\n },\n \"nousresearch/hermes-3-llama-3.1-70b\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 3e-7\n },\n \"nousresearch/hermes-4-405b\": {\n \"inputPerToken\": 0.000001,\n \"outputPerToken\": 0.000003\n },\n \"nousresearch/hermes-4-70b\": {\n \"inputPerToken\": 1.3e-7,\n \"outputPerToken\": 4e-7\n },\n \"nvidia/llama-3.1-nemotron-70b-instruct\": {\n \"inputPerToken\": 0.0000012,\n \"outputPerToken\": 0.0000012\n },\n \"nvidia/llama-3.3-nemotron-super-49b-v1.5\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 4e-7\n },\n \"nvidia/nemotron-3-nano-30b-a3b\": {\n \"inputPerToken\": 5e-8,\n \"outputPerToken\": 2e-7\n },\n \"nvidia/nemotron-nano-12b-v2-vl\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 6e-7\n },\n \"nvidia/nemotron-nano-9b-v2\": {\n \"inputPerToken\": 4e-8,\n \"outputPerToken\": 1.6e-7\n },\n \"openai/gpt-3.5-turbo\": {\n \"inputPerToken\": 5e-7,\n \"outputPerToken\": 0.0000015\n },\n \"openai/gpt-3.5-turbo-0613\": {\n \"inputPerToken\": 0.000001,\n \"outputPerToken\": 0.000002\n },\n \"openai/gpt-3.5-turbo-16k\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000004\n },\n \"openai/gpt-3.5-turbo-instruct\": {\n \"inputPerToken\": 0.0000015,\n \"outputPerToken\": 0.000002\n },\n \"openai/gpt-4\": {\n \"inputPerToken\": 0.00003,\n \"outputPerToken\": 0.00006\n },\n \"openai/gpt-4-0314\": {\n \"inputPerToken\": 0.00003,\n \"outputPerToken\": 0.00006\n },\n \"openai/gpt-4-1106-preview\": {\n \"inputPerToken\": 0.00001,\n \"outputPerToken\": 0.00003\n },\n \"openai/gpt-4-turbo\": {\n \"inputPerToken\": 0.00001,\n \"outputPerToken\": 0.00003\n },\n \"openai/gpt-4-turbo-preview\": {\n \"inputPerToken\": 0.00001,\n \"outputPerToken\": 0.00003\n },\n \"openai/gpt-4.1\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000008\n },\n \"openai/gpt-4.1-mini\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.0000016\n },\n \"openai/gpt-4.1-nano\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 4e-7\n },\n \"openai/gpt-4o\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-4o-2024-05-13\": {\n \"inputPerToken\": 0.000005,\n \"outputPerToken\": 0.000015\n },\n \"openai/gpt-4o-2024-08-06\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-4o-2024-11-20\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-4o-audio-preview\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-4o-mini\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 6e-7\n },\n \"openai/gpt-4o-mini-2024-07-18\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 6e-7\n },\n \"openai/gpt-4o-mini-search-preview\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 6e-7\n },\n \"openai/gpt-4o-search-preview\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-4o:extended\": {\n \"inputPerToken\": 0.000006,\n \"outputPerToken\": 0.000018\n },\n \"openai/gpt-5\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-5-chat\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-5-codex\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-5-image\": {\n \"inputPerToken\": 0.00001,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-5-image-mini\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.000002\n },\n \"openai/gpt-5-mini\": {\n \"inputPerToken\": 2.5e-7,\n \"outputPerToken\": 0.000002\n },\n \"openai/gpt-5-nano\": {\n \"inputPerToken\": 5e-8,\n \"outputPerToken\": 4e-7\n },\n \"openai/gpt-5-pro\": {\n \"inputPerToken\": 0.000015,\n \"outputPerToken\": 0.00012\n },\n \"openai/gpt-5.1\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-5.1-chat\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-5.1-codex\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-5.1-codex-max\": {\n \"inputPerToken\": 0.00000125,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-5.1-codex-mini\": {\n \"inputPerToken\": 2.5e-7,\n \"outputPerToken\": 0.000002\n },\n \"openai/gpt-5.2\": {\n \"inputPerToken\": 0.00000175,\n \"outputPerToken\": 0.000014\n },\n \"openai/gpt-5.2-chat\": {\n \"inputPerToken\": 0.00000175,\n \"outputPerToken\": 0.000014\n },\n \"openai/gpt-5.2-codex\": {\n \"inputPerToken\": 0.00000175,\n \"outputPerToken\": 0.000014\n },\n \"openai/gpt-5.2-pro\": {\n \"inputPerToken\": 0.000021,\n \"outputPerToken\": 0.000168\n },\n \"openai/gpt-5.3-codex\": {\n \"inputPerToken\": 0.00000175,\n \"outputPerToken\": 0.000014\n },\n \"openai/gpt-audio\": {\n \"inputPerToken\": 0.0000025,\n \"outputPerToken\": 0.00001\n },\n \"openai/gpt-audio-mini\": {\n \"inputPerToken\": 6e-7,\n \"outputPerToken\": 0.0000024\n },\n \"openai/gpt-oss-120b\": {\n \"inputPerToken\": 3.9e-8,\n \"outputPerToken\": 1.9e-7\n },\n \"openai/gpt-oss-120b:exacto\": {\n \"inputPerToken\": 3.9e-8,\n \"outputPerToken\": 1.9e-7\n },\n \"openai/gpt-oss-20b\": {\n \"inputPerToken\": 3e-8,\n \"outputPerToken\": 1.4e-7\n },\n \"openai/gpt-oss-safeguard-20b\": {\n \"inputPerToken\": 7.5e-8,\n \"outputPerToken\": 3e-7\n },\n \"openai/o1\": {\n \"inputPerToken\": 0.000015,\n \"outputPerToken\": 0.00006\n },\n \"openai/o1-pro\": {\n \"inputPerToken\": 0.00015,\n \"outputPerToken\": 0.0006\n },\n \"openai/o3\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000008\n },\n \"openai/o3-deep-research\": {\n \"inputPerToken\": 0.00001,\n \"outputPerToken\": 0.00004\n },\n \"openai/o3-mini\": {\n \"inputPerToken\": 0.0000011,\n \"outputPerToken\": 0.0000044\n },\n \"openai/o3-mini-high\": {\n \"inputPerToken\": 0.0000011,\n \"outputPerToken\": 0.0000044\n },\n \"openai/o3-pro\": {\n \"inputPerToken\": 0.00002,\n \"outputPerToken\": 0.00008\n },\n \"openai/o4-mini\": {\n \"inputPerToken\": 0.0000011,\n \"outputPerToken\": 0.0000044\n },\n \"openai/o4-mini-deep-research\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000008\n },\n \"openai/o4-mini-high\": {\n \"inputPerToken\": 0.0000011,\n \"outputPerToken\": 0.0000044\n },\n \"opengvlab/internvl3-78b\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 6e-7\n },\n \"perplexity/sonar\": {\n \"inputPerToken\": 0.000001,\n \"outputPerToken\": 0.000001\n },\n \"perplexity/sonar-deep-research\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000008\n },\n \"perplexity/sonar-pro\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000015\n },\n \"perplexity/sonar-pro-search\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000015\n },\n \"perplexity/sonar-reasoning-pro\": {\n \"inputPerToken\": 0.000002,\n \"outputPerToken\": 0.000008\n },\n \"prime-intellect/intellect-3\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 0.0000011\n },\n \"qwen/qwen-2.5-72b-instruct\": {\n \"inputPerToken\": 1.2e-7,\n \"outputPerToken\": 3.9e-7\n },\n \"qwen/qwen-2.5-7b-instruct\": {\n \"inputPerToken\": 4e-8,\n \"outputPerToken\": 1e-7\n },\n \"qwen/qwen-2.5-coder-32b-instruct\": {\n \"inputPerToken\": 2.0000000000000002e-7,\n \"outputPerToken\": 2.0000000000000002e-7\n },\n \"qwen/qwen-2.5-vl-7b-instruct\": {\n \"inputPerToken\": 2.0000000000000002e-7,\n \"outputPerToken\": 2.0000000000000002e-7\n },\n \"qwen/qwen-max\": {\n \"inputPerToken\": 0.0000016,\n \"outputPerToken\": 0.0000064\n },\n \"qwen/qwen-plus\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.0000012\n },\n \"qwen/qwen-plus-2025-07-28\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.0000012\n },\n \"qwen/qwen-plus-2025-07-28:thinking\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.0000012\n },\n \"qwen/qwen-turbo\": {\n \"inputPerToken\": 5e-8,\n \"outputPerToken\": 2e-7\n },\n \"qwen/qwen-vl-max\": {\n \"inputPerToken\": 8e-7,\n \"outputPerToken\": 0.0000032\n },\n \"qwen/qwen-vl-plus\": {\n \"inputPerToken\": 2.1e-7,\n \"outputPerToken\": 6.3e-7\n },\n \"qwen/qwen2.5-coder-7b-instruct\": {\n \"inputPerToken\": 3e-8,\n \"outputPerToken\": 9e-8\n },\n \"qwen/qwen2.5-vl-32b-instruct\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 6e-7\n },\n \"qwen/qwen2.5-vl-72b-instruct\": {\n \"inputPerToken\": 8e-7,\n \"outputPerToken\": 8e-7\n },\n \"qwen/qwen3-14b\": {\n \"inputPerToken\": 6e-8,\n \"outputPerToken\": 2.4e-7\n },\n \"qwen/qwen3-235b-a22b\": {\n \"inputPerToken\": 4.55e-7,\n \"outputPerToken\": 0.00000182\n },\n \"qwen/qwen3-235b-a22b-2507\": {\n \"inputPerToken\": 7.1e-8,\n \"outputPerToken\": 1e-7\n },\n \"qwen/qwen3-30b-a3b\": {\n \"inputPerToken\": 8e-8,\n \"outputPerToken\": 2.8e-7\n },\n \"qwen/qwen3-30b-a3b-instruct-2507\": {\n \"inputPerToken\": 9e-8,\n \"outputPerToken\": 3e-7\n },\n \"qwen/qwen3-30b-a3b-thinking-2507\": {\n \"inputPerToken\": 5.1e-8,\n \"outputPerToken\": 3.4e-7\n },\n \"qwen/qwen3-32b\": {\n \"inputPerToken\": 8e-8,\n \"outputPerToken\": 2.4e-7\n },\n \"qwen/qwen3-8b\": {\n \"inputPerToken\": 5e-8,\n \"outputPerToken\": 4e-7\n },\n \"qwen/qwen3-coder\": {\n \"inputPerToken\": 2.2e-7,\n \"outputPerToken\": 0.000001\n },\n \"qwen/qwen3-coder-30b-a3b-instruct\": {\n \"inputPerToken\": 7e-8,\n \"outputPerToken\": 2.7e-7\n },\n \"qwen/qwen3-coder-flash\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 0.0000015\n },\n \"qwen/qwen3-coder-next\": {\n \"inputPerToken\": 1.2e-7,\n \"outputPerToken\": 7.5e-7\n },\n \"qwen/qwen3-coder-plus\": {\n \"inputPerToken\": 0.000001,\n \"outputPerToken\": 0.000005\n },\n \"qwen/qwen3-coder:exacto\": {\n \"inputPerToken\": 2.2e-7,\n \"outputPerToken\": 0.0000018\n },\n \"qwen/qwen3-max\": {\n \"inputPerToken\": 0.0000012,\n \"outputPerToken\": 0.000006\n },\n \"qwen/qwen3-max-thinking\": {\n \"inputPerToken\": 0.0000012,\n \"outputPerToken\": 0.000006\n },\n \"qwen/qwen3-next-80b-a3b-instruct\": {\n \"inputPerToken\": 9e-8,\n \"outputPerToken\": 0.0000011\n },\n \"qwen/qwen3-next-80b-a3b-thinking\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 0.0000012\n },\n \"qwen/qwen3-vl-235b-a22b-instruct\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 8.8e-7\n },\n \"qwen/qwen3-vl-30b-a3b-instruct\": {\n \"inputPerToken\": 1.3e-7,\n \"outputPerToken\": 5.2e-7\n },\n \"qwen/qwen3-vl-32b-instruct\": {\n \"inputPerToken\": 1.04e-7,\n \"outputPerToken\": 4.16e-7\n },\n \"qwen/qwen3-vl-8b-instruct\": {\n \"inputPerToken\": 8e-8,\n \"outputPerToken\": 5e-7\n },\n \"qwen/qwen3-vl-8b-thinking\": {\n \"inputPerToken\": 1.17e-7,\n \"outputPerToken\": 0.000001365\n },\n \"qwen/qwen3.5-122b-a10b\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.0000032\n },\n \"qwen/qwen3.5-27b\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 0.0000024\n },\n \"qwen/qwen3.5-35b-a3b\": {\n \"inputPerToken\": 2.5e-7,\n \"outputPerToken\": 0.000002\n },\n \"qwen/qwen3.5-397b-a17b\": {\n \"inputPerToken\": 5.5e-7,\n \"outputPerToken\": 0.0000035\n },\n \"qwen/qwen3.5-flash-02-23\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 4e-7\n },\n \"qwen/qwen3.5-plus-02-15\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 0.0000024\n },\n \"qwen/qwq-32b\": {\n \"inputPerToken\": 1.5e-7,\n \"outputPerToken\": 4e-7\n },\n \"raifle/sorcererlm-8x22b\": {\n \"inputPerToken\": 0.0000045,\n \"outputPerToken\": 0.0000045\n },\n \"relace/relace-apply-3\": {\n \"inputPerToken\": 8.5e-7,\n \"outputPerToken\": 0.00000125\n },\n \"relace/relace-search\": {\n \"inputPerToken\": 0.000001,\n \"outputPerToken\": 0.000003\n },\n \"sao10k/l3-euryale-70b\": {\n \"inputPerToken\": 0.00000148,\n \"outputPerToken\": 0.00000148\n },\n \"sao10k/l3-lunaris-8b\": {\n \"inputPerToken\": 4e-8,\n \"outputPerToken\": 5e-8\n },\n \"sao10k/l3.1-70b-hanami-x1\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000003\n },\n \"sao10k/l3.1-euryale-70b\": {\n \"inputPerToken\": 6.5e-7,\n \"outputPerToken\": 7.5e-7\n },\n \"sao10k/l3.3-euryale-70b\": {\n \"inputPerToken\": 6.5e-7,\n \"outputPerToken\": 7.5e-7\n },\n \"stepfun/step-3.5-flash\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 3e-7\n },\n \"switchpoint/router\": {\n \"inputPerToken\": 8.5e-7,\n \"outputPerToken\": 0.0000034\n },\n \"tencent/hunyuan-a13b-instruct\": {\n \"inputPerToken\": 1.4e-7,\n \"outputPerToken\": 5.7e-7\n },\n \"thedrummer/cydonia-24b-v4.1\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 5e-7\n },\n \"thedrummer/rocinante-12b\": {\n \"inputPerToken\": 1.7e-7,\n \"outputPerToken\": 4.3e-7\n },\n \"thedrummer/skyfall-36b-v2\": {\n \"inputPerToken\": 5.5e-7,\n \"outputPerToken\": 8e-7\n },\n \"thedrummer/unslopnemo-12b\": {\n \"inputPerToken\": 4e-7,\n \"outputPerToken\": 4e-7\n },\n \"tngtech/deepseek-r1t2-chimera\": {\n \"inputPerToken\": 2.5e-7,\n \"outputPerToken\": 8.5e-7\n },\n \"undi95/remm-slerp-l2-13b\": {\n \"inputPerToken\": 4.5e-7,\n \"outputPerToken\": 6.5e-7\n },\n \"writer/palmyra-x5\": {\n \"inputPerToken\": 6e-7,\n \"outputPerToken\": 0.000006\n },\n \"xai/grok-3\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000015\n },\n \"xai/grok-3-beta\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000015\n },\n \"xai/grok-3-mini\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 5e-7\n },\n \"xai/grok-3-mini-beta\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 5e-7\n },\n \"xai/grok-4\": {\n \"inputPerToken\": 0.000003,\n \"outputPerToken\": 0.000015\n },\n \"xai/grok-4-fast\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 5e-7\n },\n \"xai/grok-4.1-fast\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 5e-7\n },\n \"xai/grok-code-fast-1\": {\n \"inputPerToken\": 2e-7,\n \"outputPerToken\": 0.0000015\n },\n \"xiaomi/mimo-v2-flash\": {\n \"inputPerToken\": 9e-8,\n \"outputPerToken\": 2.9e-7\n },\n \"z-ai/glm-4-32b\": {\n \"inputPerToken\": 1e-7,\n \"outputPerToken\": 1e-7\n },\n \"z-ai/glm-4.5\": {\n \"inputPerToken\": 5.5e-7,\n \"outputPerToken\": 0.000002\n },\n \"z-ai/glm-4.5-air\": {\n \"inputPerToken\": 1.3e-7,\n \"outputPerToken\": 8.5e-7\n },\n \"z-ai/glm-4.5v\": {\n \"inputPerToken\": 6e-7,\n \"outputPerToken\": 0.0000018\n },\n \"z-ai/glm-4.6\": {\n \"inputPerToken\": 3.5e-7,\n \"outputPerToken\": 0.00000171\n },\n \"z-ai/glm-4.6:exacto\": {\n \"inputPerToken\": 4.4e-7,\n \"outputPerToken\": 0.00000176\n },\n \"z-ai/glm-4.6v\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 9e-7\n },\n \"z-ai/glm-4.7\": {\n \"inputPerToken\": 3e-7,\n \"outputPerToken\": 0.0000014\n },\n \"z-ai/glm-4.7-flash\": {\n \"inputPerToken\": 6e-8,\n \"outputPerToken\": 4e-7\n },\n \"z-ai/glm-5\": {\n \"inputPerToken\": 9.5e-7,\n \"outputPerToken\": 0.00000255\n }\n }\n}\n","import catalog from './catalog.json' with { type: 'json' }\n\nexport interface ModelPricing {\n inputPerToken: number\n outputPerToken: number\n}\n\nconst models = catalog.models as Record<string, ModelPricing>\n\n// Reverse index: model name (after slash) → first catalog key that contains it.\n// Enables cross-provider lookups (e.g. groq/llama-4-scout → meta/llama-4-scout).\nconst modelNameIndex = new Map<string, string>()\nfor (const key of Object.keys(models)) {\n const name = key.split('/').slice(1).join('/')\n if (name && !modelNameIndex.has(name)) {\n modelNameIndex.set(name, key)\n }\n}\n\n/**\n * Look up pricing for a provider ID (e.g. \"openai/gpt-4o\", \"azure/gpt-5-mini\").\n *\n * Resolution order:\n * 1. Exact match on provider ID\n * 2. Strip provider prefix, try \"openai/{model}\" (covers Azure deployments)\n * 3. Cross-provider model-name fallback (covers hosting providers like Groq, Together, Fireworks)\n * 4. undefined (no pricing available)\n */\nexport function lookupPricing(providerId: string): ModelPricing | undefined {\n // 1. Exact match\n if (models[providerId]) return models[providerId]\n\n const model = providerId.split('/').slice(1).join('/')\n if (!model) return undefined\n\n // 2. Try as openai/{model} (covers azure/* deployments)\n const asOpenai = `openai/${model}`\n if (models[asOpenai]) return models[asOpenai]\n\n // 3. Cross-provider: look up by model name alone\n const crossKey = modelNameIndex.get(model)\n if (crossKey) return models[crossKey]\n\n return undefined\n}\n\nexport function registerPricing(providerId: string, pricing: ModelPricing): void {\n models[providerId] = pricing\n}\n\nexport function estimateCost(\n pricing: ModelPricing,\n promptTokens: number,\n completionTokens: number,\n): number {\n return pricing.inputPerToken * promptTokens + pricing.outputPerToken * completionTokens\n}\n","import type { ScorerFn } from './types.js'\nimport { lookupPricing, estimateCost } from '../pricing/lookup.js'\n\nexport const costScorer: ScorerFn = ({ result }, providerId) => {\n const promptTokens = result.usage?.promptTokens ?? 0\n const completionTokens = result.usage?.completionTokens ?? 0\n const totalTokens = promptTokens + completionTokens\n\n const pricing = lookupPricing(providerId)\n\n if (!pricing) {\n return {\n name: 'cost',\n value: -1,\n details: {\n estimatedUsd: null,\n promptTokens,\n completionTokens,\n totalTokens,\n note: 'No pricing data available for this model',\n },\n }\n }\n\n const usd = estimateCost(pricing, promptTokens, completionTokens)\n\n return {\n name: 'cost',\n value: usd,\n details: {\n estimatedUsd: usd,\n promptTokens,\n completionTokens,\n totalTokens,\n },\n }\n}\n","/**\n * Deep equality check with LLM-friendly tolerance:\n * - Strings: case-insensitive trimmed comparison\n * - Objects: all expected keys must match (extra keys in actual are tolerated)\n * - Arrays: element-wise comparison\n */\nexport function deepEqual(expected: unknown, actual: unknown): boolean {\n if (expected === actual) return true\n\n if (typeof expected === 'string' && typeof actual === 'string') {\n return expected.trim().toLowerCase() === actual.trim().toLowerCase()\n }\n\n if (typeof expected !== typeof actual) return false\n if (expected === null || actual === null) return expected === actual\n\n if (Array.isArray(expected) && Array.isArray(actual)) {\n if (expected.length !== actual.length) return false\n return expected.every((val, i) => deepEqual(val, actual[i]))\n }\n\n if (typeof expected === 'object' && typeof actual === 'object') {\n const objExpected = expected as Record<string, unknown>\n const objActual = actual as Record<string, unknown>\n const keysExpected = Object.keys(objExpected)\n return keysExpected.every((key) => key in objActual && deepEqual(objExpected[key], objActual[key]))\n }\n\n return expected === actual\n}\n","import type { ScorerFn } from './types.js'\nimport { deepEqual } from '../utils/deep-equal.js'\n\n/**\n * Correctness scorer for LLM output evaluation.\n *\n * For strings: case-insensitive trimmed comparison.\n * For objects: checks all expected keys exist with matching values (extra keys in actual are tolerated).\n * For arrays: if actual is an object wrapping a single array, unwraps it before comparing.\n * Returns 1 (match), 0 (no match), or 0.5 (no expected value defined).\n */\nexport const correctnessScorer: ScorerFn = ({ task, result }) => {\n if (task.expected === undefined) {\n return { name: 'correctness', value: 0.5, details: { reason: 'no expected value' } }\n }\n\n const actual = normalizeOutput(task.expected, result.output)\n const match = deepEqual(task.expected, actual)\n\n return {\n name: 'correctness',\n value: match ? 1 : 0,\n details: { expected: task.expected, actual: result.output },\n }\n}\n\n/**\n * Normalize model output to align with the expected shape.\n * Handles two common cases where json_object mode forces array responses\n * into wrapper objects:\n * - Single-key wrapper: { \"products\": [...] }\n * - Schema-echo wrapper: { \"type\": \"array\", \"items\": [...], \"$schema\": \"...\" }\n *\n * Strategy: if expected is an array and actual is an object, find all keys\n * whose value is an array. If exactly one exists, unwrap it.\n */\nfunction normalizeOutput(expected: unknown, actual: unknown): unknown {\n if (Array.isArray(expected) && !Array.isArray(actual) && typeof actual === 'object' && actual !== null) {\n const entries = Object.entries(actual as Record<string, unknown>)\n const arrayEntries = entries.filter(([, v]) => Array.isArray(v))\n if (arrayEntries.length === 1) {\n return arrayEntries[0]![1]\n }\n }\n return actual\n}\n","import type { ScorerFn } from './types.js'\n\nexport const schemaCorrectnessScorer: ScorerFn = ({ task, result }) => {\n if (!task.schema) {\n return { name: 'schema-correctness', value: -1, details: { reason: 'no schema defined' } }\n }\n\n let data: unknown = result.output\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data)\n } catch {\n return {\n name: 'schema-correctness',\n value: 0,\n details: { reason: 'output is not valid JSON' },\n }\n }\n }\n\n let parsed = task.schema.safeParse(data)\n\n // If validation fails and data is an object wrapping a single array,\n // try unwrapping — handles json_object mode forcing arrays into objects.\n if (!parsed.success && !Array.isArray(data) && typeof data === 'object' && data !== null) {\n const arrayEntries = Object.entries(data as Record<string, unknown>).filter(([, v]) => Array.isArray(v))\n if (arrayEntries.length === 1) {\n const unwrapped = task.schema.safeParse(arrayEntries[0]![1])\n if (unwrapped.success) parsed = unwrapped\n }\n }\n\n return {\n name: 'schema-correctness',\n value: parsed.success ? 1 : 0,\n details: parsed.success\n ? { valid: true }\n : { valid: false, errors: parsed.error.issues.map((i) => i.message) },\n }\n}\n","import type { ScorerFn } from './types.js'\n\nexport const fuzzySimilarityScorer: ScorerFn = ({ task, result }) => {\n if (task.expected === undefined) {\n return { name: 'fuzzy-similarity', value: -1, details: { reason: 'no expected value' } }\n }\n\n const a = stringify(task.expected)\n const b = stringify(result.output)\n const setA = tokenize(a)\n const setB = tokenize(b)\n\n const similarity = jaccardSimilarity(setA, setB)\n\n return {\n name: 'fuzzy-similarity',\n value: Math.round(similarity * 100) / 100,\n details: { method: 'jaccard', expectedTokens: setA.size, actualTokens: setB.size },\n }\n}\n\nfunction stringify(value: unknown): string {\n if (typeof value === 'string') return value.toLowerCase()\n return JSON.stringify(value).toLowerCase()\n}\n\nfunction tokenize(text: string): Set<string> {\n return new Set(text.match(/\\w+/g) ?? [])\n}\n\nfunction jaccardSimilarity(a: Set<string>, b: Set<string>): number {\n if (a.size === 0 && b.size === 0) return 1\n\n let intersection = 0\n for (const token of a) {\n if (b.has(token)) intersection++\n }\n\n const union = a.size + b.size - intersection\n return union === 0 ? 1 : intersection / union\n}\n","import OpenAI, { AzureOpenAI } from 'openai'\nimport { REQUEST_TIMEOUT_MS } from '../providers/openai.js'\nimport type { ScorerFn } from './types.js'\n\nconst JUDGE_PROMPT = `You are a strict scoring judge. Evaluate the actual output against the expected output on three criteria. Score each from 0.0 to 1.0 using the full range (not just 0, 0.5, 1).\n\nCriteria:\n1. Accuracy — are the facts, entities, and claims correct? Penalize hallucinations or wrong details.\n2. Completeness — does it capture all key information from the expected output? Penalize missing points.\n3. Conciseness — is it free of unnecessary filler, repetition, or tangential content? Penalize verbosity.\n\nRespond with ONLY this exact format — three lines, no other text:\naccuracy: <number>\ncompleteness: <number>\nconciseness: <number>\n\nTask: {task}\nExpected: {expected}\nActual: {actual}`\n\ninterface JudgeClientResult {\n client: OpenAI\n model: string\n}\n\nfunction resolveJudgeClient(configModel?: string, timeoutMs = REQUEST_TIMEOUT_MS): JudgeClientResult | undefined {\n const model = configModel ?? process.env.DUELIST_JUDGE_MODEL ?? 'gpt-5-mini'\n\n // If the judge model starts with \"gemini\", use Google's OpenAI-compatible endpoint\n if (model.startsWith('gemini') && process.env.GOOGLE_API_KEY) {\n return {\n client: new OpenAI({\n apiKey: process.env.GOOGLE_API_KEY,\n baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/',\n timeout: timeoutMs,\n }),\n model,\n }\n }\n\n // Azure OpenAI fallback\n if (!process.env.OPENAI_API_KEY && process.env.AZURE_OPENAI_API_KEY) {\n return {\n client: new AzureOpenAI({\n apiKey: process.env.AZURE_OPENAI_API_KEY,\n endpoint: process.env.AZURE_OPENAI_ENDPOINT,\n apiVersion: process.env.AZURE_OPENAI_API_VERSION ?? '2024-12-01-preview',\n deployment: model,\n timeout: timeoutMs,\n }),\n model,\n }\n }\n\n // OpenAI\n const apiKey = process.env.OPENAI_API_KEY\n if (!apiKey) return undefined\n\n return { client: new OpenAI({ apiKey, timeout: timeoutMs }), model }\n}\n\n/** Detect errors caused by temperature being unsupported (reasoning models like o1/o3). */\nfunction isTemperatureError(err: unknown): boolean {\n const msg = err instanceof Error ? err.message : String(err)\n const lower = msg.toLowerCase()\n return lower.includes('temperature') && (\n lower.includes('not supported') ||\n lower.includes('is not allowed') ||\n lower.includes('unsupported') ||\n lower.includes('invalid')\n )\n}\n\n/**\n * Create an LLM-as-judge scorer configured with a specific model.\n *\n * The model can also be set via DUELIST_JUDGE_MODEL env var.\n * Requires OPENAI_API_KEY, AZURE_OPENAI_API_KEY, or GOOGLE_API_KEY\n * depending on the model prefix.\n *\n * Uses temperature: 0 for deterministic scoring. If the model rejects\n * temperature (e.g. reasoning models like o1/o3), automatically retries\n * without it and remembers the preference for subsequent calls.\n */\nexport function createLlmJudgeScorer(judgeModel?: string, timeoutMs = REQUEST_TIMEOUT_MS): ScorerFn {\n let cached: JudgeClientResult | undefined | null = undefined\n let useTemperature = true\n\n return async ({ task, result }) => {\n if (task.expected === undefined) {\n return { name: 'llm-judge-correctness', value: -1, details: { reason: 'no expected value' } }\n }\n\n // Lazy-init and cache the client\n if (cached === undefined) {\n cached = resolveJudgeClient(judgeModel, timeoutMs) ?? null\n }\n\n if (!cached) {\n return {\n name: 'llm-judge-correctness',\n value: -1,\n details: { reason: 'no API key available for judge model' },\n }\n }\n\n const { client, model } = cached\n\n const prompt = JUDGE_PROMPT\n .replace('{task}', task.prompt)\n .replace('{expected}', JSON.stringify(task.expected))\n .replace('{actual}', JSON.stringify(result.output))\n\n const messages: OpenAI.ChatCompletionMessageParam[] = [{ role: 'user', content: prompt }]\n\n try {\n const response = await callJudge(client, model, messages, useTemperature)\n return parseJudgeResponse(response, model)\n } catch (err) {\n // Auto-fallback: if temperature is rejected, retry without it\n if (useTemperature && isTemperatureError(err)) {\n useTemperature = false\n try {\n const response = await callJudge(client, model, messages, false)\n return parseJudgeResponse(response, model)\n } catch (retryErr) {\n return {\n name: 'llm-judge-correctness',\n value: -1,\n details: { reason: `judge call failed: ${retryErr instanceof Error ? retryErr.message : String(retryErr)}` },\n }\n }\n }\n return {\n name: 'llm-judge-correctness',\n value: -1,\n details: { reason: `judge call failed: ${err instanceof Error ? err.message : String(err)}` },\n }\n }\n }\n}\n\nasync function callJudge(\n client: OpenAI,\n model: string,\n messages: OpenAI.ChatCompletionMessageParam[],\n withTemperature: boolean,\n): Promise<OpenAI.ChatCompletion> {\n return client.chat.completions.create({\n model,\n messages,\n max_completion_tokens: 2048,\n ...(withTemperature ? { temperature: 0 } : {}),\n })\n}\n\nfunction parseJudgeResponse(\n response: OpenAI.ChatCompletion,\n model: string,\n): { name: string; value: number; details: Record<string, unknown> } {\n const content = response.choices[0]?.message?.content?.trim() ?? ''\n const parsed: Record<string, number> = {}\n for (const line of content.split('\\n')) {\n const match = line.match(/^(accuracy|completeness|conciseness)\\s*:\\s*([\\d.]+)/i)\n if (match) parsed[match[1].toLowerCase()] = parseFloat(match[2])\n }\n\n const accuracy = parsed.accuracy\n const completeness = parsed.completeness\n const conciseness = parsed.conciseness\n\n if (accuracy == null || completeness == null || conciseness == null ||\n [accuracy, completeness, conciseness].some((s) => isNaN(s) || s < 0 || s > 1)) {\n return {\n name: 'llm-judge-correctness',\n value: -1,\n details: { reason: `judge returned unparseable scores: \"${content}\"`, model },\n }\n }\n\n const composite = Math.round(((accuracy + completeness + conciseness) / 3) * 100) / 100\n\n return {\n name: 'llm-judge-correctness',\n value: composite,\n details: { model, accuracy, completeness, conciseness },\n }\n}\n","import OpenAI, { AzureOpenAI } from 'openai'\nimport { zodToJsonSchema } from 'zod-to-json-schema'\nimport { registerPricing } from '../pricing/lookup.js'\nimport type { ToolDefinition } from '../tasks/types.js'\nimport type { ArenaProvider, TaskInput, TaskResult, ToolCall } from './types.js'\nimport { buildSchemaSystemMessage, parseSchemaOutput } from './shared.js'\n\n/** Default per-request timeout in ms (60 s). Prevents hanging on unresponsive APIs. */\nexport const REQUEST_TIMEOUT_MS = 60_000\n\nexport interface OpenAIProviderOptions {\n apiKey?: string\n baseURL?: string\n timeoutMs?: number\n}\n\nexport interface AzureOpenAIProviderOptions {\n apiKey?: string\n endpoint?: string\n apiVersion?: string\n deployment?: string\n timeoutMs?: number\n}\n\nexport function openai(model: string, options?: OpenAIProviderOptions): ArenaProvider {\n const client = new OpenAI({\n apiKey: options?.apiKey ?? process.env.OPENAI_API_KEY,\n baseURL: options?.baseURL,\n timeout: options?.timeoutMs ?? REQUEST_TIMEOUT_MS,\n })\n\n return makeProvider(`openai/${model}`, 'OpenAI', model, client, model)\n}\n\nexport interface OpenAICompatibleOptions {\n id: string\n name: string\n model: string\n baseURL: string\n apiKey?: string\n apiKeyEnv?: string\n /** Strip `<think>...</think>` blocks from reasoning models (e.g. DeepSeek-R1, MiniMax M2.5) */\n stripThinking?: boolean\n /** Mark this provider as free (e.g. local Ollama models) so it registers zero-cost pricing */\n free?: boolean\n timeoutMs?: number\n}\n\nexport function openaiCompatible(options: OpenAICompatibleOptions): ArenaProvider {\n const apiKey = options.apiKey\n ?? (options.apiKeyEnv ? process.env[options.apiKeyEnv] : undefined)\n ?? 'no-key'\n\n const client = new OpenAI({\n apiKey,\n baseURL: options.baseURL,\n timeout: options.timeoutMs ?? REQUEST_TIMEOUT_MS,\n })\n\n if (options.free) {\n registerPricing(options.id, { inputPerToken: 0, outputPerToken: 0 })\n }\n\n return makeProvider(options.id, options.name, options.model, client, options.model, options.stripThinking)\n}\n\n/**\n * Create an Azure OpenAI provider.\n *\n * @param model - The model or deployment name (e.g. \"gpt-4o\", \"gpt-5-mini\").\n * Used as the deployment name unless `options.deployment` overrides it.\n */\nexport function azureOpenai(model: string, options?: AzureOpenAIProviderOptions): ArenaProvider {\n const deployment = options?.deployment ?? model\n\n const client = new AzureOpenAI({\n apiKey: options?.apiKey ?? process.env.AZURE_OPENAI_API_KEY,\n endpoint: options?.endpoint ?? process.env.AZURE_OPENAI_ENDPOINT,\n apiVersion: options?.apiVersion ?? process.env.AZURE_OPENAI_API_VERSION ?? '2024-12-01-preview',\n deployment,\n timeout: options?.timeoutMs ?? REQUEST_TIMEOUT_MS,\n })\n\n return makeProvider(`azure/${model}`, 'Azure OpenAI', model, client, deployment)\n}\n\nexport function makeProvider(\n id: string,\n name: string,\n model: string,\n client: OpenAI | AzureOpenAI,\n requestModel: string,\n stripThinking?: boolean,\n): ArenaProvider {\n return {\n id,\n name,\n model,\n\n async run(input: TaskInput): Promise<TaskResult> {\n const start = Date.now()\n\n const params: OpenAI.ChatCompletionCreateParams = {\n model: requestModel,\n messages: [{ role: 'user', content: input.prompt }],\n }\n\n // If a Zod schema is provided, use structured output via response_format\n if (input.schema) {\n params.response_format = { type: 'json_object' }\n params.messages = [\n { role: 'system', content: buildSchemaSystemMessage(input.schema) },\n ...params.messages,\n ]\n }\n\n // If tools are provided, convert to OpenAI tool format\n if (input.tools?.length) {\n params.tools = input.tools.map(toolDefToOpenAI)\n params.tool_choice = 'auto'\n }\n\n const reqOpts: { signal?: AbortSignal; timeout?: number } = { signal: input.signal }\n if (input.timeout) reqOpts.timeout = input.timeout\n const response = await client.chat.completions.create(params, reqOpts)\n let totalPromptTokens = response.usage?.prompt_tokens ?? 0\n let totalCompletionTokens = response.usage?.completion_tokens ?? 0\n\n const choice = response.choices[0]\n const toolCallsRaw = choice?.message?.tool_calls\n const collectedToolCalls: ToolCall[] = []\n let finalResponse = response\n\n // If the model made tool calls, execute handlers and send results back\n if (toolCallsRaw?.length && input.tools?.length) {\n const toolMessages: OpenAI.ChatCompletionMessageParam[] = [\n ...params.messages,\n choice!.message,\n ]\n\n for (const tc of toolCallsRaw) {\n const toolDef = input.tools.find((t) => t.name === tc.function.name)\n let args: unknown\n try {\n args = JSON.parse(tc.function.arguments)\n } catch {\n args = tc.function.arguments\n }\n\n let result: unknown\n if (toolDef?.handler) {\n result = await toolDef.handler(args)\n }\n\n collectedToolCalls.push({ name: tc.function.name, arguments: args, result })\n\n toolMessages.push({\n role: 'tool' as const,\n tool_call_id: tc.id,\n content: JSON.stringify(result ?? {}),\n })\n }\n\n // Follow-up call with tool results\n const followUp = await client.chat.completions.create({\n model: requestModel,\n messages: toolMessages,\n }, reqOpts)\n\n totalPromptTokens += followUp.usage?.prompt_tokens ?? 0\n totalCompletionTokens += followUp.usage?.completion_tokens ?? 0\n finalResponse = followUp\n }\n\n const latencyMs = Date.now() - start\n const finalChoice = finalResponse.choices[0]\n let rawContent = finalChoice?.message?.content ?? ''\n\n if (stripThinking) {\n rawContent = rawContent.replace(/<think>[\\s\\S]*?<\\/think>\\s*/, '')\n }\n\n const output = parseSchemaOutput(rawContent, !!input.schema)\n\n return {\n output,\n usage: {\n promptTokens: totalPromptTokens || undefined,\n completionTokens: totalCompletionTokens || undefined,\n },\n latencyMs,\n raw: finalResponse,\n toolCalls: collectedToolCalls.length > 0 ? collectedToolCalls : undefined,\n }\n },\n }\n}\n\n// ── Gemini (OpenAI-compatible) ──────────────────────────────────────\n\nexport interface GeminiProviderOptions {\n apiKey?: string\n timeoutMs?: number\n}\n\nexport function gemini(model: string, options?: GeminiProviderOptions): ArenaProvider {\n const apiKey = options?.apiKey ?? process.env.GOOGLE_API_KEY\n\n if (!apiKey) {\n throw new Error(\n `Missing API key for google/${model}. Set GOOGLE_API_KEY or pass apiKey option.`,\n )\n }\n\n const client = new OpenAI({\n apiKey,\n baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/',\n timeout: options?.timeoutMs ?? REQUEST_TIMEOUT_MS,\n })\n\n return makeProvider(`google/${model}`, 'Google AI', model, client, model)\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────\n\nfunction toolDefToOpenAI(tool: ToolDefinition): OpenAI.ChatCompletionTool {\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: zodToJsonSchema(tool.parameters, { target: 'openAi' }) as Record<string, unknown>,\n },\n }\n}\n","import type { ZodSchema } from 'zod'\nimport { zodToJsonSchema } from 'zod-to-json-schema'\n\n/** Build a system message that includes the actual JSON schema when available. */\nexport function buildSchemaSystemMessage(schema?: ZodSchema): string {\n if (!schema) return 'Respond with valid JSON.'\n const jsonSchema = zodToJsonSchema(schema, { target: 'openAi' })\n return [\n 'Respond with ONLY valid JSON data. No markdown, no code fences, no explanation.',\n '',\n 'Your output must conform to this JSON Schema:',\n JSON.stringify(jsonSchema, null, 2),\n '',\n 'IMPORTANT: Output the actual data values, NOT the schema definition itself.',\n 'Do NOT include keys like \"type\", \"$schema\", or \"items\" from the schema definition in your response.',\n ].join('\\n')\n}\n\n/** Try to parse raw content as JSON when a schema is expected, falling back to the raw string. */\nexport function parseSchemaOutput(rawContent: string, hasSchema: boolean): string | Record<string, unknown> | unknown[] {\n if (!hasSchema) return rawContent\n const cleaned = stripCodeFences(rawContent)\n try {\n return JSON.parse(cleaned) as Record<string, unknown> | unknown[]\n } catch {\n return rawContent\n }\n}\n\n/** Strip markdown code fences (```json ... ```) that some models wrap around JSON output. */\nfunction stripCodeFences(content: string): string {\n const match = content.match(/^```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?\\s*```$/m)\n return match ? match[1]! : content\n}\n","import type { ScorerFn } from './types.js'\nimport { deepEqual } from '../utils/deep-equal.js'\n\n/**\n * Tool-usage scorer — evaluates tool calling accuracy.\n *\n * When task.expected is an object and tools are configured, checks both\n * tool selection and argument correctness:\n * 1.0 — correct tool called with matching arguments\n * 0.5 — correct tool called but arguments don't match\n * 0.0 — wrong tool or no tool called\n *\n * When task.expected is a string (or undefined), only checks if the\n * first configured tool was invoked (1 or 0). Returns -1 (N/A) when\n * no tools are configured on the task.\n */\nexport const toolUsageScorer: ScorerFn = ({ task, result }) => {\n if (!task.tools?.length) {\n return { name: 'tool-usage', value: -1, details: { reason: 'no tools configured on task' } }\n }\n\n const calls = result.toolCalls ?? []\n const expectedIsObject = task.expected !== undefined &&\n typeof task.expected === 'object' && task.expected !== null &&\n !Array.isArray(task.expected)\n\n // Object expected → check tool selection + argument correctness\n if (expectedIsObject) {\n const matchingCall = calls.find((c) => {\n const toolDef = task.tools!.find(t => t.name === c.name)\n if (!toolDef) return false\n return deepEqual(task.expected!, c.arguments)\n })\n\n if (matchingCall) {\n return {\n name: 'tool-usage',\n value: 1,\n details: { matchedTool: matchingCall.name, arguments: matchingCall.arguments, toolCalls: calls },\n }\n }\n\n // Partial credit: a tool was called whose arguments share keys with expected\n // (indicates the right tool was selected but with wrong values)\n const expectedKeys = Object.keys(task.expected as Record<string, unknown>)\n const partialMatch = calls.find((c) => {\n if (typeof c.arguments !== 'object' || c.arguments === null) return false\n const argKeys = Object.keys(c.arguments as Record<string, unknown>)\n return expectedKeys.some(k => argKeys.includes(k))\n })\n\n if (partialMatch) {\n return {\n name: 'tool-usage',\n value: 0.5,\n details: {\n reason: 'correct tool but wrong arguments',\n expected: task.expected,\n actual: partialMatch.arguments,\n toolCalls: calls,\n },\n }\n }\n\n return {\n name: 'tool-usage',\n value: 0,\n details: { reason: 'no matching tool call', expected: task.expected, toolCalls: calls },\n }\n }\n\n // String/undefined expected → simple tool name check (legacy behavior)\n const expectedToolName = task.tools[0]!.name\n const usedTool = calls.some((c) => c.name === expectedToolName)\n\n return {\n name: 'tool-usage',\n value: usedTool ? 1 : 0,\n details: { expectedToolName, usedTool, toolCalls: calls },\n }\n}\n","import type { BuiltInScorerName, ScorerFn } from './types.js'\nimport { latencyScorer } from './latency.js'\nimport { costScorer } from './cost.js'\nimport { correctnessScorer } from './correctness.js'\nimport { schemaCorrectnessScorer } from './schema-correctness.js'\nimport { fuzzySimilarityScorer } from './fuzzy-similarity.js'\nimport { createLlmJudgeScorer } from './llm-judge.js'\nimport { toolUsageScorer } from './tool-usage.js'\n\nconst staticScorers: Partial<Record<BuiltInScorerName, ScorerFn>> = {\n latency: latencyScorer,\n cost: costScorer,\n correctness: correctnessScorer,\n 'schema-correctness': schemaCorrectnessScorer,\n 'fuzzy-similarity': fuzzySimilarityScorer,\n 'tool-usage': toolUsageScorer,\n}\n\nexport function resolveScorers(names: BuiltInScorerName[], judgeModel?: string, timeoutMs?: number): ScorerFn[] {\n return names.map((name) => {\n if (name === 'llm-judge-correctness') {\n return createLlmJudgeScorer(judgeModel, timeoutMs)\n }\n const scorer = staticScorers[name]\n if (!scorer) {\n throw new Error(`Unknown scorer: \"${name}\"`)\n }\n return scorer\n })\n}\n\nexport type { BuiltInScorerName, ScorerFn, ScoreResult, ScorerContext } from './types.js'\n","import type { ArenaProvider, ToolCall } from './providers/types.js'\nimport type { ArenaTask } from './tasks/types.js'\nimport type { ScoreResult, ScorerFn } from './scorers/types.js'\n\nexport interface BenchmarkResult {\n providerId: string\n taskName: string\n run: number\n scores: ScoreResult[]\n error?: string\n raw: {\n output: string | Record<string, unknown> | unknown[]\n latencyMs: number\n usage?: { promptTokens?: number; completionTokens?: number }\n toolCalls?: ToolCall[]\n }\n}\n\nconst DEFAULT_TIMEOUT_MS = 60_000\n\nexport interface RunOptions {\n providers: ArenaProvider[]\n tasks: ArenaTask[]\n scorers: ScorerFn[]\n runs: number\n timeout?: number\n onResult?: (result: BenchmarkResult) => void\n}\n\nfunction withTimeout<T>(run: (signal: AbortSignal) => Promise<T>, ms: number): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const controller = new AbortController()\n const timer = setTimeout(() => {\n controller.abort()\n reject(new Error(`Request timed out after ${ms}ms`))\n }, ms)\n run(controller.signal).then(\n (v) => { clearTimeout(timer); resolve(v) },\n (e) => { clearTimeout(timer); reject(e) },\n )\n })\n}\n\nexport async function runBenchmarks(options: RunOptions): Promise<BenchmarkResult[]> {\n const { providers, tasks, scorers, runs, onResult } = options\n const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS\n\n const results: BenchmarkResult[] = []\n\n // Tasks run sequentially so every provider faces the same conditions per task.\n // Providers within each task run in parallel — fair head-to-head comparison\n // without queue-induced timeout penalties from full parallelism.\n for (const task of tasks) {\n for (let run = 1; run <= runs; run++) {\n const runResults = await Promise.all(\n providers.map(async (provider) => {\n let result: BenchmarkResult\n\n try {\n const taskResult = await withTimeout((signal) => provider.run({\n prompt: task.prompt,\n schema: task.schema,\n tools: task.tools,\n signal,\n timeout,\n }), timeout)\n\n const scores = await Promise.all(\n scorers.map((scorer) => scorer({ task, result: taskResult }, provider.id))\n )\n\n result = {\n providerId: provider.id,\n taskName: task.name,\n run,\n scores,\n raw: {\n output: taskResult.output,\n latencyMs: taskResult.latencyMs,\n usage: taskResult.usage,\n toolCalls: taskResult.toolCalls,\n },\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n\n result = {\n providerId: provider.id,\n taskName: task.name,\n run,\n scores: [],\n error: message,\n raw: { output: '', latencyMs: 0 },\n }\n }\n\n onResult?.(result)\n return result\n })\n )\n\n results.push(...runResults)\n }\n }\n\n return results\n}\n","/** Format a USD cost with adaptive precision (always 2+ significant figures). */\nconst MAX_FRACTION_DIGITS = 100\nexport function formatCost(usd: number | undefined): string {\n if (usd === undefined) return '—'\n if (usd === 0) return '$0.00'\n if (usd >= 0.01) return `~$${usd.toFixed(2)}`\n const digits = Math.min(\n MAX_FRACTION_DIGITS,\n Math.max(4, -Math.floor(Math.log10(Math.abs(usd))) + 1),\n )\n return `~$${usd.toFixed(digits).replace(/0+$/, '')}`\n}\n\n/** Format a numeric delta with explicit sign. */\nexport function formatDelta(delta: number, precision: number = 4): string {\n const sign = delta >= 0 ? '+' : ''\n return `${sign}${delta.toFixed(precision)}`\n}\n","import type { BenchmarkResult } from '../runner.js'\n\n// ── Shared types ────────────────────────────────────────────────────\n\nexport interface AggregatedDetails {\n costUsd: number | undefined\n totalTokens: number | undefined\n}\n\nexport interface ProviderTaskData {\n providerId: string\n avgScores: Record<string, number>\n avgDetails: AggregatedDetails\n latencyMs: number | undefined\n allErrors: boolean\n errorCount: number\n}\n\nexport interface ColumnStats {\n values: Map<string, number | undefined>\n best: number | undefined\n worst: number | undefined\n}\n\nexport type Medal = 'gold' | 'silver' | 'bronze' | 'none'\n\nexport interface GroupedResults {\n tasks: string[]\n providers: string[]\n scorerNames: string[]\n grouped: Map<string, BenchmarkResult[]>\n byProvider: Map<string, BenchmarkResult[]>\n hasErrors: boolean\n maxRun: number\n}\n\n// ── Grouping ────────────────────────────────────────────────────────\n\nexport function groupResults(results: BenchmarkResult[]): GroupedResults {\n const taskSet = new Set<string>()\n const providerSet = new Set<string>()\n const scorerSet = new Set<string>()\n const grouped = new Map<string, BenchmarkResult[]>()\n const byProvider = new Map<string, BenchmarkResult[]>()\n let hasErrors = false\n let maxRun = 0\n\n for (const r of results) {\n taskSet.add(r.taskName)\n providerSet.add(r.providerId)\n for (const s of r.scores) scorerSet.add(s.name)\n if (r.error) hasErrors = true\n if (r.run > maxRun) maxRun = r.run\n\n const key = `${r.taskName}::${r.providerId}`\n let group = grouped.get(key)\n if (!group) { group = []; grouped.set(key, group) }\n group.push(r)\n\n let provGroup = byProvider.get(r.providerId)\n if (!provGroup) { provGroup = []; byProvider.set(r.providerId, provGroup) }\n provGroup.push(r)\n }\n\n return {\n tasks: [...taskSet],\n providers: [...providerSet],\n scorerNames: [...scorerSet],\n grouped,\n byProvider,\n hasErrors,\n maxRun,\n }\n}\n\n// ── Aggregation ─────────────────────────────────────────────────────\n\nexport function aggregateProviderTask(\n providerId: string,\n grouped: Map<string, BenchmarkResult[]>,\n task: string\n): ProviderTaskData {\n const taskResults = grouped.get(`${task}::${providerId}`) ?? []\n const errorResults = taskResults.filter(r => r.error)\n const successResults = taskResults.filter(r => !r.error)\n\n if (successResults.length === 0) {\n return {\n providerId,\n avgScores: {},\n avgDetails: { costUsd: undefined, totalTokens: undefined },\n latencyMs: undefined,\n allErrors: errorResults.length > 0,\n errorCount: errorResults.length,\n }\n }\n\n return {\n providerId,\n avgScores: averageScores(successResults),\n avgDetails: averageDetails(successResults),\n latencyMs: average(successResults.map(r => r.raw.latencyMs)),\n allErrors: false,\n errorCount: errorResults.length,\n }\n}\n\nexport function averageScores(results: BenchmarkResult[]): Record<string, number> {\n const sums: Record<string, number> = {}\n const counts: Record<string, number> = {}\n\n for (const result of results) {\n for (const score of result.scores) {\n if (score.value < 0) continue\n sums[score.name] = (sums[score.name] ?? 0) + score.value\n counts[score.name] = (counts[score.name] ?? 0) + 1\n }\n }\n\n const avgs: Record<string, number> = {}\n for (const name of Object.keys(sums)) {\n avgs[name] = sums[name]! / counts[name]!\n }\n return avgs\n}\n\nexport function averageDetails(results: BenchmarkResult[]): AggregatedDetails {\n let costSum = 0\n let costCount = 0\n let tokenSum = 0\n let tokenCount = 0\n\n for (const result of results) {\n const costScore = result.scores.find((s) => s.name === 'cost')\n const details = costScore?.details as {\n estimatedUsd?: number | null\n totalTokens?: number\n } | undefined\n\n if (details?.estimatedUsd != null) {\n costSum += details.estimatedUsd\n costCount++\n }\n if (details?.totalTokens != null) {\n tokenSum += details.totalTokens\n tokenCount++\n }\n }\n\n return {\n costUsd: costCount > 0 ? costSum / costCount : undefined,\n totalTokens: tokenCount > 0 ? Math.round(tokenSum / tokenCount) : undefined,\n }\n}\n\nexport function average(nums: number[]): number | undefined {\n if (nums.length === 0) return undefined\n return nums.reduce((a, b) => a + b, 0) / nums.length\n}\n\n// ── Column statistics & medals ──────────────────────────────────────\n\nexport function computeColumnStats(\n providerData: ProviderTaskData[],\n scorerNames: string[]\n): Map<string, ColumnStats> {\n const stats = new Map<string, ColumnStats>()\n const valid = providerData.filter(p => !p.allErrors)\n\n if (scorerNames.includes('latency')) {\n const values = new Map<string, number | undefined>()\n for (const p of providerData) {\n values.set(p.providerId, p.allErrors ? undefined : p.latencyMs)\n }\n const nums = valid.map(p => p.latencyMs).filter((v): v is number => v !== undefined)\n stats.set('latency', {\n values,\n best: nums.length > 0 ? Math.min(...nums) : undefined,\n worst: nums.length > 0 ? Math.max(...nums) : undefined,\n })\n }\n\n if (scorerNames.includes('cost')) {\n const costValues = new Map<string, number | undefined>()\n const tokenValues = new Map<string, number | undefined>()\n for (const p of providerData) {\n costValues.set(p.providerId, p.allErrors ? undefined : p.avgDetails.costUsd)\n tokenValues.set(p.providerId, p.allErrors ? undefined : p.avgDetails.totalTokens)\n }\n const costNums = valid.map(p => p.avgDetails.costUsd).filter((v): v is number => v !== undefined)\n const tokenNums = valid.map(p => p.avgDetails.totalTokens).filter((v): v is number => v !== undefined)\n stats.set('cost', {\n values: costValues,\n best: costNums.length > 0 ? Math.min(...costNums) : undefined,\n worst: costNums.length > 0 ? Math.max(...costNums) : undefined,\n })\n stats.set('tokens', {\n values: tokenValues,\n best: tokenNums.length > 0 ? Math.min(...tokenNums) : undefined,\n worst: tokenNums.length > 0 ? Math.max(...tokenNums) : undefined,\n })\n }\n\n for (const name of scorerNames) {\n if (name === 'latency' || name === 'cost') continue\n const values = new Map<string, number | undefined>()\n for (const p of providerData) {\n values.set(p.providerId, p.allErrors ? undefined : p.avgScores[name])\n }\n const nums = valid.map(p => p.avgScores[name]).filter((v): v is number => v !== undefined)\n stats.set(name, {\n values,\n best: nums.length > 0 ? Math.max(...nums) : undefined,\n worst: nums.length > 0 ? Math.min(...nums) : undefined,\n })\n }\n\n return stats\n}\n\n/** Scorers that measure output quality (vs efficiency metrics like latency/cost). */\nconst QUALITY_SCORERS = new Set([\n 'correctness', 'schema-correctness', 'fuzzy-similarity', 'llm-judge-correctness', 'tool-usage',\n])\n\n/**\n * Check whether a provider passes the quality gate: it must score > 0\n * on at least one quality scorer. If no quality scorers are present,\n * all providers pass.\n */\nexport function passesQualityGate(\n providerId: string,\n columnStats: Map<string, ColumnStats>\n): boolean {\n const qualityColumns = [...columnStats.keys()].filter(k => QUALITY_SCORERS.has(k))\n if (qualityColumns.length === 0) return true\n return qualityColumns.some(col => {\n const val = columnStats.get(col)?.values.get(providerId)\n return val !== undefined && val > 0\n })\n}\n\nexport function computeMedals(\n columnStats: Map<string, ColumnStats>,\n providerIds: string[]\n): Map<string, Medal> {\n const medals = new Map<string, Medal>()\n\n if (providerIds.length < 2) {\n for (const id of providerIds) medals.set(id, 'none')\n return medals\n }\n\n // Quality gate: providers that score 0 on ALL quality scorers are ineligible\n const eligible = new Set(providerIds.filter(id => passesQualityGate(id, columnStats)))\n\n // Count quality wins and efficiency wins separately\n const qualityWins = new Map<string, number>()\n const efficiencyWins = new Map<string, number>()\n for (const id of providerIds) {\n qualityWins.set(id, 0)\n efficiencyWins.set(id, 0)\n }\n\n for (const [colName, colStats] of columnStats) {\n if (colStats.best === undefined) continue\n const bestProviders = [...colStats.values.entries()]\n .filter(([, v]) => v !== undefined && v === colStats.best)\n if (bestProviders.length === 1) {\n const winnerId = bestProviders[0]![0]\n if (QUALITY_SCORERS.has(colName)) {\n qualityWins.set(winnerId, (qualityWins.get(winnerId) ?? 0) + 1)\n } else {\n efficiencyWins.set(winnerId, (efficiencyWins.get(winnerId) ?? 0) + 1)\n }\n }\n }\n\n const totalWins = [...qualityWins.values()].reduce((a, b) => a + b, 0)\n + [...efficiencyWins.values()].reduce((a, b) => a + b, 0)\n if (totalWins === 0) {\n for (const id of providerIds) medals.set(id, 'none')\n return medals\n }\n\n // Rank only eligible providers; ineligible ones always get 'none'\n const eligibleSorted = providerIds\n .filter(id => eligible.has(id))\n .sort((a, b) => {\n const qDiff = (qualityWins.get(b) ?? 0) - (qualityWins.get(a) ?? 0)\n if (qDiff !== 0) return qDiff\n const eDiff = (efficiencyWins.get(b) ?? 0) - (efficiencyWins.get(a) ?? 0)\n if (eDiff !== 0) return eDiff\n return a.localeCompare(b)\n })\n\n const medalList: Medal[] = ['gold', 'silver', 'bronze']\n let rank = 0\n for (let i = 0; i < eligibleSorted.length; i++) {\n if (i > 0) {\n const prevQ = qualityWins.get(eligibleSorted[i - 1]!) ?? 0\n const currQ = qualityWins.get(eligibleSorted[i]!) ?? 0\n if (currQ < prevQ) {\n rank = i\n } else if (currQ === prevQ) {\n const prevE = efficiencyWins.get(eligibleSorted[i - 1]!) ?? 0\n const currE = efficiencyWins.get(eligibleSorted[i]!) ?? 0\n if (currE < prevE) rank = i\n }\n }\n medals.set(eligibleSorted[i]!, rank < medalList.length ? medalList[rank]! : 'none')\n }\n for (const id of providerIds) {\n if (!eligible.has(id)) medals.set(id, 'none')\n }\n\n return medals\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────\n\nexport function providerLabel(providerId: string): string {\n const prefix = providerId.split('/')[0]\n switch (prefix) {\n case 'azure': return '(OpenAI via Azure)'\n case 'openai': return '(OpenAI)'\n case 'anthropic': return '(Anthropic)'\n case 'google': return '(Google)'\n case 'mistral': return '(Mistral)'\n case 'meta': return '(Meta)'\n case 'deepseek': return '(DeepSeek)'\n case 'cohere': return '(Cohere)'\n case 'qwen': return '(Qwen)'\n case 'xai': return '(xAI)'\n case 'minimax': return '(MiniMax)'\n case 'moonshot': return '(Moonshot / Kimi)'\n case 'perplexity': return '(Perplexity)'\n case 'amazon': return '(Amazon)'\n case 'nvidia': return '(NVIDIA)'\n case 'microsoft': return '(Microsoft)'\n case 'ai21': return '(AI21 Labs)'\n case 'bytedance': return '(ByteDance)'\n case 'together': return '(Together AI)'\n case 'fireworks': return '(Fireworks AI)'\n case 'groq': return '(Groq)'\n case 'cerebras': return '(Cerebras)'\n default: return `(${prefix})`\n }\n}\n\nexport function apiKeyHint(providerId: string, error: string): string | undefined {\n const lower = error.toLowerCase()\n const isAuthError = lower.includes('api key') || lower.includes('401') ||\n lower.includes('unauthorized') || lower.includes('authentication') ||\n lower.includes('incorrect api key') || lower.includes('apikey')\n\n if (!isAuthError) return undefined\n\n const prefix = providerId.split('/')[0]\n switch (prefix) {\n case 'openai': return 'Set: export OPENAI_API_KEY=sk-...'\n case 'azure': return 'Set: export AZURE_OPENAI_API_KEY=... and AZURE_OPENAI_ENDPOINT=...'\n case 'anthropic': return 'Set: export ANTHROPIC_API_KEY=sk-ant-...'\n case 'google': return 'Set: export GOOGLE_API_KEY=...'\n default: return `Check the API key for ${providerId}`\n }\n}\n\nexport function rankProviders(\n successByProvider: Map<string, BenchmarkResult[]>,\n providers: string[],\n scorerName: string\n): { id: string; avg: number } | undefined {\n const ranked = providers\n .map((id) => {\n const runs = successByProvider.get(id) ?? []\n const scores = runs\n .flatMap((r) => r.scores.filter((s) => s.name === scorerName && s.value >= 0))\n .map((s) => s.value)\n const avg = scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : undefined\n return { id, avg }\n })\n .filter((p) => p.avg !== undefined)\n .sort((a, b) => b.avg! - a.avg!)\n\n return ranked[0] ? { id: ranked[0].id, avg: ranked[0].avg! } : undefined\n}\n\nexport function scorerLabel(name: string): string {\n switch (name) {\n case 'correctness': return 'Match'\n case 'schema-correctness': return 'Schema'\n case 'fuzzy-similarity': return 'Fuzzy'\n case 'llm-judge-correctness': return 'Judge'\n case 'tool-usage': return 'Tool'\n default: return name\n }\n}\n\n/** Medal emoji for display */\nexport function medalEmoji(medal: Medal): string {\n switch (medal) {\n case 'gold': return '🥇'\n case 'silver': return '🥈'\n case 'bronze': return '🥉'\n case 'none': return ''\n }\n}\n","import type { BenchmarkResult } from '../runner.js'\nimport { formatCost } from '../utils/format.js'\nimport {\n type ProviderTaskData,\n type ColumnStats,\n groupResults,\n aggregateProviderTask,\n average,\n computeColumnStats,\n computeMedals,\n providerLabel,\n apiKeyHint,\n rankProviders,\n medalEmoji,\n scorerLabel,\n} from './shared.js'\n\n// ── ANSI color palette ──────────────────────────────────────────────────────\n\nconst reset = '\\x1b[0m'\nconst boldCode = '\\x1b[1m'\nconst dimCode = '\\x1b[2m'\nconst green = '\\x1b[32m'\nconst red = '\\x1b[31m'\nconst yellow = '\\x1b[33m'\nconst cyan = '\\x1b[36m'\nconst brightGreen = '\\x1b[92m'\nconst brightWhite = '\\x1b[97m'\n\nfunction bold(s: string) { return `${boldCode}${s}${reset}` }\nfunction dim(s: string) { return `${dimCode}${s}${reset}` }\n\n// ── String utilities ────────────────────────────────────────────────────────\n\nfunction stripAnsi(s: string): string {\n return s.replace(/\\x1b\\[[0-9;]*m/g, '')\n}\n\n/** Display width accounting for wide emoji (medals, trophy = 2 columns) */\nfunction displayWidth(s: string): number {\n const stripped = stripAnsi(s)\n let width = 0\n for (const ch of stripped) {\n const code = ch.codePointAt(0) ?? 0\n if (code >= 0x1F000) width += 2\n else if (code >= 0x2600 && code <= 0x27BF) width += 2\n else width += 1\n }\n return width\n}\n\n/** Pad string to target display width, accounting for ANSI codes and wide chars */\nfunction padCell(str: string, targetWidth: number, align: 'left' | 'right'): string {\n const dw = displayWidth(str)\n const padding = Math.max(0, targetWidth - dw)\n if (align === 'right') return ' '.repeat(padding) + str\n return str + ' '.repeat(padding)\n}\n\n// ── Sparkline bar ───────────────────────────────────────────────────────────\n\ninterface SparkBarParts { fill: string; track: string }\n\nfunction sparkBar(ratio: number, width: number = 8): SparkBarParts {\n const clamped = Math.max(0, Math.min(1, ratio))\n const fillLen = Math.round(clamped * width)\n const fill = '▓'.repeat(fillLen)\n const track = '░'.repeat(width - fillLen)\n return { fill, track }\n}\n\n// ── Box-drawing ─────────────────────────────────────────────────────────────\n\ntype LinePosition = 'top' | 'header' | 'bottom' | 'merge'\n\nfunction drawTableLine(widths: number[], position: LinePosition): string {\n const totalInner = widths.reduce((sum, w) => sum + w + 2, 0) + widths.length - 1\n\n if (position === 'bottom') {\n return dim(`└${'─'.repeat(totalInner)}┘`)\n }\n if (position === 'merge') {\n return dim(`├${'─'.repeat(totalInner)}┤`)\n }\n\n const segments = widths.map(w => '─'.repeat(w + 2))\n if (position === 'top') {\n return dim(`┌${segments.join('┬')}┐`)\n }\n // header separator\n return dim(`├${segments.join('┼')}┤`)\n}\n\nfunction drawTableRow(\n cells: string[],\n widths: number[],\n aligns: ('left' | 'right')[]\n): string {\n const parts = cells.map((cell, i) =>\n ' ' + padCell(cell, widths[i]!, aligns[i]!) + ' '\n )\n return dim('│') + parts.join(dim('│')) + dim('│')\n}\n\n/** Single-cell row spanning the full table width */\nfunction drawSpanRow(content: string, widths: number[]): string {\n const totalInner = widths.reduce((sum, w) => sum + w + 2, 0) + widths.length - 1\n const dw = displayWidth(content)\n const padding = Math.max(0, totalInner - dw - 1)\n return dim('│') + ' ' + content + ' '.repeat(padding) + dim('│')\n}\n\n// ── Column layout ───────────────────────────────────────────────────────────\n\ninterface TableCol {\n label: string\n width: number\n align: 'left' | 'right'\n statsKey?: string\n}\n\nfunction colorByRank(\n text: string,\n value: number | undefined,\n colStats: ColumnStats,\n providerCount: number\n): string {\n if (value === undefined) return dim('—')\n if (providerCount < 2) return text\n if (colStats.best === undefined || colStats.worst === undefined) return text\n if (colStats.best === colStats.worst) return text\n\n if (value === colStats.best) return `${brightGreen}${boldCode}${text}${reset}`\n if (value === colStats.worst) return `${red}${text}${reset}`\n return `${yellow}${text}${reset}`\n}\n\n\n// ── Main reporter ───────────────────────────────────────────────────────────\n\nexport interface ConsoleReporterOptions {\n sparklines?: boolean\n}\n\nexport function consoleReporter(results: BenchmarkResult[], options?: ConsoleReporterOptions): void {\n const showSparklines = options?.sparklines ?? true\n if (results.length === 0) {\n console.log('\\nNo results to display.\\n')\n return\n }\n\n const { tasks, providers, scorerNames, grouped, byProvider, hasErrors, maxRun } = groupResults(results)\n const hasCost = scorerNames.includes('cost')\n const multi = providers.length >= 2\n\n // Title\n const runsPerCell = maxRun\n const runLabel = runsPerCell > 1 ? ` ${dim(`(${runsPerCell} runs each)`)}` : ''\n console.log('')\n console.log(` ${brightWhite}${boldCode}⬡ Agent Duelist${reset}${runLabel}`)\n console.log(` ${dim('━'.repeat(72))}`)\n console.log('')\n\n // Per-task tables\n for (const task of tasks) {\n console.log(` ${bold(`Task: ${task}`)}`)\n console.log('')\n\n // Gather per-provider data for this task (using pre-grouped map)\n const providerData: ProviderTaskData[] = providers.map(providerId =>\n aggregateProviderTask(providerId, grouped, task)\n )\n\n // Compute column stats and medals\n const columnStats = computeColumnStats(providerData, scorerNames)\n const medals = computeMedals(columnStats, providers)\n\n // Build columns — provider width is dynamic, score columns accommodate sparklines\n const maxProviderLen = Math.max(...providers.map(id => id.length))\n const providerWidth = Math.min(35, Math.max(22, maxProviderLen + 5))\n\n const cols: TableCol[] = [\n { label: 'Provider', width: providerWidth, align: 'left' }\n ]\n\n for (const name of scorerNames) {\n if (name === 'latency') {\n cols.push({ label: 'Latency', width: 10, align: 'right', statsKey: 'latency' })\n } else if (name === 'cost') {\n cols.push({ label: 'Cost', width: 12, align: 'right', statsKey: 'cost' })\n cols.push({ label: 'Tokens', width: 9, align: 'right', statsKey: 'tokens' })\n } else {\n cols.push({ label: scorerLabel(name), width: showSparklines ? 15 : 8, align: 'right', statsKey: name })\n }\n }\n\n if (hasErrors) {\n cols.push({ label: 'Status', width: 8, align: 'left' })\n }\n\n const widths = cols.map(c => c.width)\n const aligns = cols.map(c => c.align)\n\n // ┌ top border ┐\n console.log(` ${drawTableLine(widths, 'top')}`)\n\n // │ header row │\n const headerCells = cols.map(c => bold(c.label))\n console.log(` ${drawTableRow(headerCells, widths, aligns)}`)\n\n // ├ header separator ┤\n console.log(` ${drawTableLine(widths, 'header')}`)\n\n // │ data rows │\n for (const pd of providerData) {\n const medal = medalEmoji(medals.get(pd.providerId) ?? 'none')\n const providerCell = medal ? `${medal} ${pd.providerId}` : pd.providerId\n const cells: string[] = [providerCell]\n\n if (pd.allErrors) {\n // All runs failed — dashes everywhere\n for (const col of cols.slice(1)) {\n if (col.label === 'Status') {\n cells.push(`${red}FAIL${reset}`)\n } else {\n cells.push(dim('—'))\n }\n }\n } else {\n for (const col of cols.slice(1)) {\n if (col.label === 'Status') {\n cells.push(\n pd.errorCount > 0\n ? `${yellow}${pd.errorCount} err${reset}`\n : `${green}OK${reset}`\n )\n continue\n }\n\n const statsKey = col.statsKey!\n const colStats = columnStats.get(statsKey)\n\n if (statsKey === 'latency') {\n const ms = pd.latencyMs\n if (ms === undefined) {\n cells.push(dim('—'))\n } else {\n const text = `${Math.round(ms)}ms`\n cells.push(colStats ? colorByRank(text, ms, colStats, providers.length) : text)\n }\n } else if (statsKey === 'cost') {\n const cost = pd.avgDetails.costUsd\n if (cost === undefined) {\n cells.push(dim('—'))\n } else {\n const text = formatCost(cost)\n cells.push(colStats ? colorByRank(text, cost, colStats, providers.length) : text)\n }\n } else if (statsKey === 'tokens') {\n const tokens = pd.avgDetails.totalTokens\n if (tokens === undefined) {\n cells.push(dim('—'))\n } else {\n const text = `${tokens}`\n cells.push(colStats ? colorByRank(text, tokens, colStats, providers.length) : text)\n }\n } else {\n // Score column (0-1 scale) with optional sparkline bar\n const val = pd.avgScores[statsKey]\n if (val === undefined) {\n cells.push(dim('—'))\n } else {\n const pctStr = `${Math.round(val * 100)}%`.padStart(4)\n let coloredPct: string\n if (multi && colStats) {\n coloredPct = colorByRank(pctStr, val, colStats, providers.length)\n } else {\n // Single provider: threshold-based coloring\n if (val >= 0.8) coloredPct = `${green}${pctStr}${reset}`\n else if (val >= 0.5) coloredPct = `${yellow}${pctStr}${reset}`\n else coloredPct = `${red}${pctStr}${reset}`\n }\n if (showSparklines) {\n const { fill, track } = sparkBar(val)\n const barColor = val >= 0.8 ? green : val >= 0.5 ? yellow : red\n cells.push(`${coloredPct} ${barColor}${fill}${reset}${dim(track)}`)\n } else {\n cells.push(coloredPct)\n }\n }\n }\n }\n }\n\n console.log(` ${drawTableRow(cells, widths, aligns)}`)\n }\n\n // Winner row (2+ providers, at least one success)\n if (multi && providerData.some(p => !p.allErrors)) {\n const winnerId = [...medals.entries()].find(([, m]) => m === 'gold')?.[0]\n if (winnerId) {\n console.log(` ${drawTableLine(widths, 'merge')}`)\n const winnerText = `${brightGreen}${boldCode}🏆 Winner: ${winnerId}${reset} ${dim(providerLabel(winnerId))}`\n console.log(` ${drawSpanRow(winnerText, widths)}`)\n }\n }\n\n // └ bottom border ┘\n console.log(` ${drawTableLine(widths, 'bottom')}`)\n console.log('')\n }\n\n // Summary\n printSummary(results, providers, byProvider)\n\n // Errors — deduplicate by provider + error message and add hints\n const errorResults = results.filter((r) => r.error)\n if (errorResults.length > 0) {\n console.log(` ${bold('Errors')}`)\n console.log(` ${dim('━'.repeat(72))}`)\n\n const seen = new Set<string>()\n for (const r of errorResults) {\n const key = `${r.providerId}::${r.error}`\n if (seen.has(key)) continue\n seen.add(key)\n\n const count = errorResults.filter((e) => e.providerId === r.providerId && e.error === r.error).length\n const suffix = count > 1 ? ` (×${count})` : ''\n console.log(` ${red}✖${reset} ${r.providerId}: ${r.error}${suffix}`)\n\n const hint = apiKeyHint(r.providerId, r.error ?? '')\n if (hint) console.log(` ${dim(hint)}`)\n }\n console.log('')\n }\n\n if (hasCost) {\n console.log(dim(` Costs estimated from OpenRouter pricing catalog. Run npx tsx scripts/update-pricing.ts to refresh.`))\n console.log('')\n }\n}\n\n// ── Summary section ─────────────────────────────────────────────────────────\n\nfunction printSummary(results: BenchmarkResult[], providers: string[], byProvider: Map<string, BenchmarkResult[]>) {\n const successResults = results.filter((r) => !r.error)\n if (successResults.length === 0) return\n\n // Pre-compute success results per provider from the grouped map\n const successByProvider = new Map<string, BenchmarkResult[]>()\n for (const id of providers) {\n successByProvider.set(id, (byProvider.get(id) ?? []).filter((r) => !r.error))\n }\n\n console.log(` ${bold('Summary')}`)\n console.log(` ${dim('━'.repeat(72))}`)\n console.log('')\n\n const single = providers.length === 1\n\n // Best correctness (prefer llm-judge, fallback to correctness)\n const correctnessKey = successResults.some((r) => r.scores.some((s) => s.name === 'llm-judge-correctness' && s.value >= 0))\n ? 'llm-judge-correctness'\n : 'correctness'\n\n const byCorrectness = rankProviders(successByProvider, providers, correctnessKey)\n if (byCorrectness) {\n const medal = single ? `${cyan}◆${reset}` : '🥇'\n const pctStr = `${Math.round(byCorrectness.avg * 100)}%`\n if (single) {\n console.log(` ${medal} Avg correctness: ${brightGreen}${boldCode}${pctStr}${reset}`)\n } else {\n console.log(` ${medal} Most correct: ${bold(byCorrectness.id)} ${dim(providerLabel(byCorrectness.id))} ${brightGreen}${boldCode}${pctStr}${reset}`)\n }\n }\n\n // Fastest\n const byLatency = providers\n .map((id) => {\n const runs = successByProvider.get(id) ?? []\n const avg = average(runs.map((r) => r.raw.latencyMs))\n return { id, avg: avg ?? Infinity }\n })\n .sort((a, b) => a.avg - b.avg)[0]\n\n if (byLatency && byLatency.avg !== Infinity) {\n const medal = single ? `${cyan}◆${reset}` : '🥇'\n const msStr = `${Math.round(byLatency.avg)}ms`\n if (single) {\n console.log(` ${medal} Avg latency: ${brightGreen}${boldCode}${msStr}${reset}`)\n } else {\n console.log(` ${medal} Fastest: ${bold(byLatency.id)} ${dim(providerLabel(byLatency.id))} ${brightGreen}${boldCode}${msStr}${reset}`)\n }\n }\n\n // Cheapest\n const byCost = providers\n .map((id) => {\n const runs = successByProvider.get(id) ?? []\n const costs = runs\n .map((r) => {\n const s = r.scores.find((s) => s.name === 'cost')\n return s && s.value >= 0 ? s.value : undefined\n })\n .filter((c): c is number => c !== undefined)\n const avg = costs.length > 0 ? costs.reduce((a, b) => a + b, 0) / costs.length : undefined\n return { id, avg }\n })\n .filter((p) => p.avg !== undefined)\n .sort((a, b) => a.avg! - b.avg!)[0]\n\n if (byCost?.avg !== undefined) {\n const medal = single ? `${cyan}◆${reset}` : '🥇'\n const costStr = formatCost(byCost.avg)\n if (single) {\n console.log(` ${medal} Avg cost: ${brightGreen}${boldCode}${costStr}${reset}`)\n } else {\n console.log(` ${medal} Cheapest: ${bold(byCost.id)} ${dim(providerLabel(byCost.id))} ${brightGreen}${boldCode}${costStr}${reset}`)\n }\n }\n\n // Overall winner (2+ providers) — quality-first\n if (!single && byCorrectness && byCorrectness.avg > 0) {\n console.log('')\n const pct = `${Math.round(byCorrectness.avg * 100)}%`\n console.log(` 🏆 Overall: ${brightGreen}${boldCode}${byCorrectness.id}${reset} ${dim(providerLabel(byCorrectness.id))} ${dim(`(${pct} avg correctness)`)}`)\n }\n\n console.log('')\n}\n\n","import type { BenchmarkResult } from '../runner.js'\n\nexport function jsonReporter(results: BenchmarkResult[]): string {\n return JSON.stringify(\n {\n timestamp: new Date().toISOString(),\n summary: buildSummary(results),\n results,\n },\n null,\n 2\n )\n}\n\nfunction buildSummary(results: BenchmarkResult[]) {\n const tasks = [...new Set(results.map((r) => r.taskName))]\n const providers = [...new Set(results.map((r) => r.providerId))]\n\n return {\n totalBenchmarks: results.length,\n tasks: tasks.length,\n providers: providers.length,\n providerIds: providers,\n taskNames: tasks,\n }\n}\n","import type { ArenaProvider } from './providers/types.js'\nimport type { ArenaTask } from './tasks/types.js'\nimport type { BuiltInScorerName } from './scorers/types.js'\nimport { resolveScorers } from './scorers/index.js'\nimport { runBenchmarks, type BenchmarkResult } from './runner.js'\nimport { consoleReporter } from './reporter/console.js'\nimport { jsonReporter } from './reporter/json.js'\n\nexport interface ArenaConfig {\n providers: ArenaProvider[]\n tasks: ArenaTask[]\n scorers?: BuiltInScorerName[]\n runs?: number\n /** Model to use for llm-judge-correctness (e.g. 'gemini-3.1-pro-preview'). Falls back to DUELIST_JUDGE_MODEL env var, then gpt-5-mini. */\n judgeModel?: string\n /** Show sparkline bars next to percentage scores. Disable if your terminal doesn't render Unicode blocks. Default: true */\n sparklines?: boolean\n /** Per-request timeout in milliseconds. Requests exceeding this are marked as failures. Default: 60000 (60s) */\n timeout?: number\n}\n\nexport interface RunOptions {\n /** Called after each individual benchmark completes */\n onResult?: (result: BenchmarkResult) => void\n}\n\nexport interface Arena {\n config: ArenaConfig\n run(options?: RunOptions): Promise<BenchmarkResult[]>\n}\n\nexport function defineArena(config: ArenaConfig): Arena {\n if (config.providers.length === 0) {\n throw new Error('At least one provider is required')\n }\n\n const scorerNames = config.scorers ?? ['latency', 'cost', 'correctness']\n const scorerFns = resolveScorers(scorerNames, config.judgeModel, config.timeout)\n const runs = config.runs ?? 1\n\n return {\n config,\n\n async run(options?: RunOptions): Promise<BenchmarkResult[]> {\n if (config.tasks.length === 0) {\n throw new Error('At least one task is required')\n }\n return runBenchmarks({\n providers: config.providers,\n tasks: config.tasks,\n scorers: scorerFns,\n runs,\n timeout: config.timeout,\n onResult: options?.onResult,\n })\n },\n }\n}\n\n// Also export reporters for programmatic use\nexport { consoleReporter, jsonReporter }\n","import Anthropic from '@anthropic-ai/sdk'\nimport type { ArenaProvider, TaskInput, TaskResult } from './types.js'\nimport { buildSchemaSystemMessage, parseSchemaOutput } from './shared.js'\n\nexport interface AnthropicProviderOptions {\n apiKey?: string\n maxTokens?: number\n}\n\nexport function anthropic(model: string, options?: AnthropicProviderOptions): ArenaProvider {\n const client = new Anthropic({\n apiKey: options?.apiKey ?? process.env.ANTHROPIC_API_KEY,\n })\n\n const maxTokens = options?.maxTokens ?? 1024\n\n return {\n id: `anthropic/${model}`,\n name: 'Anthropic',\n model,\n\n async run(input: TaskInput): Promise<TaskResult> {\n const start = Date.now()\n\n const systemMessage = input.schema ? buildSchemaSystemMessage(input.schema) : undefined\n\n const reqOpts: { signal?: AbortSignal; timeout?: number } = { signal: input.signal }\n if (input.timeout) reqOpts.timeout = input.timeout\n const response = await client.messages.create({\n model,\n max_tokens: maxTokens,\n system: systemMessage,\n messages: [{ role: 'user', content: input.prompt }],\n }, reqOpts)\n\n const latencyMs = Date.now() - start\n\n const textBlock = response.content.find((b) => b.type === 'text')\n const rawContent = textBlock?.type === 'text' ? textBlock.text : ''\n\n const output = parseSchemaOutput(rawContent, !!input.schema)\n\n return {\n output,\n usage: {\n promptTokens: response.usage.input_tokens,\n completionTokens: response.usage.output_tokens,\n },\n latencyMs,\n raw: response,\n }\n },\n }\n}\n","import type { CiReport, ScorerComparison, CostSummary, ScorerStats } from '../ci.js'\nimport type { BenchmarkResult } from '../runner.js'\nimport { formatDelta } from '../utils/format.js'\n\nexport const COMMENT_MARKER = '<!-- duelist-ci-report -->'\n\nexport function markdownReporter(report: CiReport, _current: BenchmarkResult[]): string {\n const lines: string[] = [COMMENT_MARKER, '']\n\n // Header\n const status = report.failed ? '🔴 Failed' : '🟢 Passed'\n lines.push(`## ⬡ Agent Duelist CI — ${status}`)\n lines.push('')\n\n // Comparison table\n if (report.comparisons.length > 0) {\n lines.push(markdownComparisonTable(report.comparisons))\n lines.push('')\n }\n\n // Cost summary\n if (report.cost.totalUsd > 0 || report.cost.budget !== undefined) {\n lines.push(markdownCostSummary(report.cost))\n lines.push('')\n }\n\n // Flakiness warnings\n if (report.flakyResults.length > 0) {\n lines.push('### ⚠️ Flaky Results')\n lines.push('')\n lines.push('These scorer/task combinations have high variance (CV > 0.3). Consider increasing `runs` or tightening prompts.')\n lines.push('')\n for (const f of report.flakyResults) {\n lines.push(`- **${f.providerId}** × ${f.taskName} → ${f.scorerName} (CV = ${f.current.cv.toFixed(2)})`)\n }\n lines.push('')\n }\n\n // Failure reasons\n if (report.failureReasons.length > 0) {\n lines.push('### Failure Reasons')\n lines.push('')\n for (const reason of report.failureReasons) {\n lines.push(`- ${reason}`)\n }\n lines.push('')\n }\n\n lines.push('---')\n lines.push('*Generated by [agent-duelist](https://github.com/DataGobes/agent-duelist) CI*')\n\n return lines.join('\\n')\n}\n\nexport function markdownComparisonTable(comparisons: ScorerComparison[]): string {\n const lines: string[] = []\n\n lines.push('| Provider | Task | Scorer | Baseline | Current | Delta | Status |')\n lines.push('|----------|------|--------|----------|---------|-------|--------|')\n\n for (const c of comparisons) {\n const baselineStr = c.baseline ? formatStats(c.baseline) : '—'\n const currentStr = formatStats(c.current)\n const deltaStr = c.delta !== null ? formatDelta(c.delta, 3) : '—'\n const status = statusIndicator(c)\n\n lines.push(`| ${c.providerId} | ${c.taskName} | ${c.scorerName} | ${baselineStr} | ${currentStr} | ${deltaStr} | ${status} |`)\n }\n\n return lines.join('\\n')\n}\n\nexport function markdownCostSummary(cost: CostSummary): string {\n const lines: string[] = []\n\n lines.push('### 💰 Cost Summary')\n lines.push('')\n lines.push(`**Total:** $${cost.totalUsd.toFixed(4)}`)\n\n if (cost.budget !== undefined) {\n const pct = cost.budget > 0 ? ((cost.totalUsd / cost.budget) * 100).toFixed(0) : '∞'\n const indicator = cost.overBudget ? '🔴' : '🟢'\n lines.push(`**Budget:** $${cost.budget.toFixed(2)} (${pct}% used) ${indicator}`)\n }\n\n if (cost.perProvider.size > 1) {\n lines.push('')\n lines.push('| Provider | Cost |')\n lines.push('|----------|------|')\n for (const [provider, usd] of cost.perProvider) {\n lines.push(`| ${provider} | $${usd.toFixed(4)} |`)\n }\n }\n\n return lines.join('\\n')\n}\n\nfunction formatStats(stats: ScorerStats): string {\n if (stats.n > 1) {\n const margin = (stats.ci95Upper - stats.ci95Lower) / 2\n return `${stats.mean.toFixed(3)} ± ${margin.toFixed(3)}`\n }\n return stats.mean.toFixed(3)\n}\n\nfunction statusIndicator(c: ScorerComparison): string {\n if (c.regressed) return '🔴 regressed'\n if (c.improved) return '🟢 improved'\n if (c.baseline === null) return '🆕 new'\n return '⚪ unchanged'\n}\n","import type { BenchmarkResult } from '../runner.js'\nimport { formatCost } from '../utils/format.js'\nimport {\n type ProviderTaskData,\n type Medal,\n groupResults,\n aggregateProviderTask,\n average,\n computeColumnStats,\n computeMedals,\n providerLabel,\n apiKeyHint,\n rankProviders,\n medalEmoji,\n scorerLabel,\n} from './shared.js'\n\n// ── XSS prevention ──────────────────────────────────────────────────\n\nfunction esc(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;')\n}\n\n// ── Main reporter ───────────────────────────────────────────────────\n\nexport function htmlReporter(results: BenchmarkResult[]): string {\n if (results.length === 0) {\n return emptyReport()\n }\n\n const { tasks, providers, scorerNames, grouped, byProvider, maxRun } = groupResults(results)\n const hasCost = scorerNames.includes('cost')\n const multi = providers.length >= 2\n const runsLabel = maxRun > 1 ? `${maxRun} runs each` : '1 run'\n\n // Build per-task table data\n const taskSections = tasks.map(task => {\n const providerData = providers.map(id => aggregateProviderTask(id, grouped, task))\n const columnStats = computeColumnStats(providerData, scorerNames)\n const medals = computeMedals(columnStats, providers)\n const winnerId = multi\n ? [...medals.entries()].find(([, m]) => m === 'gold')?.[0]\n : undefined\n return { task, providerData, columnStats, medals, winnerId }\n })\n\n // Summary stats\n const successResults = results.filter(r => !r.error)\n const successByProvider = new Map<string, BenchmarkResult[]>()\n for (const id of providers) {\n successByProvider.set(id, (byProvider.get(id) ?? []).filter(r => !r.error))\n }\n\n const correctnessKey = successResults.some(r =>\n r.scores.some(s => s.name === 'llm-judge-correctness' && s.value >= 0)\n ) ? 'llm-judge-correctness' : 'correctness'\n\n const byCorrectness = rankProviders(successByProvider, providers, correctnessKey)\n const byLatency = providers\n .map(id => {\n const runs = successByProvider.get(id) ?? []\n const avg = average(runs.map(r => r.raw.latencyMs))\n return { id, avg: avg ?? Infinity }\n })\n .sort((a, b) => a.avg - b.avg)[0]\n\n const byCost = providers\n .map(id => {\n const runs = successByProvider.get(id) ?? []\n const costs = runs\n .map(r => {\n const s = r.scores.find(s => s.name === 'cost')\n return s && s.value >= 0 ? s.value : undefined\n })\n .filter((c): c is number => c !== undefined)\n const avg = costs.length > 0 ? costs.reduce((a, b) => a + b, 0) / costs.length : undefined\n return { id, avg }\n })\n .filter(p => p.avg !== undefined)\n .sort((a, b) => a.avg! - b.avg!)[0]\n\n // Overall winner — quality-first (fastest/cheapest are shown separately)\n let overallWinner: string | undefined\n if (multi && byCorrectness && byCorrectness.avg > 0) {\n overallWinner = byCorrectness.id\n }\n\n // Error details\n const errorResults = results.filter(r => r.error)\n const deduped = dedupeErrors(errorResults)\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Agent Duelist Report</title>\n<meta name=\"description\" content=\"LLM provider benchmark results — ${providers.length} provider${providers.length !== 1 ? 's' : ''}, ${tasks.length} task${tasks.length !== 1 ? 's' : ''}\">\n<meta property=\"og:title\" content=\"Agent Duelist Report\">\n<meta property=\"og:description\" content=\"LLM provider benchmark: ${providers.map(esc).join(' vs ')}\">\n<meta property=\"og:type\" content=\"website\">\n${renderStyle()}\n</head>\n<body>\n<div class=\"bg-mesh\"><div class=\"bg-mesh-extra\"></div></div>\n<div class=\"report\">\n\n${renderHeader(runsLabel, providers.length, tasks.length)}\n\n${tasks.length > 1 ? renderTabs(tasks) : ''}\n\n<main>\n${taskSections.map((s, i) => renderTaskSection(\n s.task, s.providerData, s.columnStats, s.medals, s.winnerId,\n scorerNames, hasCost, multi, i\n )).join('\\n')}\n</main>\n\n${renderSummary(byCorrectness, byLatency, byCost, overallWinner, multi)}\n\n${deduped.length > 0 ? renderErrors(deduped) : ''}\n\n${renderFooter()}\n\n</div>\n${renderScript(tasks.length)}\n</body>\n</html>`\n}\n\n// ── Empty report ────────────────────────────────────────────────────\n\nfunction emptyReport(): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Agent Duelist Report</title>\n${renderStyle()}\n</head>\n<body>\n<div class=\"bg-mesh\"><div class=\"bg-mesh-extra\"></div></div>\n<div class=\"report\">\n${renderHeader('0 runs', 0, 0)}\n<main><p class=\"empty-msg\">No results to display.</p></main>\n${renderFooter()}\n</div>\n</body>\n</html>`\n}\n\n// ── Error deduplication ─────────────────────────────────────────────\n\ninterface DedupedError {\n providerId: string\n error: string\n count: number\n hint?: string\n}\n\nfunction dedupeErrors(errorResults: BenchmarkResult[]): DedupedError[] {\n const seen = new Map<string, DedupedError>()\n for (const r of errorResults) {\n const key = `${r.providerId}::${r.error}`\n const existing = seen.get(key)\n if (existing) {\n existing.count++\n } else {\n seen.set(key, {\n providerId: r.providerId,\n error: r.error ?? 'Unknown error',\n count: 1,\n hint: apiKeyHint(r.providerId, r.error ?? ''),\n })\n }\n }\n return [...seen.values()]\n}\n\n// ── Render: style ───────────────────────────────────────────────────\n\nfunction renderStyle(): string {\n return `<style>\n:root {\n --bg: #0f172a;\n --bg-deep: #020617;\n --panel: rgba(15, 23, 42, 0.85);\n --accent: #f59e0b;\n --accent-soft: rgba(245, 158, 11, 0.15);\n --text: #e2e8f0;\n --muted: #94a3b8;\n --border: rgba(148, 163, 184, 0.15);\n --green: #22c55e;\n --red: #ef4444;\n --yellow: #eab308;\n --radius: 12px;\n --mono: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Monaco, Consolas, monospace;\n --sans: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n}\n*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\nhtml, body {\n font-family: var(--sans);\n background: var(--bg);\n color: var(--text);\n min-height: 100vh;\n}\nbody { padding: 24px; display: flex; justify-content: center; }\n\n/* Animated gradient mesh */\n.bg-mesh {\n position: fixed; inset: 0; z-index: 0;\n overflow: hidden; pointer-events: none;\n}\n.bg-mesh::before, .bg-mesh::after {\n content: \"\"; position: absolute; border-radius: 50%;\n filter: blur(120px); opacity: 0.4;\n}\n.bg-mesh::before {\n width: 600px; height: 600px;\n background: radial-gradient(circle, rgba(245,158,11,0.18), transparent 70%);\n top: -10%; left: -5%;\n animation: meshDrift1 18s ease-in-out infinite alternate;\n}\n.bg-mesh::after {\n width: 500px; height: 500px;\n background: radial-gradient(circle, rgba(139,92,246,0.12), transparent 70%);\n bottom: -10%; right: -5%;\n animation: meshDrift2 22s ease-in-out infinite alternate;\n}\n.bg-mesh-extra {\n position: absolute; width: 400px; height: 400px;\n border-radius: 50%; filter: blur(100px); opacity: 0.3;\n background: radial-gradient(circle, rgba(56,189,248,0.12), transparent 70%);\n top: 50%; left: 60%;\n animation: meshDrift3 15s ease-in-out infinite alternate;\n}\n@keyframes meshDrift1 { from { transform: translate(0,0) scale(1); } to { transform: translate(80px,60px) scale(1.15); } }\n@keyframes meshDrift2 { from { transform: translate(0,0) scale(1); } to { transform: translate(-60px,-50px) scale(1.1); } }\n@keyframes meshDrift3 { from { transform: translate(0,0) scale(1); } to { transform: translate(-40px,40px) scale(1.2); } }\n\n/* Report container */\n.report {\n position: relative; z-index: 1;\n width: 100%; max-width: 960px;\n}\n\n/* Header */\n.report-header {\n display: flex; justify-content: space-between; align-items: center;\n padding: 20px 0; margin-bottom: 8px;\n}\n.report-brand {\n display: flex; align-items: center; gap: 10px;\n text-decoration: none; color: var(--muted);\n font-weight: 600; font-size: 14px;\n letter-spacing: 0.04em; text-transform: uppercase;\n}\n.report-brand:hover { color: var(--text); }\n.brand-icon {\n width: 32px; height: 32px; border-radius: 8px;\n background: linear-gradient(135deg, var(--accent-soft), rgba(245,158,11,0.05));\n border: 1px solid rgba(245,158,11,0.3);\n display: flex; align-items: center; justify-content: center;\n font-size: 16px;\n}\n.report-meta {\n font-size: 12px; color: var(--muted);\n text-align: right; line-height: 1.6;\n}\n\n/* Task tabs */\n.task-tabs {\n display: flex; gap: 6px; margin-bottom: 16px; flex-wrap: wrap;\n}\n.task-tab {\n padding: 6px 16px; border-radius: 999px;\n border: 1px solid var(--border);\n background: transparent; color: var(--muted);\n font-size: 13px; font-weight: 500; cursor: pointer;\n transition: all 150ms ease;\n}\n.task-tab:hover { border-color: rgba(245,158,11,0.3); color: var(--text); }\n.task-tab.active {\n background: var(--accent-soft);\n border-color: rgba(245,158,11,0.4);\n color: var(--accent);\n}\n\n/* Task sections */\n.task-section { display: none; }\n.task-section.active { display: block; }\n.task-name {\n font-size: 18px; font-weight: 600;\n margin-bottom: 12px; letter-spacing: -0.01em;\n}\n\n/* Results table */\n.results-table {\n width: 100%; border-collapse: collapse;\n font-size: 13px; margin-bottom: 16px;\n border-radius: var(--radius); overflow: hidden;\n border: 1px solid var(--border);\n}\n.results-table th, .results-table td {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--border);\n}\n.results-table th {\n background: rgba(0,0,0,0.3);\n font-size: 11px; font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.05em;\n color: var(--muted); cursor: pointer;\n user-select: none; white-space: nowrap;\n}\n.results-table th:hover { color: var(--text); }\n.results-table th .sort-arrow { margin-left: 4px; font-size: 10px; }\n.results-table tbody tr {\n background: var(--panel);\n transition: background 120ms ease;\n}\n.results-table tbody tr:hover { background: rgba(15,23,42,0.95); }\n.results-table tbody tr:last-child td { border-bottom: none; }\n\n/* Score cell with progress bar */\n.score-cell { position: relative; min-width: 90px; }\n.score-bar {\n position: absolute; left: 0; bottom: 0;\n height: 3px; border-radius: 2px;\n transition: width 300ms ease;\n}\n.score-val { position: relative; z-index: 1; font-family: var(--mono); font-size: 12px; }\n\n/* Color ranking */\n.rank-best { color: var(--green); font-weight: 600; }\n.rank-worst { color: var(--red); }\n.rank-mid { color: var(--yellow); }\n.rank-neutral { color: var(--text); }\n.rank-error { color: var(--muted); }\n\n/* Winner banner */\n.task-winner {\n display: flex; align-items: center; gap: 10px;\n padding: 12px 18px; margin-bottom: 20px;\n border-radius: var(--radius);\n background: linear-gradient(135deg, rgba(34,197,94,0.08), rgba(34,197,94,0.02));\n border: 1px solid rgba(34,197,94,0.2);\n font-size: 14px; font-weight: 500;\n}\n.task-winner .trophy { font-size: 20px; }\n.task-winner .winner-name { color: var(--green); font-weight: 600; }\n.task-winner .winner-label { color: var(--muted); font-size: 12px; margin-left: 4px; }\n\n/* Summary cards */\n.summary-section { margin-top: 32px; }\n.summary-title {\n font-size: 16px; font-weight: 600;\n margin-bottom: 12px; color: var(--text);\n}\n.summary-cards {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 12px;\n}\n.summary-card {\n padding: 16px; border-radius: var(--radius);\n border: 1px solid var(--border);\n background: var(--panel);\n}\n.summary-card .card-label {\n font-size: 11px; font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.05em;\n color: var(--muted); margin-bottom: 6px;\n}\n.summary-card .card-value {\n font-size: 20px; font-weight: 700;\n color: var(--green); font-family: var(--mono);\n}\n.summary-card .card-provider {\n font-size: 12px; color: var(--muted); margin-top: 4px;\n}\n\n/* Errors */\n.errors-section { margin-top: 24px; }\n.errors-title {\n font-size: 16px; font-weight: 600;\n margin-bottom: 8px; color: var(--red);\n cursor: pointer;\n}\n.errors-list {\n border-radius: var(--radius);\n border: 1px solid rgba(239,68,68,0.2);\n background: rgba(239,68,68,0.04);\n overflow: hidden;\n}\n.error-item {\n padding: 10px 16px;\n border-bottom: 1px solid rgba(239,68,68,0.1);\n font-size: 13px;\n}\n.error-item:last-child { border-bottom: none; }\n.error-provider { font-weight: 600; color: var(--text); }\n.error-msg { color: var(--muted); margin-left: 8px; }\n.error-count { color: var(--muted); font-size: 11px; }\n.error-hint { color: var(--muted); font-size: 12px; margin-top: 4px; font-style: italic; }\n\n/* Footer */\n.report-footer {\n margin-top: 40px; padding: 20px 0;\n border-top: 1px solid var(--border);\n display: flex; justify-content: space-between; align-items: center;\n flex-wrap: wrap; gap: 12px;\n}\n.footer-brand {\n font-size: 13px; color: var(--muted);\n}\n.footer-brand a {\n color: var(--accent); text-decoration: none; font-weight: 500;\n}\n.footer-brand a:hover { text-decoration: underline; }\n.footer-cta {\n display: inline-flex; align-items: center; gap: 6px;\n padding: 6px 14px; border-radius: 8px;\n background: var(--accent-soft);\n border: 1px solid rgba(245,158,11,0.3);\n color: var(--accent); font-size: 12px; font-weight: 500;\n text-decoration: none;\n transition: transform 120ms ease, box-shadow 120ms ease;\n}\n.footer-cta:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(245,158,11,0.2); }\n\n/* Empty state */\n.empty-msg {\n text-align: center; color: var(--muted);\n padding: 60px 20px; font-size: 16px;\n}\n\n/* Responsive */\n@media (max-width: 640px) {\n body { padding: 12px; }\n .report-header { flex-direction: column; align-items: flex-start; gap: 8px; }\n .report-meta { text-align: left; }\n .summary-cards { grid-template-columns: 1fr; }\n .results-table { font-size: 12px; }\n .results-table th, .results-table td { padding: 8px 10px; }\n .report-footer { flex-direction: column; align-items: flex-start; }\n}\n</style>`\n}\n\n// ── Render: header ──────────────────────────────────────────────────\n\nfunction renderHeader(runsLabel: string, providerCount: number, taskCount: number): string {\n const now = new Date().toISOString().replace('T', ' ').slice(0, 19) + ' UTC'\n return `<header class=\"report-header\">\n <a class=\"report-brand\" href=\"https://github.com/DataGobes/agent-duelist\" target=\"_blank\" rel=\"noopener\">\n <div class=\"brand-icon\">&#x2B21;</div>\n <span>Agent Duelist</span>\n </a>\n <div class=\"report-meta\">\n ${providerCount} provider${providerCount !== 1 ? 's' : ''} &middot;\n ${taskCount} task${taskCount !== 1 ? 's' : ''} &middot;\n ${esc(runsLabel)}<br>\n ${esc(now)}\n </div>\n</header>`\n}\n\n// ── Render: tabs ────────────────────────────────────────────────────\n\nfunction renderTabs(tasks: string[]): string {\n const buttons = tasks.map((t, i) =>\n `<button class=\"task-tab${i === 0 ? ' active' : ''}\" data-task=\"${i}\">${esc(t)}</button>`\n ).join('\\n ')\n return `<nav class=\"task-tabs\">\n ${buttons}\n </nav>`\n}\n\n// ── Render: task section ────────────────────────────────────────────\n\nfunction renderTaskSection(\n task: string,\n providerData: ProviderTaskData[],\n columnStats: Map<string, import('./shared.js').ColumnStats>,\n medals: Map<string, Medal>,\n winnerId: string | undefined,\n scorerNames: string[],\n _hasCost: boolean,\n multi: boolean,\n index: number\n): string {\n // Build columns\n const cols: { label: string; key: string; isScore: boolean }[] = [\n { label: 'Provider', key: 'provider', isScore: false },\n ]\n\n for (const name of scorerNames) {\n if (name === 'latency') {\n cols.push({ label: 'Latency', key: 'latency', isScore: false })\n } else if (name === 'cost') {\n cols.push({ label: 'Cost', key: 'cost', isScore: false })\n cols.push({ label: 'Tokens', key: 'tokens', isScore: false })\n } else {\n cols.push({ label: scorerLabel(name), key: name, isScore: true })\n }\n }\n\n // Header row\n const ths = cols.map(c =>\n `<th data-col=\"${esc(c.key)}\">${esc(c.label)}<span class=\"sort-arrow\"></span></th>`\n ).join('')\n\n // Data rows\n const rows = providerData.map(pd => {\n const medal = medalEmoji(medals.get(pd.providerId) ?? 'none')\n const cells: string[] = []\n\n // Provider cell\n const medalHtml = medal ? `${medal} ` : ''\n cells.push(`<td>${medalHtml}${esc(pd.providerId)}</td>`)\n\n if (pd.allErrors) {\n for (let ci = 1; ci < cols.length; ci++) {\n cells.push(`<td class=\"rank-error\">&mdash;</td>`)\n }\n } else {\n for (const col of cols.slice(1)) {\n cells.push(renderDataCell(col.key, col.isScore, pd, columnStats, multi))\n }\n }\n\n return `<tr>${cells.join('')}</tr>`\n }).join('\\n')\n\n // Winner banner\n const winnerHtml = winnerId\n ? `<div class=\"task-winner\">\n <span class=\"trophy\">&#x1F3C6;</span>\n <span>Winner: <span class=\"winner-name\">${esc(winnerId)}</span>\n <span class=\"winner-label\">${esc(providerLabel(winnerId))}</span></span>\n </div>`\n : ''\n\n return `<section class=\"task-section${index === 0 ? ' active' : ''}\" data-task-idx=\"${index}\">\n <h2 class=\"task-name\">${esc(task)}</h2>\n <table class=\"results-table\">\n <thead><tr>${ths}</tr></thead>\n <tbody>${rows}</tbody>\n </table>\n ${winnerHtml}\n</section>`\n}\n\n// ── Render: data cell ───────────────────────────────────────────────\n\nfunction renderDataCell(\n key: string,\n _isScore: boolean,\n pd: ProviderTaskData,\n columnStats: Map<string, import('./shared.js').ColumnStats>,\n multi: boolean\n): string {\n const colStats = columnStats.get(key)\n\n if (key === 'latency') {\n const ms = pd.latencyMs\n if (ms === undefined) return `<td class=\"rank-error\">&mdash;</td>`\n const rankClass = multi && colStats ? rankClass_(ms, colStats) : 'rank-neutral'\n return `<td class=\"${rankClass}\" data-sort-val=\"${ms}\">${Math.round(ms)}ms</td>`\n }\n\n if (key === 'cost') {\n const cost = pd.avgDetails.costUsd\n if (cost === undefined) return `<td class=\"rank-error\">&mdash;</td>`\n const rankClass = multi && colStats ? rankClass_(cost, colStats) : 'rank-neutral'\n return `<td class=\"${rankClass}\" data-sort-val=\"${cost}\">${esc(formatCost(cost))}</td>`\n }\n\n if (key === 'tokens') {\n const tokens = pd.avgDetails.totalTokens\n if (tokens === undefined) return `<td class=\"rank-error\">&mdash;</td>`\n const rankClass = multi && colStats ? rankClass_(tokens, colStats) : 'rank-neutral'\n return `<td class=\"${rankClass}\" data-sort-val=\"${tokens}\">${tokens}</td>`\n }\n\n // Score column (0-1)\n const val = pd.avgScores[key]\n if (val === undefined) return `<td class=\"rank-error\">&mdash;</td>`\n\n const pct = Math.round(val * 100)\n let rankCls: string\n if (multi && colStats) {\n rankCls = rankClass_(val, colStats)\n } else {\n rankCls = val >= 0.8 ? 'rank-best' : val >= 0.5 ? 'rank-mid' : 'rank-worst'\n }\n\n const barColor = val >= 0.8 ? 'var(--green)' : val >= 0.5 ? 'var(--yellow)' : 'var(--red)'\n\n return `<td class=\"score-cell ${rankCls}\" data-sort-val=\"${val}\">\n <span class=\"score-val\">${pct}%</span>\n <div class=\"score-bar\" style=\"width:${pct}%;background:${barColor}\"></div>\n </td>`\n}\n\nfunction rankClass_(value: number, colStats: import('./shared.js').ColumnStats): string {\n if (colStats.best === undefined || colStats.worst === undefined) return 'rank-neutral'\n if (colStats.best === colStats.worst) return 'rank-neutral'\n if (value === colStats.best) return 'rank-best'\n if (value === colStats.worst) return 'rank-worst'\n return 'rank-mid'\n}\n\n// ── Render: summary ─────────────────────────────────────────────────\n\nfunction renderSummary(\n byCorrectness: { id: string; avg: number } | undefined,\n byLatency: { id: string; avg: number } | undefined,\n byCost: { id: string; avg: number | undefined } | undefined,\n overallWinner: string | undefined,\n multi: boolean\n): string {\n const cards: string[] = []\n\n if (byCorrectness) {\n const pct = `${Math.round(byCorrectness.avg * 100)}%`\n const provider = multi\n ? `<div class=\"card-provider\">${esc(byCorrectness.id)} ${esc(providerLabel(byCorrectness.id))}</div>`\n : ''\n cards.push(`<div class=\"summary-card\">\n <div class=\"card-label\">${multi ? 'Most Correct' : 'Avg Correctness'}</div>\n <div class=\"card-value\">${pct}</div>\n ${provider}\n </div>`)\n }\n\n if (byLatency && byLatency.avg !== Infinity) {\n const ms = `${Math.round(byLatency.avg)}ms`\n const provider = multi\n ? `<div class=\"card-provider\">${esc(byLatency.id)} ${esc(providerLabel(byLatency.id))}</div>`\n : ''\n cards.push(`<div class=\"summary-card\">\n <div class=\"card-label\">${multi ? 'Fastest' : 'Avg Latency'}</div>\n <div class=\"card-value\">${ms}</div>\n ${provider}\n </div>`)\n }\n\n if (byCost?.avg !== undefined) {\n const cost = esc(formatCost(byCost.avg))\n const provider = multi\n ? `<div class=\"card-provider\">${esc(byCost.id)} ${esc(providerLabel(byCost.id))}</div>`\n : ''\n cards.push(`<div class=\"summary-card\">\n <div class=\"card-label\">${multi ? 'Cheapest' : 'Avg Cost'}</div>\n <div class=\"card-value\">${cost}</div>\n ${provider}\n </div>`)\n }\n\n if (overallWinner) {\n cards.push(`<div class=\"summary-card\">\n <div class=\"card-label\">Overall Winner</div>\n <div class=\"card-value\">&#x1F3C6;</div>\n <div class=\"card-provider\">${esc(overallWinner)} ${esc(providerLabel(overallWinner))}</div>\n </div>`)\n }\n\n if (cards.length === 0) return ''\n\n return `<section class=\"summary-section\">\n <h2 class=\"summary-title\">Summary</h2>\n <div class=\"summary-cards\">\n ${cards.join('\\n ')}\n </div>\n</section>`\n}\n\n// ── Render: errors ──────────────────────────────────────────────────\n\nfunction renderErrors(errors: DedupedError[]): string {\n const items = errors.map(e => {\n const suffix = e.count > 1 ? ` <span class=\"error-count\">(&times;${e.count})</span>` : ''\n const hint = e.hint ? `<div class=\"error-hint\">${esc(e.hint)}</div>` : ''\n return `<div class=\"error-item\">\n <span class=\"error-provider\">${esc(e.providerId)}:</span>\n <span class=\"error-msg\">${esc(e.error)}</span>${suffix}\n ${hint}\n </div>`\n }).join('\\n')\n\n return `<section class=\"errors-section\">\n <h2 class=\"errors-title\" onclick=\"this.nextElementSibling.style.display=this.nextElementSibling.style.display==='none'?'block':'none'\">Errors</h2>\n <div class=\"errors-list\">\n ${items}\n </div>\n</section>`\n}\n\n// ── Render: footer ──────────────────────────────────────────────────\n\nfunction renderFooter(): string {\n return `<footer class=\"report-footer\">\n <div class=\"footer-brand\">\n Powered by <a href=\"https://github.com/DataGobes/agent-duelist\" target=\"_blank\" rel=\"noopener\">Agent Duelist</a>\n </div>\n <a class=\"footer-cta\" href=\"https://github.com/DataGobes/agent-duelist\" target=\"_blank\" rel=\"noopener\">\n &#x2B50; Star on GitHub\n </a>\n</footer>`\n}\n\n// ── Render: script ──────────────────────────────────────────────────\n\nfunction renderScript(taskCount: number): string {\n return `<script>\n(function() {\n /* Tab switching */\n ${taskCount > 1 ? `\n var tabs = document.querySelectorAll('.task-tab');\n var sections = document.querySelectorAll('.task-section');\n tabs.forEach(function(tab) {\n tab.addEventListener('click', function() {\n var idx = parseInt(tab.getAttribute('data-task'));\n tabs.forEach(function(t) { t.classList.remove('active'); });\n sections.forEach(function(s) { s.classList.remove('active'); });\n tab.classList.add('active');\n sections[idx].classList.add('active');\n });\n });` : ''}\n\n /* Column sorting */\n document.querySelectorAll('.results-table th').forEach(function(th, colIdx) {\n var table = th.closest('table');\n var asc = true;\n th.addEventListener('click', function() {\n var tbody = table.querySelector('tbody');\n var rows = Array.from(tbody.querySelectorAll('tr'));\n rows.sort(function(a, b) {\n var aCell = a.children[colIdx];\n var bCell = b.children[colIdx];\n var aVal = aCell.getAttribute('data-sort-val');\n var bVal = bCell.getAttribute('data-sort-val');\n if (aVal !== null && bVal !== null) {\n return asc ? parseFloat(aVal) - parseFloat(bVal) : parseFloat(bVal) - parseFloat(aVal);\n }\n var aText = aCell.textContent || '';\n var bText = bCell.textContent || '';\n return asc ? aText.localeCompare(bText) : bText.localeCompare(aText);\n });\n rows.forEach(function(row) { tbody.appendChild(row); });\n\n /* Update sort arrows */\n table.querySelectorAll('th .sort-arrow').forEach(function(a) { a.textContent = ''; });\n th.querySelector('.sort-arrow').textContent = asc ? ' \\\\u25B2' : ' \\\\u25BC';\n asc = !asc;\n });\n });\n})();\n</script>`\n}\n","import { z } from 'zod'\nimport type { TaskPack } from './types.js'\n\nexport const structuredOutputPack: TaskPack = {\n name: 'structured-output',\n label: 'Structured Output',\n description: 'Zod schema stress test — flat objects, nesting, arrays, enums, empty arrays, and adversarial input',\n\n tasks: [\n {\n name: 'so:flat-entity',\n prompt:\n \"Extract the person's details from this text: 'Maria Garcia, age 34, works as a software architect in Barcelona, Spain. Her employee ID is EMP-2847.' Return as JSON.\",\n expected: {\n name: 'Maria Garcia',\n age: 34,\n role: 'software architect',\n city: 'Barcelona',\n country: 'Spain',\n employeeId: 'EMP-2847',\n },\n schema: z.object({\n name: z.string(),\n age: z.number(),\n role: z.string(),\n city: z.string(),\n country: z.string(),\n employeeId: z.string(),\n }),\n },\n\n {\n name: 'so:nested-object',\n prompt:\n \"Parse this shipping label into structured JSON: 'Ship to: Acme Corp, Attn: John Lee, 4th Floor, 742 Evergreen Terrace, Springfield, IL 62704, USA. Order #ORD-9912, 3 items, 2.4kg, express shipping.' Use shippingMethod values: standard, express, or overnight. Return as JSON.\",\n expected: {\n recipient: { company: 'Acme Corp', contact: 'John Lee', floor: '4th Floor' },\n address: { street: '742 Evergreen Terrace', city: 'Springfield', state: 'IL', zip: '62704', country: 'USA' },\n order: { id: 'ORD-9912', itemCount: 3, weightKg: 2.4, shippingMethod: 'express' },\n },\n schema: z.object({\n recipient: z.object({ company: z.string(), contact: z.string(), floor: z.string() }),\n address: z.object({\n street: z.string(),\n city: z.string(),\n state: z.string(),\n zip: z.string(),\n country: z.string(),\n }),\n order: z.object({\n id: z.string(),\n itemCount: z.number(),\n weightKg: z.number(),\n shippingMethod: z.enum(['standard', 'express', 'overnight']),\n }),\n }),\n },\n\n {\n name: 'so:array-of-objects',\n prompt:\n \"Extract all mentioned products with their prices and categories from this text: 'Our summer sale includes the UltraWidget Pro ($49.99, Electronics), ComfortMax Chair ($199.00, Furniture), and AquaPure Filter ($24.50, Home & Kitchen). The SmartLamp Mini is also available at $34.99 in the Electronics category.' Return as a JSON array.\",\n expected: [\n { name: 'UltraWidget Pro', price: 49.99, category: 'Electronics' },\n { name: 'ComfortMax Chair', price: 199.0, category: 'Furniture' },\n { name: 'AquaPure Filter', price: 24.5, category: 'Home & Kitchen' },\n { name: 'SmartLamp Mini', price: 34.99, category: 'Electronics' },\n ],\n schema: z.array(z.object({ name: z.string(), price: z.number(), category: z.string() })),\n },\n\n {\n name: 'so:empty-arrays',\n prompt:\n \"Extract all error codes and their severity levels from this log message: 'System health check completed at 14:32 UTC. All services operational. No warnings or errors detected. Uptime: 99.97%.' Classify status as one of: healthy, degraded, or down. Return as JSON.\",\n expected: { errors: [], warnings: [], status: 'healthy', uptimePercent: 99.97 },\n schema: z.object({\n errors: z.array(z.object({ code: z.string(), severity: z.string() })),\n warnings: z.array(z.string()),\n status: z.enum(['healthy', 'degraded', 'down']),\n uptimePercent: z.number(),\n }),\n },\n\n {\n name: 'so:enum-classification',\n prompt:\n 'Classify each of these support tickets by priority (low/medium/high/critical) and category (billing/technical/account/general). Use just the letter (A, B, C, D) as the id.\\nTicket A: \\'My account was charged twice for the same subscription.\\'\\nTicket B: \\'The API returns 500 errors intermittently.\\'\\nTicket C: \\'How do I update my display name?\\'\\nTicket D: \\'Production database is completely unresponsive, all services down.\\'\\nReturn as a JSON array.',\n expected: [\n { id: 'A', priority: 'high', category: 'billing' },\n { id: 'B', priority: 'high', category: 'technical' },\n { id: 'C', priority: 'low', category: 'account' },\n { id: 'D', priority: 'critical', category: 'technical' },\n ],\n schema: z.array(\n z.object({\n id: z.string(),\n priority: z.enum(['low', 'medium', 'high', 'critical']),\n category: z.enum(['billing', 'technical', 'account', 'general']),\n })\n ),\n },\n\n {\n name: 'so:adversarial-input',\n prompt:\n 'Extract the actual product review data from this messy input. Ignore any JSON-like noise in the text.\\n\\nUser said: \\'I bought the {product: \"fake\"} headphones for $59.99 and they\\'re great! Rating: 5/5. The \"noise-cancelling\" feature works well even in {\"noisy\": true} environments. Would recommend to friend=true. Purchased on 01/15/2026.\\'\\nReturn as JSON. Use ISO 8601 date format (YYYY-MM-DD).',\n expected: {\n product: 'headphones',\n price: 59.99,\n rating: 5,\n maxRating: 5,\n features: ['noise-cancelling'],\n recommended: true,\n purchaseDate: '2026-01-15',\n },\n schema: z.object({\n product: z.string(),\n price: z.number(),\n rating: z.number(),\n maxRating: z.number(),\n features: z.array(z.string()),\n recommended: z.boolean(),\n purchaseDate: z.string(),\n }),\n },\n ],\n\n scorers: ['correctness', 'schema-correctness', 'latency', 'cost'],\n}\n","import { z } from 'zod'\nimport type { TaskPack } from './types.js'\n\nexport const toolCallingPack: TaskPack = {\n name: 'tool-calling',\n label: 'Tool Calling',\n description: 'Function invocation accuracy — single calls, complex params, tool selection, parallel calls, and relevance detection',\n\n tasks: [\n {\n name: 'tc:simple-single-tool',\n prompt: \"What's the current weather in Tokyo?\",\n tools: [{\n name: 'getWeather',\n description: 'Get current weather for a city',\n parameters: z.object({\n city: z.string(),\n units: z.enum(['celsius', 'fahrenheit']).optional(),\n }),\n handler: async ({ city, units }: { city: string; units?: string }) => ({\n city,\n tempC: 8,\n condition: 'cloudy',\n units: units ?? 'celsius',\n }),\n }],\n expected: { city: 'Tokyo' },\n },\n\n {\n name: 'tc:complex-params',\n prompt: 'Search for Italian restaurants within 2 miles of downtown Portland that are open now and have at least a 4-star rating.',\n tools: [{\n name: 'searchRestaurants',\n description: 'Search for restaurants matching criteria',\n parameters: z.object({\n cuisine: z.string(),\n location: z.string(),\n radiusMiles: z.number(),\n minRating: z.number(),\n openNow: z.boolean(),\n }),\n handler: async (_args: {\n cuisine: string; location: string;\n radiusMiles: number; minRating: number; openNow: boolean\n }) => ({\n results: [{ name: 'Trattoria Roma', rating: 4.5, distance: 1.2 }],\n }),\n }],\n expected: {\n cuisine: 'Italian',\n location: 'downtown Portland',\n radiusMiles: 2,\n minRating: 4,\n openNow: true,\n },\n },\n\n {\n name: 'tc:select-from-many',\n prompt: 'Convert 150 USD to Euros.',\n tools: [\n {\n name: 'getWeather',\n description: 'Get current weather for a city',\n parameters: z.object({ city: z.string() }),\n handler: async () => ({ tempC: 20 }),\n },\n {\n name: 'convertCurrency',\n description: 'Convert an amount between currencies',\n parameters: z.object({\n amount: z.number(),\n from: z.string(),\n to: z.string(),\n }),\n handler: async ({ amount, from, to }: {\n amount: number; from: string; to: string\n }) => ({\n amount, from, to, result: 138.75, rate: 0.925,\n }),\n },\n {\n name: 'translateText',\n description: 'Translate text between languages',\n parameters: z.object({ text: z.string(), targetLang: z.string() }),\n handler: async () => ({ translated: '' }),\n },\n {\n name: 'calculateTip',\n description: 'Calculate tip amount for a bill',\n parameters: z.object({ billAmount: z.number(), tipPercent: z.number() }),\n handler: async () => ({ tip: 0 }),\n },\n ],\n expected: { amount: 150, from: 'USD', to: 'EUR' },\n },\n\n {\n name: 'tc:parallel-calls',\n prompt: \"I'm planning a trip. What's the weather like in both Paris and London right now?\",\n tools: [{\n name: 'getWeather',\n description: 'Get current weather for a city',\n parameters: z.object({ city: z.string() }),\n handler: async ({ city }: { city: string }) => {\n const data: Record<string, { tempC: number; condition: string }> = {\n Paris: { tempC: 12, condition: 'partly cloudy' },\n London: { tempC: 9, condition: 'rainy' },\n }\n return data[city] ?? { tempC: 15, condition: 'unknown' }\n },\n }],\n expected: 'weather data for Paris and London',\n },\n\n ],\n\n scorers: ['tool-usage', 'latency', 'cost'],\n}\n","import { z } from 'zod'\nimport type { TaskPack } from './types.js'\n\nexport const reasoningPack: TaskPack = {\n name: 'reasoning',\n label: 'Reasoning',\n description: 'Logic, math, and multi-step thinking — arithmetic, deduction, data interpretation, critical path, and business rules',\n\n tasks: [\n {\n name: 'rs:saas-mrr-calc',\n prompt: `A SaaS company charges $49/month for the basic plan and $149/month for pro.\nIn Q1 they had 200 basic subscribers and 85 pro subscribers.\nIn Q2, 15% of basic users upgraded to pro and they gained 40 new basic subscribers.\nNo one churned. What is the Q2 monthly recurring revenue (MRR)?\nReturn as JSON with your reasoning and the final MRR number.`,\n expected: { mrr: 27425 },\n schema: z.object({\n reasoning: z.string().optional(),\n mrr: z.number(),\n }),\n },\n\n {\n name: 'rs:logical-deduction',\n prompt: `Five developers — Alice, Bob, Carol, Dave, and Eve — each use a different\nprimary language: Rust, TypeScript, Python, Go, and Java. Given:\n1. Alice does not use Python, Java, or Go.\n2. Bob uses TypeScript.\n3. Carol uses neither Rust nor Go.\n4. Dave does not use Java.\n5. Eve uses neither Rust, Go, nor Java.\nWhat language does each developer use? Return as JSON.`,\n expected: {\n Alice: 'Rust',\n Bob: 'TypeScript',\n Carol: 'Java',\n Dave: 'Go',\n Eve: 'Python',\n },\n schema: z.object({\n Alice: z.string(),\n Bob: z.string(),\n Carol: z.string(),\n Dave: z.string(),\n Eve: z.string(),\n }),\n },\n\n {\n name: 'rs:data-interpretation',\n prompt: `Given this quarterly revenue data:\n| Quarter | Revenue | Growth |\n|---------|---------|--------|\n| Q1 2025 | $2.1M | - |\n| Q2 2025 | $2.4M | 14.3% |\n| Q3 2025 | $2.2M | -8.3% |\n| Q4 2025 | $2.8M | 27.3% |\n\nWhich quarter had the highest absolute revenue increase compared to the previous\nquarter? What was the full-year total revenue in millions? Return as JSON.`,\n expected: {\n highestGrowthQuarter: 'Q4 2025',\n absoluteIncrease: 0.6,\n fullYearRevenue: 9.5,\n },\n schema: z.object({\n highestGrowthQuarter: z.string(),\n absoluteIncrease: z.number(),\n fullYearRevenue: z.number(),\n }),\n },\n\n {\n name: 'rs:critical-path',\n prompt: `A deployment pipeline has these stages with dependencies:\n- Build (3 min, no dependency)\n- Unit tests (5 min, depends on Build)\n- Integration tests (8 min, depends on Build)\n- Security scan (4 min, depends on Build)\n- Staging deploy (2 min, depends on Unit tests AND Integration tests AND Security scan)\n- Smoke tests (3 min, depends on Staging deploy)\n\nAssuming stages run in parallel where possible, what is the total pipeline\nduration in minutes? Which stages are on the critical path? Return as JSON.`,\n expected: {\n totalMinutes: 16,\n criticalPath: ['Build', 'Integration tests', 'Staging deploy', 'Smoke tests'],\n },\n schema: z.object({\n totalMinutes: z.number(),\n criticalPath: z.array(z.string()),\n }),\n },\n\n {\n name: 'rs:pricing-rules',\n prompt: `Apply these pricing rules to each customer and return the final price:\nRules:\n- Base price: $100\n- Enterprise customers (>100 seats): 30% discount\n- Annual billing: additional 15% off the discounted price\n- Non-profit organizations: flat $50 regardless of other rules\n\nCustomers:\nA: 50 seats, monthly billing, for-profit\nB: 200 seats, annual billing, for-profit\nC: 75 seats, annual billing, non-profit\nD: 150 seats, monthly billing, for-profit\n\nReturn as a JSON array with customer id and finalPrice.`,\n expected: [\n { id: 'A', finalPrice: 100 },\n { id: 'B', finalPrice: 59.5 },\n { id: 'C', finalPrice: 50 },\n { id: 'D', finalPrice: 70 },\n ],\n schema: z.array(z.object({\n id: z.string(),\n finalPrice: z.number(),\n })),\n },\n ],\n\n scorers: ['correctness', 'latency', 'cost'],\n}\n","import type { TaskPack } from './types.js'\nimport { structuredOutputPack } from './structured-output.js'\nimport { toolCallingPack } from './tool-calling.js'\nimport { reasoningPack } from './reasoning.js'\n\nconst registry = new Map<string, TaskPack>()\n\nfunction register(pack: TaskPack): void {\n registry.set(pack.name, pack)\n}\n\nregister(structuredOutputPack)\nregister(toolCallingPack)\nregister(reasoningPack)\n\n/** Get a pack by name. Throws if not found. */\nexport function loadPack(name: string): TaskPack {\n const pack = registry.get(name)\n if (!pack) {\n const available = [...registry.keys()].join(', ')\n throw new Error(`Unknown pack \"${name}\". Available packs: ${available}`)\n }\n return pack\n}\n\n/** Get all available pack names */\nexport function listPacks(): Array<{ name: string; label: string; description: string; taskCount: number }> {\n return [...registry.values()].map((p) => ({\n name: p.name,\n label: p.label,\n description: p.description,\n taskCount: p.tasks.length,\n }))\n}\n","import { readFileSync, writeFileSync, mkdirSync } from 'node:fs'\nimport { dirname } from 'node:path'\nimport type { BenchmarkResult } from './runner.js'\nimport { formatDelta } from './utils/format.js'\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport interface CiOptions {\n configPath: string\n baselinePath: string\n budget?: number\n thresholds: Map<string, number>\n updateBaseline: boolean\n comment: boolean\n quiet: boolean\n}\n\nexport interface ScorerStats {\n mean: number\n stddev: number\n cv: number // coefficient of variation\n n: number\n ci95Lower: number\n ci95Upper: number\n}\n\nexport interface ScorerComparison {\n providerId: string\n taskName: string\n scorerName: string\n baseline: ScorerStats | null\n current: ScorerStats\n delta: number | null // current.mean - baseline.mean (null when no baseline)\n regressed: boolean\n improved: boolean\n flaky: boolean\n}\n\nexport interface CostSummary {\n totalUsd: number\n perProvider: Map<string, number>\n budget: number | undefined\n overBudget: boolean\n}\n\nexport interface CiReport {\n comparisons: ScorerComparison[]\n cost: CostSummary\n failed: boolean\n flakyResults: ScorerComparison[]\n failureReasons: string[]\n}\n\n// ── Constants ────────────────────────────────────────────────────────\n\n/** Scorers where lower values are better */\nconst LOWER_IS_BETTER = new Set(['cost'])\n\n/** CV threshold above which a scorer is flagged as flaky */\nconst FLAKY_CV_THRESHOLD = 0.3\n\n/**\n * T-distribution critical values for 95% two-tailed CI.\n * Index = degrees of freedom (df). For df > 30 we use z ≈ 1.96.\n */\nconst T_CRITICAL_95: Record<number, number> = {\n 1: 12.706, 2: 4.303, 3: 3.182, 4: 2.776, 5: 2.571,\n 6: 2.447, 7: 2.365, 8: 2.306, 9: 2.262, 10: 2.228,\n 15: 2.131, 20: 2.086, 25: 2.060, 30: 2.042,\n}\n\nconst T_CRITICAL_KEYS = Object.keys(T_CRITICAL_95).map(Number).sort((a, b) => a - b)\n\nfunction tCritical(df: number): number {\n if (df <= 0) return 1.96\n if (T_CRITICAL_95[df] !== undefined) return T_CRITICAL_95[df]!\n // Interpolate between known values or fall back to z-approximation\n const keys = T_CRITICAL_KEYS\n if (df > keys[keys.length - 1]!) return 1.96\n // Find surrounding keys and linearly interpolate\n for (let i = 0; i < keys.length - 1; i++) {\n if (df > keys[i]! && df < keys[i + 1]!) {\n const low = keys[i]!, high = keys[i + 1]!\n const ratio = (df - low) / (high - low)\n return T_CRITICAL_95[low]! + ratio * (T_CRITICAL_95[high]! - T_CRITICAL_95[low]!)\n }\n }\n return 1.96\n}\n\n// ── Stats ────────────────────────────────────────────────────────────\n\nexport function computeScorerStats(samples: number[]): ScorerStats {\n const n = samples.length\n if (n === 0) {\n return { mean: 0, stddev: 0, cv: 0, n: 0, ci95Lower: 0, ci95Upper: 0 }\n }\n\n const mean = samples.reduce((a, b) => a + b, 0) / n\n\n if (n === 1) {\n return { mean, stddev: 0, cv: 0, n: 1, ci95Lower: mean, ci95Upper: mean }\n }\n\n const variance = samples.reduce((sum, x) => sum + (x - mean) ** 2, 0) / (n - 1)\n const stddev = Math.sqrt(variance)\n const cv = mean !== 0 ? stddev / Math.abs(mean) : 0\n const se = stddev / Math.sqrt(n)\n const t = tCritical(n - 1)\n\n return {\n mean,\n stddev,\n cv,\n n,\n ci95Lower: mean - t * se,\n ci95Upper: mean + t * se,\n }\n}\n\n// ── Grouping ─────────────────────────────────────────────────────────\n\n/** Group key: providerId::taskName::scorerName */\nfunction groupKey(providerId: string, taskName: string, scorerName: string): string {\n return `${providerId}::${taskName}::${scorerName}`\n}\n\nexport function computeStats(results: BenchmarkResult[]): Map<string, ScorerStats> {\n const grouped = new Map<string, number[]>()\n\n for (const r of results) {\n if (r.error) continue\n for (const score of r.scores) {\n if (score.value < 0) continue // skip unavailable scores (e.g., cost = -1)\n const key = groupKey(r.providerId, r.taskName, score.name)\n if (!grouped.has(key)) grouped.set(key, [])\n grouped.get(key)!.push(score.value)\n }\n }\n\n const stats = new Map<string, ScorerStats>()\n for (const [key, samples] of grouped) {\n stats.set(key, computeScorerStats(samples))\n }\n return stats\n}\n\n// ── Cost ─────────────────────────────────────────────────────────────\n\nexport function computeCostSummary(results: BenchmarkResult[], budget?: number): CostSummary {\n let totalUsd = 0\n const perProvider = new Map<string, number>()\n\n for (const r of results) {\n if (r.error) continue\n const costScore = r.scores.find((s) => s.name === 'cost')\n if (!costScore || costScore.value < 0) continue\n\n const details = costScore.details as { estimatedUsd?: number } | undefined\n const usd = details?.estimatedUsd ?? 0\n if (usd <= 0) continue\n\n totalUsd += usd\n perProvider.set(r.providerId, (perProvider.get(r.providerId) ?? 0) + usd)\n }\n\n return {\n totalUsd,\n perProvider,\n budget,\n overBudget: budget !== undefined && totalUsd > budget,\n }\n}\n\n// ── Comparison ───────────────────────────────────────────────────────\n\nexport function compareResults(\n baselineStats: Map<string, ScorerStats> | null,\n currentStats: Map<string, ScorerStats>,\n thresholds: Map<string, number>,\n budget?: number,\n currentResults?: BenchmarkResult[],\n): CiReport {\n const comparisons: ScorerComparison[] = []\n const failureReasons: string[] = []\n\n for (const [key, current] of currentStats) {\n const [providerId, taskName, scorerName] = key.split('::') as [string, string, string]\n const baseline = baselineStats?.get(key) ?? null\n\n let delta: number | null = null\n let regressed = false\n let improved = false\n\n if (baseline) {\n delta = current.mean - baseline.mean\n const threshold = thresholds.get(scorerName)\n\n if (threshold !== undefined) {\n const lowerIsBetter = LOWER_IS_BETTER.has(scorerName)\n regressed = detectRegression(baseline, current, threshold, lowerIsBetter)\n improved = detectImprovement(baseline, current, threshold, lowerIsBetter)\n }\n }\n\n const flaky = current.n > 1 && current.cv > FLAKY_CV_THRESHOLD\n\n comparisons.push({\n providerId, taskName, scorerName,\n baseline, current, delta,\n regressed, improved, flaky,\n })\n }\n\n // Cost check\n const cost = computeCostSummary(currentResults ?? [], budget)\n\n // Determine failure\n const regressions = comparisons.filter((c) => c.regressed)\n if (regressions.length > 0) {\n for (const r of regressions) {\n failureReasons.push(\n `${r.providerId} × ${r.taskName}: ${r.scorerName} regressed by ${formatDelta(r.delta!)}`\n )\n }\n }\n if (cost.overBudget) {\n failureReasons.push(\n `Total cost $${cost.totalUsd.toFixed(4)} exceeds budget $${cost.budget!.toFixed(2)}`\n )\n }\n\n const flakyResults = comparisons.filter((c) => c.flaky)\n const failed = failureReasons.length > 0\n\n return { comparisons, cost, failed, flakyResults, failureReasons }\n}\n\nfunction detectRegression(\n baseline: ScorerStats,\n current: ScorerStats,\n threshold: number,\n lowerIsBetter: boolean,\n): boolean {\n // For single-run comparisons: simple delta\n if (baseline.n === 1 && current.n === 1) {\n const delta = current.mean - baseline.mean\n if (lowerIsBetter) return delta > threshold\n return delta < -threshold\n }\n\n // Multi-run: conservative CI comparison\n if (lowerIsBetter) {\n // Cost-like: regresses if current lower bound is significantly above baseline upper bound\n return current.ci95Lower - baseline.ci95Upper > threshold\n }\n // Quality-like: regresses if current lower bound is significantly below baseline upper bound\n return baseline.ci95Upper - current.ci95Lower > threshold && current.mean < baseline.mean\n}\n\nfunction detectImprovement(\n baseline: ScorerStats,\n current: ScorerStats,\n threshold: number,\n lowerIsBetter: boolean,\n): boolean {\n if (baseline.n === 1 && current.n === 1) {\n const delta = current.mean - baseline.mean\n if (lowerIsBetter) return delta < -threshold\n return delta > threshold\n }\n\n if (lowerIsBetter) {\n return baseline.ci95Lower - current.ci95Upper > threshold\n }\n return current.ci95Lower - baseline.ci95Upper > threshold\n}\n\n// ── Baseline I/O ─────────────────────────────────────────────────────\n\nexport interface BaselineData {\n timestamp: string\n results: BenchmarkResult[]\n}\n\nexport function loadBaseline(path: string): BaselineData | null {\n try {\n const raw = readFileSync(path, 'utf-8')\n const data = JSON.parse(raw) as Record<string, unknown>\n\n // Support both formats: { results: [...] } and { results: [...], timestamp: ... }\n const results = (data.results ?? data) as BenchmarkResult[]\n if (!Array.isArray(results)) return null\n\n return {\n timestamp: (data.timestamp as string) ?? 'unknown',\n results,\n }\n } catch {\n return null\n }\n}\n\nexport function saveBaseline(path: string, results: BenchmarkResult[]): void {\n mkdirSync(dirname(path), { recursive: true })\n const data: BaselineData = {\n timestamp: new Date().toISOString(),\n results,\n }\n writeFileSync(path, JSON.stringify(data, null, 2))\n}\n","import { readFileSync } from 'node:fs'\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport interface GitHubContext {\n token: string\n owner: string\n repo: string\n prNumber: number\n}\n\ninterface GitHubComment {\n id: number\n body?: string\n}\n\n// ── Context detection ────────────────────────────────────────────────\n\nexport function detectGitHubContext(): GitHubContext | null {\n const token = process.env.GITHUB_TOKEN\n const repository = process.env.GITHUB_REPOSITORY\n const eventPath = process.env.GITHUB_EVENT_PATH\n\n if (!token || !repository) return null\n\n const [owner, repo] = repository.split('/')\n if (!owner || !repo) return null\n\n let prNumber: number | undefined\n\n // Try to get PR number from event payload\n if (eventPath) {\n try {\n const event = JSON.parse(readFileSync(eventPath, 'utf-8')) as Record<string, unknown>\n\n // pull_request event\n if (event.pull_request && typeof event.pull_request === 'object') {\n const pr = event.pull_request as Record<string, unknown>\n prNumber = pr.number as number\n }\n\n // issue_comment or other events with issue.pull_request\n if (!prNumber && event.issue && typeof event.issue === 'object') {\n const issue = event.issue as Record<string, unknown>\n if (issue.pull_request) {\n prNumber = issue.number as number\n }\n }\n } catch {\n // Can't read event file — not fatal\n }\n }\n\n // Fallback: DUELIST_PR_NUMBER env var for manual use\n if (!prNumber && process.env.DUELIST_PR_NUMBER) {\n prNumber = parseInt(process.env.DUELIST_PR_NUMBER, 10)\n }\n\n if (!prNumber) return null\n\n return { token, owner, repo, prNumber }\n}\n\n// ── PR comment helpers ───────────────────────────────────────────────\n\nconst API_BASE = 'https://api.github.com'\n\nfunction ghHeaders(token: string, extra?: Record<string, string>): Record<string, string> {\n return {\n Authorization: `Bearer ${token}`,\n Accept: 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n ...extra,\n }\n}\n\nexport async function findExistingComment(\n ctx: GitHubContext,\n marker: string,\n): Promise<number | null> {\n let page = 1\n const perPage = 50\n\n while (true) {\n const url = `${API_BASE}/repos/${ctx.owner}/${ctx.repo}/issues/${ctx.prNumber}/comments?per_page=${perPage}&page=${page}`\n const res = await fetch(url, { headers: ghHeaders(ctx.token) })\n\n if (!res.ok) return null\n\n const comments = (await res.json()) as GitHubComment[]\n if (comments.length === 0) break\n\n for (const comment of comments) {\n if (comment.body?.includes(marker)) {\n return comment.id\n }\n }\n\n if (comments.length < perPage) break\n page++\n }\n\n return null\n}\n\nexport async function upsertPrComment(\n ctx: GitHubContext,\n body: string,\n marker: string,\n): Promise<void> {\n const existingId = await findExistingComment(ctx, marker)\n\n if (existingId) {\n // Update existing comment\n const url = `${API_BASE}/repos/${ctx.owner}/${ctx.repo}/issues/comments/${existingId}`\n const res = await fetch(url, {\n method: 'PATCH',\n headers: ghHeaders(ctx.token, { 'Content-Type': 'application/json' }),\n body: JSON.stringify({ body }),\n })\n\n if (!res.ok) {\n const text = await res.text()\n console.warn(`Failed to update PR comment: ${res.status} ${text}`)\n }\n } else {\n // Create new comment\n const url = `${API_BASE}/repos/${ctx.owner}/${ctx.repo}/issues/${ctx.prNumber}/comments`\n const res = await fetch(url, {\n method: 'POST',\n headers: ghHeaders(ctx.token, { 'Content-Type': 'application/json' }),\n body: JSON.stringify({ body }),\n })\n\n if (!res.ok) {\n const text = await res.text()\n console.warn(`Failed to create PR comment: ${res.status} ${text}`)\n }\n }\n}\n"],"mappings":"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","names":["OpenAI","AzureOpenAI","zodToJsonSchema","zodToJsonSchema","OpenAI","AzureOpenAI","s","s","z","z","readFileSync"]}