agent-duelist 0.1.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 +471 -0
- package/dist/cli.js +6710 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.cjs +2207 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +145 -0
- package/dist/index.d.ts +145 -0
- package/dist/index.js +2162 -0
- package/dist/index.js.map +1 -0
- package/package.json +76 -0
- package/templates/arena.config.ts +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/scorers/latency.ts","../src/pricing/catalog.json","../src/pricing/lookup.ts","../src/scorers/cost.ts","../src/scorers/correctness.ts","../src/scorers/schema-correctness.ts","../src/scorers/fuzzy-similarity.ts","../src/scorers/llm-judge.ts","../src/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":["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":["errorResults","cells","s","OpenAI","AzureOpenAI","OpenAI","AzureOpenAI","OpenAI","OpenAI"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agent-duelist",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Pit LLM providers against each other on agent tasks.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.cjs",
|
|
8
|
+
"module": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"source": "./src/index.ts",
|
|
13
|
+
"import": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"default": "./dist/index.js"
|
|
16
|
+
},
|
|
17
|
+
"require": {
|
|
18
|
+
"types": "./dist/index.d.cts",
|
|
19
|
+
"default": "./dist/index.cjs"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"bin": {
|
|
24
|
+
"duelist": "./dist/cli.js"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist",
|
|
28
|
+
"templates"
|
|
29
|
+
],
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsup",
|
|
32
|
+
"dev": "tsup --watch",
|
|
33
|
+
"test": "vitest run",
|
|
34
|
+
"test:watch": "vitest",
|
|
35
|
+
"lint": "tsc --noEmit",
|
|
36
|
+
"update:pricing": "tsx scripts/update-pricing.ts",
|
|
37
|
+
"prepublishOnly": "npm run build"
|
|
38
|
+
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=18"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@anthropic-ai/sdk": "^0.78.0",
|
|
44
|
+
"commander": "^13.1.0",
|
|
45
|
+
"dotenv": "^17.3.1",
|
|
46
|
+
"openai": "^4.85.0",
|
|
47
|
+
"zod": "^3.24.0",
|
|
48
|
+
"zod-to-json-schema": "^3.25.1"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"tsup": "^8.4.0",
|
|
52
|
+
"tsx": "^4.21.0",
|
|
53
|
+
"typescript": "^5.7.0",
|
|
54
|
+
"vitest": "^3.0.0"
|
|
55
|
+
},
|
|
56
|
+
"keywords": [
|
|
57
|
+
"llm",
|
|
58
|
+
"ai",
|
|
59
|
+
"agents",
|
|
60
|
+
"benchmark",
|
|
61
|
+
"evaluation",
|
|
62
|
+
"typescript",
|
|
63
|
+
"openai",
|
|
64
|
+
"anthropic",
|
|
65
|
+
"arena",
|
|
66
|
+
"duelist"
|
|
67
|
+
],
|
|
68
|
+
"repository": {
|
|
69
|
+
"type": "git",
|
|
70
|
+
"url": "https://github.com/DataGobes/agent-duelist.git"
|
|
71
|
+
},
|
|
72
|
+
"bugs": {
|
|
73
|
+
"url": "https://github.com/DataGobes/agent-duelist/issues"
|
|
74
|
+
},
|
|
75
|
+
"homepage": "https://github.com/DataGobes/agent-duelist#readme"
|
|
76
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// ─── Agent Duelist Config ────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// Set your API key before running:
|
|
4
|
+
// export OPENAI_API_KEY=sk-...
|
|
5
|
+
//
|
|
6
|
+
// Then run:
|
|
7
|
+
// npx duelist run
|
|
8
|
+
//
|
|
9
|
+
// Docs: https://github.com/DataGobes/agent-duelist
|
|
10
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
11
|
+
|
|
12
|
+
import { defineArena, openai } from 'agent-duelist'
|
|
13
|
+
import { z } from 'zod'
|
|
14
|
+
|
|
15
|
+
export default defineArena({
|
|
16
|
+
providers: [
|
|
17
|
+
openai('gpt-4o-mini'),
|
|
18
|
+
// Add more providers to compare:
|
|
19
|
+
// openai('gpt-4o'),
|
|
20
|
+
// azureOpenai('gpt-4o-mini'),
|
|
21
|
+
// anthropic('claude-sonnet-4-20250514'),
|
|
22
|
+
// gemini('gemini-2.5-flash'),
|
|
23
|
+
],
|
|
24
|
+
|
|
25
|
+
tasks: [
|
|
26
|
+
{
|
|
27
|
+
name: 'extract-company',
|
|
28
|
+
prompt:
|
|
29
|
+
'Extract the company name and role as JSON: "I work at Acme Corp as a senior engineer." Return {"company": "...", "role": "..."}',
|
|
30
|
+
expected: { company: 'Acme Corp', role: 'senior engineer' },
|
|
31
|
+
schema: z.object({ company: z.string(), role: z.string() }),
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'classify-sentiment',
|
|
35
|
+
prompt:
|
|
36
|
+
'Classify the sentiment as "positive", "negative", or "neutral". Return only the word.\n\nReview: "The product arrived on time and works exactly as described. Very happy!"',
|
|
37
|
+
expected: 'positive',
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'summarize',
|
|
41
|
+
prompt:
|
|
42
|
+
'Summarize in one sentence: The quick brown fox jumps over the lazy dog. This pangram contains every letter of the English alphabet and has been used since the late 1800s.',
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
|
|
46
|
+
scorers: ['latency', 'cost', 'correctness'],
|
|
47
|
+
runs: 1,
|
|
48
|
+
})
|