agent-duelist 0.2.0 → 0.2.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/README.md +17 -3
- package/dist/cli.js +2754 -2102
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +1054 -346
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -7
- package/dist/index.d.ts +8 -7
- package/dist/index.js +1053 -346
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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/scorers/tool-usage.ts","../src/scorers/index.ts","../src/runner.ts","../src/reporter/console.ts","../src/reporter/json.ts","../src/arena.ts","../src/providers/anthropic.ts","../src/providers/gemini.ts","../src/reporter/markdown.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\n const similarity = jaccardSimilarity(tokenize(a), tokenize(b))\n\n return {\n name: 'fuzzy-similarity',\n value: Math.round(similarity * 100) / 100,\n details: { method: 'jaccard', expectedTokens: tokenize(a).size, actualTokens: tokenize(b).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 temperature: 0,\n max_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'\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: 'Respond with valid JSON matching the requested 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 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 let output: string | Record<string, unknown> = rawContent\n if (input.schema) {\n try {\n output = JSON.parse(rawContent) as Record<string, unknown>\n } catch {\n // If JSON parsing fails, fall back to raw string\n }\n }\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\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 { 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 const results: BenchmarkResult[] = []\n\n for (const task of tasks) {\n for (const provider of providers) {\n for (let run = 1; run <= runs; run++) {\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 results.push(result)\n onResult?.(result)\n }\n }\n }\n\n return results\n}\n","import type { BenchmarkResult } from '../runner.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 statistics & ranking ─────────────────────────────────────────────\n\ninterface ColumnStats {\n values: Map<string, number | undefined>\n best: number | undefined\n worst: number | undefined\n}\n\ninterface ProviderTaskData {\n providerId: string\n avgScores: Record<string, number>\n avgDetails: AggregatedDetails\n latencyMs: number | undefined\n allErrors: boolean\n errorCount: number\n}\n\ninterface TableCol {\n label: string\n width: number\n align: 'left' | 'right'\n statsKey?: string\n}\n\nfunction 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\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 })\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\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\n return stats\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\ntype Medal = '🥇' | '🥈' | '🥉' | ''\n\nfunction 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, '')\n return medals\n }\n\n // Count column wins per provider\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 for (const [providerId, value] of colStats.values) {\n if (value !== undefined && value === colStats.best) {\n wins.set(providerId, (wins.get(providerId) ?? 0) + 1)\n }\n }\n }\n\n // If nobody won anything, skip medals\n const totalWins = [...wins.values()].reduce((a, b) => a + b, 0)\n if (totalWins === 0) {\n for (const id of providerIds) medals.set(id, '')\n return medals\n }\n\n // Sort by wins descending, then alphabetically for stability\n const sorted = [...wins.entries()].sort((a, b) =>\n b[1] - a[1] || a[0].localeCompare(b[0])\n )\n\n const medalList: Medal[] = ['🥇', '🥈', '🥉']\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 medals.set(sorted[i]![0], rank < medalList.length ? medalList[rank]! : '')\n }\n\n return medals\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 = [...new Set(results.map((r) => r.taskName))]\n const providers = [...new Set(results.map((r) => r.providerId))]\n const scorerNames = [...new Set(results.flatMap((r) => r.scores.map((s) => s.name)))]\n const hasCost = scorerNames.includes('cost')\n const hasErrors = results.some((r) => r.error)\n const multi = providers.length >= 2\n\n // Title\n const runsPerCell = Math.max(...results.map((r) => r.run))\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\n const providerData: ProviderTaskData[] = providers.map(providerId => {\n const taskResults = results.filter(r => r.taskName === task && r.providerId === 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\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 const label = name === 'correctness' ? 'Match'\n : name === 'schema-correctness' ? 'Schema'\n : name === 'fuzzy-similarity' ? 'Fuzzy'\n : name === 'llm-judge-correctness' ? 'Judge'\n : name === 'tool-usage' ? 'Tool'\n : name\n cols.push({ label, 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 = medals.get(pd.providerId) ?? ''\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 === '🥇')?.[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)\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[]) {\n const successResults = results.filter((r) => !r.error)\n if (successResults.length === 0) return\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(successResults, 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 = successResults.filter((r) => r.providerId === 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 = successResults.filter((r) => r.providerId === 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// ── Pure data functions (unchanged) ─────────────────────────────────────────\n\nfunction rankProviders(results: BenchmarkResult[], providers: string[], scorerName: string) {\n const ranked = providers\n .map((id) => {\n const runs = results.filter((r) => r.providerId === 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\ninterface AggregatedDetails {\n costUsd: number | undefined\n totalTokens: number | undefined\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction 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 // Adaptive precision: always 2 significant figures, always in dollars\n const digits = Math.max(4, -Math.floor(Math.log10(usd)) + 1)\n return `~$${usd.toFixed(digits).replace(/0+$/, '')}`\n}\n\nfunction 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\nfunction 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","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'\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\n ? 'Respond with valid JSON matching the requested schema.'\n : 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 let output: string | Record<string, unknown> = rawContent\n if (input.schema) {\n try {\n output = JSON.parse(rawContent) as Record<string, unknown>\n } catch {\n // fall back to raw string\n }\n }\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 OpenAI from 'openai'\nimport { makeProvider, REQUEST_TIMEOUT_MS } from './openai.js'\nimport type { ArenaProvider } from './types.js'\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","import type { CiReport, ScorerComparison, CostSummary, ScorerStats } from '../ci.js'\nimport type { BenchmarkResult } from '../runner.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) : '—'\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 formatDelta(delta: number): string {\n const sign = delta >= 0 ? '+' : ''\n return `${sign}${delta.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 { readFileSync, writeFileSync, mkdirSync } from 'node:fs'\nimport { dirname } from 'node:path'\nimport type { BenchmarkResult } from './runner.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\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 = Object.keys(T_CRITICAL_95).map(Number).sort((a, b) => a - b)\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\nfunction formatDelta(delta: number): string {\n const sign = delta >= 0 ? '+' : ''\n return `${sign}${delta.toFixed(4)}`\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\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, {\n headers: {\n Authorization: `Bearer ${ctx.token}`,\n Accept: 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n })\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: {\n Authorization: `Bearer ${ctx.token}`,\n Accept: 'application/vnd.github+json',\n 'Content-Type': 'application/json',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\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: {\n Authorization: `Bearer ${ctx.token}`,\n Accept: 'application/vnd.github+json',\n 'Content-Type': 'application/json',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\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","errorResults","s","OpenAI","OpenAI","formatDelta","readFileSync"]}
|
|
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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\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\">⬡</div>\n <span>Agent Duelist</span>\n </a>\n <div class=\"report-meta\">\n ${providerCount} provider${providerCount !== 1 ? 's' : ''} ·\n ${taskCount} task${taskCount !== 1 ? 's' : ''} ·\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\">—</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\">🏆</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\">—</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\">—</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\">—</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\">—</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\">🏆</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\">(×${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 ⭐ 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"]}
|