diff --git a/.github/workflows/publish-typescript.yml b/.github/workflows/publish-typescript.yml index a4c57a2..c06a63e 100644 --- a/.github/workflows/publish-typescript.yml +++ b/.github/workflows/publish-typescript.yml @@ -26,6 +26,9 @@ jobs: node-version: "24" registry-url: "https://registry.npmjs.org" + - name: Configure npm release age gate + run: echo "NPM_CONFIG_BEFORE=$(date -u -d '7 days ago' +'%Y-%m-%dT%H:%M:%SZ')" >> "$GITHUB_ENV" + - name: Install dependencies run: npm ci diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 5402396..c72773b 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -16,22 +16,17 @@ jobs: with: node-version: "20" + - name: Configure npm release age gate + run: echo "NPM_CONFIG_BEFORE=$(date -u -d '7 days ago' +'%Y-%m-%dT%H:%M:%SZ')" >> "$GITHUB_ENV" + + - name: Install validation dependencies + run: npm ci + - name: Validate models YAML against schema - run: | - npm install ajv ajv-cli - npx ajv validate \ - -s model-metadata.schema.json \ - -d "models/*.yaml" \ - --spec=draft2020 \ - --all-errors || exit 1 + run: npm run validate:models - name: Validate providers YAML against schema - run: | - npx ajv validate \ - -s provider.schema.json \ - -d "providers/*.yaml" \ - --spec=draft2020 \ - --all-errors || exit 1 + run: npm run validate:providers codegen: runs-on: ubuntu-latest @@ -48,7 +43,7 @@ jobs: - name: Check for changes run: | git diff --exit-code packages/typescript/src/generated/ - git diff --exit-code packages/python/model_metadata/generated/ + git diff --exit-code packages/python/model_metadata_central/generated/ typescript: runs-on: ubuntu-latest @@ -63,6 +58,9 @@ jobs: node-version: "20" registry-url: "https://registry.npmjs.org" + - name: Configure npm release age gate + run: echo "NPM_CONFIG_BEFORE=$(date -u -d '7 days ago' +'%Y-%m-%dT%H:%M:%SZ')" >> "$GITHUB_ENV" + - name: Install deps and type-check run: npm ci && npm run lint @@ -81,7 +79,7 @@ jobs: python-version: "3.10" - name: Install dependencies - run: uv sync + run: uv sync --locked - name: Build registry from YAML sources run: uv run python scripts/build_registry.py @@ -89,7 +87,7 @@ jobs: - name: Type-check generated models run: | uv run python -c " - from model_metadata.generated.models import ModelMetadata, ProviderMetadata + from model_metadata_central.generated.models import ModelMetadata, ProviderMetadata m = ModelMetadata.model_validate({ 'model_id': 'test', 'model_type': 'chat', @@ -103,4 +101,4 @@ jobs: 'routing_priority': 'direct' }) print('ProviderMetadata valid:', p.provider_id) - " \ No newline at end of file + " diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..ae6b0e7 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +min-release-age=7 +save-exact=true diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..a091629 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "yaml.schemas": { + "./model-metadata.schema.json": "models/*.yaml", + "./provider.schema.json": "providers/*.yaml" + } +} diff --git a/README.md b/README.md index 1d35b56..7dfb5a4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Model Metadata Central -A centralized, language-agnostic, open-source approach to storing and sharing model definitions like context windows, cost per token, etc. +A centralized, language-agnostic, open-source approach to storing and sharing model definitions like context windows, token pricing, providers, and modality support. **Note**: This project does not strive to be an exhaustive registry of every model, but a registry that I can use in my own projects to provide consistent, sane defaults for model and provider selection for provider and model agnostic projects where the user can configure which models and providers they want to use. @@ -54,12 +54,12 @@ These schema defines properties that are relevant to the model and developers wh - `model_description`: A human-friendly description of the model - `model_version`: The version of the model - **Example** `0613` -- `cost_per_token`: The cost per token in USD +- `cost_per_million_tokens`: The token cost in USD per 1,000,000 tokens - **Example**: `json { - "input": 0.0000015, - "output": 0.000002 + "input": 1.5, + "output": 2 }` - - **Note**: supports either a basic number or an object with `input` and `output` numbers to define different costs between input tokens and output tokens + - **Note**: supports `input`, `cached_input`, `cache_write_input`, and `output`. Each value may be a number or a modality map such as `{ "text": 1.5, "audio": 10 }`. - `knowledge_cutoff`: The training data cutoff date for the model - **Note**: This is helpful when dealing with applications where you may need to know if you should supplement the model's training data with more recent information - `tokenizer`: What type of tokenization the model uses @@ -80,10 +80,18 @@ These schema defines properties that are relevant to the model and developers wh model_id_on_provider: gpt-4o - provider_id: openrouter model_id_on_provider: openai/gpt-4o + model_info: https://openrouter.ai/openai/gpt-4o + cost_per_million_tokens: + input: 2.5 + output: 10 ``` - - **Note**: Allows a single model to be accessed via direct provider API or aggregator. Provider definitions live in `/providers`. + - **Note**: Allows a single model to be accessed via direct provider API or aggregator, with provider-specific model IDs, info links, and pricing overrides. Provider definitions live in `/providers`. - `meta_model`: If the model is a meta model, like [OpenRouter's Auto Router](https://openrouter.ai/openrouter/auto), this field indicates that the model may have special treatment for context, tokenization, and cost +### YAML Editor Hints + +This repo includes `.vscode/settings.json` schema associations for `models/*.yaml` and `providers/*.yaml`. In VS Code with a YAML language server, those associations provide key completion, validation, and hover descriptions from the JSON Schemas. + ### Provider Schema Provider definitions in [`providers/`](./providers) describe API endpoints and routing. See [`provider.schema.json`](./provider.schema.json). @@ -121,7 +129,7 @@ status: active ### Included Models -66 active models across 12 primary model providers (deprecated models exist in [`/models`](./models) but are excluded from this list). Provider definitions cover 17 direct/local/aggregator routes. +73 model definitions across direct, local, and aggregator providers. Provider definitions cover 18 direct/local/aggregator routes. **OpenAI**: @@ -148,13 +156,11 @@ status: active **Anthropic**: -- `claude-haiku-4` - `claude-haiku-4-5` - `claude-opus-4-6` - `claude-opus-4-6-fast` - `claude-opus-4-7` - `claude-opus-latest` -- `claude-sonnet-4-2` - `claude-sonnet-4-6` **Google**: @@ -166,19 +172,17 @@ status: active **DeepSeek**: -- `deepseek-coder-v4` - `deepseek-v4-flash` - `deepseek-v4-pro` **xAI**: -- `grok-4.2` -- `grok-4.2-multi-agent` +- `grok-4.20` +- `grok-4.20-multi-agent` **Moonshot AI**: - `kimi-k2.6` -- `kimi-v3` **Mistral AI**: @@ -194,11 +198,11 @@ status: active - `minimax-m2` - `minimax-m2.1` -- `minimax-m2.1-highspeed` - `minimax-m2.5` - `minimax-m2.5-highspeed` - `minimax-m2.7` - `minimax-m2.7-highspeed` +- `minimax-m3` **Z.AI**: @@ -214,6 +218,11 @@ status: active - `qwen3-32b` - `qwen3.6-flash` - `qwen3.6-plus` +- `qwen3.7-plus` + +**Claudinio**: + +- `claudinio-essential` **Groq**: diff --git a/model-metadata.schema.json b/model-metadata.schema.json index 76829a4..b59e4c7 100644 --- a/model-metadata.schema.json +++ b/model-metadata.schema.json @@ -45,22 +45,9 @@ "type": "integer", "minimum": 1 }, - "cost_per_token": { - "description": "The cost per token in USD", - "type": ["object", "number"], - "minimum": 0, - "properties": { - "input": { - "description": "The cost per token of input send to the model", - "type": "number", - "minimum": 0 - }, - "output": { - "description": "The cost per token of output generated by the model", - "type": "number", - "minimum": 0 - } - } + "cost_per_million_tokens": { + "description": "The model provider's default token pricing in USD per 1,000,000 tokens. Provider-specific entries may override this on individual providers.", + "$ref": "#/$defs/token_costs" }, "knowledge_cutoff": { "description": "The training data cutoff date for the model", @@ -76,8 +63,38 @@ "type": "array", "items": { "type": "string", - "enum": ["function", "instruction", "code", "multilingual", "multimodal"] + "enum": [ + "function", + "instruction", + "code", + "multilingual", + "multimodal", + "structured", + "reasoning" + ] + }, + "uniqueItems": true, + "minItems": 1 + }, + "input_type": { + "description": "The type of input the model accepts", + "type": "array", + "items": { + "type": "string", + "enum": ["text", "image", "audio", "video", "other"] + }, + "default": ["text"], + "uniqueItems": true, + "minItems": 1 + }, + "output_type": { + "description": "The type of output the model generates", + "type": "array", + "items": { + "type": "string", + "enum": ["text", "image", "audio", "video", "other"] }, + "default": ["text"], "uniqueItems": true, "minItems": 1 }, @@ -114,10 +131,87 @@ "model_id_on_provider": { "description": "The model ID as used by this specific provider (may differ from model_id)", "type": "string" + }, + "model_info": { + "description": "Provider-specific link to this model, such as an aggregator listing or provider docs page", + "type": "string", + "format": "uri" + }, + "cost_per_million_tokens": { + "description": "Provider-specific token pricing in USD per 1,000,000 tokens. Use this when an aggregator or route prices the model differently from the primary provider.", + "$ref": "#/$defs/token_costs" } }, "required": ["provider_id"] }, + "token_costs": { + "type": "object", + "description": "Token pricing in USD per 1,000,000 tokens. Each direction may be a single number or a map of modality-specific prices.", + "properties": { + "input": { + "description": "Input token cost. May be a single blended price or modality-specific prices.", + "$ref": "#/$defs/token_cost_value" + }, + "cached_input": { + "description": "Cached input token read cost, when the provider exposes separate cache pricing.", + "$ref": "#/$defs/token_cost_value" + }, + "cache_write_input": { + "description": "Cache write input token cost, when the provider exposes separate cache pricing.", + "$ref": "#/$defs/token_cost_value" + }, + "output": { + "description": "Output token cost. May be a single blended price or modality-specific prices.", + "$ref": "#/$defs/token_cost_value" + } + }, + "additionalProperties": false + }, + "token_cost_value": { + "description": "A token price in USD per 1,000,000 tokens, either as one number or split by modality.", + "oneOf": [ + { + "type": "number", + "minimum": 0 + }, + { + "$ref": "#/$defs/modality_costs" + } + ] + }, + "modality_costs": { + "type": "object", + "description": "Modality-specific token prices in USD per 1,000,000 tokens.", + "properties": { + "text": { + "description": "Text token cost in USD per 1,000,000 tokens.", + "type": "number", + "minimum": 0 + }, + "image": { + "description": "Image token cost in USD per 1,000,000 tokens.", + "type": "number", + "minimum": 0 + }, + "audio": { + "description": "Audio token cost in USD per 1,000,000 tokens.", + "type": "number", + "minimum": 0 + }, + "video": { + "description": "Video token cost in USD per 1,000,000 tokens.", + "type": "number", + "minimum": 0 + }, + "other": { + "description": "Other or provider-specific token cost in USD per 1,000,000 tokens.", + "type": "number", + "minimum": 0 + } + }, + "additionalProperties": false, + "minProperties": 1 + }, "tokenizer_config": { "type": "object", "description": "Tokenizer family and the specific encoding/version identifier within that family", @@ -125,7 +219,14 @@ "family": { "description": "Tokenizer library or system (example: tiktoken, tekken, sentencepiece)", "type": "string", - "enum": ["tiktoken", "tekken", "sentencepiece", "huggingface", "other", "unknown"] + "enum": [ + "tiktoken", + "tekken", + "sentencepiece", + "huggingface", + "other", + "unknown" + ] }, "name": { "description": "The encoding or version identifier within the family (example: 'cl100k_base' for tiktoken, 'v3' for tekken)", diff --git a/models/claude-haiku-4-5.yaml b/models/claude-haiku-4-5.yaml index e458fed..7471aba 100644 --- a/models/claude-haiku-4-5.yaml +++ b/models/claude-haiku-4-5.yaml @@ -6,13 +6,16 @@ model_info: https://docs.anthropic.com/en/docs/about-claude/models/overview model_type: chat context_window: 200000 max_tokens: 64000 -cost_per_token: - input: 0.000001 - output: 0.000005 +cost_per_million_tokens: + input: 1 + output: 5 knowledge_cutoff: "2025-02-28" tuning: [multimodal, function] +input_type: [text, image] +output_type: [text] providers: - provider_id: anthropic model_id_on_provider: claude-haiku-4-5 - provider_id: openrouter model_id_on_provider: anthropic/claude-haiku-4.5 + model_info: https://openrouter.ai/anthropic/claude-haiku-4.5 diff --git a/models/claude-haiku-4.yaml b/models/claude-haiku-4.yaml deleted file mode 100644 index 6730a45..0000000 --- a/models/claude-haiku-4.yaml +++ /dev/null @@ -1,15 +0,0 @@ -model_id: claude-haiku-4 -model_name: Claude Haiku 4 -model_provider: anthropic -model_description: Fast, affordable Claude. Optimized for high-volume, latency-sensitive tasks where quality-per-token matters more than raw capability. -model_info: https://docs.anthropic.com/en/docs/models/claude-haiku-4 -model_type: chat -context_window: 200000 -cost_per_token: - input: 0.0000008 - output: 0.000004 -providers: - - provider_id: anthropic - model_id_on_provider: haiku-4 - - provider_id: openrouter - model_id_on_provider: anthropic/claude-haiku-4 \ No newline at end of file diff --git a/models/claude-opus-4-6-fast.yaml b/models/claude-opus-4-6-fast.yaml index b1910ba..01bbed9 100644 --- a/models/claude-opus-4-6-fast.yaml +++ b/models/claude-opus-4-6-fast.yaml @@ -5,12 +5,13 @@ model_description: High-speed variant of Opus 4.6. Optimized for rapid responses model_info: https://docs.anthropic.com/en/docs/models/claude-opus-4-6 model_type: chat context_window: 1000000 -cost_per_token: - input: 0.000030 - output: 0.000150 +cost_per_million_tokens: + input: 30 + output: 150 tuning: [function] +input_type: [text, image] +output_type: [text] providers: - - provider_id: anthropic - model_id_on_provider: claude-opus-4-6-fast - provider_id: openrouter - model_id_on_provider: anthropic/claude-opus-4-6-fast \ No newline at end of file + model_id_on_provider: anthropic/claude-opus-4.6-fast + model_info: https://openrouter.ai/anthropic/claude-opus-4.6-fast \ No newline at end of file diff --git a/models/claude-opus-4-6.yaml b/models/claude-opus-4-6.yaml index e32ac3d..397d20e 100644 --- a/models/claude-opus-4-6.yaml +++ b/models/claude-opus-4-6.yaml @@ -6,13 +6,16 @@ model_info: https://docs.anthropic.com/en/docs/about-claude/models/overview model_type: chat context_window: 1000000 max_tokens: 128000 -cost_per_token: - input: 0.000005 - output: 0.000025 +cost_per_million_tokens: + input: 5 + output: 25 knowledge_cutoff: "2025-05-31" tuning: [multimodal, function] +input_type: [text, image] +output_type: [text] providers: - provider_id: anthropic model_id_on_provider: claude-opus-4-6 - provider_id: openrouter model_id_on_provider: anthropic/claude-opus-4.6 + model_info: https://openrouter.ai/anthropic/claude-opus-4.6 diff --git a/models/claude-opus-4-7.yaml b/models/claude-opus-4-7.yaml index 3282bbd..edc7d01 100644 --- a/models/claude-opus-4-7.yaml +++ b/models/claude-opus-4-7.yaml @@ -5,12 +5,15 @@ model_description: Anthropic's most capable model. Exceptional at complex reason model_info: https://docs.anthropic.com/en/docs/models/claude-opus-4-7 model_type: chat context_window: 1000000 -cost_per_token: - input: 0.000005 - output: 0.000025 +cost_per_million_tokens: + input: 5 + output: 25 tuning: [function] +input_type: [text, image] +output_type: [text] providers: - provider_id: anthropic model_id_on_provider: claude-opus-4-7 - provider_id: openrouter - model_id_on_provider: anthropic/claude-opus-4-7 \ No newline at end of file + model_id_on_provider: anthropic/claude-opus-4.7 + model_info: https://openrouter.ai/anthropic/claude-opus-4.7 \ No newline at end of file diff --git a/models/claude-opus-latest.yaml b/models/claude-opus-latest.yaml index fb3825c..36e19a5 100644 --- a/models/claude-opus-latest.yaml +++ b/models/claude-opus-latest.yaml @@ -5,12 +5,13 @@ model_description: Points to the latest stable Opus release. Use when you want t model_info: https://docs.anthropic.com/en/docs/models model_type: chat context_window: 1000000 -cost_per_token: - input: 0.000005 - output: 0.000025 +cost_per_million_tokens: + input: 5 + output: 25 tuning: [function] +input_type: [text, image] +output_type: [text] providers: - - provider_id: anthropic - model_id_on_provider: opus - provider_id: openrouter - model_id_on_provider: anthropic/claude-opus-latest \ No newline at end of file + model_id_on_provider: ~anthropic/claude-opus-latest + model_info: https://openrouter.ai/~anthropic/claude-opus-latest \ No newline at end of file diff --git a/models/claude-sonnet-4-2.yaml b/models/claude-sonnet-4-2.yaml deleted file mode 100644 index b9a5deb..0000000 --- a/models/claude-sonnet-4-2.yaml +++ /dev/null @@ -1,16 +0,0 @@ -model_id: claude-sonnet-4-2 -model_name: Claude Sonnet 4.2 -model_provider: anthropic -model_description: Balanced Anthropic model. Strong for coding, analysis, and everyday tasks at a mid-range price point. -model_info: https://docs.anthropic.com/en/docs/models/claude-sonnet-4-2 -model_type: chat -context_window: 200000 -cost_per_token: - input: 0.000003 - output: 0.000015 -tuning: [function] -providers: - - provider_id: anthropic - model_id_on_provider: claude-sonnet-4-2 - - provider_id: openrouter - model_id_on_provider: anthropic/claude-sonnet-4-2 \ No newline at end of file diff --git a/models/claude-sonnet-4-6.yaml b/models/claude-sonnet-4-6.yaml index 2b69494..24be116 100644 --- a/models/claude-sonnet-4-6.yaml +++ b/models/claude-sonnet-4-6.yaml @@ -6,13 +6,16 @@ model_info: https://docs.anthropic.com/en/docs/about-claude/models/overview model_type: chat context_window: 1000000 max_tokens: 64000 -cost_per_token: - input: 0.000003 - output: 0.000015 +cost_per_million_tokens: + input: 3 + output: 15 knowledge_cutoff: "2025-08-31" tuning: [multimodal, function] +input_type: [text, image] +output_type: [text] providers: - provider_id: anthropic model_id_on_provider: claude-sonnet-4-6 - provider_id: openrouter model_id_on_provider: anthropic/claude-sonnet-4.6 + model_info: https://openrouter.ai/anthropic/claude-sonnet-4.6 diff --git a/models/claudinio-essential.yaml b/models/claudinio-essential.yaml new file mode 100644 index 0000000..549f87e --- /dev/null +++ b/models/claudinio-essential.yaml @@ -0,0 +1,20 @@ +model_id: claudinio-essential +model_name: Claudinio Essential +model_provider: claudinio +model_description: | + Claudinio runs a unified model optimized for coding agents. All plans access the same high-performance model — the + difference is the hourly protection level, tuned for each developer profile. +model_info: https://claudin.io/ +model_type: chat +context_window: 256000 +max_tokens: 64000 +cost_per_million_tokens: + input: 0.5 + output: 20 +knowledge_cutoff: "2026-05-01" +tuning: [multimodal, function, code, reasoning] +input_type: [text, image, audio, video] +output_type: [text] +providers: + - provider_id: claudinio + model_id_on_provider: claudinio-essential diff --git a/models/codestral-latest.yaml b/models/codestral-latest.yaml index 5985728..9a31693 100644 --- a/models/codestral-latest.yaml +++ b/models/codestral-latest.yaml @@ -6,15 +6,15 @@ model_info: https://docs.mistral.ai/getting-started/models/models_overview/ model_type: chat context_window: 256000 max_tokens: 4096 -cost_per_token: - input: 3e-7 - output: 9e-7 +cost_per_million_tokens: + input: 0.3 + output: 0.9 knowledge_cutoff: "2024-10-01" tokenizer: family: tekken tuning: [function, instruction] +input_type: [text] +output_type: [text] providers: - provider_id: mistralai - model_id_on_provider: codestral-latest - - provider_id: openrouter - model_id_on_provider: mistralai/codestral-latest + model_id_on_provider: codestral-latest \ No newline at end of file diff --git a/models/deepseek-coder-v4.yaml b/models/deepseek-coder-v4.yaml deleted file mode 100644 index 4840d74..0000000 --- a/models/deepseek-coder-v4.yaml +++ /dev/null @@ -1,16 +0,0 @@ -model_id: deepseek-coder-v4 -model_name: DeepSeek Coder V4 -model_provider: deepseek -model_description: DeepSeek's dedicated code model. Specialized for code generation, completion, and debugging across many languages. -model_info: https://api.deepseek.com -model_type: chat -context_window: 1048576 -cost_per_token: - input: 0.00000043 - output: 0.00000087 -tuning: [code] -providers: - - provider_id: deepseek - model_id_on_provider: deepseek-coder - - provider_id: openrouter - model_id_on_provider: deepseek/deepseek-coder-v4 \ No newline at end of file diff --git a/models/deepseek-r1-distill-llama-70b.yaml b/models/deepseek-r1-distill-llama-70b.yaml index 013faaf..b86bac3 100644 --- a/models/deepseek-r1-distill-llama-70b.yaml +++ b/models/deepseek-r1-distill-llama-70b.yaml @@ -6,11 +6,13 @@ model_info: https://console.groq.com/docs/models model_type: chat context_window: 131072 max_tokens: 8192 -cost_per_token: - input: 7.5e-7 - output: 9.9e-7 +cost_per_million_tokens: + input: 0.75 + output: 0.99 knowledge_cutoff: "2024-07-01" tuning: [function, instruction] +input_type: [text] +output_type: [text] providers: - provider_id: groq model_id_on_provider: deepseek-r1-distill-llama-70b diff --git a/models/deepseek-v4-flash.yaml b/models/deepseek-v4-flash.yaml index 90dddf0..09a04de 100644 --- a/models/deepseek-v4-flash.yaml +++ b/models/deepseek-v4-flash.yaml @@ -5,11 +5,14 @@ model_description: Fast, efficient DeepSeek variant. Optimized for high-volume a model_info: https://api.deepseek.com model_type: chat context_window: 1048576 -cost_per_token: - input: 0.00000014 - output: 0.00000028 +cost_per_million_tokens: + input: 0.14 + output: 0.28 +input_type: [text] +output_type: [text] providers: - provider_id: deepseek model_id_on_provider: deepseek-chat - provider_id: openrouter - model_id_on_provider: deepseek/deepseek-v4-flash \ No newline at end of file + model_id_on_provider: deepseek/deepseek-v4-flash + model_info: https://openrouter.ai/deepseek/deepseek-v4-flash \ No newline at end of file diff --git a/models/deepseek-v4-pro.yaml b/models/deepseek-v4-pro.yaml index 4eb782b..b1eb0aa 100644 --- a/models/deepseek-v4-pro.yaml +++ b/models/deepseek-v4-pro.yaml @@ -5,12 +5,15 @@ model_description: DeepSeek's flagship model. Excellent reasoning and code capab model_info: https://api.deepseek.com model_type: chat context_window: 1048576 -cost_per_token: - input: 0.00000043 - output: 0.00000087 +cost_per_million_tokens: + input: 0.43 + output: 0.87 tuning: [function] +input_type: [text] +output_type: [text] providers: - provider_id: deepseek model_id_on_provider: deepseek-chat - provider_id: openrouter - model_id_on_provider: deepseek/deepseek-v4-pro \ No newline at end of file + model_id_on_provider: deepseek/deepseek-v4-pro + model_info: https://openrouter.ai/deepseek/deepseek-v4-pro \ No newline at end of file diff --git a/models/gemini-2.0-flash.yaml b/models/gemini-2.0-flash.yaml index 9ae0994..d3f8343 100644 --- a/models/gemini-2.0-flash.yaml +++ b/models/gemini-2.0-flash.yaml @@ -5,12 +5,12 @@ model_description: Previous-generation Gemini. Good balance of speed, cost, and model_info: https://ai.google.dev/gemini-api/models/gemini-2.0-flash model_type: chat context_window: 128000 -cost_per_token: - input: 0.00000010 - output: 0.00000040 +cost_per_million_tokens: + input: 0.1 + output: 0.4 deprecated: true +input_type: [text, image, audio, video] +output_type: [text] providers: - provider_id: google - model_id_on_provider: gemini-2.0-flash - - provider_id: openrouter - model_id_on_provider: google/gemini-2.0-flash \ No newline at end of file + model_id_on_provider: gemini-2.0-flash \ No newline at end of file diff --git a/models/gemini-2.5-flash.yaml b/models/gemini-2.5-flash.yaml index 1887bad..90177db 100644 --- a/models/gemini-2.5-flash.yaml +++ b/models/gemini-2.5-flash.yaml @@ -5,12 +5,15 @@ model_description: Fast, efficient Gemini model. Optimized for high-volume appli model_info: https://ai.google.dev/gemini-api/models/gemini-2.5-flash model_type: chat context_window: 1000000 -cost_per_token: - input: 0.000000075 - output: 0.00000030 +cost_per_million_tokens: + input: 0.075 + output: 0.3 tuning: [multimodal] +input_type: [text, image, audio, video] +output_type: [text] providers: - provider_id: google model_id_on_provider: gemini-2.5-flash - provider_id: openrouter - model_id_on_provider: google/gemini-2.5-flash \ No newline at end of file + model_id_on_provider: google/gemini-2.5-flash + model_info: https://openrouter.ai/google/gemini-2.5-flash \ No newline at end of file diff --git a/models/gemini-2.5-pro.yaml b/models/gemini-2.5-pro.yaml index dd3d778..50030a5 100644 --- a/models/gemini-2.5-pro.yaml +++ b/models/gemini-2.5-pro.yaml @@ -5,12 +5,15 @@ model_description: Google's flagship model. Exceptional at long-context tasks, m model_info: https://ai.google.dev/gemini-api/docs/models/gemini-2.5-pro model_type: chat context_window: 1000000 -cost_per_token: - input: 0.00000125 - output: 0.000005 +cost_per_million_tokens: + input: 1.25 + output: 5 tuning: [multimodal] +input_type: [text, image, audio, video] +output_type: [text] providers: - provider_id: google model_id_on_provider: gemini-2.5-pro - provider_id: openrouter - model_id_on_provider: google/gemini-2.5-pro \ No newline at end of file + model_id_on_provider: google/gemini-2.5-pro + model_info: https://openrouter.ai/google/gemini-2.5-pro \ No newline at end of file diff --git a/models/gemma-4-26b-a4b-it.yaml b/models/gemma-4-26b-a4b-it.yaml index 0c37132..81dec6f 100644 --- a/models/gemma-4-26b-a4b-it.yaml +++ b/models/gemma-4-26b-a4b-it.yaml @@ -5,9 +5,11 @@ model_description: Google's smaller open-weight instruction-tuned model. Efficie model_info: https://ai.google.dev/gemma model_type: chat context_window: 262144 -cost_per_token: - input: 0.00000006 - output: 0.00000033 +cost_per_million_tokens: + input: 0.06 + output: 0.33 +input_type: [text] +output_type: [text] providers: - provider_id: google model_id_on_provider: gemma-4-26b-a4b-it @@ -15,3 +17,4 @@ providers: model_id_on_provider: "@cf/google/gemma-4-26b-a4b-it" - provider_id: openrouter model_id_on_provider: google/gemma-4-26b-a4b-it + model_info: https://openrouter.ai/google/gemma-4-26b-a4b-it diff --git a/models/gemma-4-31b-it.yaml b/models/gemma-4-31b-it.yaml index 9e5ef94..d9ecdd2 100644 --- a/models/gemma-4-31b-it.yaml +++ b/models/gemma-4-31b-it.yaml @@ -5,11 +5,14 @@ model_description: Google's open-weight instruction-tuned model. Strong reasonin model_info: https://ai.google.dev/gemma model_type: chat context_window: 262144 -cost_per_token: - input: 0.00000013 - output: 0.00000038 +cost_per_million_tokens: + input: 0.13 + output: 0.38 +input_type: [text] +output_type: [text] providers: - provider_id: google model_id_on_provider: gemma-4-31b-it - provider_id: openrouter - model_id_on_provider: google/gemma-4-31b-it \ No newline at end of file + model_id_on_provider: google/gemma-4-31b-it + model_info: https://openrouter.ai/google/gemma-4-31b-it \ No newline at end of file diff --git a/models/glm-4.7-flash.yaml b/models/glm-4.7-flash.yaml index 53bf54c..d8b24e8 100644 --- a/models/glm-4.7-flash.yaml +++ b/models/glm-4.7-flash.yaml @@ -6,11 +6,13 @@ model_info: https://docs.z.ai/guides/overview/pricing model_type: chat context_window: 200000 max_tokens: 131072 -cost_per_token: +cost_per_million_tokens: input: 0 output: 0 knowledge_cutoff: "2025-04-01" tuning: [function, instruction] +input_type: [text] +output_type: [text] providers: - provider_id: zai model_id_on_provider: glm-4.7-flash @@ -18,3 +20,4 @@ providers: model_id_on_provider: "@cf/zai-org/glm-4.7-flash" - provider_id: openrouter model_id_on_provider: z-ai/glm-4.7-flash + model_info: https://openrouter.ai/z-ai/glm-4.7-flash diff --git a/models/glm-4.7.yaml b/models/glm-4.7.yaml index 486bcfb..3cf67f1 100644 --- a/models/glm-4.7.yaml +++ b/models/glm-4.7.yaml @@ -6,13 +6,16 @@ model_info: https://docs.z.ai/guides/overview/pricing model_type: chat context_window: 204800 max_tokens: 131072 -cost_per_token: - input: 6e-7 - output: 0.0000022 +cost_per_million_tokens: + input: 0.6 + output: 2.2 knowledge_cutoff: "2025-04-01" tuning: [function, instruction] +input_type: [text] +output_type: [text] providers: - provider_id: zai model_id_on_provider: glm-4.7 - provider_id: openrouter model_id_on_provider: z-ai/glm-4.7 + model_info: https://openrouter.ai/z-ai/glm-4.7 diff --git a/models/glm-5-turbo.yaml b/models/glm-5-turbo.yaml index 6e1710d..7387bf2 100644 --- a/models/glm-5-turbo.yaml +++ b/models/glm-5-turbo.yaml @@ -6,12 +6,15 @@ model_info: https://docs.z.ai/guides/overview/pricing model_type: chat context_window: 200000 max_tokens: 131072 -cost_per_token: - input: 0.0000012 - output: 0.000004 +cost_per_million_tokens: + input: 1.2 + output: 4 tuning: [function] +input_type: [text] +output_type: [text] providers: - provider_id: zai model_id_on_provider: glm-5-turbo - provider_id: openrouter model_id_on_provider: z-ai/glm-5-turbo + model_info: https://openrouter.ai/z-ai/glm-5-turbo diff --git a/models/glm-5.1.yaml b/models/glm-5.1.yaml index 74499a3..77e95fe 100644 --- a/models/glm-5.1.yaml +++ b/models/glm-5.1.yaml @@ -6,12 +6,15 @@ model_info: https://docs.z.ai/guides/overview/pricing model_type: chat context_window: 200000 max_tokens: 131072 -cost_per_token: - input: 0.0000014 - output: 0.0000044 +cost_per_million_tokens: + input: 1.4 + output: 4.4 tuning: [function] +input_type: [text] +output_type: [text] providers: - provider_id: zai model_id_on_provider: glm-5.1 - provider_id: openrouter model_id_on_provider: z-ai/glm-5.1 + model_info: https://openrouter.ai/z-ai/glm-5.1 diff --git a/models/glm-5.yaml b/models/glm-5.yaml index 308aa5a..126ebbf 100644 --- a/models/glm-5.yaml +++ b/models/glm-5.yaml @@ -6,12 +6,15 @@ model_info: https://docs.z.ai/guides/overview/pricing model_type: chat context_window: 204800 max_tokens: 131072 -cost_per_token: - input: 0.000001 - output: 0.0000032 +cost_per_million_tokens: + input: 1 + output: 3.2 tuning: [function, instruction] +input_type: [text] +output_type: [text] providers: - provider_id: zai model_id_on_provider: glm-5 - provider_id: openrouter model_id_on_provider: z-ai/glm-5 + model_info: https://openrouter.ai/z-ai/glm-5 diff --git a/models/glm-5v-turbo.yaml b/models/glm-5v-turbo.yaml index 8c173bc..94cf77b 100644 --- a/models/glm-5v-turbo.yaml +++ b/models/glm-5v-turbo.yaml @@ -6,12 +6,15 @@ model_info: https://docs.z.ai/guides/overview/pricing model_type: chat context_window: 200000 max_tokens: 131072 -cost_per_token: - input: 0.0000012 - output: 0.000004 +cost_per_million_tokens: + input: 1.2 + output: 4 tuning: [multimodal, function] +input_type: [text, image, video] +output_type: [text] providers: - provider_id: zai model_id_on_provider: glm-5v-turbo - provider_id: openrouter model_id_on_provider: z-ai/glm-5v-turbo + model_info: https://openrouter.ai/z-ai/glm-5v-turbo diff --git a/models/gpt-3.5-turbo-16k.yaml b/models/gpt-3.5-turbo-16k.yaml index 857873b..5e4e3f7 100644 --- a/models/gpt-3.5-turbo-16k.yaml +++ b/models/gpt-3.5-turbo-16k.yaml @@ -7,15 +7,17 @@ model_version: "0613" model_type: chat context_window: 16385 max_tokens: 4096 -cost_per_token: - input: 0.000003 - output: 0.000004 +cost_per_million_tokens: + input: 3 + output: 4 knowledge_cutoff: "2021-09-01" tokenizer: family: tiktoken name: cl100k_base tuning: [instruction] deprecated: true +input_type: [text] +output_type: [text] providers: - provider_id: openai model_id_on_provider: gpt-3.5-turbo-16k-0613 diff --git a/models/gpt-3.5-turbo-instruct.yaml b/models/gpt-3.5-turbo-instruct.yaml index a9b4de4..5c246da 100644 --- a/models/gpt-3.5-turbo-instruct.yaml +++ b/models/gpt-3.5-turbo-instruct.yaml @@ -7,9 +7,9 @@ model_version: latest model_type: completion context_window: 4097 max_tokens: 4095 -cost_per_token: - input: 0.0000015 - output: 0.000002 +cost_per_million_tokens: + input: 1.5 + output: 2 knowledge_cutoff: "2021-09-01" tokenizer: family: tiktoken @@ -18,3 +18,6 @@ tuning: - instruction - function deprecated: true + +input_type: [text] +output_type: [text] diff --git a/models/gpt-3.5-turbo.yaml b/models/gpt-3.5-turbo.yaml index 6ff0e05..0a4d291 100644 --- a/models/gpt-3.5-turbo.yaml +++ b/models/gpt-3.5-turbo.yaml @@ -7,15 +7,17 @@ model_version: latest model_type: chat context_window: 4097 max_tokens: 4095 -cost_per_token: - input: 0.0000015 - output: 0.000002 +cost_per_million_tokens: + input: 1.5 + output: 2 knowledge_cutoff: "2021-09-01" tokenizer: family: tiktoken name: cl100k_base tuning: [function] deprecated: true +input_type: [text] +output_type: [text] providers: - provider_id: openai model_id_on_provider: gpt-3.5-turbo diff --git a/models/gpt-4-32k.yaml b/models/gpt-4-32k.yaml index 5832c4c..7b44c04 100644 --- a/models/gpt-4-32k.yaml +++ b/models/gpt-4-32k.yaml @@ -6,9 +6,9 @@ model_info: https://platform.openai.com/docs/models/gpt-4 model_version: latest model_type: chat context_window: 32768 -cost_per_token: - input: 0.00006 - output: 0.00012 +cost_per_million_tokens: + input: 60 + output: 120 knowledge_cutoff: "2021-09-01" tokenizer: family: tiktoken @@ -16,3 +16,6 @@ tokenizer: tuning: - function deprecated: true + +input_type: [text] +output_type: [text] diff --git a/models/gpt-4-turbo.yaml b/models/gpt-4-turbo.yaml index 6256aa1..7431bc1 100644 --- a/models/gpt-4-turbo.yaml +++ b/models/gpt-4-turbo.yaml @@ -6,16 +6,19 @@ model_info: https://platform.openai.com/docs/models/gpt-4-turbo model_type: chat context_window: 128000 max_tokens: 4096 -cost_per_token: - input: 0.00001 - output: 0.00003 +cost_per_million_tokens: + input: 10 + output: 30 knowledge_cutoff: "2023-12-01" tokenizer: family: tiktoken name: o200k_base tuning: [multimodal, function] +input_type: [text, image] +output_type: [text] providers: - provider_id: openai model_id_on_provider: gpt-4-turbo - provider_id: openrouter model_id_on_provider: openai/gpt-4-turbo + model_info: https://openrouter.ai/openai/gpt-4-turbo diff --git a/models/gpt-4.1-mini.yaml b/models/gpt-4.1-mini.yaml index bfb57b3..50f0ea9 100644 --- a/models/gpt-4.1-mini.yaml +++ b/models/gpt-4.1-mini.yaml @@ -6,16 +6,19 @@ model_info: https://platform.openai.com/docs/models/gpt-4.1-mini model_type: chat context_window: 1047576 max_tokens: 32768 -cost_per_token: - input: 4e-7 - output: 0.0000016 +cost_per_million_tokens: + input: 0.4 + output: 1.6 knowledge_cutoff: "2024-04-01" tokenizer: family: tiktoken name: o200k_base tuning: [multimodal, function] +input_type: [text, image] +output_type: [text] providers: - provider_id: openai model_id_on_provider: gpt-4.1-mini - provider_id: openrouter model_id_on_provider: openai/gpt-4.1-mini + model_info: https://openrouter.ai/openai/gpt-4.1-mini diff --git a/models/gpt-4.1-nano.yaml b/models/gpt-4.1-nano.yaml index 96d17d6..64e42db 100644 --- a/models/gpt-4.1-nano.yaml +++ b/models/gpt-4.1-nano.yaml @@ -6,16 +6,19 @@ model_info: https://platform.openai.com/docs/models/gpt-4.1-nano model_type: chat context_window: 1047576 max_tokens: 32768 -cost_per_token: - input: 1e-7 - output: 4e-7 +cost_per_million_tokens: + input: 0.1 + output: 0.4 knowledge_cutoff: "2024-04-01" tokenizer: family: tiktoken name: o200k_base tuning: [multimodal, function] +input_type: [text, image] +output_type: [text] providers: - provider_id: openai model_id_on_provider: gpt-4.1-nano - provider_id: openrouter model_id_on_provider: openai/gpt-4.1-nano + model_info: https://openrouter.ai/openai/gpt-4.1-nano diff --git a/models/gpt-4.1.yaml b/models/gpt-4.1.yaml index 78d8251..65c0770 100644 --- a/models/gpt-4.1.yaml +++ b/models/gpt-4.1.yaml @@ -6,16 +6,19 @@ model_info: https://platform.openai.com/docs/models/gpt-4.1 model_type: chat context_window: 1047576 max_tokens: 32768 -cost_per_token: - input: 0.000002 - output: 0.000008 +cost_per_million_tokens: + input: 2 + output: 8 knowledge_cutoff: "2024-04-01" tokenizer: family: tiktoken name: o200k_base tuning: [multimodal, function] +input_type: [text, image] +output_type: [text] providers: - provider_id: openai model_id_on_provider: gpt-4.1 - provider_id: openrouter model_id_on_provider: openai/gpt-4.1 + model_info: https://openrouter.ai/openai/gpt-4.1 diff --git a/models/gpt-4.5.yaml b/models/gpt-4.5.yaml index c47eab4..b222152 100644 --- a/models/gpt-4.5.yaml +++ b/models/gpt-4.5.yaml @@ -5,15 +5,16 @@ model_description: GPT-4 successor with improved reasoning and instruction follo model_info: https://platform.openai.com/docs/models/gpt-4.5 model_type: chat context_window: 128000 -cost_per_token: - input: 0.000010 - output: 0.000030 +cost_per_million_tokens: + input: 10 + output: 30 tuning: [function] tokenizer: family: tiktoken name: o200k_base +deprecated: true +input_type: [text, image] +output_type: [text] providers: - provider_id: openai model_id_on_provider: gpt-4.5 - - provider_id: openrouter - model_id_on_provider: openai/gpt-4.5 \ No newline at end of file diff --git a/models/gpt-4.yaml b/models/gpt-4.yaml index 60f2ad7..eb7f698 100644 --- a/models/gpt-4.yaml +++ b/models/gpt-4.yaml @@ -7,9 +7,9 @@ model_version: latest model_type: chat context_window: 8192 max_tokens: 8191 -cost_per_token: - input: 0.00003 - output: 0.00006 +cost_per_million_tokens: + input: 30 + output: 60 knowledge_cutoff: "2021-09-01" tokenizer: family: tiktoken @@ -17,6 +17,8 @@ tokenizer: tuning: - function deprecated: true +input_type: [text] +output_type: [text] providers: - provider_id: openai model_id_on_provider: gpt-4 diff --git a/models/gpt-4o-mini.yaml b/models/gpt-4o-mini.yaml index 2ff4857..284bde8 100644 --- a/models/gpt-4o-mini.yaml +++ b/models/gpt-4o-mini.yaml @@ -6,15 +6,18 @@ model_info: https://platform.openai.com/docs/models/gpt-4o-mini model_type: chat context_window: 128000 max_tokens: 16384 -cost_per_token: - input: 0.00000015 - output: 0.00000060 +cost_per_million_tokens: + input: 0.15 + output: 0.6 tuning: [multimodal] tokenizer: family: tiktoken name: o200k_base +input_type: [text, image] +output_type: [text] providers: - provider_id: openai model_id_on_provider: gpt-4o-mini - provider_id: openrouter - model_id_on_provider: openai/gpt-4o-mini \ No newline at end of file + model_id_on_provider: openai/gpt-4o-mini + model_info: https://openrouter.ai/openai/gpt-4o-mini \ No newline at end of file diff --git a/models/gpt-4o.yaml b/models/gpt-4o.yaml index b148213..ecb09e2 100644 --- a/models/gpt-4o.yaml +++ b/models/gpt-4o.yaml @@ -6,15 +6,21 @@ model_info: https://platform.openai.com/docs/models/gpt-4o model_type: chat context_window: 128000 max_tokens: 32768 -cost_per_token: - input: 0.000005 - output: 0.000015 +cost_per_million_tokens: + input: 5 + output: 15 tuning: [multimodal] tokenizer: family: tiktoken name: o200k_base +input_type: [text, image, audio] +output_type: [text] providers: - provider_id: openai model_id_on_provider: gpt-4o - provider_id: openrouter - model_id_on_provider: openai/gpt-4o \ No newline at end of file + model_id_on_provider: openai/gpt-4o + cost_per_million_tokens: + input: 2.5 + output: 10 + model_info: https://openrouter.ai/openai/gpt-4o diff --git a/models/gpt-5-mini.yaml b/models/gpt-5-mini.yaml index 458a325..25bcb54 100644 --- a/models/gpt-5-mini.yaml +++ b/models/gpt-5-mini.yaml @@ -6,16 +6,19 @@ model_info: https://platform.openai.com/docs/models/gpt-5-mini model_type: chat context_window: 400000 max_tokens: 128000 -cost_per_token: - input: 2.5e-7 - output: 0.000002 +cost_per_million_tokens: + input: 0.25 + output: 2 knowledge_cutoff: "2024-05-30" tokenizer: family: tiktoken name: o200k_base tuning: [multimodal, function] +input_type: [text, image] +output_type: [text] providers: - provider_id: openai model_id_on_provider: gpt-5-mini - provider_id: openrouter model_id_on_provider: openai/gpt-5-mini + model_info: https://openrouter.ai/openai/gpt-5-mini diff --git a/models/gpt-5-nano.yaml b/models/gpt-5-nano.yaml index a48f51a..0b40c0c 100644 --- a/models/gpt-5-nano.yaml +++ b/models/gpt-5-nano.yaml @@ -6,16 +6,19 @@ model_info: https://platform.openai.com/docs/models/gpt-5-nano model_type: chat context_window: 400000 max_tokens: 128000 -cost_per_token: - input: 5e-8 - output: 4e-7 +cost_per_million_tokens: + input: 0.05 + output: 0.4 knowledge_cutoff: "2024-05-30" tokenizer: family: tiktoken name: o200k_base tuning: [multimodal, function] +input_type: [text, image] +output_type: [text] providers: - provider_id: openai model_id_on_provider: gpt-5-nano - provider_id: openrouter model_id_on_provider: openai/gpt-5-nano + model_info: https://openrouter.ai/openai/gpt-5-nano diff --git a/models/gpt-5.3-codex.yaml b/models/gpt-5.3-codex.yaml index 53b1f21..a32c190 100644 --- a/models/gpt-5.3-codex.yaml +++ b/models/gpt-5.3-codex.yaml @@ -6,16 +6,19 @@ model_info: https://platform.openai.com/docs/models/gpt-5.3-codex model_type: chat context_window: 400000 max_tokens: 128000 -cost_per_token: - input: 0.00000175 - output: 0.000014 +cost_per_million_tokens: + input: 1.75 + output: 14 knowledge_cutoff: "2025-08-31" tokenizer: family: tiktoken name: o200k_base tuning: [multimodal, function] +input_type: [text, image] +output_type: [text] providers: - provider_id: openai model_id_on_provider: gpt-5.3-codex - provider_id: openrouter model_id_on_provider: openai/gpt-5.3-codex + model_info: https://openrouter.ai/openai/gpt-5.3-codex diff --git a/models/gpt-5.4-image-2.yaml b/models/gpt-5.4-image-2.yaml index e3dd0ce..07d700f 100644 --- a/models/gpt-5.4-image-2.yaml +++ b/models/gpt-5.4-image-2.yaml @@ -5,12 +5,15 @@ model_description: GPT-5.4 optimized for image understanding and generation. Mul model_info: https://platform.openai.com/docs/models/gpt-5.4-image-2 model_type: chat context_window: 272000 -cost_per_token: - input: 0.000008 - output: 0.000015 +cost_per_million_tokens: + input: 8 + output: 15 tuning: [multimodal] +input_type: [text, image] +output_type: [text, image] providers: - provider_id: openai model_id_on_provider: gpt-5.4-image-2 - provider_id: openrouter - model_id_on_provider: openai/gpt-5.4-image-2 \ No newline at end of file + model_id_on_provider: openai/gpt-5.4-image-2 + model_info: https://openrouter.ai/openai/gpt-5.4-image-2 \ No newline at end of file diff --git a/models/gpt-5.4-mini.yaml b/models/gpt-5.4-mini.yaml index bc1a977..4c56e74 100644 --- a/models/gpt-5.4-mini.yaml +++ b/models/gpt-5.4-mini.yaml @@ -6,16 +6,19 @@ model_info: https://platform.openai.com/docs/models/gpt-5.4-mini model_type: chat context_window: 400000 max_tokens: 128000 -cost_per_token: - input: 7.5e-7 - output: 0.0000045 +cost_per_million_tokens: + input: 0.75 + output: 4.5 knowledge_cutoff: "2025-08-31" tokenizer: family: tiktoken name: o200k_base tuning: [multimodal, function] +input_type: [text, image] +output_type: [text] providers: - provider_id: openai model_id_on_provider: gpt-5.4-mini - provider_id: openrouter model_id_on_provider: openai/gpt-5.4-mini + model_info: https://openrouter.ai/openai/gpt-5.4-mini diff --git a/models/gpt-5.4-nano.yaml b/models/gpt-5.4-nano.yaml index 9a4669c..b9d0bf6 100644 --- a/models/gpt-5.4-nano.yaml +++ b/models/gpt-5.4-nano.yaml @@ -6,16 +6,19 @@ model_info: https://platform.openai.com/docs/models/gpt-5.4-nano model_type: chat context_window: 400000 max_tokens: 128000 -cost_per_token: - input: 2e-7 - output: 0.00000125 +cost_per_million_tokens: + input: 0.2 + output: 1.25 knowledge_cutoff: "2025-08-31" tokenizer: family: tiktoken name: o200k_base tuning: [multimodal, function] +input_type: [text, image] +output_type: [text] providers: - provider_id: openai model_id_on_provider: gpt-5.4-nano - provider_id: openrouter model_id_on_provider: openai/gpt-5.4-nano + model_info: https://openrouter.ai/openai/gpt-5.4-nano diff --git a/models/gpt-5.4-pro.yaml b/models/gpt-5.4-pro.yaml index a454986..c29612c 100644 --- a/models/gpt-5.4-pro.yaml +++ b/models/gpt-5.4-pro.yaml @@ -6,16 +6,19 @@ model_info: https://platform.openai.com/docs/models/gpt-5.4-pro model_type: chat context_window: 1050000 max_tokens: 128000 -cost_per_token: - input: 0.00003 - output: 0.00018 +cost_per_million_tokens: + input: 30 + output: 180 knowledge_cutoff: "2025-08-31" tokenizer: family: tiktoken name: o200k_base tuning: [multimodal, function] +input_type: [text, image] +output_type: [text] providers: - provider_id: openai model_id_on_provider: gpt-5.4-pro - provider_id: openrouter model_id_on_provider: openai/gpt-5.4-pro + model_info: https://openrouter.ai/openai/gpt-5.4-pro diff --git a/models/gpt-5.4.yaml b/models/gpt-5.4.yaml index eb99079..063ac60 100644 --- a/models/gpt-5.4.yaml +++ b/models/gpt-5.4.yaml @@ -6,16 +6,19 @@ model_info: https://platform.openai.com/docs/models/gpt-5.4 model_type: chat context_window: 1050000 max_tokens: 128000 -cost_per_token: - input: 0.0000025 - output: 0.000015 +cost_per_million_tokens: + input: 2.5 + output: 15 knowledge_cutoff: "2025-08-31" tokenizer: family: tiktoken name: o200k_base tuning: [multimodal, function] +input_type: [text, image] +output_type: [text] providers: - provider_id: openai model_id_on_provider: gpt-5.4 - provider_id: openrouter model_id_on_provider: openai/gpt-5.4 + model_info: https://openrouter.ai/openai/gpt-5.4 diff --git a/models/gpt-5.5-pro.yaml b/models/gpt-5.5-pro.yaml index 8862879..4e8727e 100644 --- a/models/gpt-5.5-pro.yaml +++ b/models/gpt-5.5-pro.yaml @@ -6,12 +6,15 @@ model_info: https://platform.openai.com/docs/models/gpt-5.5-pro model_type: chat context_window: 1050000 max_tokens: 1049999 -cost_per_token: - input: 0.000030 - output: 0.000180 +cost_per_million_tokens: + input: 30 + output: 180 tuning: [function] +input_type: [text] +output_type: [text] providers: - provider_id: openai model_id_on_provider: gpt-5.5-pro - provider_id: openrouter - model_id_on_provider: openai/gpt-5.5-pro \ No newline at end of file + model_id_on_provider: openai/gpt-5.5-pro + model_info: https://openrouter.ai/openai/gpt-5.5-pro \ No newline at end of file diff --git a/models/gpt-5.5.yaml b/models/gpt-5.5.yaml index bbb2cda..4f1ccab 100644 --- a/models/gpt-5.5.yaml +++ b/models/gpt-5.5.yaml @@ -6,12 +6,15 @@ model_info: https://platform.openai.com/docs/models/gpt-5.5 model_type: chat context_window: 1050000 max_tokens: 1049999 -cost_per_token: - input: 0.000005 - output: 0.000030 +cost_per_million_tokens: + input: 5 + output: 30 tuning: [function] +input_type: [text] +output_type: [text] providers: - provider_id: openai model_id_on_provider: gpt-5.5 - provider_id: openrouter - model_id_on_provider: openai/gpt-5.5 \ No newline at end of file + model_id_on_provider: openai/gpt-5.5 + model_info: https://openrouter.ai/openai/gpt-5.5 \ No newline at end of file diff --git a/models/gpt-5.yaml b/models/gpt-5.yaml index 509de0b..058e940 100644 --- a/models/gpt-5.yaml +++ b/models/gpt-5.yaml @@ -6,16 +6,19 @@ model_info: https://platform.openai.com/docs/models/gpt-5 model_type: chat context_window: 400000 max_tokens: 128000 -cost_per_token: - input: 0.00000125 - output: 0.00001 +cost_per_million_tokens: + input: 1.25 + output: 10 knowledge_cutoff: "2024-09-30" tokenizer: family: tiktoken name: o200k_base tuning: [multimodal, function] +input_type: [text, image] +output_type: [text] providers: - provider_id: openai model_id_on_provider: gpt-5 - provider_id: openrouter model_id_on_provider: openai/gpt-5 + model_info: https://openrouter.ai/openai/gpt-5 diff --git a/models/grok-4.2-multi-agent.yaml b/models/grok-4.2-multi-agent.yaml deleted file mode 100644 index 55a467c..0000000 --- a/models/grok-4.2-multi-agent.yaml +++ /dev/null @@ -1,15 +0,0 @@ -model_id: grok-4.2-multi-agent -model_name: Grok 4.2 Multi-Agent -model_provider: x-ai -model_description: Grok 4.2 optimized for multi-agent workflows. Enhanced tool use and coordination for parallel task execution. -model_info: https://x.ai/api -model_type: chat -context_window: 2000000 -cost_per_token: - input: 0.000002 - output: 0.000006 -providers: - - provider_id: x-ai - model_id_on_provider: grok-4.2 - - provider_id: openrouter - model_id_on_provider: x-ai/grok-4.2-multi-agent \ No newline at end of file diff --git a/models/grok-4.2.yaml b/models/grok-4.2.yaml deleted file mode 100644 index 916b5fd..0000000 --- a/models/grok-4.2.yaml +++ /dev/null @@ -1,16 +0,0 @@ -model_id: grok-4.2 -model_name: Grok 4.2 -model_provider: x-ai -model_description: xAI's flagship model. Strong reasoning with real-time web access. Known for personality and directness. -model_info: https://x.ai/api -model_type: chat -context_window: 2000000 -cost_per_token: - input: 0.000002 - output: 0.000006 -tuning: [function] -providers: - - provider_id: x-ai - model_id_on_provider: grok-4.2 - - provider_id: openrouter - model_id_on_provider: x-ai/grok-4.2 \ No newline at end of file diff --git a/models/grok-4.20-multi-agent.yaml b/models/grok-4.20-multi-agent.yaml new file mode 100644 index 0000000..91c7c73 --- /dev/null +++ b/models/grok-4.20-multi-agent.yaml @@ -0,0 +1,25 @@ +model_id: grok-4.20-multi-agent +model_name: Grok 4.20 Multi-Agent +model_provider: x-ai +model_description: Grok 4.20 optimized for multi-agent workflows. Enhanced coordination for parallel task execution. +model_info: https://x.ai/api +model_type: chat +context_window: 2000000 +max_tokens: 30000 +cost_per_million_tokens: + input: 1.25 + cached_input: 0.2 + output: 2.5 +tuning: [reasoning, multimodal] +input_type: [text, image, other] +output_type: [text] +providers: + - provider_id: x-ai + model_id_on_provider: grok-4.20-multi-agent-0309 + - provider_id: openrouter + model_id_on_provider: x-ai/grok-4.20-multi-agent + cost_per_million_tokens: + input: 2 + cached_input: 0.2 + output: 6 + model_info: https://openrouter.ai/x-ai/grok-4.20-multi-agent diff --git a/models/grok-4.20.yaml b/models/grok-4.20.yaml new file mode 100644 index 0000000..fbf5374 --- /dev/null +++ b/models/grok-4.20.yaml @@ -0,0 +1,21 @@ +model_id: grok-4.20 +model_name: Grok 4.20 +model_provider: x-ai +model_description: xAI's flagship model. Strong reasoning with real-time web access. Known for personality and directness. +model_info: https://x.ai/api +model_type: chat +context_window: 2000000 +max_tokens: 30000 +cost_per_million_tokens: + input: 1.25 + cached_input: 0.2 + output: 2.5 +tuning: [function, reasoning, multimodal] +input_type: [text, image, other] +output_type: [text] +providers: + - provider_id: x-ai + model_id_on_provider: grok-4.20-0309-reasoning + - provider_id: openrouter + model_id_on_provider: x-ai/grok-4.20 + model_info: https://openrouter.ai/x-ai/grok-4.20 diff --git a/models/kimi-k2.6.yaml b/models/kimi-k2.6.yaml index f51849f..e1187df 100644 --- a/models/kimi-k2.6.yaml +++ b/models/kimi-k2.6.yaml @@ -5,10 +5,12 @@ model_description: Moonshot AI's flagship model. Strong long-context understandi model_info: https://platform.moonshot.ai/docs model_type: chat context_window: 256000 -cost_per_token: - input: 0.00000074 - output: 0.00000466 +cost_per_million_tokens: + input: 0.74 + output: 4.66 tuning: [function] +input_type: [text] +output_type: [text] providers: - provider_id: moonshotai model_id_on_provider: kimi-k2.6 @@ -16,3 +18,4 @@ providers: model_id_on_provider: "@cf/moonshotai/kimi-k2.6" - provider_id: openrouter model_id_on_provider: moonshotai/kimi-k2.6 + model_info: https://openrouter.ai/moonshotai/kimi-k2.6 diff --git a/models/kimi-v3.yaml b/models/kimi-v3.yaml deleted file mode 100644 index 1ea10a9..0000000 --- a/models/kimi-v3.yaml +++ /dev/null @@ -1,15 +0,0 @@ -model_id: kimi-v3 -model_name: Kimi V3 -model_provider: moonshotai -model_description: Mid-range Moonshot model. Good balance of capability and cost for standard tasks. -model_info: https://platform.moonshot.ai/docs -model_type: chat -context_window: 256000 -cost_per_token: - input: 0.00000020 - output: 0.000001 -providers: - - provider_id: moonshotai - model_id_on_provider: kimi-v3 - - provider_id: openrouter - model_id_on_provider: moonshotai/kimi-v3 \ No newline at end of file diff --git a/models/llama-3.1-8b-instant.yaml b/models/llama-3.1-8b-instant.yaml index 79e41c3..67f696c 100644 --- a/models/llama-3.1-8b-instant.yaml +++ b/models/llama-3.1-8b-instant.yaml @@ -6,11 +6,13 @@ model_info: https://console.groq.com/docs/models model_type: chat context_window: 131072 max_tokens: 131072 -cost_per_token: - input: 5e-8 - output: 8e-8 +cost_per_million_tokens: + input: 0.05 + output: 0.08 knowledge_cutoff: "2023-12-01" tuning: [function, instruction] +input_type: [text] +output_type: [text] providers: - provider_id: groq model_id_on_provider: llama-3.1-8b-instant diff --git a/models/llama-3.3-70b-versatile.yaml b/models/llama-3.3-70b-versatile.yaml index 4ddbea7..9eea5cc 100644 --- a/models/llama-3.3-70b-versatile.yaml +++ b/models/llama-3.3-70b-versatile.yaml @@ -6,11 +6,13 @@ model_info: https://console.groq.com/docs/models model_type: chat context_window: 131072 max_tokens: 32768 -cost_per_token: - input: 5.9e-7 - output: 7.9e-7 +cost_per_million_tokens: + input: 0.59 + output: 0.79 knowledge_cutoff: "2023-12-01" tuning: [function, instruction] +input_type: [text] +output_type: [text] providers: - provider_id: groq model_id_on_provider: llama-3.3-70b-versatile diff --git a/models/minimax-m2.1-highspeed.yaml b/models/minimax-m2.1-highspeed.yaml deleted file mode 100644 index 3cde692..0000000 --- a/models/minimax-m2.1-highspeed.yaml +++ /dev/null @@ -1,15 +0,0 @@ -model_id: minimax-m2.1-highspeed -model_name: MiniMax M2.1-highspeed -model_provider: minimax -model_description: High-speed MiniMax M2.1 variant for faster multilingual programming and agent workflows. -model_info: "https://platform.minimax.io/docs/guides/text-generation" -model_type: chat -context_window: 204800 -max_tokens: 131072 -cost_per_token: - input: 6e-7 - output: 0.0000024 -tuning: [function, instruction, code, multilingual] -providers: - - provider_id: minimax - model_id_on_provider: MiniMax-M2.1-highspeed diff --git a/models/minimax-m2.1.yaml b/models/minimax-m2.1.yaml index 7c26b32..1deddfa 100644 --- a/models/minimax-m2.1.yaml +++ b/models/minimax-m2.1.yaml @@ -6,12 +6,15 @@ model_info: "https://platform.minimax.io/docs/guides/text-generation" model_type: chat context_window: 204800 max_tokens: 131072 -cost_per_token: - input: 3e-7 - output: 0.0000012 +cost_per_million_tokens: + input: 0.3 + output: 1.2 tuning: [function, instruction, code, multilingual] +input_type: [text] +output_type: [text] providers: - provider_id: minimax model_id_on_provider: MiniMax-M2.1 - provider_id: openrouter model_id_on_provider: minimax/minimax-m2.1 + model_info: https://openrouter.ai/minimax/minimax-m2.1 diff --git a/models/minimax-m2.5-highspeed.yaml b/models/minimax-m2.5-highspeed.yaml index 4d39a34..503439c 100644 --- a/models/minimax-m2.5-highspeed.yaml +++ b/models/minimax-m2.5-highspeed.yaml @@ -6,10 +6,12 @@ model_info: "https://platform.minimax.io/docs/guides/text-generation" model_type: chat context_window: 204800 max_tokens: 131072 -cost_per_token: - input: 6e-7 - output: 0.0000024 +cost_per_million_tokens: + input: 0.6 + output: 2.4 tuning: [function, instruction, code, multilingual] +input_type: [text] +output_type: [text] providers: - provider_id: minimax model_id_on_provider: MiniMax-M2.5-highspeed diff --git a/models/minimax-m2.5.yaml b/models/minimax-m2.5.yaml index 9dfc15a..182e848 100644 --- a/models/minimax-m2.5.yaml +++ b/models/minimax-m2.5.yaml @@ -2,16 +2,19 @@ model_id: minimax-m2.5 model_name: MiniMax M2.5 model_provider: minimax model_description: MiniMax M2.5 model for complex programming, agent, and productivity tasks. -model_info: "https://platform.minimax.io/docs/guides/text-generation" +model_info: "https://www.minimax.io/models/text" model_type: chat context_window: 204800 max_tokens: 131072 -cost_per_token: - input: 3e-7 - output: 0.0000012 +cost_per_million_tokens: + input: 0.3 + output: 1.2 tuning: [function, instruction, code, multilingual] +input_type: [text] +output_type: [text] providers: - provider_id: minimax model_id_on_provider: MiniMax-M2.5 - provider_id: openrouter model_id_on_provider: minimax/minimax-m2.5 + model_info: https://openrouter.ai/minimax/minimax-m2.5 diff --git a/models/minimax-m2.7-highspeed.yaml b/models/minimax-m2.7-highspeed.yaml index 904492c..d1dc1ff 100644 --- a/models/minimax-m2.7-highspeed.yaml +++ b/models/minimax-m2.7-highspeed.yaml @@ -6,10 +6,12 @@ model_info: "https://platform.minimax.io/docs/guides/text-generation" model_type: chat context_window: 204800 max_tokens: 131072 -cost_per_token: - input: 6e-7 - output: 0.0000024 +cost_per_million_tokens: + input: 0.6 + output: 2.4 tuning: [function, instruction, code, multilingual] +input_type: [text] +output_type: [text] providers: - provider_id: minimax model_id_on_provider: MiniMax-M2.7-highspeed diff --git a/models/minimax-m2.7.yaml b/models/minimax-m2.7.yaml index 7e96c87..a87930b 100644 --- a/models/minimax-m2.7.yaml +++ b/models/minimax-m2.7.yaml @@ -6,12 +6,15 @@ model_info: "https://platform.minimax.io/docs/guides/text-generation" model_type: chat context_window: 204800 max_tokens: 131072 -cost_per_token: - input: 3e-7 - output: 0.0000012 +cost_per_million_tokens: + input: 0.3 + output: 1.2 tuning: [function, instruction, code, multilingual] +input_type: [text] +output_type: [text] providers: - provider_id: minimax model_id_on_provider: MiniMax-M2.7 - provider_id: openrouter model_id_on_provider: minimax/minimax-m2.7 + model_info: https://openrouter.ai/minimax/minimax-m2.7 diff --git a/models/minimax-m2.yaml b/models/minimax-m2.yaml index 4232b0f..caaf685 100644 --- a/models/minimax-m2.yaml +++ b/models/minimax-m2.yaml @@ -6,12 +6,15 @@ model_info: "https://platform.minimax.io/docs/guides/text-generation" model_type: chat context_window: 204800 max_tokens: 128000 -cost_per_token: - input: 3e-7 - output: 0.0000012 +cost_per_million_tokens: + input: 0.3 + output: 1.2 tuning: [function, instruction, code, multilingual] +input_type: [text] +output_type: [text] providers: - provider_id: minimax model_id_on_provider: MiniMax-M2 - provider_id: openrouter model_id_on_provider: minimax/minimax-m2 + model_info: https://openrouter.ai/minimax/minimax-m2 diff --git a/models/minimax-m3.yaml b/models/minimax-m3.yaml new file mode 100644 index 0000000..1dd9ed0 --- /dev/null +++ b/models/minimax-m3.yaml @@ -0,0 +1,28 @@ +model_id: minimax-m3 +model_name: MiniMax M3 +model_provider: minimax +model_description: | + MiniMax-M3 is a multimodal foundation model from MiniMax. It supports text, image, and video inputs with text output, a 1M-token context window, and is suited for + long-horizon agentic work, coding, and tool use. It is built on MiniMax Sparse Attention (MSA), which replaces full attention with KV-block selection to cut per-token + compute at long context — roughly 1/20 the cost of the previous generation at 1M tokens, with substantially faster prefill and decode while retaining quality across + most tasks. +model_info: "https://www.minimax.io/models/text/m3" +model_type: chat +context_window: 512000 +max_tokens: 128000 +cost_per_million_tokens: + input: 0.6 + output: 2.4 +tuning: [function, instruction, code, multilingual] +input_type: [text, image, video] +output_type: [text] +providers: + - provider_id: minimax + model_id_on_provider: MiniMax-M3 + - provider_id: openrouter + model_id_on_provider: minimax/minimax-m3 + cost_per_million_tokens: + input: 0.3 + cached_input: 0.06 + output: 1.2 + model_info: https://openrouter.ai/minimax/minimax-m3 diff --git a/models/mistral-7b-instruct.yaml b/models/mistral-7b-instruct.yaml index 5cd4a92..0cffb8e 100644 --- a/models/mistral-7b-instruct.yaml +++ b/models/mistral-7b-instruct.yaml @@ -8,8 +8,8 @@ context_window: 8192 tuning: - instruction deprecated: true +input_type: [text] +output_type: [text] providers: - provider_id: mistralai - model_id_on_provider: mistral-7b-instruct-0.3 - - provider_id: openrouter - model_id_on_provider: mistralai/mistral-7b-instruct + model_id_on_provider: mistral-7b-instruct-0.3 \ No newline at end of file diff --git a/models/mistral-7b.yaml b/models/mistral-7b.yaml index 813f128..88b1527 100644 --- a/models/mistral-7b.yaml +++ b/models/mistral-7b.yaml @@ -5,10 +5,12 @@ model_description: Mistral-7B-v0.1 is a small yet powerful model adaptable to ma model_info: https://mistral.ai/news/announcing-mistral-7b/ model_type: chat context_window: 8192 -cost_per_token: 0 +cost_per_million_tokens: + input: 0 + output: 0 deprecated: true +input_type: [text] +output_type: [text] providers: - provider_id: mistralai - model_id_on_provider: open-mistral-7b - - provider_id: openrouter - model_id_on_provider: mistralai/mistral-7b + model_id_on_provider: open-mistral-7b \ No newline at end of file diff --git a/models/mistral-large-2411.yaml b/models/mistral-large-2411.yaml index fb72d65..554e3ac 100644 --- a/models/mistral-large-2411.yaml +++ b/models/mistral-large-2411.yaml @@ -6,15 +6,15 @@ model_info: https://docs.mistral.ai/getting-started/models/models_overview/ model_type: chat context_window: 131072 max_tokens: 16384 -cost_per_token: - input: 0.000002 - output: 0.000006 +cost_per_million_tokens: + input: 2 + output: 6 knowledge_cutoff: "2024-11-01" tokenizer: family: tekken tuning: [function, instruction] +input_type: [text] +output_type: [text] providers: - provider_id: mistralai - model_id_on_provider: mistral-large-2411 - - provider_id: openrouter - model_id_on_provider: mistralai/mistral-large-2411 + model_id_on_provider: mistral-large-2411 \ No newline at end of file diff --git a/models/mistral-large-2512.yaml b/models/mistral-large-2512.yaml index 5f59ff4..465f32c 100644 --- a/models/mistral-large-2512.yaml +++ b/models/mistral-large-2512.yaml @@ -6,15 +6,18 @@ model_info: https://docs.mistral.ai/getting-started/models/models_overview/ model_type: chat context_window: 262144 max_tokens: 262144 -cost_per_token: - input: 5e-7 - output: 0.0000015 +cost_per_million_tokens: + input: 0.5 + output: 1.5 knowledge_cutoff: "2024-11-01" tokenizer: family: tekken tuning: [multimodal, function, instruction] +input_type: [text, image] +output_type: [text] providers: - provider_id: mistralai model_id_on_provider: mistral-large-2512 - provider_id: openrouter model_id_on_provider: mistralai/mistral-large-2512 + model_info: https://openrouter.ai/mistralai/mistral-large-2512 diff --git a/models/mistral-large-latest.yaml b/models/mistral-large-latest.yaml index 16f8bb2..8086708 100644 --- a/models/mistral-large-latest.yaml +++ b/models/mistral-large-latest.yaml @@ -6,15 +6,15 @@ model_info: https://docs.mistral.ai/getting-started/models/models_overview/ model_type: chat context_window: 262144 max_tokens: 262144 -cost_per_token: - input: 5e-7 - output: 0.0000015 +cost_per_million_tokens: + input: 0.5 + output: 1.5 knowledge_cutoff: "2024-11-01" tokenizer: family: tekken tuning: [multimodal, function, instruction] +input_type: [text, image] +output_type: [text] providers: - provider_id: mistralai - model_id_on_provider: mistral-large-latest - - provider_id: openrouter - model_id_on_provider: mistralai/mistral-large-latest + model_id_on_provider: mistral-large-latest \ No newline at end of file diff --git a/models/mistral-medium-latest.yaml b/models/mistral-medium-latest.yaml index b06d35a..8a8f3bc 100644 --- a/models/mistral-medium-latest.yaml +++ b/models/mistral-medium-latest.yaml @@ -6,15 +6,15 @@ model_info: https://docs.mistral.ai/getting-started/models/models_overview/ model_type: chat context_window: 128000 max_tokens: 16384 -cost_per_token: - input: 4e-7 - output: 0.000002 +cost_per_million_tokens: + input: 0.4 + output: 2 knowledge_cutoff: "2025-05-01" tokenizer: family: tekken tuning: [multimodal, function, instruction] +input_type: [text, image] +output_type: [text] providers: - provider_id: mistralai - model_id_on_provider: mistral-medium-latest - - provider_id: openrouter - model_id_on_provider: mistralai/mistral-medium-latest + model_id_on_provider: mistral-medium-latest \ No newline at end of file diff --git a/models/mistral-nemo.yaml b/models/mistral-nemo.yaml index 7372b19..7831307 100644 --- a/models/mistral-nemo.yaml +++ b/models/mistral-nemo.yaml @@ -6,15 +6,18 @@ model_info: https://docs.mistral.ai/getting-started/models/models_overview/ model_type: chat context_window: 128000 max_tokens: 128000 -cost_per_token: - input: 1.5e-7 - output: 1.5e-7 +cost_per_million_tokens: + input: 0.15 + output: 0.15 knowledge_cutoff: "2024-07-01" tokenizer: family: tekken tuning: [function, instruction] +input_type: [text] +output_type: [text] providers: - provider_id: mistralai model_id_on_provider: mistral-nemo - provider_id: openrouter model_id_on_provider: mistralai/mistral-nemo + model_info: https://openrouter.ai/mistralai/mistral-nemo diff --git a/models/mistral-small-latest.yaml b/models/mistral-small-latest.yaml index 8ba7ebe..372ef27 100644 --- a/models/mistral-small-latest.yaml +++ b/models/mistral-small-latest.yaml @@ -6,15 +6,15 @@ model_info: https://docs.mistral.ai/getting-started/models/models_overview/ model_type: chat context_window: 256000 max_tokens: 256000 -cost_per_token: - input: 1.5e-7 - output: 6e-7 +cost_per_million_tokens: + input: 0.15 + output: 0.6 knowledge_cutoff: "2025-06-01" tokenizer: family: tekken tuning: [multimodal, function, instruction] +input_type: [text, image] +output_type: [text] providers: - provider_id: mistralai - model_id_on_provider: mistral-small-latest - - provider_id: openrouter - model_id_on_provider: mistralai/mistral-small-latest + model_id_on_provider: mistral-small-latest \ No newline at end of file diff --git a/models/nemotron-3-super-120b-a12b.yaml b/models/nemotron-3-super-120b-a12b.yaml index 01f1786..85a091b 100644 --- a/models/nemotron-3-super-120b-a12b.yaml +++ b/models/nemotron-3-super-120b-a12b.yaml @@ -6,15 +6,18 @@ model_info: https://docs.api.nvidia.com/nim/reference/nvidia-nemotron-3-super-12 model_type: chat context_window: 262144 max_tokens: 262144 -cost_per_token: - input: 2e-7 - output: 8e-7 +cost_per_million_tokens: + input: 0.2 + output: 0.8 knowledge_cutoff: "2024-04-01" tuning: [function, instruction] +input_type: [text] +output_type: [text] providers: - provider_id: nvidia model_id_on_provider: nvidia/nemotron-3-super-120b-a12b - provider_id: openrouter model_id_on_provider: nvidia/nemotron-3-super-120b-a12b + model_info: https://openrouter.ai/nvidia/nemotron-3-super-120b-a12b - provider_id: cloudflare model_id_on_provider: "@cf/nvidia/nemotron-3-120b-a12b" diff --git a/models/o3.yaml b/models/o3.yaml index 4cad1a4..1c4ed05 100644 --- a/models/o3.yaml +++ b/models/o3.yaml @@ -5,14 +5,17 @@ model_description: OpenAI reasoning model. Extended thinking model optimized for model_info: https://platform.openai.com/docs/models/o3 model_type: chat context_window: 200000 -cost_per_token: - input: 0.000004 - output: 0.000016 +cost_per_million_tokens: + input: 4 + output: 16 tokenizer: family: tiktoken name: o200k_base +input_type: [text, image] +output_type: [text] providers: - provider_id: openai model_id_on_provider: o3 - provider_id: openrouter - model_id_on_provider: openai/o3 \ No newline at end of file + model_id_on_provider: openai/o3 + model_info: https://openrouter.ai/openai/o3 \ No newline at end of file diff --git a/models/o4-mini.yaml b/models/o4-mini.yaml index 3e18fa8..5b94bbd 100644 --- a/models/o4-mini.yaml +++ b/models/o4-mini.yaml @@ -5,14 +5,17 @@ model_description: Lightweight OpenAI reasoning model. Fast and cost-efficient r model_info: https://platform.openai.com/docs/models/o4-mini model_type: chat context_window: 100000 -cost_per_token: - input: 0.000001 - output: 0.000004 +cost_per_million_tokens: + input: 1 + output: 4 tokenizer: family: tiktoken name: o200k_base +input_type: [text, image] +output_type: [text] providers: - provider_id: openai model_id_on_provider: o4-mini - provider_id: openrouter - model_id_on_provider: openai/o4-mini \ No newline at end of file + model_id_on_provider: openai/o4-mini + model_info: https://openrouter.ai/openai/o4-mini \ No newline at end of file diff --git a/models/openrouter-auto.yaml b/models/openrouter-auto.yaml index 19e49cf..a3d54a4 100644 --- a/models/openrouter-auto.yaml +++ b/models/openrouter-auto.yaml @@ -7,6 +7,9 @@ model_type: chat context_window: 2000000 meta_model: true tuning: [function, instruction, multimodal] +input_type: [text, image, audio, video] +output_type: [text] providers: - provider_id: openrouter model_id_on_provider: openrouter/auto + model_info: https://openrouter.ai/openrouter/auto diff --git a/models/qwen3-32b.yaml b/models/qwen3-32b.yaml index 0b37de8..deb5c31 100644 --- a/models/qwen3-32b.yaml +++ b/models/qwen3-32b.yaml @@ -2,15 +2,17 @@ model_id: qwen3-32b model_name: Qwen3 32B model_provider: qwen model_description: Groq-hosted Qwen3 32B open-weight model for reasoning, code, and multilingual work. -model_info: https://console.groq.com/docs/models +model_info: https://openrouter.ai/qwen/qwen3-32b model_type: chat context_window: 131072 max_tokens: 40960 -cost_per_token: - input: 2.9e-7 - output: 5.9e-7 +cost_per_million_tokens: + input: 0.29 + output: 0.59 knowledge_cutoff: "2024-11-08" tuning: [function, instruction] +input_type: [text] +output_type: [text] providers: - provider_id: groq model_id_on_provider: qwen/qwen3-32b @@ -18,3 +20,4 @@ providers: model_id_on_provider: qwen3-32b - provider_id: openrouter model_id_on_provider: qwen/qwen3-32b + model_info: https://openrouter.ai/qwen/qwen3-32b diff --git a/models/qwen3.6-flash.yaml b/models/qwen3.6-flash.yaml index 0981139..27208c7 100644 --- a/models/qwen3.6-flash.yaml +++ b/models/qwen3.6-flash.yaml @@ -2,14 +2,17 @@ model_id: qwen3.6-flash model_name: Qwen 3.6 Flash model_provider: qwen model_description: Fast, efficient Qwen variant. Optimized for high-volume applications. -model_info: https://qwen.io/docs +model_info: https://openrouter.ai/qwen/qwen3.6-flash model_type: chat context_window: 1000000 -cost_per_token: - input: 0.00000010 - output: 0.00000040 +cost_per_million_tokens: + input: 0.1 + output: 0.4 +input_type: [text] +output_type: [text] providers: - provider_id: qwen model_id_on_provider: qwen3.6-flash - provider_id: openrouter - model_id_on_provider: qwen/qwen3.6-flash \ No newline at end of file + model_id_on_provider: qwen/qwen3.6-flash + model_info: https://openrouter.ai/qwen/qwen3.6-flash diff --git a/models/qwen3.6-plus.yaml b/models/qwen3.6-plus.yaml index e2111bb..c8e4603 100644 --- a/models/qwen3.6-plus.yaml +++ b/models/qwen3.6-plus.yaml @@ -2,15 +2,18 @@ model_id: qwen3.6-plus model_name: Qwen 3.6 Plus model_provider: qwen model_description: Alibaba's flagship model. Strong multilingual and reasoning capabilities with large context support. -model_info: https://qwen.io/docs +model_info: https://openrouter.ai/qwen/qwen3.6-plus model_type: chat context_window: 1000000 -cost_per_token: - input: 0.00000033 - output: 0.00000195 +cost_per_million_tokens: + input: 0.33 + output: 1.95 tuning: [function] +input_type: [text] +output_type: [text] providers: - provider_id: qwen model_id_on_provider: qwen3.6-plus - provider_id: openrouter - model_id_on_provider: qwen/qwen3.6-plus \ No newline at end of file + model_id_on_provider: qwen/qwen3.6-plus + model_info: https://openrouter.ai/qwen/qwen3.6-plus diff --git a/models/qwen3.7-plus.yaml b/models/qwen3.7-plus.yaml new file mode 100644 index 0000000..737d05f --- /dev/null +++ b/models/qwen3.7-plus.yaml @@ -0,0 +1,30 @@ +model_id: qwen3.7-plus +model_name: Qwen 3.6 Plus +model_provider: qwen +model_description: | + Qwen3.7-Plus is a cost-effective model in Alibaba's Qwen3.7 series. It supports text and image input with text output, + building on the series' text capabilities with a comprehensive upgrade to its vision-language abilities while retaining + full-stack, agent-level intelligence for coding, tool use, and productivity workflows. Its distinguishing trait is + multi-modal interactive hybrid agent capability: it can perceive real-world scenes, read screens and interact with GUIs, + generate code from visual references, and perform end-to-end navigation within mobile apps. +model_info: https://openrouter.ai/qwen/qwen3.7-plus +model_type: chat +context_window: 1000000 +max_tokens: 65536 +cost_per_million_tokens: + input: 0.4 + output: 1.6 +tuning: [function, structured] +input_type: [text, image] +output_type: [text] +providers: + - provider_id: qwen + model_id_on_provider: qwen3.7-plus + - provider_id: openrouter + model_id_on_provider: qwen/qwen3.7-plus + cost_per_million_tokens: + input: 0.4 + cached_input: 0.08 + cache_write_input: 0.5 + output: 1.6 + model_info: https://openrouter.ai/qwen/qwen3.7-plus diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..9aecbb5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,111 @@ +{ + "name": "model-metadata-central", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "model-metadata-central", + "devDependencies": { + "ajv": "8.20.0", + "ajv-formats": "3.0.1", + "yaml": "3.0.0-0" + }, + "engines": { + "node": ">=20", + "npm": ">=11.16.0" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yaml": { + "version": "3.0.0-0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-3.0.0-0.tgz", + "integrity": "sha512-PHPfns7F4FYUxfWzghNC/VYvFANsZkNSEZ7s7TbL9Aabf781lJ0wq88Hqx7+2gLBnBWUIy/YYaE+AIXJ0cs6Dg==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.js" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + } + } +} diff --git a/package.json b/package.json index 2ad36ca..95737f9 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,19 @@ { "name": "model-metadata-central", "private": true, + "packageManager": "npm@11.16.0", + "engines": { + "node": ">=20", + "npm": ">=11.16.0" + }, "scripts": { - "generate": "node scripts/codegen.mjs" + "generate": "node scripts/codegen.mjs", + "validate:models": "node scripts/validate-yaml-schema.mjs model-metadata.schema.json models", + "validate:providers": "node scripts/validate-yaml-schema.mjs provider.schema.json providers" + }, + "devDependencies": { + "ajv": "8.20.0", + "ajv-formats": "3.0.1", + "yaml": "3.0.0-0" } -} \ No newline at end of file +} diff --git a/packages/python/README.md b/packages/python/README.md index 6b9c3f8..effeab1 100644 --- a/packages/python/README.md +++ b/packages/python/README.md @@ -26,7 +26,7 @@ from model_metadata_central import get_model model = get_model("gpt-4o") if model: print(model["context_window"]) # 128000 - print(model["cost_per_token"]) # {"input": 0.000005, "output": 0.000015} + print(model["cost_per_million_tokens"]) # {"input": 5, "output": 15} ``` ### Filter by provider @@ -77,8 +77,8 @@ print(GPT_4_O["context_window"]) ## Data - Registry pre-compiled from `models/*.yaml` at install/build time -- 74 models across 17 providers -- Prices are in USD per token +- 73 models across 18 providers +- Prices are in USD per 1,000,000 tokens ## Schema diff --git a/packages/python/model_metadata_central/__init__.py b/packages/python/model_metadata_central/__init__.py index 7358d5d..742a2a3 100644 --- a/packages/python/model_metadata_central/__init__.py +++ b/packages/python/model_metadata_central/__init__.py @@ -34,9 +34,7 @@ "O4_MINI", "CLAUDE_OPUS_4_7", "CLAUDE_OPUS_4_6_FAST", - "CLAUDE_SONNET_4_2", "CLAUDE_OPUS_LATEST", - "CLAUDE_HAIKU_4", "GEMINI_2_5_PRO", "GEMINI_2_5_FLASH", "GEMINI_2_0_FLASH", @@ -44,11 +42,12 @@ "GEMMA_4_26B_A4B_IT", "DEEPSEEK_V4_PRO", "DEEPSEEK_V4_FLASH", - "DEEPSEEK_CODER_V4", - "GROK_4_2", - "GROK_4_2_MULTI_AGENT", + "GROK_4_20", + "GROK_4_20_MULTI_AGENT", "KIMI_K2_6", - "KIMI_V3", + "CLAUDINIO_ESSENTIAL", + "MINIMAX_M3", + "QWEN_3_7_PLUS", "QWEN_3_6_PLUS", "QWEN_3_6_FLASH", "MISTRAL_7B", @@ -70,9 +69,7 @@ O4_MINI = get_model("o4-mini") CLAUDE_OPUS_4_7 = get_model("claude-opus-4-7") CLAUDE_OPUS_4_6_FAST = get_model("claude-opus-4-6-fast") -CLAUDE_SONNET_4_2 = get_model("claude-sonnet-4-2") CLAUDE_OPUS_LATEST = get_model("claude-opus-latest") -CLAUDE_HAIKU_4 = get_model("claude-haiku-4") GEMINI_2_5_PRO = get_model("gemini-2.5-pro") GEMINI_2_5_FLASH = get_model("gemini-2.5-flash") GEMINI_2_0_FLASH = get_model("gemini-2.0-flash") @@ -80,11 +77,12 @@ GEMMA_4_26B_A4B_IT = get_model("gemma-4-26b-a4b-it") DEEPSEEK_V4_PRO = get_model("deepseek-v4-pro") DEEPSEEK_V4_FLASH = get_model("deepseek-v4-flash") -DEEPSEEK_CODER_V4 = get_model("deepseek-coder-v4") -GROK_4_2 = get_model("grok-4.2") -GROK_4_2_MULTI_AGENT = get_model("grok-4.2-multi-agent") +GROK_4_20 = get_model("grok-4.20") +GROK_4_20_MULTI_AGENT = get_model("grok-4.20-multi-agent") KIMI_K2_6 = get_model("kimi-k2.6") -KIMI_V3 = get_model("kimi-v3") +CLAUDINIO_ESSENTIAL = get_model("claudinio-essential") +MINIMAX_M3 = get_model("minimax-m3") +QWEN_3_7_PLUS = get_model("qwen3.7-plus") QWEN_3_6_PLUS = get_model("qwen3.6-plus") QWEN_3_6_FLASH = get_model("qwen3.6-flash") MISTRAL_7B = get_model("mistral-7b") diff --git a/packages/python/model_metadata_central/generated/models.py b/packages/python/model_metadata_central/generated/models.py index 1d3de33..d65fd31 100644 --- a/packages/python/model_metadata_central/generated/models.py +++ b/packages/python/model_metadata_central/generated/models.py @@ -5,11 +5,26 @@ from typing import Any, Literal from pydantic import BaseModel, Field -class Provider_reference(BaseModel): +class ProviderReference(BaseModel): provider_id: str model_id_on_provider: str | None = None + model_info: str | None = None + cost_per_million_tokens: TokenCosts | None = None + +class TokenCosts(BaseModel): + input: Any | None = None + cached_input: Any | None = None + cache_write_input: Any | None = None + output: Any | None = None + +class ModalityCosts(BaseModel): + text: float | None = None + image: float | None = None + audio: float | None = None + video: float | None = None + other: float | None = None -class Tokenizer_config(BaseModel): +class TokenizerConfig(BaseModel): family: Literal['tiktoken', 'tekken', 'sentencepiece', 'huggingface', 'other', 'unknown'] name: str | None = None @@ -22,12 +37,14 @@ class ModelMetadata(BaseModel): model_info: str | None = None model_version: str | None = None model_type: Literal['chat', 'completion', 'embedding'] - context_window: float - max_tokens: float | None = None - cost_per_token: Any | None = None + context_window: int + max_tokens: int | None = None + cost_per_million_tokens: TokenCosts | None = None knowledge_cutoff: str | None = None - tokenizer: Tokenizer_config | None = None + tokenizer: TokenizerConfig | None = None tuning: list | None = None + input_type: list | None = None + output_type: list | None = None deprecated: bool | None = None meta_model: bool | None = None providers: list | None = None diff --git a/packages/python/model_metadata_central/providers.json b/packages/python/model_metadata_central/providers.json index b90bbd7..ff59308 100644 --- a/packages/python/model_metadata_central/providers.json +++ b/packages/python/model_metadata_central/providers.json @@ -10,6 +10,17 @@ "status": "active", "notes": "Primary provider for Claude models. Uses Anthropic's own API protocol." }, + { + "provider_id": "claudinio", + "name": "Claudin.io", + "website_url": "https://claudin.io", + "api_type": "openai_compatible", + "base_url": "https://api.claudin.io/v1", + "auth_type": "api_key", + "routing_priority": "direct", + "status": "active", + "notes": "API proxy with fixed subscription and intelligent per-hour protection for coding agents. Claudinio runs a unified model optimized for coding agents." + }, { "provider_id": "cloudflare", "name": "Cloudflare Workers AI", diff --git a/packages/python/model_metadata_central/registry.json b/packages/python/model_metadata_central/registry.json index 72b673f..a81f36f 100644 --- a/packages/python/model_metadata_central/registry.json +++ b/packages/python/model_metadata_central/registry.json @@ -8,15 +8,22 @@ "model_type": "chat", "context_window": 200000, "max_tokens": 64000, - "cost_per_token": { - "input": 1e-06, - "output": 5e-06 + "cost_per_million_tokens": { + "input": 1, + "output": 5 }, "knowledge_cutoff": "2025-02-28", "tuning": [ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "anthropic", @@ -24,30 +31,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "anthropic/claude-haiku-4.5" - } - ] - }, - { - "model_id": "claude-haiku-4", - "model_name": "Claude Haiku 4", - "model_provider": "anthropic", - "model_description": "Fast, affordable Claude. Optimized for high-volume, latency-sensitive tasks where quality-per-token matters more than raw capability.", - "model_info": "https://docs.anthropic.com/en/docs/models/claude-haiku-4", - "model_type": "chat", - "context_window": 200000, - "cost_per_token": { - "input": 8e-07, - "output": 4e-06 - }, - "providers": [ - { - "provider_id": "anthropic", - "model_id_on_provider": "haiku-4" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "anthropic/claude-haiku-4" + "model_id_on_provider": "anthropic/claude-haiku-4.5", + "model_info": "https://openrouter.ai/anthropic/claude-haiku-4.5" } ] }, @@ -59,21 +44,25 @@ "model_info": "https://docs.anthropic.com/en/docs/models/claude-opus-4-6", "model_type": "chat", "context_window": 1000000, - "cost_per_token": { - "input": 3e-05, - "output": 0.00015 + "cost_per_million_tokens": { + "input": 30, + "output": 150 }, "tuning": [ "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ - { - "provider_id": "anthropic", - "model_id_on_provider": "claude-opus-4-6-fast" - }, { "provider_id": "openrouter", - "model_id_on_provider": "anthropic/claude-opus-4-6-fast" + "model_id_on_provider": "anthropic/claude-opus-4.6-fast", + "model_info": "https://openrouter.ai/anthropic/claude-opus-4.6-fast" } ] }, @@ -86,15 +75,22 @@ "model_type": "chat", "context_window": 1000000, "max_tokens": 128000, - "cost_per_token": { - "input": 5e-06, - "output": 2.5e-05 + "cost_per_million_tokens": { + "input": 5, + "output": 25 }, "knowledge_cutoff": "2025-05-31", "tuning": [ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "anthropic", @@ -102,7 +98,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "anthropic/claude-opus-4.6" + "model_id_on_provider": "anthropic/claude-opus-4.6", + "model_info": "https://openrouter.ai/anthropic/claude-opus-4.6" } ] }, @@ -114,13 +111,20 @@ "model_info": "https://docs.anthropic.com/en/docs/models/claude-opus-4-7", "model_type": "chat", "context_window": 1000000, - "cost_per_token": { - "input": 5e-06, - "output": 2.5e-05 + "cost_per_million_tokens": { + "input": 5, + "output": 25 }, "tuning": [ "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "anthropic", @@ -128,7 +132,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "anthropic/claude-opus-4-7" + "model_id_on_provider": "anthropic/claude-opus-4.7", + "model_info": "https://openrouter.ai/anthropic/claude-opus-4.7" } ] }, @@ -140,76 +145,98 @@ "model_info": "https://docs.anthropic.com/en/docs/models", "model_type": "chat", "context_window": 1000000, - "cost_per_token": { - "input": 5e-06, - "output": 2.5e-05 + "cost_per_million_tokens": { + "input": 5, + "output": 25 }, "tuning": [ "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ - { - "provider_id": "anthropic", - "model_id_on_provider": "opus" - }, { "provider_id": "openrouter", - "model_id_on_provider": "anthropic/claude-opus-latest" + "model_id_on_provider": "~anthropic/claude-opus-latest", + "model_info": "https://openrouter.ai/~anthropic/claude-opus-latest" } ] }, { - "model_id": "claude-sonnet-4-2", - "model_name": "Claude Sonnet 4.2", + "model_id": "claude-sonnet-4-6", + "model_name": "Claude Sonnet 4.6", "model_provider": "anthropic", - "model_description": "Balanced Anthropic model. Strong for coding, analysis, and everyday tasks at a mid-range price point.", - "model_info": "https://docs.anthropic.com/en/docs/models/claude-sonnet-4-2", + "model_description": "Anthropic's balanced Claude model with strong speed/intelligence tradeoffs, extended thinking, and 1M context.", + "model_info": "https://docs.anthropic.com/en/docs/about-claude/models/overview", "model_type": "chat", - "context_window": 200000, - "cost_per_token": { - "input": 3e-06, - "output": 1.5e-05 + "context_window": 1000000, + "max_tokens": 64000, + "cost_per_million_tokens": { + "input": 3, + "output": 15 }, + "knowledge_cutoff": "2025-08-31", "tuning": [ + "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "anthropic", - "model_id_on_provider": "claude-sonnet-4-2" + "model_id_on_provider": "claude-sonnet-4-6" }, { "provider_id": "openrouter", - "model_id_on_provider": "anthropic/claude-sonnet-4-2" + "model_id_on_provider": "anthropic/claude-sonnet-4.6", + "model_info": "https://openrouter.ai/anthropic/claude-sonnet-4.6" } ] }, { - "model_id": "claude-sonnet-4-6", - "model_name": "Claude Sonnet 4.6", - "model_provider": "anthropic", - "model_description": "Anthropic's balanced Claude model with strong speed/intelligence tradeoffs, extended thinking, and 1M context.", - "model_info": "https://docs.anthropic.com/en/docs/about-claude/models/overview", + "model_id": "claudinio-essential", + "model_name": "Claudinio Essential", + "model_provider": "claudinio", + "model_description": "Claudinio runs a unified model optimized for coding agents. All plans access the same high-performance model \u2014 the\ndifference is the hourly protection level, tuned for each developer profile.\n", + "model_info": "https://claudin.io/", "model_type": "chat", - "context_window": 1000000, + "context_window": 256000, "max_tokens": 64000, - "cost_per_token": { - "input": 3e-06, - "output": 1.5e-05 + "cost_per_million_tokens": { + "input": 0.5, + "output": 20 }, - "knowledge_cutoff": "2025-08-31", + "knowledge_cutoff": "2026-05-01", "tuning": [ "multimodal", - "function" + "function", + "code", + "reasoning" + ], + "input_type": [ + "text", + "image", + "audio", + "video" + ], + "output_type": [ + "text" ], "providers": [ { - "provider_id": "anthropic", - "model_id_on_provider": "claude-sonnet-4-6" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "anthropic/claude-sonnet-4.6" + "provider_id": "claudinio", + "model_id_on_provider": "claudinio-essential" } ] }, @@ -222,9 +249,9 @@ "model_type": "chat", "context_window": 256000, "max_tokens": 4096, - "cost_per_token": { - "input": "3e-7", - "output": "9e-7" + "cost_per_million_tokens": { + "input": 0.3, + "output": 0.9 }, "knowledge_cutoff": "2024-10-01", "tokenizer": { @@ -234,40 +261,16 @@ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "mistralai", "model_id_on_provider": "codestral-latest" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "mistralai/codestral-latest" - } - ] - }, - { - "model_id": "deepseek-coder-v4", - "model_name": "DeepSeek Coder V4", - "model_provider": "deepseek", - "model_description": "DeepSeek's dedicated code model. Specialized for code generation, completion, and debugging across many languages.", - "model_info": "https://api.deepseek.com", - "model_type": "chat", - "context_window": 1048576, - "cost_per_token": { - "input": 4.3e-07, - "output": 8.7e-07 - }, - "tuning": [ - "code" - ], - "providers": [ - { - "provider_id": "deepseek", - "model_id_on_provider": "deepseek-coder" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "deepseek/deepseek-coder-v4" } ] }, @@ -280,15 +283,21 @@ "model_type": "chat", "context_window": 131072, "max_tokens": 8192, - "cost_per_token": { - "input": 7.5e-07, - "output": 9.9e-07 + "cost_per_million_tokens": { + "input": 0.75, + "output": 0.99 }, "knowledge_cutoff": "2024-07-01", "tuning": [ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "groq", @@ -304,10 +313,16 @@ "model_info": "https://api.deepseek.com", "model_type": "chat", "context_window": 1048576, - "cost_per_token": { - "input": 1.4e-07, - "output": 2.8e-07 + "cost_per_million_tokens": { + "input": 0.14, + "output": 0.28 }, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "deepseek", @@ -315,7 +330,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "deepseek/deepseek-v4-flash" + "model_id_on_provider": "deepseek/deepseek-v4-flash", + "model_info": "https://openrouter.ai/deepseek/deepseek-v4-flash" } ] }, @@ -327,13 +343,19 @@ "model_info": "https://api.deepseek.com", "model_type": "chat", "context_window": 1048576, - "cost_per_token": { - "input": 4.3e-07, - "output": 8.7e-07 + "cost_per_million_tokens": { + "input": 0.43, + "output": 0.87 }, "tuning": [ "function" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "deepseek", @@ -341,7 +363,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "deepseek/deepseek-v4-pro" + "model_id_on_provider": "deepseek/deepseek-v4-pro", + "model_info": "https://openrouter.ai/deepseek/deepseek-v4-pro" } ] }, @@ -353,19 +376,24 @@ "model_info": "https://ai.google.dev/gemini-api/models/gemini-2.0-flash", "model_type": "chat", "context_window": 128000, - "cost_per_token": { - "input": 1e-07, - "output": 4e-07 + "cost_per_million_tokens": { + "input": 0.1, + "output": 0.4 }, "deprecated": true, + "input_type": [ + "text", + "image", + "audio", + "video" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "google", "model_id_on_provider": "gemini-2.0-flash" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "google/gemini-2.0-flash" } ] }, @@ -377,13 +405,22 @@ "model_info": "https://ai.google.dev/gemini-api/models/gemini-2.5-flash", "model_type": "chat", "context_window": 1000000, - "cost_per_token": { - "input": 7.5e-08, - "output": 3e-07 + "cost_per_million_tokens": { + "input": 0.075, + "output": 0.3 }, "tuning": [ "multimodal" ], + "input_type": [ + "text", + "image", + "audio", + "video" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "google", @@ -391,7 +428,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "google/gemini-2.5-flash" + "model_id_on_provider": "google/gemini-2.5-flash", + "model_info": "https://openrouter.ai/google/gemini-2.5-flash" } ] }, @@ -403,13 +441,22 @@ "model_info": "https://ai.google.dev/gemini-api/docs/models/gemini-2.5-pro", "model_type": "chat", "context_window": 1000000, - "cost_per_token": { - "input": 1.25e-06, - "output": 5e-06 + "cost_per_million_tokens": { + "input": 1.25, + "output": 5 }, "tuning": [ "multimodal" ], + "input_type": [ + "text", + "image", + "audio", + "video" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "google", @@ -417,7 +464,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "google/gemini-2.5-pro" + "model_id_on_provider": "google/gemini-2.5-pro", + "model_info": "https://openrouter.ai/google/gemini-2.5-pro" } ] }, @@ -429,10 +477,16 @@ "model_info": "https://ai.google.dev/gemma", "model_type": "chat", "context_window": 262144, - "cost_per_token": { - "input": 6e-08, - "output": 3.3e-07 + "cost_per_million_tokens": { + "input": 0.06, + "output": 0.33 }, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "google", @@ -444,7 +498,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "google/gemma-4-26b-a4b-it" + "model_id_on_provider": "google/gemma-4-26b-a4b-it", + "model_info": "https://openrouter.ai/google/gemma-4-26b-a4b-it" } ] }, @@ -456,10 +511,16 @@ "model_info": "https://ai.google.dev/gemma", "model_type": "chat", "context_window": 262144, - "cost_per_token": { - "input": 1.3e-07, - "output": 3.8e-07 + "cost_per_million_tokens": { + "input": 0.13, + "output": 0.38 }, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "google", @@ -467,7 +528,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "google/gemma-4-31b-it" + "model_id_on_provider": "google/gemma-4-31b-it", + "model_info": "https://openrouter.ai/google/gemma-4-31b-it" } ] }, @@ -480,7 +542,7 @@ "model_type": "chat", "context_window": 200000, "max_tokens": 131072, - "cost_per_token": { + "cost_per_million_tokens": { "input": 0, "output": 0 }, @@ -489,6 +551,12 @@ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "zai", @@ -500,7 +568,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "z-ai/glm-4.7-flash" + "model_id_on_provider": "z-ai/glm-4.7-flash", + "model_info": "https://openrouter.ai/z-ai/glm-4.7-flash" } ] }, @@ -513,15 +582,21 @@ "model_type": "chat", "context_window": 204800, "max_tokens": 131072, - "cost_per_token": { - "input": "6e-7", - "output": 2.2e-06 + "cost_per_million_tokens": { + "input": 0.6, + "output": 2.2 }, "knowledge_cutoff": "2025-04-01", "tuning": [ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "zai", @@ -529,7 +604,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "z-ai/glm-4.7" + "model_id_on_provider": "z-ai/glm-4.7", + "model_info": "https://openrouter.ai/z-ai/glm-4.7" } ] }, @@ -542,13 +618,19 @@ "model_type": "chat", "context_window": 200000, "max_tokens": 131072, - "cost_per_token": { - "input": 1.2e-06, - "output": 4e-06 + "cost_per_million_tokens": { + "input": 1.2, + "output": 4 }, "tuning": [ "function" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "zai", @@ -556,7 +638,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "z-ai/glm-5-turbo" + "model_id_on_provider": "z-ai/glm-5-turbo", + "model_info": "https://openrouter.ai/z-ai/glm-5-turbo" } ] }, @@ -569,13 +652,19 @@ "model_type": "chat", "context_window": 200000, "max_tokens": 131072, - "cost_per_token": { - "input": 1.4e-06, - "output": 4.4e-06 + "cost_per_million_tokens": { + "input": 1.4, + "output": 4.4 }, "tuning": [ "function" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "zai", @@ -583,7 +672,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "z-ai/glm-5.1" + "model_id_on_provider": "z-ai/glm-5.1", + "model_info": "https://openrouter.ai/z-ai/glm-5.1" } ] }, @@ -596,14 +686,20 @@ "model_type": "chat", "context_window": 204800, "max_tokens": 131072, - "cost_per_token": { - "input": 1e-06, - "output": 3.2e-06 + "cost_per_million_tokens": { + "input": 1, + "output": 3.2 }, "tuning": [ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "zai", @@ -611,7 +707,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "z-ai/glm-5" + "model_id_on_provider": "z-ai/glm-5", + "model_info": "https://openrouter.ai/z-ai/glm-5" } ] }, @@ -624,14 +721,22 @@ "model_type": "chat", "context_window": 200000, "max_tokens": 131072, - "cost_per_token": { - "input": 1.2e-06, - "output": 4e-06 + "cost_per_million_tokens": { + "input": 1.2, + "output": 4 }, "tuning": [ "multimodal", "function" ], + "input_type": [ + "text", + "image", + "video" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "zai", @@ -639,7 +744,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "z-ai/glm-5v-turbo" + "model_id_on_provider": "z-ai/glm-5v-turbo", + "model_info": "https://openrouter.ai/z-ai/glm-5v-turbo" } ] }, @@ -653,9 +759,9 @@ "model_type": "chat", "context_window": 16385, "max_tokens": 4096, - "cost_per_token": { - "input": 3e-06, - "output": 4e-06 + "cost_per_million_tokens": { + "input": 3, + "output": 4 }, "knowledge_cutoff": "2021-09-01", "tokenizer": { @@ -666,6 +772,12 @@ "instruction" ], "deprecated": true, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -683,9 +795,9 @@ "model_type": "completion", "context_window": 4097, "max_tokens": 4095, - "cost_per_token": { - "input": 1.5e-06, - "output": 2e-06 + "cost_per_million_tokens": { + "input": 1.5, + "output": 2 }, "knowledge_cutoff": "2021-09-01", "tokenizer": { @@ -696,7 +808,13 @@ "instruction", "function" ], - "deprecated": true + "deprecated": true, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ] }, { "model_id": "gpt-3.5-turbo", @@ -708,9 +826,9 @@ "model_type": "chat", "context_window": 4097, "max_tokens": 4095, - "cost_per_token": { - "input": 1.5e-06, - "output": 2e-06 + "cost_per_million_tokens": { + "input": 1.5, + "output": 2 }, "knowledge_cutoff": "2021-09-01", "tokenizer": { @@ -721,6 +839,12 @@ "function" ], "deprecated": true, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -737,9 +861,9 @@ "model_version": "latest", "model_type": "chat", "context_window": 32768, - "cost_per_token": { - "input": 6e-05, - "output": 0.00012 + "cost_per_million_tokens": { + "input": 60, + "output": 120 }, "knowledge_cutoff": "2021-09-01", "tokenizer": { @@ -749,7 +873,13 @@ "tuning": [ "function" ], - "deprecated": true + "deprecated": true, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ] }, { "model_id": "gpt-4-turbo", @@ -760,9 +890,9 @@ "model_type": "chat", "context_window": 128000, "max_tokens": 4096, - "cost_per_token": { - "input": 1e-05, - "output": 3e-05 + "cost_per_million_tokens": { + "input": 10, + "output": 30 }, "knowledge_cutoff": "2023-12-01", "tokenizer": { @@ -773,6 +903,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -780,7 +917,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-4-turbo" + "model_id_on_provider": "openai/gpt-4-turbo", + "model_info": "https://openrouter.ai/openai/gpt-4-turbo" } ] }, @@ -793,9 +931,9 @@ "model_type": "chat", "context_window": 1047576, "max_tokens": 32768, - "cost_per_token": { - "input": "4e-7", - "output": 1.6e-06 + "cost_per_million_tokens": { + "input": 0.4, + "output": 1.6 }, "knowledge_cutoff": "2024-04-01", "tokenizer": { @@ -806,6 +944,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -813,7 +958,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-4.1-mini" + "model_id_on_provider": "openai/gpt-4.1-mini", + "model_info": "https://openrouter.ai/openai/gpt-4.1-mini" } ] }, @@ -826,9 +972,9 @@ "model_type": "chat", "context_window": 1047576, "max_tokens": 32768, - "cost_per_token": { - "input": "1e-7", - "output": "4e-7" + "cost_per_million_tokens": { + "input": 0.1, + "output": 0.4 }, "knowledge_cutoff": "2024-04-01", "tokenizer": { @@ -839,6 +985,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -846,7 +999,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-4.1-nano" + "model_id_on_provider": "openai/gpt-4.1-nano", + "model_info": "https://openrouter.ai/openai/gpt-4.1-nano" } ] }, @@ -859,9 +1013,9 @@ "model_type": "chat", "context_window": 1047576, "max_tokens": 32768, - "cost_per_token": { - "input": 2e-06, - "output": 8e-06 + "cost_per_million_tokens": { + "input": 2, + "output": 8 }, "knowledge_cutoff": "2024-04-01", "tokenizer": { @@ -872,6 +1026,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -879,7 +1040,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-4.1" + "model_id_on_provider": "openai/gpt-4.1", + "model_info": "https://openrouter.ai/openai/gpt-4.1" } ] }, @@ -891,9 +1053,9 @@ "model_info": "https://platform.openai.com/docs/models/gpt-4.5", "model_type": "chat", "context_window": 128000, - "cost_per_token": { - "input": 1e-05, - "output": 3e-05 + "cost_per_million_tokens": { + "input": 10, + "output": 30 }, "tuning": [ "function" @@ -902,14 +1064,18 @@ "family": "tiktoken", "name": "o200k_base" }, + "deprecated": true, + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", "model_id_on_provider": "gpt-4.5" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-4.5" } ] }, @@ -923,9 +1089,9 @@ "model_type": "chat", "context_window": 8192, "max_tokens": 8191, - "cost_per_token": { - "input": 3e-05, - "output": 6e-05 + "cost_per_million_tokens": { + "input": 30, + "output": 60 }, "knowledge_cutoff": "2021-09-01", "tokenizer": { @@ -936,6 +1102,12 @@ "function" ], "deprecated": true, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -952,9 +1124,9 @@ "model_type": "chat", "context_window": 128000, "max_tokens": 16384, - "cost_per_token": { - "input": 1.5e-07, - "output": 6e-07 + "cost_per_million_tokens": { + "input": 0.15, + "output": 0.6 }, "tuning": [ "multimodal" @@ -963,6 +1135,13 @@ "family": "tiktoken", "name": "o200k_base" }, + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -970,7 +1149,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-4o-mini" + "model_id_on_provider": "openai/gpt-4o-mini", + "model_info": "https://openrouter.ai/openai/gpt-4o-mini" } ] }, @@ -983,9 +1163,9 @@ "model_type": "chat", "context_window": 128000, "max_tokens": 32768, - "cost_per_token": { - "input": 5e-06, - "output": 1.5e-05 + "cost_per_million_tokens": { + "input": 5, + "output": 15 }, "tuning": [ "multimodal" @@ -994,6 +1174,14 @@ "family": "tiktoken", "name": "o200k_base" }, + "input_type": [ + "text", + "image", + "audio" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1001,7 +1189,12 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-4o" + "model_id_on_provider": "openai/gpt-4o", + "cost_per_million_tokens": { + "input": 2.5, + "output": 10 + }, + "model_info": "https://openrouter.ai/openai/gpt-4o" } ] }, @@ -1014,9 +1207,9 @@ "model_type": "chat", "context_window": 400000, "max_tokens": 128000, - "cost_per_token": { - "input": 2.5e-07, - "output": 2e-06 + "cost_per_million_tokens": { + "input": 0.25, + "output": 2 }, "knowledge_cutoff": "2024-05-30", "tokenizer": { @@ -1027,6 +1220,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1034,7 +1234,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5-mini" + "model_id_on_provider": "openai/gpt-5-mini", + "model_info": "https://openrouter.ai/openai/gpt-5-mini" } ] }, @@ -1047,9 +1248,9 @@ "model_type": "chat", "context_window": 400000, "max_tokens": 128000, - "cost_per_token": { - "input": "5e-8", - "output": "4e-7" + "cost_per_million_tokens": { + "input": 0.05, + "output": 0.4 }, "knowledge_cutoff": "2024-05-30", "tokenizer": { @@ -1060,6 +1261,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1067,7 +1275,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5-nano" + "model_id_on_provider": "openai/gpt-5-nano", + "model_info": "https://openrouter.ai/openai/gpt-5-nano" } ] }, @@ -1080,9 +1289,9 @@ "model_type": "chat", "context_window": 400000, "max_tokens": 128000, - "cost_per_token": { - "input": 1.75e-06, - "output": 1.4e-05 + "cost_per_million_tokens": { + "input": 1.75, + "output": 14 }, "knowledge_cutoff": "2025-08-31", "tokenizer": { @@ -1093,6 +1302,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1100,7 +1316,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5.3-codex" + "model_id_on_provider": "openai/gpt-5.3-codex", + "model_info": "https://openrouter.ai/openai/gpt-5.3-codex" } ] }, @@ -1112,13 +1329,21 @@ "model_info": "https://platform.openai.com/docs/models/gpt-5.4-image-2", "model_type": "chat", "context_window": 272000, - "cost_per_token": { - "input": 8e-06, - "output": 1.5e-05 + "cost_per_million_tokens": { + "input": 8, + "output": 15 }, "tuning": [ "multimodal" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text", + "image" + ], "providers": [ { "provider_id": "openai", @@ -1126,7 +1351,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5.4-image-2" + "model_id_on_provider": "openai/gpt-5.4-image-2", + "model_info": "https://openrouter.ai/openai/gpt-5.4-image-2" } ] }, @@ -1139,9 +1365,9 @@ "model_type": "chat", "context_window": 400000, "max_tokens": 128000, - "cost_per_token": { - "input": 7.5e-07, - "output": 4.5e-06 + "cost_per_million_tokens": { + "input": 0.75, + "output": 4.5 }, "knowledge_cutoff": "2025-08-31", "tokenizer": { @@ -1152,6 +1378,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1159,7 +1392,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5.4-mini" + "model_id_on_provider": "openai/gpt-5.4-mini", + "model_info": "https://openrouter.ai/openai/gpt-5.4-mini" } ] }, @@ -1172,9 +1406,9 @@ "model_type": "chat", "context_window": 400000, "max_tokens": 128000, - "cost_per_token": { - "input": "2e-7", - "output": 1.25e-06 + "cost_per_million_tokens": { + "input": 0.2, + "output": 1.25 }, "knowledge_cutoff": "2025-08-31", "tokenizer": { @@ -1185,6 +1419,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1192,7 +1433,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5.4-nano" + "model_id_on_provider": "openai/gpt-5.4-nano", + "model_info": "https://openrouter.ai/openai/gpt-5.4-nano" } ] }, @@ -1205,9 +1447,9 @@ "model_type": "chat", "context_window": 1050000, "max_tokens": 128000, - "cost_per_token": { - "input": 3e-05, - "output": 0.00018 + "cost_per_million_tokens": { + "input": 30, + "output": 180 }, "knowledge_cutoff": "2025-08-31", "tokenizer": { @@ -1218,6 +1460,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1225,7 +1474,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5.4-pro" + "model_id_on_provider": "openai/gpt-5.4-pro", + "model_info": "https://openrouter.ai/openai/gpt-5.4-pro" } ] }, @@ -1238,9 +1488,9 @@ "model_type": "chat", "context_window": 1050000, "max_tokens": 128000, - "cost_per_token": { - "input": 2.5e-06, - "output": 1.5e-05 + "cost_per_million_tokens": { + "input": 2.5, + "output": 15 }, "knowledge_cutoff": "2025-08-31", "tokenizer": { @@ -1251,6 +1501,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1258,7 +1515,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5.4" + "model_id_on_provider": "openai/gpt-5.4", + "model_info": "https://openrouter.ai/openai/gpt-5.4" } ] }, @@ -1271,13 +1529,19 @@ "model_type": "chat", "context_window": 1050000, "max_tokens": 1049999, - "cost_per_token": { - "input": 3e-05, - "output": 0.00018 + "cost_per_million_tokens": { + "input": 30, + "output": 180 }, "tuning": [ "function" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1285,7 +1549,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5.5-pro" + "model_id_on_provider": "openai/gpt-5.5-pro", + "model_info": "https://openrouter.ai/openai/gpt-5.5-pro" } ] }, @@ -1298,13 +1563,19 @@ "model_type": "chat", "context_window": 1050000, "max_tokens": 1049999, - "cost_per_token": { - "input": 5e-06, - "output": 3e-05 + "cost_per_million_tokens": { + "input": 5, + "output": 30 }, "tuning": [ "function" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1312,7 +1583,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5.5" + "model_id_on_provider": "openai/gpt-5.5", + "model_info": "https://openrouter.ai/openai/gpt-5.5" } ] }, @@ -1325,9 +1597,9 @@ "model_type": "chat", "context_window": 400000, "max_tokens": 128000, - "cost_per_token": { - "input": 1.25e-06, - "output": 1e-05 + "cost_per_million_tokens": { + "input": 1.25, + "output": 10 }, "knowledge_cutoff": "2024-09-30", "tokenizer": { @@ -1338,6 +1610,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1345,56 +1624,90 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5" + "model_id_on_provider": "openai/gpt-5", + "model_info": "https://openrouter.ai/openai/gpt-5" } ] }, { - "model_id": "grok-4.2-multi-agent", - "model_name": "Grok 4.2 Multi-Agent", + "model_id": "grok-4.20-multi-agent", + "model_name": "Grok 4.20 Multi-Agent", "model_provider": "x-ai", - "model_description": "Grok 4.2 optimized for multi-agent workflows. Enhanced tool use and coordination for parallel task execution.", + "model_description": "Grok 4.20 optimized for multi-agent workflows. Enhanced coordination for parallel task execution.", "model_info": "https://x.ai/api", "model_type": "chat", "context_window": 2000000, - "cost_per_token": { - "input": 2e-06, - "output": 6e-06 + "max_tokens": 30000, + "cost_per_million_tokens": { + "input": 1.25, + "cached_input": 0.2, + "output": 2.5 }, + "tuning": [ + "reasoning", + "multimodal" + ], + "input_type": [ + "text", + "image", + "other" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "x-ai", - "model_id_on_provider": "grok-4.2" + "model_id_on_provider": "grok-4.20-multi-agent-0309" }, { "provider_id": "openrouter", - "model_id_on_provider": "x-ai/grok-4.2-multi-agent" + "model_id_on_provider": "x-ai/grok-4.20-multi-agent", + "cost_per_million_tokens": { + "input": 2, + "cached_input": 0.2, + "output": 6 + }, + "model_info": "https://openrouter.ai/x-ai/grok-4.20-multi-agent" } ] }, { - "model_id": "grok-4.2", - "model_name": "Grok 4.2", + "model_id": "grok-4.20", + "model_name": "Grok 4.20", "model_provider": "x-ai", "model_description": "xAI's flagship model. Strong reasoning with real-time web access. Known for personality and directness.", "model_info": "https://x.ai/api", "model_type": "chat", "context_window": 2000000, - "cost_per_token": { - "input": 2e-06, - "output": 6e-06 + "max_tokens": 30000, + "cost_per_million_tokens": { + "input": 1.25, + "cached_input": 0.2, + "output": 2.5 }, "tuning": [ - "function" + "function", + "reasoning", + "multimodal" + ], + "input_type": [ + "text", + "image", + "other" + ], + "output_type": [ + "text" ], "providers": [ { "provider_id": "x-ai", - "model_id_on_provider": "grok-4.2" + "model_id_on_provider": "grok-4.20-0309-reasoning" }, { "provider_id": "openrouter", - "model_id_on_provider": "x-ai/grok-4.2" + "model_id_on_provider": "x-ai/grok-4.20", + "model_info": "https://openrouter.ai/x-ai/grok-4.20" } ] }, @@ -1406,13 +1719,19 @@ "model_info": "https://platform.moonshot.ai/docs", "model_type": "chat", "context_window": 256000, - "cost_per_token": { - "input": 7.4e-07, - "output": 4.66e-06 + "cost_per_million_tokens": { + "input": 0.74, + "output": 4.66 }, "tuning": [ "function" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "moonshotai", @@ -1424,30 +1743,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "moonshotai/kimi-k2.6" - } - ] - }, - { - "model_id": "kimi-v3", - "model_name": "Kimi V3", - "model_provider": "moonshotai", - "model_description": "Mid-range Moonshot model. Good balance of capability and cost for standard tasks.", - "model_info": "https://platform.moonshot.ai/docs", - "model_type": "chat", - "context_window": 256000, - "cost_per_token": { - "input": 2e-07, - "output": 1e-06 - }, - "providers": [ - { - "provider_id": "moonshotai", - "model_id_on_provider": "kimi-v3" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "moonshotai/kimi-v3" + "model_id_on_provider": "moonshotai/kimi-k2.6", + "model_info": "https://openrouter.ai/moonshotai/kimi-k2.6" } ] }, @@ -1460,15 +1757,21 @@ "model_type": "chat", "context_window": 131072, "max_tokens": 131072, - "cost_per_token": { - "input": "5e-8", - "output": "8e-8" + "cost_per_million_tokens": { + "input": 0.05, + "output": 0.08 }, "knowledge_cutoff": "2023-12-01", "tuning": [ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "groq", @@ -1485,15 +1788,21 @@ "model_type": "chat", "context_window": 131072, "max_tokens": 32768, - "cost_per_token": { - "input": 5.9e-07, - "output": 7.9e-07 + "cost_per_million_tokens": { + "input": 0.59, + "output": 0.79 }, "knowledge_cutoff": "2023-12-01", "tuning": [ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "groq", @@ -1501,32 +1810,6 @@ } ] }, - { - "model_id": "minimax-m2.1-highspeed", - "model_name": "MiniMax M2.1-highspeed", - "model_provider": "minimax", - "model_description": "High-speed MiniMax M2.1 variant for faster multilingual programming and agent workflows.", - "model_info": "https://platform.minimax.io/docs/guides/text-generation", - "model_type": "chat", - "context_window": 204800, - "max_tokens": 131072, - "cost_per_token": { - "input": "6e-7", - "output": 2.4e-06 - }, - "tuning": [ - "function", - "instruction", - "code", - "multilingual" - ], - "providers": [ - { - "provider_id": "minimax", - "model_id_on_provider": "MiniMax-M2.1-highspeed" - } - ] - }, { "model_id": "minimax-m2.1", "model_name": "MiniMax M2.1", @@ -1536,9 +1819,9 @@ "model_type": "chat", "context_window": 204800, "max_tokens": 131072, - "cost_per_token": { - "input": "3e-7", - "output": 1.2e-06 + "cost_per_million_tokens": { + "input": 0.3, + "output": 1.2 }, "tuning": [ "function", @@ -1546,6 +1829,12 @@ "code", "multilingual" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "minimax", @@ -1553,7 +1842,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "minimax/minimax-m2.1" + "model_id_on_provider": "minimax/minimax-m2.1", + "model_info": "https://openrouter.ai/minimax/minimax-m2.1" } ] }, @@ -1566,9 +1856,9 @@ "model_type": "chat", "context_window": 204800, "max_tokens": 131072, - "cost_per_token": { - "input": "6e-7", - "output": 2.4e-06 + "cost_per_million_tokens": { + "input": 0.6, + "output": 2.4 }, "tuning": [ "function", @@ -1576,6 +1866,12 @@ "code", "multilingual" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "minimax", @@ -1588,13 +1884,13 @@ "model_name": "MiniMax M2.5", "model_provider": "minimax", "model_description": "MiniMax M2.5 model for complex programming, agent, and productivity tasks.", - "model_info": "https://platform.minimax.io/docs/guides/text-generation", + "model_info": "https://www.minimax.io/models/text", "model_type": "chat", "context_window": 204800, "max_tokens": 131072, - "cost_per_token": { - "input": "3e-7", - "output": 1.2e-06 + "cost_per_million_tokens": { + "input": 0.3, + "output": 1.2 }, "tuning": [ "function", @@ -1602,6 +1898,12 @@ "code", "multilingual" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "minimax", @@ -1609,7 +1911,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "minimax/minimax-m2.5" + "model_id_on_provider": "minimax/minimax-m2.5", + "model_info": "https://openrouter.ai/minimax/minimax-m2.5" } ] }, @@ -1622,9 +1925,9 @@ "model_type": "chat", "context_window": 204800, "max_tokens": 131072, - "cost_per_token": { - "input": "6e-7", - "output": 2.4e-06 + "cost_per_million_tokens": { + "input": 0.6, + "output": 2.4 }, "tuning": [ "function", @@ -1632,6 +1935,12 @@ "code", "multilingual" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "minimax", @@ -1648,9 +1957,9 @@ "model_type": "chat", "context_window": 204800, "max_tokens": 131072, - "cost_per_token": { - "input": "3e-7", - "output": 1.2e-06 + "cost_per_million_tokens": { + "input": 0.3, + "output": 1.2 }, "tuning": [ "function", @@ -1658,6 +1967,12 @@ "code", "multilingual" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "minimax", @@ -1665,7 +1980,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "minimax/minimax-m2.7" + "model_id_on_provider": "minimax/minimax-m2.7", + "model_info": "https://openrouter.ai/minimax/minimax-m2.7" } ] }, @@ -1678,9 +1994,9 @@ "model_type": "chat", "context_window": 204800, "max_tokens": 128000, - "cost_per_token": { - "input": "3e-7", - "output": 1.2e-06 + "cost_per_million_tokens": { + "input": 0.3, + "output": 1.2 }, "tuning": [ "function", @@ -1688,6 +2004,12 @@ "code", "multilingual" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "minimax", @@ -1695,7 +2017,52 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "minimax/minimax-m2" + "model_id_on_provider": "minimax/minimax-m2", + "model_info": "https://openrouter.ai/minimax/minimax-m2" + } + ] + }, + { + "model_id": "minimax-m3", + "model_name": "MiniMax M3", + "model_provider": "minimax", + "model_description": "MiniMax-M3 is a multimodal foundation model from MiniMax. It supports text, image, and video inputs with text output, a 1M-token context window, and is suited for\nlong-horizon agentic work, coding, and tool use. It is built on MiniMax Sparse Attention (MSA), which replaces full attention with KV-block selection to cut per-token\ncompute at long context \u2014 roughly 1/20 the cost of the previous generation at 1M tokens, with substantially faster prefill and decode while retaining quality across\nmost tasks.\n", + "model_info": "https://www.minimax.io/models/text/m3", + "model_type": "chat", + "context_window": 512000, + "max_tokens": 128000, + "cost_per_million_tokens": { + "input": 0.6, + "output": 2.4 + }, + "tuning": [ + "function", + "instruction", + "code", + "multilingual" + ], + "input_type": [ + "text", + "image", + "video" + ], + "output_type": [ + "text" + ], + "providers": [ + { + "provider_id": "minimax", + "model_id_on_provider": "MiniMax-M3" + }, + { + "provider_id": "openrouter", + "model_id_on_provider": "minimax/minimax-m3", + "cost_per_million_tokens": { + "input": 0.3, + "cached_input": 0.06, + "output": 1.2 + }, + "model_info": "https://openrouter.ai/minimax/minimax-m3" } ] }, @@ -1711,14 +2078,16 @@ "instruction" ], "deprecated": true, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "mistralai", "model_id_on_provider": "mistral-7b-instruct-0.3" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "mistralai/mistral-7b-instruct" } ] }, @@ -1730,16 +2099,21 @@ "model_info": "https://mistral.ai/news/announcing-mistral-7b/", "model_type": "chat", "context_window": 8192, - "cost_per_token": 0, + "cost_per_million_tokens": { + "input": 0, + "output": 0 + }, "deprecated": true, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "mistralai", "model_id_on_provider": "open-mistral-7b" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "mistralai/mistral-7b" } ] }, @@ -1752,9 +2126,9 @@ "model_type": "chat", "context_window": 131072, "max_tokens": 16384, - "cost_per_token": { - "input": 2e-06, - "output": 6e-06 + "cost_per_million_tokens": { + "input": 2, + "output": 6 }, "knowledge_cutoff": "2024-11-01", "tokenizer": { @@ -1764,14 +2138,16 @@ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "mistralai", "model_id_on_provider": "mistral-large-2411" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "mistralai/mistral-large-2411" } ] }, @@ -1784,9 +2160,9 @@ "model_type": "chat", "context_window": 262144, "max_tokens": 262144, - "cost_per_token": { - "input": "5e-7", - "output": 1.5e-06 + "cost_per_million_tokens": { + "input": 0.5, + "output": 1.5 }, "knowledge_cutoff": "2024-11-01", "tokenizer": { @@ -1797,6 +2173,13 @@ "function", "instruction" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "mistralai", @@ -1804,7 +2187,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "mistralai/mistral-large-2512" + "model_id_on_provider": "mistralai/mistral-large-2512", + "model_info": "https://openrouter.ai/mistralai/mistral-large-2512" } ] }, @@ -1817,9 +2201,9 @@ "model_type": "chat", "context_window": 262144, "max_tokens": 262144, - "cost_per_token": { - "input": "5e-7", - "output": 1.5e-06 + "cost_per_million_tokens": { + "input": 0.5, + "output": 1.5 }, "knowledge_cutoff": "2024-11-01", "tokenizer": { @@ -1830,14 +2214,17 @@ "function", "instruction" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "mistralai", "model_id_on_provider": "mistral-large-latest" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "mistralai/mistral-large-latest" } ] }, @@ -1850,9 +2237,9 @@ "model_type": "chat", "context_window": 128000, "max_tokens": 16384, - "cost_per_token": { - "input": "4e-7", - "output": 2e-06 + "cost_per_million_tokens": { + "input": 0.4, + "output": 2 }, "knowledge_cutoff": "2025-05-01", "tokenizer": { @@ -1863,14 +2250,17 @@ "function", "instruction" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "mistralai", "model_id_on_provider": "mistral-medium-latest" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "mistralai/mistral-medium-latest" } ] }, @@ -1883,9 +2273,9 @@ "model_type": "chat", "context_window": 128000, "max_tokens": 128000, - "cost_per_token": { - "input": 1.5e-07, - "output": 1.5e-07 + "cost_per_million_tokens": { + "input": 0.15, + "output": 0.15 }, "knowledge_cutoff": "2024-07-01", "tokenizer": { @@ -1895,6 +2285,12 @@ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "mistralai", @@ -1902,7 +2298,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "mistralai/mistral-nemo" + "model_id_on_provider": "mistralai/mistral-nemo", + "model_info": "https://openrouter.ai/mistralai/mistral-nemo" } ] }, @@ -1915,9 +2312,9 @@ "model_type": "chat", "context_window": 256000, "max_tokens": 256000, - "cost_per_token": { - "input": 1.5e-07, - "output": "6e-7" + "cost_per_million_tokens": { + "input": 0.15, + "output": 0.6 }, "knowledge_cutoff": "2025-06-01", "tokenizer": { @@ -1928,14 +2325,17 @@ "function", "instruction" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "mistralai", "model_id_on_provider": "mistral-small-latest" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "mistralai/mistral-small-latest" } ] }, @@ -1948,15 +2348,21 @@ "model_type": "chat", "context_window": 262144, "max_tokens": 262144, - "cost_per_token": { - "input": "2e-7", - "output": "8e-7" + "cost_per_million_tokens": { + "input": 0.2, + "output": 0.8 }, "knowledge_cutoff": "2024-04-01", "tuning": [ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "nvidia", @@ -1964,7 +2370,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "nvidia/nemotron-3-super-120b-a12b" + "model_id_on_provider": "nvidia/nemotron-3-super-120b-a12b", + "model_info": "https://openrouter.ai/nvidia/nemotron-3-super-120b-a12b" }, { "provider_id": "cloudflare", @@ -1980,14 +2387,21 @@ "model_info": "https://platform.openai.com/docs/models/o3", "model_type": "chat", "context_window": 200000, - "cost_per_token": { - "input": 4e-06, - "output": 1.6e-05 + "cost_per_million_tokens": { + "input": 4, + "output": 16 }, "tokenizer": { "family": "tiktoken", "name": "o200k_base" }, + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1995,7 +2409,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/o3" + "model_id_on_provider": "openai/o3", + "model_info": "https://openrouter.ai/openai/o3" } ] }, @@ -2007,14 +2422,21 @@ "model_info": "https://platform.openai.com/docs/models/o4-mini", "model_type": "chat", "context_window": 100000, - "cost_per_token": { - "input": 1e-06, - "output": 4e-06 + "cost_per_million_tokens": { + "input": 1, + "output": 4 }, "tokenizer": { "family": "tiktoken", "name": "o200k_base" }, + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -2022,7 +2444,39 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/o4-mini" + "model_id_on_provider": "openai/o4-mini", + "model_info": "https://openrouter.ai/openai/o4-mini" + } + ] + }, + { + "model_id": "openrouter-auto", + "model_name": "Auto Router", + "model_provider": "openrouter", + "model_description": "Meta-model that analyzes the prompt and routes each request to one of dozens of underlying models (Anthropic, OpenAI, Google, DeepSeek, and others), optimizing for output quality. Effective context window, pricing, knowledge cutoff, and tokenizer all track whichever model is selected; the response's `model` field reports the actual choice.", + "model_info": "https://openrouter.ai/openrouter/auto", + "model_type": "chat", + "context_window": 2000000, + "meta_model": true, + "tuning": [ + "function", + "instruction", + "multimodal" + ], + "input_type": [ + "text", + "image", + "audio", + "video" + ], + "output_type": [ + "text" + ], + "providers": [ + { + "provider_id": "openrouter", + "model_id_on_provider": "openrouter/auto", + "model_info": "https://openrouter.ai/openrouter/auto" } ] }, @@ -2031,19 +2485,25 @@ "model_name": "Qwen3 32B", "model_provider": "qwen", "model_description": "Groq-hosted Qwen3 32B open-weight model for reasoning, code, and multilingual work.", - "model_info": "https://console.groq.com/docs/models", + "model_info": "https://openrouter.ai/qwen/qwen3-32b", "model_type": "chat", "context_window": 131072, "max_tokens": 40960, - "cost_per_token": { - "input": 2.9e-07, - "output": 5.9e-07 + "cost_per_million_tokens": { + "input": 0.29, + "output": 0.59 }, "knowledge_cutoff": "2024-11-08", "tuning": [ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "groq", @@ -2055,7 +2515,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "qwen/qwen3-32b" + "model_id_on_provider": "qwen/qwen3-32b", + "model_info": "https://openrouter.ai/qwen/qwen3-32b" } ] }, @@ -2064,13 +2525,19 @@ "model_name": "Qwen 3.6 Flash", "model_provider": "qwen", "model_description": "Fast, efficient Qwen variant. Optimized for high-volume applications.", - "model_info": "https://qwen.io/docs", + "model_info": "https://openrouter.ai/qwen/qwen3.6-flash", "model_type": "chat", "context_window": 1000000, - "cost_per_token": { - "input": 1e-07, - "output": 4e-07 + "cost_per_million_tokens": { + "input": 0.1, + "output": 0.4 }, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "qwen", @@ -2078,7 +2545,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "qwen/qwen3.6-flash" + "model_id_on_provider": "qwen/qwen3.6-flash", + "model_info": "https://openrouter.ai/qwen/qwen3.6-flash" } ] }, @@ -2087,16 +2555,22 @@ "model_name": "Qwen 3.6 Plus", "model_provider": "qwen", "model_description": "Alibaba's flagship model. Strong multilingual and reasoning capabilities with large context support.", - "model_info": "https://qwen.io/docs", + "model_info": "https://openrouter.ai/qwen/qwen3.6-plus", "model_type": "chat", "context_window": 1000000, - "cost_per_token": { - "input": 3.3e-07, - "output": 1.95e-06 + "cost_per_million_tokens": { + "input": 0.33, + "output": 1.95 }, "tuning": [ "function" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "qwen", @@ -2104,7 +2578,50 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "qwen/qwen3.6-plus" + "model_id_on_provider": "qwen/qwen3.6-plus", + "model_info": "https://openrouter.ai/qwen/qwen3.6-plus" + } + ] + }, + { + "model_id": "qwen3.7-plus", + "model_name": "Qwen 3.6 Plus", + "model_provider": "qwen", + "model_description": "Qwen3.7-Plus is a cost-effective model in Alibaba's Qwen3.7 series. It supports text and image input with text output,\nbuilding on the series' text capabilities with a comprehensive upgrade to its vision-language abilities while retaining\nfull-stack, agent-level intelligence for coding, tool use, and productivity workflows. Its distinguishing trait is\nmulti-modal interactive hybrid agent capability: it can perceive real-world scenes, read screens and interact with GUIs,\ngenerate code from visual references, and perform end-to-end navigation within mobile apps.\n", + "model_info": "https://openrouter.ai/qwen/qwen3.7-plus", + "model_type": "chat", + "context_window": 1000000, + "max_tokens": 65536, + "cost_per_million_tokens": { + "input": 0.4, + "output": 1.6 + }, + "tuning": [ + "function", + "structured" + ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], + "providers": [ + { + "provider_id": "qwen", + "model_id_on_provider": "qwen3.7-plus" + }, + { + "provider_id": "openrouter", + "model_id_on_provider": "qwen/qwen3.7-plus", + "cost_per_million_tokens": { + "input": 0.4, + "cached_input": 0.08, + "cache_write_input": 0.5, + "output": 1.6 + }, + "model_info": "https://openrouter.ai/qwen/qwen3.7-plus" } ] } diff --git a/packages/python/pyproject.toml b/packages/python/pyproject.toml index 7dc1fb3..28980a1 100644 --- a/packages/python/pyproject.toml +++ b/packages/python/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "model-metadata-central" -version = "0.3.0" +version = "0.4.0" description = "Typed registry of LLM model metadata for Python — context windows, pricing, provider routing." readme = "README.md" license = "MIT" diff --git a/packages/python/uv.lock b/packages/python/uv.lock index 9947218..b96b61f 100644 --- a/packages/python/uv.lock +++ b/packages/python/uv.lock @@ -180,7 +180,7 @@ wheels = [ [[package]] name = "model-metadata-central" -version = "0.3.0" +version = "0.4.0" source = { editable = "." } dependencies = [ { name = "pydantic" }, diff --git a/packages/typescript/.npmrc b/packages/typescript/.npmrc new file mode 100644 index 0000000..ae6b0e7 --- /dev/null +++ b/packages/typescript/.npmrc @@ -0,0 +1,2 @@ +min-release-age=7 +save-exact=true diff --git a/packages/typescript/README.md b/packages/typescript/README.md index 59c689b..bce4d58 100644 --- a/packages/typescript/README.md +++ b/packages/typescript/README.md @@ -21,7 +21,7 @@ const modelOptions = models.map((m) => ({ value: m.model_id, label: m.model_name, contextWindow: m.context_window, - pricePerMillion: m.cost_per_token, + pricePerMillion: m.cost_per_million_tokens, })); ``` @@ -33,7 +33,7 @@ import { getModel } from "model-metadata-central"; const model = getModel("gpt-4o"); if (model) { console.log(model.context_window); // 128000 - console.log(model.cost_per_token); // { input: 0.000005, output: 0.000015 } + console.log(model.cost_per_million_tokens); // { input: 5, output: 15 } } ``` @@ -77,12 +77,12 @@ import { gpt4o, claudeOpus47 } from "model-metadata-central"; All types are exported for your own data structures: ```ts -import type { ModelMetadata, ProviderMetadata, CostPerToken } from "model-metadata-central"; +import type { ModelMetadata, ProviderMetadata, TokenCosts } from "model-metadata-central"; function logCost(model: ModelMetadata) { - if (model.cost_per_token) { - const cost = model.cost_per_token as CostPerToken; - console.log(`$${cost.input * 1_000_000} per 1M input tokens`); + if (model.cost_per_million_tokens) { + const cost = model.cost_per_million_tokens as TokenCosts; + console.log(`$${cost.input} per 1M input tokens`); } } ``` @@ -102,8 +102,8 @@ function logCost(model: ModelMetadata) { ## Data - Registry compiled from `/models/*.yaml` and `/providers/*.yaml` at build time -- 33 models across 14 providers -- Prices are in USD per token +- 73 models across 18 providers +- Prices are in USD per 1,000,000 tokens ## Schema diff --git a/packages/typescript/package-lock.json b/packages/typescript/package-lock.json index ba69063..e7996ce 100644 --- a/packages/typescript/package-lock.json +++ b/packages/typescript/package-lock.json @@ -1,13 +1,16 @@ { "name": "model-metadata-central", - "version": "0.3.0", + "version": "0.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "model-metadata-central", - "version": "0.3.0", + "version": "0.4.0", "license": "MIT", + "engines": { + "node": ">=20" + }, "devDependencies": { "@types/node": "^20.0.0", "typescript": "^5.0.0", diff --git a/packages/typescript/package.json b/packages/typescript/package.json index b354077..e82dcde 100644 --- a/packages/typescript/package.json +++ b/packages/typescript/package.json @@ -1,6 +1,6 @@ { "name": "model-metadata-central", - "version": "0.3.0", + "version": "0.4.0", "description": "Typed TypeScript registry of LLM model metadata (context windows, pricing, providers)", "license": "MIT", "repository": { @@ -10,6 +10,9 @@ "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", + "engines": { + "node": ">=20" + }, "exports": { ".": { "import": "./dist/index.js", diff --git a/packages/typescript/src/generated/types.ts b/packages/typescript/src/generated/types.ts index 4a3c117..bef377f 100644 --- a/packages/typescript/src/generated/types.ts +++ b/packages/typescript/src/generated/types.ts @@ -1,20 +1,42 @@ /** Generated from JSON Schema — do not edit manually */ // --- Enums --- -export type Model_type = 'chat' | 'completion' | 'embedding'; -export type Api_type = 'openai_compatible' | 'anthropic' | 'openai' | 'other'; -export type Auth_type = 'api_key' | 'bearer' | 'oauth' | 'managed' | 'none'; -export type Routing_priority = 'direct' | 'aggregator' | 'both'; +export type ModelType = 'chat' | 'completion' | 'embedding'; +export type Tuning = 'function' | 'instruction' | 'code' | 'multilingual' | 'multimodal' | 'structured' | 'reasoning'; +export type InputType = 'text' | 'image' | 'audio' | 'video' | 'other'; +export type OutputType = 'text' | 'image' | 'audio' | 'video' | 'other'; +export type ApiType = 'openai_compatible' | 'anthropic' | 'openai' | 'other'; +export type AuthType = 'api_key' | 'bearer' | 'oauth' | 'managed' | 'none'; +export type RoutingPriority = 'direct' | 'aggregator' | 'both'; export type Status = 'active' | 'deprecated' | 'inactive'; export type Family = 'tiktoken' | 'tekken' | 'sentencepiece' | 'huggingface' | 'other' | 'unknown'; // --- $defs --- -export interface Provider_reference { +export interface ProviderReference { provider_id: string; model_id_on_provider?: string; + model_info?: string; + cost_per_million_tokens?: TokenCosts; +} + +export interface TokenCosts { + input?: TokenCostValue; + cached_input?: TokenCostValue; + cache_write_input?: TokenCostValue; + output?: TokenCostValue; +} + +export type TokenCostValue = number | ModalityCosts; + +export interface ModalityCosts { + text?: number; + image?: number; + audio?: number; + video?: number; + other?: number; } -export interface Tokenizer_config { +export interface TokenizerConfig { family: Family; name?: string; } @@ -27,26 +49,28 @@ export interface ModelMetadata { model_description?: string; model_info?: string; model_version?: string; - model_type: Model_type; + model_type: ModelType; context_window: number; max_tokens?: number; - cost_per_token?: unknown; + cost_per_million_tokens?: TokenCosts; knowledge_cutoff?: string; - tokenizer?: Tokenizer_config; - tuning?: unknown[]; + tokenizer?: TokenizerConfig; + tuning?: Tuning[]; + input_type?: InputType[]; + output_type?: OutputType[]; deprecated?: boolean; meta_model?: boolean; - providers?: unknown[]; + providers?: ProviderReference[]; } export interface ProviderMetadata { provider_id: string; name: string; website_url?: string; - api_type: Api_type; + api_type: ApiType; base_url?: string; - auth_type?: Auth_type; - routing_priority: Routing_priority; + auth_type?: AuthType; + routing_priority: RoutingPriority; status?: Status; notes?: string; } diff --git a/packages/typescript/src/index.ts b/packages/typescript/src/index.ts index bd3a95f..eb57840 100644 --- a/packages/typescript/src/index.ts +++ b/packages/typescript/src/index.ts @@ -85,16 +85,14 @@ export function getProviderModelId( // --- Named re-exports for tree-shaking --- // Individual model objects — bundlers can dead-code-eliminate unused ones. // Kept in sync with models/*.yaml. Usage: import { gpt4o } from 'model-metadata-central'; -export const claudeHaiku4 = getModel("claude-haiku-4"); export const claudeHaiku45 = getModel("claude-haiku-4-5"); export const claudeOpus46 = getModel("claude-opus-4-6"); export const claudeOpus46Fast = getModel("claude-opus-4-6-fast"); export const claudeOpus47 = getModel("claude-opus-4-7"); export const claudeOpusLatest = getModel("claude-opus-latest"); -export const claudeSonnet42 = getModel("claude-sonnet-4-2"); export const claudeSonnet46 = getModel("claude-sonnet-4-6"); +export const claudinioEssential = getModel("claudinio-essential"); export const codestralLatest = getModel("codestral-latest"); -export const deepseekCoderV4 = getModel("deepseek-coder-v4"); export const deepseekR1DistillLlama70b = getModel("deepseek-r1-distill-llama-70b"); export const deepseekV4Flash = getModel("deepseek-v4-flash"); export const deepseekV4Pro = getModel("deepseek-v4-pro"); @@ -132,19 +130,18 @@ export const gpt54Nano = getModel("gpt-5.4-nano"); export const gpt54Pro = getModel("gpt-5.4-pro"); export const gpt55 = getModel("gpt-5.5"); export const gpt55Pro = getModel("gpt-5.5-pro"); -export const grok42 = getModel("grok-4.2"); -export const grok42MultiAgent = getModel("grok-4.2-multi-agent"); +export const grok420 = getModel("grok-4.20"); +export const grok420MultiAgent = getModel("grok-4.20-multi-agent"); export const kimiK26 = getModel("kimi-k2.6"); -export const kimiV3 = getModel("kimi-v3"); export const llama318bInstant = getModel("llama-3.1-8b-instant"); export const llama3370bVersatile = getModel("llama-3.3-70b-versatile"); export const minimaxM2 = getModel("minimax-m2"); export const minimaxM21 = getModel("minimax-m2.1"); -export const minimaxM21Highspeed = getModel("minimax-m2.1-highspeed"); export const minimaxM25 = getModel("minimax-m2.5"); export const minimaxM25Highspeed = getModel("minimax-m2.5-highspeed"); export const minimaxM27 = getModel("minimax-m2.7"); export const minimaxM27Highspeed = getModel("minimax-m2.7-highspeed"); +export const minimaxM3 = getModel("minimax-m3"); export const mistral7b = getModel("mistral-7b"); export const mistral7bInstruct = getModel("mistral-7b-instruct"); export const mistralLarge2411 = getModel("mistral-large-2411"); @@ -159,6 +156,7 @@ export const o4Mini = getModel("o4-mini"); export const qwen332b = getModel("qwen3-32b"); export const qwen36Flash = getModel("qwen3.6-flash"); export const qwen36Plus = getModel("qwen3.6-plus"); +export const qwen37Plus = getModel("qwen3.7-plus"); // Re-export types export type { @@ -172,5 +170,7 @@ export type { AuthType, RoutingPriority, ProviderStatus, - CostPerToken, -} from "./types.js"; \ No newline at end of file + Modality, + TokenCostValue, + TokenCosts, +} from "./types.js"; diff --git a/packages/typescript/src/providers.json b/packages/typescript/src/providers.json index 76346a1..9c56d7b 100644 --- a/packages/typescript/src/providers.json +++ b/packages/typescript/src/providers.json @@ -10,6 +10,17 @@ "status": "active", "notes": "Primary provider for Claude models. Uses Anthropic's own API protocol." }, + { + "provider_id": "claudinio", + "name": "Claudin.io", + "website_url": "https://claudin.io", + "api_type": "openai_compatible", + "base_url": "https://api.claudin.io/v1", + "auth_type": "api_key", + "routing_priority": "direct", + "status": "active", + "notes": "API proxy with fixed subscription and intelligent per-hour protection for coding agents. Claudinio runs a unified model optimized for coding agents." + }, { "provider_id": "cloudflare", "name": "Cloudflare Workers AI", diff --git a/packages/typescript/src/registry.json b/packages/typescript/src/registry.json index 82ee94b..270cde3 100644 --- a/packages/typescript/src/registry.json +++ b/packages/typescript/src/registry.json @@ -8,15 +8,22 @@ "model_type": "chat", "context_window": 200000, "max_tokens": 64000, - "cost_per_token": { - "input": 0.000001, - "output": 0.000005 + "cost_per_million_tokens": { + "input": 1, + "output": 5 }, "knowledge_cutoff": "2025-02-28", "tuning": [ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "anthropic", @@ -24,30 +31,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "anthropic/claude-haiku-4.5" - } - ] - }, - { - "model_id": "claude-haiku-4", - "model_name": "Claude Haiku 4", - "model_provider": "anthropic", - "model_description": "Fast, affordable Claude. Optimized for high-volume, latency-sensitive tasks where quality-per-token matters more than raw capability.", - "model_info": "https://docs.anthropic.com/en/docs/models/claude-haiku-4", - "model_type": "chat", - "context_window": 200000, - "cost_per_token": { - "input": 8e-7, - "output": 0.000004 - }, - "providers": [ - { - "provider_id": "anthropic", - "model_id_on_provider": "haiku-4" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "anthropic/claude-haiku-4" + "model_id_on_provider": "anthropic/claude-haiku-4.5", + "model_info": "https://openrouter.ai/anthropic/claude-haiku-4.5" } ] }, @@ -59,21 +44,25 @@ "model_info": "https://docs.anthropic.com/en/docs/models/claude-opus-4-6", "model_type": "chat", "context_window": 1000000, - "cost_per_token": { - "input": 0.00003, - "output": 0.00015 + "cost_per_million_tokens": { + "input": 30, + "output": 150 }, "tuning": [ "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ - { - "provider_id": "anthropic", - "model_id_on_provider": "claude-opus-4-6-fast" - }, { "provider_id": "openrouter", - "model_id_on_provider": "anthropic/claude-opus-4-6-fast" + "model_id_on_provider": "anthropic/claude-opus-4.6-fast", + "model_info": "https://openrouter.ai/anthropic/claude-opus-4.6-fast" } ] }, @@ -86,15 +75,22 @@ "model_type": "chat", "context_window": 1000000, "max_tokens": 128000, - "cost_per_token": { - "input": 0.000005, - "output": 0.000025 + "cost_per_million_tokens": { + "input": 5, + "output": 25 }, "knowledge_cutoff": "2025-05-31", "tuning": [ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "anthropic", @@ -102,7 +98,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "anthropic/claude-opus-4.6" + "model_id_on_provider": "anthropic/claude-opus-4.6", + "model_info": "https://openrouter.ai/anthropic/claude-opus-4.6" } ] }, @@ -114,13 +111,20 @@ "model_info": "https://docs.anthropic.com/en/docs/models/claude-opus-4-7", "model_type": "chat", "context_window": 1000000, - "cost_per_token": { - "input": 0.000005, - "output": 0.000025 + "cost_per_million_tokens": { + "input": 5, + "output": 25 }, "tuning": [ "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "anthropic", @@ -128,7 +132,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "anthropic/claude-opus-4-7" + "model_id_on_provider": "anthropic/claude-opus-4.7", + "model_info": "https://openrouter.ai/anthropic/claude-opus-4.7" } ] }, @@ -140,76 +145,98 @@ "model_info": "https://docs.anthropic.com/en/docs/models", "model_type": "chat", "context_window": 1000000, - "cost_per_token": { - "input": 0.000005, - "output": 0.000025 + "cost_per_million_tokens": { + "input": 5, + "output": 25 }, "tuning": [ "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ - { - "provider_id": "anthropic", - "model_id_on_provider": "opus" - }, { "provider_id": "openrouter", - "model_id_on_provider": "anthropic/claude-opus-latest" + "model_id_on_provider": "~anthropic/claude-opus-latest", + "model_info": "https://openrouter.ai/~anthropic/claude-opus-latest" } ] }, { - "model_id": "claude-sonnet-4-2", - "model_name": "Claude Sonnet 4.2", + "model_id": "claude-sonnet-4-6", + "model_name": "Claude Sonnet 4.6", "model_provider": "anthropic", - "model_description": "Balanced Anthropic model. Strong for coding, analysis, and everyday tasks at a mid-range price point.", - "model_info": "https://docs.anthropic.com/en/docs/models/claude-sonnet-4-2", + "model_description": "Anthropic's balanced Claude model with strong speed/intelligence tradeoffs, extended thinking, and 1M context.", + "model_info": "https://docs.anthropic.com/en/docs/about-claude/models/overview", "model_type": "chat", - "context_window": 200000, - "cost_per_token": { - "input": 0.000003, - "output": 0.000015 + "context_window": 1000000, + "max_tokens": 64000, + "cost_per_million_tokens": { + "input": 3, + "output": 15 }, + "knowledge_cutoff": "2025-08-31", "tuning": [ + "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "anthropic", - "model_id_on_provider": "claude-sonnet-4-2" + "model_id_on_provider": "claude-sonnet-4-6" }, { "provider_id": "openrouter", - "model_id_on_provider": "anthropic/claude-sonnet-4-2" + "model_id_on_provider": "anthropic/claude-sonnet-4.6", + "model_info": "https://openrouter.ai/anthropic/claude-sonnet-4.6" } ] }, { - "model_id": "claude-sonnet-4-6", - "model_name": "Claude Sonnet 4.6", - "model_provider": "anthropic", - "model_description": "Anthropic's balanced Claude model with strong speed/intelligence tradeoffs, extended thinking, and 1M context.", - "model_info": "https://docs.anthropic.com/en/docs/about-claude/models/overview", + "model_id": "claudinio-essential", + "model_name": "Claudinio Essential", + "model_provider": "claudinio", + "model_description": "Claudinio runs a unified model optimized for coding agents. All plans access the same high-performance model — the\ndifference is the hourly protection level, tuned for each developer profile.\n", + "model_info": "https://claudin.io/", "model_type": "chat", - "context_window": 1000000, + "context_window": 256000, "max_tokens": 64000, - "cost_per_token": { - "input": 0.000003, - "output": 0.000015 + "cost_per_million_tokens": { + "input": 0.5, + "output": 20 }, - "knowledge_cutoff": "2025-08-31", + "knowledge_cutoff": "2026-05-01", "tuning": [ "multimodal", - "function" + "function", + "code", + "reasoning" + ], + "input_type": [ + "text", + "image", + "audio", + "video" + ], + "output_type": [ + "text" ], "providers": [ { - "provider_id": "anthropic", - "model_id_on_provider": "claude-sonnet-4-6" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "anthropic/claude-sonnet-4.6" + "provider_id": "claudinio", + "model_id_on_provider": "claudinio-essential" } ] }, @@ -222,9 +249,9 @@ "model_type": "chat", "context_window": 256000, "max_tokens": 4096, - "cost_per_token": { - "input": 3e-7, - "output": 9e-7 + "cost_per_million_tokens": { + "input": 0.3, + "output": 0.9 }, "knowledge_cutoff": "2024-10-01", "tokenizer": { @@ -234,40 +261,16 @@ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "mistralai", "model_id_on_provider": "codestral-latest" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "mistralai/codestral-latest" - } - ] - }, - { - "model_id": "deepseek-coder-v4", - "model_name": "DeepSeek Coder V4", - "model_provider": "deepseek", - "model_description": "DeepSeek's dedicated code model. Specialized for code generation, completion, and debugging across many languages.", - "model_info": "https://api.deepseek.com", - "model_type": "chat", - "context_window": 1048576, - "cost_per_token": { - "input": 4.3e-7, - "output": 8.7e-7 - }, - "tuning": [ - "code" - ], - "providers": [ - { - "provider_id": "deepseek", - "model_id_on_provider": "deepseek-coder" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "deepseek/deepseek-coder-v4" } ] }, @@ -280,15 +283,21 @@ "model_type": "chat", "context_window": 131072, "max_tokens": 8192, - "cost_per_token": { - "input": 7.5e-7, - "output": 9.9e-7 + "cost_per_million_tokens": { + "input": 0.75, + "output": 0.99 }, "knowledge_cutoff": "2024-07-01", "tuning": [ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "groq", @@ -304,10 +313,16 @@ "model_info": "https://api.deepseek.com", "model_type": "chat", "context_window": 1048576, - "cost_per_token": { - "input": 1.4e-7, - "output": 2.8e-7 + "cost_per_million_tokens": { + "input": 0.14, + "output": 0.28 }, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "deepseek", @@ -315,7 +330,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "deepseek/deepseek-v4-flash" + "model_id_on_provider": "deepseek/deepseek-v4-flash", + "model_info": "https://openrouter.ai/deepseek/deepseek-v4-flash" } ] }, @@ -327,13 +343,19 @@ "model_info": "https://api.deepseek.com", "model_type": "chat", "context_window": 1048576, - "cost_per_token": { - "input": 4.3e-7, - "output": 8.7e-7 + "cost_per_million_tokens": { + "input": 0.43, + "output": 0.87 }, "tuning": [ "function" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "deepseek", @@ -341,7 +363,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "deepseek/deepseek-v4-pro" + "model_id_on_provider": "deepseek/deepseek-v4-pro", + "model_info": "https://openrouter.ai/deepseek/deepseek-v4-pro" } ] }, @@ -353,19 +376,24 @@ "model_info": "https://ai.google.dev/gemini-api/models/gemini-2.0-flash", "model_type": "chat", "context_window": 128000, - "cost_per_token": { - "input": 1e-7, - "output": 4e-7 + "cost_per_million_tokens": { + "input": 0.1, + "output": 0.4 }, "deprecated": true, + "input_type": [ + "text", + "image", + "audio", + "video" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "google", "model_id_on_provider": "gemini-2.0-flash" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "google/gemini-2.0-flash" } ] }, @@ -377,13 +405,22 @@ "model_info": "https://ai.google.dev/gemini-api/models/gemini-2.5-flash", "model_type": "chat", "context_window": 1000000, - "cost_per_token": { - "input": 7.5e-8, - "output": 3e-7 + "cost_per_million_tokens": { + "input": 0.075, + "output": 0.3 }, "tuning": [ "multimodal" ], + "input_type": [ + "text", + "image", + "audio", + "video" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "google", @@ -391,7 +428,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "google/gemini-2.5-flash" + "model_id_on_provider": "google/gemini-2.5-flash", + "model_info": "https://openrouter.ai/google/gemini-2.5-flash" } ] }, @@ -403,13 +441,22 @@ "model_info": "https://ai.google.dev/gemini-api/docs/models/gemini-2.5-pro", "model_type": "chat", "context_window": 1000000, - "cost_per_token": { - "input": 0.00000125, - "output": 0.000005 + "cost_per_million_tokens": { + "input": 1.25, + "output": 5 }, "tuning": [ "multimodal" ], + "input_type": [ + "text", + "image", + "audio", + "video" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "google", @@ -417,7 +464,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "google/gemini-2.5-pro" + "model_id_on_provider": "google/gemini-2.5-pro", + "model_info": "https://openrouter.ai/google/gemini-2.5-pro" } ] }, @@ -429,10 +477,16 @@ "model_info": "https://ai.google.dev/gemma", "model_type": "chat", "context_window": 262144, - "cost_per_token": { - "input": 6e-8, - "output": 3.3e-7 + "cost_per_million_tokens": { + "input": 0.06, + "output": 0.33 }, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "google", @@ -444,7 +498,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "google/gemma-4-26b-a4b-it" + "model_id_on_provider": "google/gemma-4-26b-a4b-it", + "model_info": "https://openrouter.ai/google/gemma-4-26b-a4b-it" } ] }, @@ -456,10 +511,16 @@ "model_info": "https://ai.google.dev/gemma", "model_type": "chat", "context_window": 262144, - "cost_per_token": { - "input": 1.3e-7, - "output": 3.8e-7 + "cost_per_million_tokens": { + "input": 0.13, + "output": 0.38 }, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "google", @@ -467,7 +528,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "google/gemma-4-31b-it" + "model_id_on_provider": "google/gemma-4-31b-it", + "model_info": "https://openrouter.ai/google/gemma-4-31b-it" } ] }, @@ -480,7 +542,7 @@ "model_type": "chat", "context_window": 200000, "max_tokens": 131072, - "cost_per_token": { + "cost_per_million_tokens": { "input": 0, "output": 0 }, @@ -489,6 +551,12 @@ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "zai", @@ -500,7 +568,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "z-ai/glm-4.7-flash" + "model_id_on_provider": "z-ai/glm-4.7-flash", + "model_info": "https://openrouter.ai/z-ai/glm-4.7-flash" } ] }, @@ -513,15 +582,21 @@ "model_type": "chat", "context_window": 204800, "max_tokens": 131072, - "cost_per_token": { - "input": 6e-7, - "output": 0.0000022 + "cost_per_million_tokens": { + "input": 0.6, + "output": 2.2 }, "knowledge_cutoff": "2025-04-01", "tuning": [ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "zai", @@ -529,7 +604,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "z-ai/glm-4.7" + "model_id_on_provider": "z-ai/glm-4.7", + "model_info": "https://openrouter.ai/z-ai/glm-4.7" } ] }, @@ -542,13 +618,19 @@ "model_type": "chat", "context_window": 200000, "max_tokens": 131072, - "cost_per_token": { - "input": 0.0000012, - "output": 0.000004 + "cost_per_million_tokens": { + "input": 1.2, + "output": 4 }, "tuning": [ "function" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "zai", @@ -556,7 +638,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "z-ai/glm-5-turbo" + "model_id_on_provider": "z-ai/glm-5-turbo", + "model_info": "https://openrouter.ai/z-ai/glm-5-turbo" } ] }, @@ -569,13 +652,19 @@ "model_type": "chat", "context_window": 200000, "max_tokens": 131072, - "cost_per_token": { - "input": 0.0000014, - "output": 0.0000044 + "cost_per_million_tokens": { + "input": 1.4, + "output": 4.4 }, "tuning": [ "function" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "zai", @@ -583,7 +672,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "z-ai/glm-5.1" + "model_id_on_provider": "z-ai/glm-5.1", + "model_info": "https://openrouter.ai/z-ai/glm-5.1" } ] }, @@ -596,14 +686,20 @@ "model_type": "chat", "context_window": 204800, "max_tokens": 131072, - "cost_per_token": { - "input": 0.000001, - "output": 0.0000032 + "cost_per_million_tokens": { + "input": 1, + "output": 3.2 }, "tuning": [ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "zai", @@ -611,7 +707,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "z-ai/glm-5" + "model_id_on_provider": "z-ai/glm-5", + "model_info": "https://openrouter.ai/z-ai/glm-5" } ] }, @@ -624,14 +721,22 @@ "model_type": "chat", "context_window": 200000, "max_tokens": 131072, - "cost_per_token": { - "input": 0.0000012, - "output": 0.000004 + "cost_per_million_tokens": { + "input": 1.2, + "output": 4 }, "tuning": [ "multimodal", "function" ], + "input_type": [ + "text", + "image", + "video" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "zai", @@ -639,7 +744,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "z-ai/glm-5v-turbo" + "model_id_on_provider": "z-ai/glm-5v-turbo", + "model_info": "https://openrouter.ai/z-ai/glm-5v-turbo" } ] }, @@ -653,9 +759,9 @@ "model_type": "chat", "context_window": 16385, "max_tokens": 4096, - "cost_per_token": { - "input": 0.000003, - "output": 0.000004 + "cost_per_million_tokens": { + "input": 3, + "output": 4 }, "knowledge_cutoff": "2021-09-01", "tokenizer": { @@ -666,6 +772,12 @@ "instruction" ], "deprecated": true, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -683,9 +795,9 @@ "model_type": "completion", "context_window": 4097, "max_tokens": 4095, - "cost_per_token": { - "input": 0.0000015, - "output": 0.000002 + "cost_per_million_tokens": { + "input": 1.5, + "output": 2 }, "knowledge_cutoff": "2021-09-01", "tokenizer": { @@ -696,7 +808,13 @@ "instruction", "function" ], - "deprecated": true + "deprecated": true, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ] }, { "model_id": "gpt-3.5-turbo", @@ -708,9 +826,9 @@ "model_type": "chat", "context_window": 4097, "max_tokens": 4095, - "cost_per_token": { - "input": 0.0000015, - "output": 0.000002 + "cost_per_million_tokens": { + "input": 1.5, + "output": 2 }, "knowledge_cutoff": "2021-09-01", "tokenizer": { @@ -721,6 +839,12 @@ "function" ], "deprecated": true, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -737,9 +861,9 @@ "model_version": "latest", "model_type": "chat", "context_window": 32768, - "cost_per_token": { - "input": 0.00006, - "output": 0.00012 + "cost_per_million_tokens": { + "input": 60, + "output": 120 }, "knowledge_cutoff": "2021-09-01", "tokenizer": { @@ -749,7 +873,13 @@ "tuning": [ "function" ], - "deprecated": true + "deprecated": true, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ] }, { "model_id": "gpt-4-turbo", @@ -760,9 +890,9 @@ "model_type": "chat", "context_window": 128000, "max_tokens": 4096, - "cost_per_token": { - "input": 0.00001, - "output": 0.00003 + "cost_per_million_tokens": { + "input": 10, + "output": 30 }, "knowledge_cutoff": "2023-12-01", "tokenizer": { @@ -773,6 +903,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -780,7 +917,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-4-turbo" + "model_id_on_provider": "openai/gpt-4-turbo", + "model_info": "https://openrouter.ai/openai/gpt-4-turbo" } ] }, @@ -793,9 +931,9 @@ "model_type": "chat", "context_window": 1047576, "max_tokens": 32768, - "cost_per_token": { - "input": 4e-7, - "output": 0.0000016 + "cost_per_million_tokens": { + "input": 0.4, + "output": 1.6 }, "knowledge_cutoff": "2024-04-01", "tokenizer": { @@ -806,6 +944,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -813,7 +958,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-4.1-mini" + "model_id_on_provider": "openai/gpt-4.1-mini", + "model_info": "https://openrouter.ai/openai/gpt-4.1-mini" } ] }, @@ -826,9 +972,9 @@ "model_type": "chat", "context_window": 1047576, "max_tokens": 32768, - "cost_per_token": { - "input": 1e-7, - "output": 4e-7 + "cost_per_million_tokens": { + "input": 0.1, + "output": 0.4 }, "knowledge_cutoff": "2024-04-01", "tokenizer": { @@ -839,6 +985,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -846,7 +999,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-4.1-nano" + "model_id_on_provider": "openai/gpt-4.1-nano", + "model_info": "https://openrouter.ai/openai/gpt-4.1-nano" } ] }, @@ -859,9 +1013,9 @@ "model_type": "chat", "context_window": 1047576, "max_tokens": 32768, - "cost_per_token": { - "input": 0.000002, - "output": 0.000008 + "cost_per_million_tokens": { + "input": 2, + "output": 8 }, "knowledge_cutoff": "2024-04-01", "tokenizer": { @@ -872,6 +1026,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -879,7 +1040,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-4.1" + "model_id_on_provider": "openai/gpt-4.1", + "model_info": "https://openrouter.ai/openai/gpt-4.1" } ] }, @@ -891,9 +1053,9 @@ "model_info": "https://platform.openai.com/docs/models/gpt-4.5", "model_type": "chat", "context_window": 128000, - "cost_per_token": { - "input": 0.00001, - "output": 0.00003 + "cost_per_million_tokens": { + "input": 10, + "output": 30 }, "tuning": [ "function" @@ -902,14 +1064,18 @@ "family": "tiktoken", "name": "o200k_base" }, + "deprecated": true, + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", "model_id_on_provider": "gpt-4.5" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-4.5" } ] }, @@ -923,9 +1089,9 @@ "model_type": "chat", "context_window": 8192, "max_tokens": 8191, - "cost_per_token": { - "input": 0.00003, - "output": 0.00006 + "cost_per_million_tokens": { + "input": 30, + "output": 60 }, "knowledge_cutoff": "2021-09-01", "tokenizer": { @@ -936,6 +1102,12 @@ "function" ], "deprecated": true, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -952,9 +1124,9 @@ "model_type": "chat", "context_window": 128000, "max_tokens": 16384, - "cost_per_token": { - "input": 1.5e-7, - "output": 6e-7 + "cost_per_million_tokens": { + "input": 0.15, + "output": 0.6 }, "tuning": [ "multimodal" @@ -963,6 +1135,13 @@ "family": "tiktoken", "name": "o200k_base" }, + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -970,7 +1149,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-4o-mini" + "model_id_on_provider": "openai/gpt-4o-mini", + "model_info": "https://openrouter.ai/openai/gpt-4o-mini" } ] }, @@ -983,9 +1163,9 @@ "model_type": "chat", "context_window": 128000, "max_tokens": 32768, - "cost_per_token": { - "input": 0.000005, - "output": 0.000015 + "cost_per_million_tokens": { + "input": 5, + "output": 15 }, "tuning": [ "multimodal" @@ -994,6 +1174,14 @@ "family": "tiktoken", "name": "o200k_base" }, + "input_type": [ + "text", + "image", + "audio" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1001,7 +1189,12 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-4o" + "model_id_on_provider": "openai/gpt-4o", + "cost_per_million_tokens": { + "input": 2.5, + "output": 10 + }, + "model_info": "https://openrouter.ai/openai/gpt-4o" } ] }, @@ -1014,9 +1207,9 @@ "model_type": "chat", "context_window": 400000, "max_tokens": 128000, - "cost_per_token": { - "input": 2.5e-7, - "output": 0.000002 + "cost_per_million_tokens": { + "input": 0.25, + "output": 2 }, "knowledge_cutoff": "2024-05-30", "tokenizer": { @@ -1027,6 +1220,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1034,7 +1234,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5-mini" + "model_id_on_provider": "openai/gpt-5-mini", + "model_info": "https://openrouter.ai/openai/gpt-5-mini" } ] }, @@ -1047,9 +1248,9 @@ "model_type": "chat", "context_window": 400000, "max_tokens": 128000, - "cost_per_token": { - "input": 5e-8, - "output": 4e-7 + "cost_per_million_tokens": { + "input": 0.05, + "output": 0.4 }, "knowledge_cutoff": "2024-05-30", "tokenizer": { @@ -1060,6 +1261,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1067,7 +1275,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5-nano" + "model_id_on_provider": "openai/gpt-5-nano", + "model_info": "https://openrouter.ai/openai/gpt-5-nano" } ] }, @@ -1080,9 +1289,9 @@ "model_type": "chat", "context_window": 400000, "max_tokens": 128000, - "cost_per_token": { - "input": 0.00000175, - "output": 0.000014 + "cost_per_million_tokens": { + "input": 1.75, + "output": 14 }, "knowledge_cutoff": "2025-08-31", "tokenizer": { @@ -1093,6 +1302,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1100,7 +1316,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5.3-codex" + "model_id_on_provider": "openai/gpt-5.3-codex", + "model_info": "https://openrouter.ai/openai/gpt-5.3-codex" } ] }, @@ -1112,13 +1329,21 @@ "model_info": "https://platform.openai.com/docs/models/gpt-5.4-image-2", "model_type": "chat", "context_window": 272000, - "cost_per_token": { - "input": 0.000008, - "output": 0.000015 + "cost_per_million_tokens": { + "input": 8, + "output": 15 }, "tuning": [ "multimodal" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text", + "image" + ], "providers": [ { "provider_id": "openai", @@ -1126,7 +1351,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5.4-image-2" + "model_id_on_provider": "openai/gpt-5.4-image-2", + "model_info": "https://openrouter.ai/openai/gpt-5.4-image-2" } ] }, @@ -1139,9 +1365,9 @@ "model_type": "chat", "context_window": 400000, "max_tokens": 128000, - "cost_per_token": { - "input": 7.5e-7, - "output": 0.0000045 + "cost_per_million_tokens": { + "input": 0.75, + "output": 4.5 }, "knowledge_cutoff": "2025-08-31", "tokenizer": { @@ -1152,6 +1378,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1159,7 +1392,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5.4-mini" + "model_id_on_provider": "openai/gpt-5.4-mini", + "model_info": "https://openrouter.ai/openai/gpt-5.4-mini" } ] }, @@ -1172,9 +1406,9 @@ "model_type": "chat", "context_window": 400000, "max_tokens": 128000, - "cost_per_token": { - "input": 2e-7, - "output": 0.00000125 + "cost_per_million_tokens": { + "input": 0.2, + "output": 1.25 }, "knowledge_cutoff": "2025-08-31", "tokenizer": { @@ -1185,6 +1419,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1192,7 +1433,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5.4-nano" + "model_id_on_provider": "openai/gpt-5.4-nano", + "model_info": "https://openrouter.ai/openai/gpt-5.4-nano" } ] }, @@ -1205,9 +1447,9 @@ "model_type": "chat", "context_window": 1050000, "max_tokens": 128000, - "cost_per_token": { - "input": 0.00003, - "output": 0.00018 + "cost_per_million_tokens": { + "input": 30, + "output": 180 }, "knowledge_cutoff": "2025-08-31", "tokenizer": { @@ -1218,6 +1460,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1225,7 +1474,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5.4-pro" + "model_id_on_provider": "openai/gpt-5.4-pro", + "model_info": "https://openrouter.ai/openai/gpt-5.4-pro" } ] }, @@ -1238,9 +1488,9 @@ "model_type": "chat", "context_window": 1050000, "max_tokens": 128000, - "cost_per_token": { - "input": 0.0000025, - "output": 0.000015 + "cost_per_million_tokens": { + "input": 2.5, + "output": 15 }, "knowledge_cutoff": "2025-08-31", "tokenizer": { @@ -1251,6 +1501,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1258,7 +1515,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5.4" + "model_id_on_provider": "openai/gpt-5.4", + "model_info": "https://openrouter.ai/openai/gpt-5.4" } ] }, @@ -1271,13 +1529,19 @@ "model_type": "chat", "context_window": 1050000, "max_tokens": 1049999, - "cost_per_token": { - "input": 0.00003, - "output": 0.00018 + "cost_per_million_tokens": { + "input": 30, + "output": 180 }, "tuning": [ "function" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1285,7 +1549,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5.5-pro" + "model_id_on_provider": "openai/gpt-5.5-pro", + "model_info": "https://openrouter.ai/openai/gpt-5.5-pro" } ] }, @@ -1298,13 +1563,19 @@ "model_type": "chat", "context_window": 1050000, "max_tokens": 1049999, - "cost_per_token": { - "input": 0.000005, - "output": 0.00003 + "cost_per_million_tokens": { + "input": 5, + "output": 30 }, "tuning": [ "function" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1312,7 +1583,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5.5" + "model_id_on_provider": "openai/gpt-5.5", + "model_info": "https://openrouter.ai/openai/gpt-5.5" } ] }, @@ -1325,9 +1597,9 @@ "model_type": "chat", "context_window": 400000, "max_tokens": 128000, - "cost_per_token": { - "input": 0.00000125, - "output": 0.00001 + "cost_per_million_tokens": { + "input": 1.25, + "output": 10 }, "knowledge_cutoff": "2024-09-30", "tokenizer": { @@ -1338,6 +1610,13 @@ "multimodal", "function" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1345,56 +1624,90 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/gpt-5" + "model_id_on_provider": "openai/gpt-5", + "model_info": "https://openrouter.ai/openai/gpt-5" } ] }, { - "model_id": "grok-4.2-multi-agent", - "model_name": "Grok 4.2 Multi-Agent", + "model_id": "grok-4.20-multi-agent", + "model_name": "Grok 4.20 Multi-Agent", "model_provider": "x-ai", - "model_description": "Grok 4.2 optimized for multi-agent workflows. Enhanced tool use and coordination for parallel task execution.", + "model_description": "Grok 4.20 optimized for multi-agent workflows. Enhanced coordination for parallel task execution.", "model_info": "https://x.ai/api", "model_type": "chat", "context_window": 2000000, - "cost_per_token": { - "input": 0.000002, - "output": 0.000006 + "max_tokens": 30000, + "cost_per_million_tokens": { + "input": 1.25, + "cached_input": 0.2, + "output": 2.5 }, + "tuning": [ + "reasoning", + "multimodal" + ], + "input_type": [ + "text", + "image", + "other" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "x-ai", - "model_id_on_provider": "grok-4.2" + "model_id_on_provider": "grok-4.20-multi-agent-0309" }, { "provider_id": "openrouter", - "model_id_on_provider": "x-ai/grok-4.2-multi-agent" + "model_id_on_provider": "x-ai/grok-4.20-multi-agent", + "cost_per_million_tokens": { + "input": 2, + "cached_input": 0.2, + "output": 6 + }, + "model_info": "https://openrouter.ai/x-ai/grok-4.20-multi-agent" } ] }, { - "model_id": "grok-4.2", - "model_name": "Grok 4.2", + "model_id": "grok-4.20", + "model_name": "Grok 4.20", "model_provider": "x-ai", "model_description": "xAI's flagship model. Strong reasoning with real-time web access. Known for personality and directness.", "model_info": "https://x.ai/api", "model_type": "chat", "context_window": 2000000, - "cost_per_token": { - "input": 0.000002, - "output": 0.000006 + "max_tokens": 30000, + "cost_per_million_tokens": { + "input": 1.25, + "cached_input": 0.2, + "output": 2.5 }, "tuning": [ - "function" + "function", + "reasoning", + "multimodal" + ], + "input_type": [ + "text", + "image", + "other" + ], + "output_type": [ + "text" ], "providers": [ { "provider_id": "x-ai", - "model_id_on_provider": "grok-4.2" + "model_id_on_provider": "grok-4.20-0309-reasoning" }, { "provider_id": "openrouter", - "model_id_on_provider": "x-ai/grok-4.2" + "model_id_on_provider": "x-ai/grok-4.20", + "model_info": "https://openrouter.ai/x-ai/grok-4.20" } ] }, @@ -1406,13 +1719,19 @@ "model_info": "https://platform.moonshot.ai/docs", "model_type": "chat", "context_window": 256000, - "cost_per_token": { - "input": 7.4e-7, - "output": 0.00000466 + "cost_per_million_tokens": { + "input": 0.74, + "output": 4.66 }, "tuning": [ "function" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "moonshotai", @@ -1424,30 +1743,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "moonshotai/kimi-k2.6" - } - ] - }, - { - "model_id": "kimi-v3", - "model_name": "Kimi V3", - "model_provider": "moonshotai", - "model_description": "Mid-range Moonshot model. Good balance of capability and cost for standard tasks.", - "model_info": "https://platform.moonshot.ai/docs", - "model_type": "chat", - "context_window": 256000, - "cost_per_token": { - "input": 2e-7, - "output": 0.000001 - }, - "providers": [ - { - "provider_id": "moonshotai", - "model_id_on_provider": "kimi-v3" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "moonshotai/kimi-v3" + "model_id_on_provider": "moonshotai/kimi-k2.6", + "model_info": "https://openrouter.ai/moonshotai/kimi-k2.6" } ] }, @@ -1460,15 +1757,21 @@ "model_type": "chat", "context_window": 131072, "max_tokens": 131072, - "cost_per_token": { - "input": 5e-8, - "output": 8e-8 + "cost_per_million_tokens": { + "input": 0.05, + "output": 0.08 }, "knowledge_cutoff": "2023-12-01", "tuning": [ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "groq", @@ -1485,15 +1788,21 @@ "model_type": "chat", "context_window": 131072, "max_tokens": 32768, - "cost_per_token": { - "input": 5.9e-7, - "output": 7.9e-7 + "cost_per_million_tokens": { + "input": 0.59, + "output": 0.79 }, "knowledge_cutoff": "2023-12-01", "tuning": [ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "groq", @@ -1501,32 +1810,6 @@ } ] }, - { - "model_id": "minimax-m2.1-highspeed", - "model_name": "MiniMax M2.1-highspeed", - "model_provider": "minimax", - "model_description": "High-speed MiniMax M2.1 variant for faster multilingual programming and agent workflows.", - "model_info": "https://platform.minimax.io/docs/guides/text-generation", - "model_type": "chat", - "context_window": 204800, - "max_tokens": 131072, - "cost_per_token": { - "input": 6e-7, - "output": 0.0000024 - }, - "tuning": [ - "function", - "instruction", - "code", - "multilingual" - ], - "providers": [ - { - "provider_id": "minimax", - "model_id_on_provider": "MiniMax-M2.1-highspeed" - } - ] - }, { "model_id": "minimax-m2.1", "model_name": "MiniMax M2.1", @@ -1536,9 +1819,9 @@ "model_type": "chat", "context_window": 204800, "max_tokens": 131072, - "cost_per_token": { - "input": 3e-7, - "output": 0.0000012 + "cost_per_million_tokens": { + "input": 0.3, + "output": 1.2 }, "tuning": [ "function", @@ -1546,6 +1829,12 @@ "code", "multilingual" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "minimax", @@ -1553,7 +1842,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "minimax/minimax-m2.1" + "model_id_on_provider": "minimax/minimax-m2.1", + "model_info": "https://openrouter.ai/minimax/minimax-m2.1" } ] }, @@ -1566,9 +1856,9 @@ "model_type": "chat", "context_window": 204800, "max_tokens": 131072, - "cost_per_token": { - "input": 6e-7, - "output": 0.0000024 + "cost_per_million_tokens": { + "input": 0.6, + "output": 2.4 }, "tuning": [ "function", @@ -1576,6 +1866,12 @@ "code", "multilingual" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "minimax", @@ -1588,13 +1884,13 @@ "model_name": "MiniMax M2.5", "model_provider": "minimax", "model_description": "MiniMax M2.5 model for complex programming, agent, and productivity tasks.", - "model_info": "https://platform.minimax.io/docs/guides/text-generation", + "model_info": "https://www.minimax.io/models/text", "model_type": "chat", "context_window": 204800, "max_tokens": 131072, - "cost_per_token": { - "input": 3e-7, - "output": 0.0000012 + "cost_per_million_tokens": { + "input": 0.3, + "output": 1.2 }, "tuning": [ "function", @@ -1602,6 +1898,12 @@ "code", "multilingual" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "minimax", @@ -1609,7 +1911,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "minimax/minimax-m2.5" + "model_id_on_provider": "minimax/minimax-m2.5", + "model_info": "https://openrouter.ai/minimax/minimax-m2.5" } ] }, @@ -1622,9 +1925,9 @@ "model_type": "chat", "context_window": 204800, "max_tokens": 131072, - "cost_per_token": { - "input": 6e-7, - "output": 0.0000024 + "cost_per_million_tokens": { + "input": 0.6, + "output": 2.4 }, "tuning": [ "function", @@ -1632,6 +1935,12 @@ "code", "multilingual" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "minimax", @@ -1648,9 +1957,9 @@ "model_type": "chat", "context_window": 204800, "max_tokens": 131072, - "cost_per_token": { - "input": 3e-7, - "output": 0.0000012 + "cost_per_million_tokens": { + "input": 0.3, + "output": 1.2 }, "tuning": [ "function", @@ -1658,6 +1967,12 @@ "code", "multilingual" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "minimax", @@ -1665,7 +1980,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "minimax/minimax-m2.7" + "model_id_on_provider": "minimax/minimax-m2.7", + "model_info": "https://openrouter.ai/minimax/minimax-m2.7" } ] }, @@ -1678,9 +1994,9 @@ "model_type": "chat", "context_window": 204800, "max_tokens": 128000, - "cost_per_token": { - "input": 3e-7, - "output": 0.0000012 + "cost_per_million_tokens": { + "input": 0.3, + "output": 1.2 }, "tuning": [ "function", @@ -1688,6 +2004,12 @@ "code", "multilingual" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "minimax", @@ -1695,7 +2017,52 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "minimax/minimax-m2" + "model_id_on_provider": "minimax/minimax-m2", + "model_info": "https://openrouter.ai/minimax/minimax-m2" + } + ] + }, + { + "model_id": "minimax-m3", + "model_name": "MiniMax M3", + "model_provider": "minimax", + "model_description": "MiniMax-M3 is a multimodal foundation model from MiniMax. It supports text, image, and video inputs with text output, a 1M-token context window, and is suited for\nlong-horizon agentic work, coding, and tool use. It is built on MiniMax Sparse Attention (MSA), which replaces full attention with KV-block selection to cut per-token\ncompute at long context — roughly 1/20 the cost of the previous generation at 1M tokens, with substantially faster prefill and decode while retaining quality across\nmost tasks.\n", + "model_info": "https://www.minimax.io/models/text/m3", + "model_type": "chat", + "context_window": 512000, + "max_tokens": 128000, + "cost_per_million_tokens": { + "input": 0.6, + "output": 2.4 + }, + "tuning": [ + "function", + "instruction", + "code", + "multilingual" + ], + "input_type": [ + "text", + "image", + "video" + ], + "output_type": [ + "text" + ], + "providers": [ + { + "provider_id": "minimax", + "model_id_on_provider": "MiniMax-M3" + }, + { + "provider_id": "openrouter", + "model_id_on_provider": "minimax/minimax-m3", + "cost_per_million_tokens": { + "input": 0.3, + "cached_input": 0.06, + "output": 1.2 + }, + "model_info": "https://openrouter.ai/minimax/minimax-m3" } ] }, @@ -1711,14 +2078,16 @@ "instruction" ], "deprecated": true, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "mistralai", "model_id_on_provider": "mistral-7b-instruct-0.3" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "mistralai/mistral-7b-instruct" } ] }, @@ -1730,16 +2099,21 @@ "model_info": "https://mistral.ai/news/announcing-mistral-7b/", "model_type": "chat", "context_window": 8192, - "cost_per_token": 0, + "cost_per_million_tokens": { + "input": 0, + "output": 0 + }, "deprecated": true, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "mistralai", "model_id_on_provider": "open-mistral-7b" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "mistralai/mistral-7b" } ] }, @@ -1752,9 +2126,9 @@ "model_type": "chat", "context_window": 131072, "max_tokens": 16384, - "cost_per_token": { - "input": 0.000002, - "output": 0.000006 + "cost_per_million_tokens": { + "input": 2, + "output": 6 }, "knowledge_cutoff": "2024-11-01", "tokenizer": { @@ -1764,14 +2138,16 @@ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "mistralai", "model_id_on_provider": "mistral-large-2411" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "mistralai/mistral-large-2411" } ] }, @@ -1784,9 +2160,9 @@ "model_type": "chat", "context_window": 262144, "max_tokens": 262144, - "cost_per_token": { - "input": 5e-7, - "output": 0.0000015 + "cost_per_million_tokens": { + "input": 0.5, + "output": 1.5 }, "knowledge_cutoff": "2024-11-01", "tokenizer": { @@ -1797,6 +2173,13 @@ "function", "instruction" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "mistralai", @@ -1804,7 +2187,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "mistralai/mistral-large-2512" + "model_id_on_provider": "mistralai/mistral-large-2512", + "model_info": "https://openrouter.ai/mistralai/mistral-large-2512" } ] }, @@ -1817,9 +2201,9 @@ "model_type": "chat", "context_window": 262144, "max_tokens": 262144, - "cost_per_token": { - "input": 5e-7, - "output": 0.0000015 + "cost_per_million_tokens": { + "input": 0.5, + "output": 1.5 }, "knowledge_cutoff": "2024-11-01", "tokenizer": { @@ -1830,14 +2214,17 @@ "function", "instruction" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "mistralai", "model_id_on_provider": "mistral-large-latest" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "mistralai/mistral-large-latest" } ] }, @@ -1850,9 +2237,9 @@ "model_type": "chat", "context_window": 128000, "max_tokens": 16384, - "cost_per_token": { - "input": 4e-7, - "output": 0.000002 + "cost_per_million_tokens": { + "input": 0.4, + "output": 2 }, "knowledge_cutoff": "2025-05-01", "tokenizer": { @@ -1863,14 +2250,17 @@ "function", "instruction" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "mistralai", "model_id_on_provider": "mistral-medium-latest" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "mistralai/mistral-medium-latest" } ] }, @@ -1883,9 +2273,9 @@ "model_type": "chat", "context_window": 128000, "max_tokens": 128000, - "cost_per_token": { - "input": 1.5e-7, - "output": 1.5e-7 + "cost_per_million_tokens": { + "input": 0.15, + "output": 0.15 }, "knowledge_cutoff": "2024-07-01", "tokenizer": { @@ -1895,6 +2285,12 @@ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "mistralai", @@ -1902,7 +2298,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "mistralai/mistral-nemo" + "model_id_on_provider": "mistralai/mistral-nemo", + "model_info": "https://openrouter.ai/mistralai/mistral-nemo" } ] }, @@ -1915,9 +2312,9 @@ "model_type": "chat", "context_window": 256000, "max_tokens": 256000, - "cost_per_token": { - "input": 1.5e-7, - "output": 6e-7 + "cost_per_million_tokens": { + "input": 0.15, + "output": 0.6 }, "knowledge_cutoff": "2025-06-01", "tokenizer": { @@ -1928,14 +2325,17 @@ "function", "instruction" ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "mistralai", "model_id_on_provider": "mistral-small-latest" - }, - { - "provider_id": "openrouter", - "model_id_on_provider": "mistralai/mistral-small-latest" } ] }, @@ -1948,15 +2348,21 @@ "model_type": "chat", "context_window": 262144, "max_tokens": 262144, - "cost_per_token": { - "input": 2e-7, - "output": 8e-7 + "cost_per_million_tokens": { + "input": 0.2, + "output": 0.8 }, "knowledge_cutoff": "2024-04-01", "tuning": [ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "nvidia", @@ -1964,7 +2370,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "nvidia/nemotron-3-super-120b-a12b" + "model_id_on_provider": "nvidia/nemotron-3-super-120b-a12b", + "model_info": "https://openrouter.ai/nvidia/nemotron-3-super-120b-a12b" }, { "provider_id": "cloudflare", @@ -1980,14 +2387,21 @@ "model_info": "https://platform.openai.com/docs/models/o3", "model_type": "chat", "context_window": 200000, - "cost_per_token": { - "input": 0.000004, - "output": 0.000016 + "cost_per_million_tokens": { + "input": 4, + "output": 16 }, "tokenizer": { "family": "tiktoken", "name": "o200k_base" }, + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -1995,7 +2409,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/o3" + "model_id_on_provider": "openai/o3", + "model_info": "https://openrouter.ai/openai/o3" } ] }, @@ -2007,14 +2422,21 @@ "model_info": "https://platform.openai.com/docs/models/o4-mini", "model_type": "chat", "context_window": 100000, - "cost_per_token": { - "input": 0.000001, - "output": 0.000004 + "cost_per_million_tokens": { + "input": 1, + "output": 4 }, "tokenizer": { "family": "tiktoken", "name": "o200k_base" }, + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "openai", @@ -2022,7 +2444,39 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "openai/o4-mini" + "model_id_on_provider": "openai/o4-mini", + "model_info": "https://openrouter.ai/openai/o4-mini" + } + ] + }, + { + "model_id": "openrouter-auto", + "model_name": "Auto Router", + "model_provider": "openrouter", + "model_description": "Meta-model that analyzes the prompt and routes each request to one of dozens of underlying models (Anthropic, OpenAI, Google, DeepSeek, and others), optimizing for output quality. Effective context window, pricing, knowledge cutoff, and tokenizer all track whichever model is selected; the response's `model` field reports the actual choice.", + "model_info": "https://openrouter.ai/openrouter/auto", + "model_type": "chat", + "context_window": 2000000, + "meta_model": true, + "tuning": [ + "function", + "instruction", + "multimodal" + ], + "input_type": [ + "text", + "image", + "audio", + "video" + ], + "output_type": [ + "text" + ], + "providers": [ + { + "provider_id": "openrouter", + "model_id_on_provider": "openrouter/auto", + "model_info": "https://openrouter.ai/openrouter/auto" } ] }, @@ -2031,19 +2485,25 @@ "model_name": "Qwen3 32B", "model_provider": "qwen", "model_description": "Groq-hosted Qwen3 32B open-weight model for reasoning, code, and multilingual work.", - "model_info": "https://console.groq.com/docs/models", + "model_info": "https://openrouter.ai/qwen/qwen3-32b", "model_type": "chat", "context_window": 131072, "max_tokens": 40960, - "cost_per_token": { - "input": 2.9e-7, - "output": 5.9e-7 + "cost_per_million_tokens": { + "input": 0.29, + "output": 0.59 }, "knowledge_cutoff": "2024-11-08", "tuning": [ "function", "instruction" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "groq", @@ -2055,7 +2515,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "qwen/qwen3-32b" + "model_id_on_provider": "qwen/qwen3-32b", + "model_info": "https://openrouter.ai/qwen/qwen3-32b" } ] }, @@ -2064,13 +2525,19 @@ "model_name": "Qwen 3.6 Flash", "model_provider": "qwen", "model_description": "Fast, efficient Qwen variant. Optimized for high-volume applications.", - "model_info": "https://qwen.io/docs", + "model_info": "https://openrouter.ai/qwen/qwen3.6-flash", "model_type": "chat", "context_window": 1000000, - "cost_per_token": { - "input": 1e-7, - "output": 4e-7 + "cost_per_million_tokens": { + "input": 0.1, + "output": 0.4 }, + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "qwen", @@ -2078,7 +2545,8 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "qwen/qwen3.6-flash" + "model_id_on_provider": "qwen/qwen3.6-flash", + "model_info": "https://openrouter.ai/qwen/qwen3.6-flash" } ] }, @@ -2087,16 +2555,22 @@ "model_name": "Qwen 3.6 Plus", "model_provider": "qwen", "model_description": "Alibaba's flagship model. Strong multilingual and reasoning capabilities with large context support.", - "model_info": "https://qwen.io/docs", + "model_info": "https://openrouter.ai/qwen/qwen3.6-plus", "model_type": "chat", "context_window": 1000000, - "cost_per_token": { - "input": 3.3e-7, - "output": 0.00000195 + "cost_per_million_tokens": { + "input": 0.33, + "output": 1.95 }, "tuning": [ "function" ], + "input_type": [ + "text" + ], + "output_type": [ + "text" + ], "providers": [ { "provider_id": "qwen", @@ -2104,7 +2578,50 @@ }, { "provider_id": "openrouter", - "model_id_on_provider": "qwen/qwen3.6-plus" + "model_id_on_provider": "qwen/qwen3.6-plus", + "model_info": "https://openrouter.ai/qwen/qwen3.6-plus" + } + ] + }, + { + "model_id": "qwen3.7-plus", + "model_name": "Qwen 3.6 Plus", + "model_provider": "qwen", + "model_description": "Qwen3.7-Plus is a cost-effective model in Alibaba's Qwen3.7 series. It supports text and image input with text output,\nbuilding on the series' text capabilities with a comprehensive upgrade to its vision-language abilities while retaining\nfull-stack, agent-level intelligence for coding, tool use, and productivity workflows. Its distinguishing trait is\nmulti-modal interactive hybrid agent capability: it can perceive real-world scenes, read screens and interact with GUIs,\ngenerate code from visual references, and perform end-to-end navigation within mobile apps.\n", + "model_info": "https://openrouter.ai/qwen/qwen3.7-plus", + "model_type": "chat", + "context_window": 1000000, + "max_tokens": 65536, + "cost_per_million_tokens": { + "input": 0.4, + "output": 1.6 + }, + "tuning": [ + "function", + "structured" + ], + "input_type": [ + "text", + "image" + ], + "output_type": [ + "text" + ], + "providers": [ + { + "provider_id": "qwen", + "model_id_on_provider": "qwen3.7-plus" + }, + { + "provider_id": "openrouter", + "model_id_on_provider": "qwen/qwen3.7-plus", + "cost_per_million_tokens": { + "input": 0.4, + "cached_input": 0.08, + "cache_write_input": 0.5, + "output": 1.6 + }, + "model_info": "https://openrouter.ai/qwen/qwen3.7-plus" } ] } diff --git a/packages/typescript/src/types.ts b/packages/typescript/src/types.ts index 9fc3919..0847f5a 100644 --- a/packages/typescript/src/types.ts +++ b/packages/typescript/src/types.ts @@ -4,7 +4,16 @@ export type ModelType = "chat" | "completion" | "embedding"; -export type Tuning = "function" | "instruction" | "code" | "multilingual" | "multimodal"; +export type Tuning = + | "function" + | "instruction" + | "code" + | "multilingual" + | "multimodal" + | "structured" + | "reasoning"; + +export type Modality = "text" | "image" | "audio" | "video" | "other"; export type TokenEncoding = | "cl100k_base" @@ -25,11 +34,17 @@ export type ProviderStatus = "active" | "deprecated" | "inactive"; export interface ProviderReference { provider_id: string; model_id_on_provider?: string; + model_info?: string; + cost_per_million_tokens?: TokenCosts; } -export interface CostPerToken { - input: number; - output: number; +export type TokenCostValue = number | Partial>; + +export interface TokenCosts { + input?: TokenCostValue; + cached_input?: TokenCostValue; + cache_write_input?: TokenCostValue; + output?: TokenCostValue; } export interface ModelMetadata { @@ -42,11 +57,17 @@ export interface ModelMetadata { model_type: ModelType; context_window: number; max_tokens?: number; - cost_per_token?: CostPerToken | number; + cost_per_million_tokens?: TokenCosts; knowledge_cutoff?: string; - token_encoding?: TokenEncoding; + tokenizer?: { + family: "tiktoken" | "tekken" | "sentencepiece" | "huggingface" | "other" | "unknown"; + name?: string; + }; tuning?: Tuning[]; + input_type?: Modality[]; + output_type?: Modality[]; deprecated?: boolean; + meta_model?: boolean; providers?: ProviderReference[]; } @@ -67,4 +88,4 @@ export class ModelNotFoundError extends Error { super(`No metadata found for model: ${modelId}`); this.name = "ModelNotFoundError"; } -} \ No newline at end of file +} diff --git a/providers/claudinio.yaml b/providers/claudinio.yaml new file mode 100644 index 0000000..6285216 --- /dev/null +++ b/providers/claudinio.yaml @@ -0,0 +1,9 @@ +provider_id: claudinio +name: Claudin.io +website_url: https://claudin.io +api_type: openai_compatible +base_url: https://api.claudin.io/v1 +auth_type: api_key +routing_priority: direct +status: active +notes: API proxy with fixed subscription and intelligent per-hour protection for coding agents. Claudinio runs a unified model optimized for coding agents. diff --git a/scripts/codegen.mjs b/scripts/codegen.mjs index fed4720..03995f2 100644 --- a/scripts/codegen.mjs +++ b/scripts/codegen.mjs @@ -39,21 +39,31 @@ function isRequired(schema, key) { function tsEnumType(key, prop, enums) { if (prop.enum) { - enums.set(upperFirst(key), prop.enum); + enums.set(toPascalCase(key), prop.enum); + } + if (prop.items?.enum) { + enums.set(toPascalCase(key), prop.items.enum); } } function tsFieldType(key, prop, defs) { if (prop.$ref) { const ref = prop.$ref.replace("#/$defs/", ""); - return upperFirst(ref); + return toPascalCase(ref); + } + if (prop.oneOf || prop.anyOf) { + const variants = prop.oneOf ?? prop.anyOf; + return variants.map((variant) => tsFieldType(key, variant, defs)).join(" | "); } if (prop.type === "string") { - return prop.enum ? upperFirst(key) : "string"; + return prop.enum ? toPascalCase(key) : "string"; } if (prop.type === "number" || prop.type === "integer") return "number"; if (prop.type === "boolean") return "boolean"; - if (prop.type === "array") return "unknown[]"; + if (prop.type === "array") { + const itemType = prop.items ? tsFieldType(key, prop.items, defs) : "unknown"; + return `${itemType}[]`; + } if (prop.type === "object") return "Record"; return "unknown"; } @@ -80,6 +90,7 @@ for (const [key, prop] of Object.entries(providerSchema.properties ?? {})) { tsEnumType(key, prop, tsEnums); } for (const def of Object.values(modelSchema.$defs ?? {})) { + tsEnumType("", def, tsEnums); for (const [key, prop] of Object.entries(def.properties ?? {})) { tsEnumType(key, prop, tsEnums); } @@ -87,7 +98,11 @@ for (const def of Object.values(modelSchema.$defs ?? {})) { // Build $defs interfaces for (const [name, def] of Object.entries(modelSchema.$defs ?? {})) { - const tsName = upperFirst(name); + const tsName = toPascalCase(name); + if (!def.properties && (def.oneOf || def.anyOf)) { + tsDefs.set(tsName, `export type ${tsName} = ${tsFieldType(name, def, tsDefs)};`); + continue; + } const lines = [`export interface ${tsName} {`]; for (const [key, prop] of Object.entries(def.properties ?? {})) { const opt = def.required?.includes(key) ? "" : "?"; @@ -130,17 +145,24 @@ function pyField(key, prop, required) { let ann; if (prop.$ref) { - ann = upperFirst(prop.$ref.replace("#/$defs/", "")); + const ref = prop.$ref.replace("#/$defs/", ""); + ann = ref === "token_cost_value" ? "Any" : toPascalCase(ref); + } else if (prop.oneOf || prop.anyOf) { + const variants = prop.oneOf ?? prop.anyOf; + ann = variants.map((variant) => pyFieldType(key, variant)).join(" | "); } else if (prop.type === "string") { ann = prop.enum ? "Literal[" + prop.enum.map((v) => `'${v}'`).join(", ") + "]" : "str"; - } else if (prop.type === "number" || prop.type === "integer") { + } else if (prop.type === "number") { ann = "float"; + } else if (prop.type === "integer") { + ann = "int"; } else if (prop.type === "boolean") { ann = "bool"; } else if (prop.type === "array") { - ann = "list"; + const itemAnn = prop.items ? pyFieldType(key, prop.items) : "Any"; + ann = `list[${itemAnn}]`; } else if (prop.type === "object") { ann = "dict"; } else { @@ -158,6 +180,31 @@ function pyField(key, prop, required) { } } +function pyFieldType(key, prop) { + if (prop.$ref) { + const ref = prop.$ref.replace("#/$defs/", ""); + return ref === "token_cost_value" ? "Any" : toPascalCase(ref); + } + if (prop.oneOf || prop.anyOf) { + const variants = prop.oneOf ?? prop.anyOf; + return variants.map((variant) => pyFieldType(key, variant)).join(" | "); + } + if (prop.type === "string") { + return prop.enum + ? "Literal[" + prop.enum.map((v) => `'${v}'`).join(", ") + "]" + : "str"; + } + if (prop.type === "number") return "float"; + if (prop.type === "integer") return "int"; + if (prop.type === "boolean") return "bool"; + if (prop.type === "array") { + const itemAnn = prop.items ? pyFieldType(key, prop.items) : "Any"; + return `list[${itemAnn}]`; + } + if (prop.type === "object") return "dict"; + return "Any"; +} + const pyLines = [ "# Generated from JSON Schema — do not edit manually", "", @@ -170,7 +217,10 @@ const pyLines = [ // $defs first (e.g. ProviderReference) for (const [name, def] of Object.entries(modelSchema.$defs ?? {})) { - const className = upperFirst(name); + if (!def.properties) { + continue; + } + const className = toPascalCase(name); pyLines.push(`class ${className}(BaseModel):`); const req = def.required ?? []; for (const [k, v] of Object.entries(def.properties ?? {})) { diff --git a/scripts/validate-yaml-schema.mjs b/scripts/validate-yaml-schema.mjs new file mode 100644 index 0000000..6fd93b8 --- /dev/null +++ b/scripts/validate-yaml-schema.mjs @@ -0,0 +1,47 @@ +import fs from "node:fs"; +import path from "node:path"; +import process from "node:process"; +import Ajv2020 from "ajv/dist/2020.js"; +import addFormats from "ajv-formats"; +import { parse } from "yaml"; + +const [schemaPath, dataDir] = process.argv.slice(2); + +if (!schemaPath || !dataDir) { + console.error("Usage: node scripts/validate-yaml-schema.mjs "); + process.exit(2); +} + +const schema = JSON.parse(fs.readFileSync(schemaPath, "utf8")); +const ajv = new Ajv2020({ allErrors: true }); +addFormats(ajv); + +const validate = ajv.compile(schema); +const yamlFiles = fs + .readdirSync(dataDir) + .filter((file) => file.endsWith(".yaml") || file.endsWith(".yml")) + .sort(); + +let hasErrors = false; + +for (const file of yamlFiles) { + const filePath = path.join(dataDir, file); + const data = parse(fs.readFileSync(filePath, "utf8")); + + if (validate(data)) { + console.log(`${filePath} valid`); + continue; + } + + hasErrors = true; + console.error(`${filePath} invalid`); + + for (const error of validate.errors ?? []) { + const location = error.instancePath || "/"; + console.error(` ${location} ${error.message}`); + } +} + +if (hasErrors) { + process.exit(1); +}