agent-duelist 0.1.0 → 0.2.0
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 +150 -58
- package/dist/cli.js +870 -123
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +897 -227
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +67 -3
- package/dist/index.d.ts +67 -3
- package/dist/index.js +887 -224
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/arena.config.ts +5 -5
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../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/scorers/tool-usage.ts","../src/scorers/index.ts","../src/runner.ts","../src/reporter/console.ts","../src/reporter/json.ts","../src/arena.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/gemini.ts"],"sourcesContent":["// Core API\nexport { defineArena } from './arena.js'\nexport type { ArenaConfig, Arena } from './arena.js'\n\n// Providers\nexport { openai, azureOpenai, openaiCompatible } from './providers/openai.js'\nexport { anthropic } from './providers/anthropic.js'\nexport { gemini } from './providers/gemini.js'\nexport type { ArenaProvider, TaskInput, TaskResult, ToolCall } from './providers/types.js'\n\n// Tasks\nexport type { ArenaTask, ToolDefinition } from './tasks/types.js'\n\n// Pricing\nexport { registerPricing } from './pricing/lookup.js'\n\n// Scorers\nexport type { ScoreResult, ScorerFn, BuiltInScorerName } from './scorers/types.js'\n\n// Runner\nexport type { BenchmarkResult } from './runner.js'\n\n// Reporters\nexport { consoleReporter, jsonReporter } from './reporter/index.js'\n","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 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): JudgeClientResult | undefined {\n const model = configModel ?? process.env.DUELIST_JUDGE_MODEL ?? 'gpt-4o-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 }),\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 }),\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 }), 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): 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) ?? 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 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): ScorerFn[] {\n return names.map((name) => {\n if (name === 'llm-judge-correctness') {\n return createLlmJudgeScorer(judgeModel)\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\nexport interface RunOptions {\n providers: ArenaProvider[]\n tasks: ArenaTask[]\n scorers: ScorerFn[]\n runs: number\n onResult?: (result: BenchmarkResult) => void\n}\n\nexport async function runBenchmarks(options: RunOptions): Promise<BenchmarkResult[]> {\n const { providers, tasks, scorers, runs, onResult } = options\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 provider.run({\n prompt: task.prompt,\n schema: task.schema,\n tools: task.tools,\n })\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 helpers\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'\n\nfunction bold(s: string) { return `${boldCode}${s}${reset}` }\nfunction dim(s: string) { return `${dimCode}${s}${reset}` }\nfunction colorScore(value: number): string {\n const pct = Math.round(value * 100)\n const str = `${pct}%`\n if (value >= 0.8) return `${green}${str}${reset}`\n if (value >= 0.5) return `${yellow}${str}${reset}`\n return `${red}${str}${reset}`\n}\n\nexport function consoleReporter(results: BenchmarkResult[]): void {\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\n // Title — include run count so readers know results are aggregated\n const runsPerCell = Math.max(...results.map((r) => r.run))\n const runLabel = runsPerCell > 1 ? ` (${runsPerCell} runs each)` : ''\n console.log('')\n console.log(` ${bold(`⬡ Agent Duelist Results${runLabel}`)}`)\n console.log(` ${dim('─'.repeat(70))}`)\n console.log('')\n\n // Per-task tables\n for (const task of tasks) {\n console.log(` ${bold(`Task: ${task}`)}`)\n\n // Build columns\n const cols: Col[] = [{ label: 'Provider', width: 22, align: 'left' }]\n for (const name of scorerNames) {\n if (name === 'latency') cols.push({ label: 'Latency', width: 10, align: 'right' })\n else if (name === 'cost') {\n cols.push({ label: 'Cost', width: 12, align: 'right' })\n cols.push({ label: 'Tokens', width: 9, align: 'right' })\n }\n else if (name === 'correctness') cols.push({ label: 'Match', width: 8, align: 'right' })\n else if (name === 'schema-correctness') cols.push({ label: 'Schema', width: 8, align: 'right' })\n else if (name === 'fuzzy-similarity') cols.push({ label: 'Fuzzy', width: 8, align: 'right' })\n else if (name === 'llm-judge-correctness') cols.push({ label: 'Judge', width: 8, align: 'right' })\n else if (name === 'tool-usage') cols.push({ label: 'Tool', width: 8, align: 'right' })\n else cols.push({ label: name, width: 10, align: 'right' })\n }\n if (hasErrors) cols.push({ label: 'Status', width: 8, align: 'left' })\n\n const totalWidth = cols.reduce((sum, c) => sum + c.width + 2, 0)\n console.log(` ${dim(cols.map((c) => pad(c.label, c.width + 2, c.align)).join(''))}`)\n console.log(` ${dim('─'.repeat(totalWidth))}`)\n\n for (const provider of providers) {\n const taskResults = results.filter(\n (r) => r.taskName === task && r.providerId === provider\n )\n const errorResults = taskResults.filter((r) => r.error)\n const successResults = taskResults.filter((r) => !r.error)\n\n if (successResults.length === 0 && errorResults.length > 0) {\n const cells = [pad(provider, 24, 'left')]\n for (const name of scorerNames) {\n if (name === 'cost') {\n cells.push(pad('—', 14, 'right'))\n cells.push(pad('—', 11, 'right'))\n } else cells.push(pad('—', cols.find((c) => c.label !== 'Provider')!.width + 2, 'right'))\n }\n if (hasErrors) cells.push(` ${red}FAIL${reset}`)\n console.log(` ${cells.join('')}`)\n continue\n }\n\n const avgScores = averageScores(successResults)\n const avgDetails = averageDetails(successResults)\n const latencyMs = average(successResults.map((r) => r.raw.latencyMs))\n\n const cells: string[] = [pad(provider, 24, 'left')]\n\n for (const name of scorerNames) {\n if (name === 'latency') {\n cells.push(pad(latencyMs !== undefined ? `${Math.round(latencyMs)}ms` : '—', 12, 'right'))\n } else if (name === 'cost') {\n cells.push(pad(formatCost(avgDetails.costUsd), 14, 'right'))\n cells.push(pad(avgDetails.totalTokens !== undefined ? `${avgDetails.totalTokens}` : '—', 11, 'right'))\n } else {\n const val = avgScores[name]\n if (val === undefined) cells.push(pad('—', 10, 'right'))\n else cells.push(pad(colorScore(val), 10 + colorLen(colorScore(val)), 'right'))\n }\n }\n\n if (hasErrors) {\n const failCount = errorResults.length\n cells.push(failCount > 0 ? ` ${yellow}${failCount} err${reset}` : ` ${green}OK${reset}`)\n }\n\n console.log(` ${cells.join('')}`)\n }\n\n console.log('')\n }\n\n // Summary section\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(70))}`)\n\n // Deduplicate: same provider + same error only shown once\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 // Hint for common API key issues\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\nfunction printSummary(results: BenchmarkResult[], providers: string[]) {\n const successResults = results.filter((r) => !r.error)\n if (successResults.length === 0) return\n\n console.log(` ${dim('─'.repeat(70))}`)\n console.log(` ${bold('Summary')}`)\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 label = single ? 'Avg correctness' : `Most correct: ${bold(byCorrectness.id)} ${dim(providerLabel(byCorrectness.id))}`\n console.log(` ${cyan}◆${reset} ${label} (avg ${colorScore(byCorrectness.avg)})`)\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 label = single ? 'Avg latency' : `Fastest: ${bold(byLatency.id)} ${dim(providerLabel(byLatency.id))}`\n console.log(` ${cyan}◆${reset} ${label} (avg ${Math.round(byLatency.avg)}ms)`)\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 label = single ? 'Avg cost' : `Cheapest: ${bold(byCost.id)} ${dim(providerLabel(byCost.id))}`\n console.log(` ${cyan}◆${reset} ${label} (avg ${formatCost(byCost.avg)})`)\n }\n\n console.log('')\n}\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 Col {\n label: string\n width: number\n align: 'left' | 'right'\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 pad(str: string, width: number, align: 'left' | 'right'): string {\n if (align === 'right') return str.padStart(width)\n return str.padEnd(width)\n}\n\n// ANSI escape codes add invisible characters — this calculates the extra length\nfunction colorLen(str: string): number {\n const stripped = str.replace(/\\x1b\\[[0-9;]*m/g, '')\n return str.length - stripped.length\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-4o-mini. */\n judgeModel?: string\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)\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 onResult: options?.onResult,\n })\n },\n }\n}\n\n// Also export reporters for programmatic use\nexport { consoleReporter, jsonReporter }\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\nexport interface OpenAIProviderOptions {\n apiKey?: string\n baseURL?: string\n}\n\nexport interface AzureOpenAIProviderOptions {\n apiKey?: string\n endpoint?: string\n apiVersion?: string\n deployment?: string\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 })\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}\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 })\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 })\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)\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 })\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 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 })\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 } from './openai.js'\nimport type { ArenaProvider } from './types.js'\n\nexport interface GeminiProviderOptions {\n apiKey?: string\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 })\n\n return makeProvider(`google/${model}`, 'Google AI', model, client, model)\n}\n"],"mappings":"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","names":["OpenAI","errorResults","cells","s","import_openai","OpenAI","Anthropic","import_openai","OpenAI"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../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":["// Core API\nexport { defineArena } from './arena.js'\nexport type { ArenaConfig, Arena } from './arena.js'\n\n// Providers\nexport { openai, azureOpenai, openaiCompatible } from './providers/openai.js'\nexport { anthropic } from './providers/anthropic.js'\nexport { gemini } from './providers/gemini.js'\nexport type { ArenaProvider, TaskInput, TaskResult, ToolCall } from './providers/types.js'\n\n// Tasks\nexport type { ArenaTask, ToolDefinition } from './tasks/types.js'\n\n// Pricing\nexport { registerPricing } from './pricing/lookup.js'\n\n// Scorers\nexport type { ScoreResult, ScorerFn, BuiltInScorerName } from './scorers/types.js'\n\n// Runner\nexport type { BenchmarkResult } from './runner.js'\n\n// Reporters\nexport { consoleReporter, jsonReporter, markdownReporter } from './reporter/index.js'\n\n// CI\nexport { compareResults, computeStats, loadBaseline, saveBaseline } from './ci.js'\nexport type { CiReport, ScorerComparison, ScorerStats, CostSummary } from './ci.js'\n\n// GitHub\nexport { detectGitHubContext, upsertPrComment } from './github.js'\n","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":["import_openai","OpenAI","OpenAI","errorResults","s","Anthropic","import_openai","OpenAI","formatDelta","import_node_fs"]}
|