chore: 🐝 Update SDK - Generate 0.10.1 (#366)

Co-authored-by: speakeasybot <bot@speakeasyapi.dev>
Co-authored-by: speakeasy-github[bot] <128539517+speakeasy-github[bot]@users.noreply.github.com>
This commit is contained in:
github-actions[bot]
2026-06-25 22:01:36 +00:00
committed by GitHub
co-authored by speakeasybot speakeasy-github[bot] <128539517+speakeasy-github[bot]@users.noreply.github.com>
parent 667941aaa8
commit 5e0b1a2b69
96 changed files with 8765 additions and 2021 deletions
+807 -291
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -32,7 +32,7 @@ generation:
skipResponseBodyAssertions: false
preApplyUnionDiscriminators: true
python:
version: 0.10.0
version: 0.10.1
additionalDependencies:
dev: {}
main: {}
+1946 -560
View File
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -2,20 +2,20 @@ speakeasyVersion: 1.680.0
sources:
OpenRouter API:
sourceNamespace: open-router-chat-completions-api
sourceRevisionDigest: sha256:716ece4a1211eac2ee0e7e5836c7b484cff9bb002bd4e676d9ecad8317ee7941
sourceBlobDigest: sha256:12d3dc8e7150ab2c4c5e3d613b01cb5e4dcce52b329eea89ca1fdc656d6fe045
sourceRevisionDigest: sha256:8a4df86f3d3822da1bc0bd41158b6e2674f517dde9d9747c7fd6aeae92531d65
sourceBlobDigest: sha256:6ced93728e355c985d439c194e9d8ee1593b92f6f809f1315be8847686c46174
tags:
- latest
- speakeasy-sdk-regen-1781312282
- speakeasy-sdk-regen-1782424634
- 1.0.0
targets:
open-router:
source: OpenRouter API
sourceNamespace: open-router-chat-completions-api
sourceRevisionDigest: sha256:716ece4a1211eac2ee0e7e5836c7b484cff9bb002bd4e676d9ecad8317ee7941
sourceBlobDigest: sha256:12d3dc8e7150ab2c4c5e3d613b01cb5e4dcce52b329eea89ca1fdc656d6fe045
sourceRevisionDigest: sha256:8a4df86f3d3822da1bc0bd41158b6e2674f517dde9d9747c7fd6aeae92531d65
sourceBlobDigest: sha256:6ced93728e355c985d439c194e9d8ee1593b92f6f809f1315be8847686c46174
codeSamplesNamespace: open-router-python-code-samples
codeSamplesRevisionDigest: sha256:e7d6f4de48a7c63cf15f3a8378f952277cd4c59373c28c61909497853fa769e2
codeSamplesRevisionDigest: sha256:50757f7fdc830970d172346b5b1a7308c4861a13f531f093a629e1ac180687ee
workflow:
workflowVersion: 1.0.0
speakeasyVersion: 1.680.0
+11 -1
View File
@@ -28,4 +28,14 @@ Based on:
### Generated
- [python v0.10.0] .
### Releases
- [PyPI v0.10.0] https://pypi.org/project/openrouter/0.10.0 - .
- [PyPI v0.10.0] https://pypi.org/project/openrouter/0.10.0 - .
## 2026-06-25 21:56:51
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.680.0 (2.788.4) https://github.com/speakeasy-api/speakeasy
### Generated
- [python v0.10.1] .
### Releases
- [PyPI v0.10.1] https://pypi.org/project/openrouter/0.10.1 - .
@@ -1,13 +0,0 @@
# CompletionTokensDetails
Detailed completion token usage
## Fields
| Field | Type | Required | Description |
| ---------------------------- | ---------------------------- | ---------------------------- | ---------------------------- |
| `accepted_prediction_tokens` | *OptionalNullable[int]* | :heavy_minus_sign: | Accepted prediction tokens |
| `audio_tokens` | *OptionalNullable[int]* | :heavy_minus_sign: | Tokens used for audio output |
| `reasoning_tokens` | *OptionalNullable[int]* | :heavy_minus_sign: | Tokens used for reasoning |
| `rejected_prediction_tokens` | *OptionalNullable[int]* | :heavy_minus_sign: | Rejected prediction tokens |
-11
View File
@@ -1,11 +0,0 @@
# Error
Error information
## Fields
| Field | Type | Required | Description | Example |
| ------------------- | ------------------- | ------------------- | ------------------- | ------------------- |
| `code` | *int* | :heavy_check_mark: | Error code | 429 |
| `message` | *str* | :heavy_check_mark: | Error message | Rate limit exceeded |
+1
View File
@@ -22,6 +22,7 @@ Information about an AI model available on OpenRouter
| `name` | *str* | :heavy_check_mark: | Display name of the model | GPT-4 |
| `per_request_limits` | [Nullable[components.PerRequestLimits]](../components/perrequestlimits.md) | :heavy_check_mark: | Per-request token limits | {<br/>"completion_tokens": 1000,<br/>"prompt_tokens": 1000<br/>} |
| `pricing` | [components.PublicPricing](../components/publicpricing.md) | :heavy_check_mark: | Pricing information for the model | {<br/>"completion": "0.00006",<br/>"image": "0",<br/>"prompt": "0.00003",<br/>"request": "0"<br/>} |
| `reasoning` | [Optional[components.ModelReasoning]](../components/modelreasoning.md) | :heavy_minus_sign: | Reasoning effort configuration. Omitted for non-reasoning models and dynamic router models. | {<br/>"default_effort": "medium",<br/>"default_enabled": true,<br/>"mandatory": false,<br/>"supported_efforts": [<br/>"high",<br/>"medium",<br/>"low",<br/>"minimal"<br/>]<br/>} |
| `supported_parameters` | List[[components.Parameter](../components/parameter.md)] | :heavy_check_mark: | List of supported parameters for this model | |
| `supported_voices` | List[*str*] | :heavy_check_mark: | List of supported voice identifiers for TTS models. Null for non-TTS models. | <nil> |
| `top_provider` | [components.TopProviderInfo](../components/topproviderinfo.md) | :heavy_check_mark: | Information about the top provider for this model | {<br/>"context_length": 8192,<br/>"is_moderated": true,<br/>"max_completion_tokens": 4096<br/>} |
-13
View File
@@ -1,13 +0,0 @@
# PromptTokensDetails
Detailed prompt token usage
## Fields
| Field | Type | Required | Description |
| ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ |
| `audio_tokens` | *Optional[int]* | :heavy_minus_sign: | Audio input tokens |
| `cache_write_tokens` | *Optional[int]* | :heavy_minus_sign: | Tokens written to cache. Only returned for models with explicit caching and cache write pricing. |
| `cached_tokens` | *Optional[int]* | :heavy_minus_sign: | Cached prompt tokens |
| `video_tokens` | *Optional[int]* | :heavy_minus_sign: | Video input tokens |
+4
View File
@@ -42,12 +42,14 @@
| `GOOGLE` | Google |
| `GOOGLE_AI_STUDIO` | Google AI Studio |
| `GROQ` | Groq |
| `HEY_GEN` | HeyGen |
| `INCEPTION` | Inception |
| `INCEPTRON` | Inceptron |
| `INFERENCE_NET` | InferenceNet |
| `IONSTREAM` | Ionstream |
| `INFERMATIC` | Infermatic |
| `IO_NET` | Io Net |
| `INFERACT_V_LLM` | Inferact vLLM |
| `INFLECTION` | Inflection |
| `LIQUID` | Liquid |
| `MARA` | Mara |
@@ -74,6 +76,7 @@
| `RECRAFT` | Recraft |
| `REKA` | Reka |
| `RELACE` | Relace |
| `SAKANA_AI` | Sakana AI |
| `SAMBA_NOVA` | SambaNova |
| `SEED` | Seed |
| `SILICON_FLOW` | SiliconFlow |
@@ -82,6 +85,7 @@
| `STEALTH` | Stealth |
| `STREAM_LAKE` | StreamLake |
| `SWITCHPOINT` | Switchpoint |
| `TENSTORRENT` | Tenstorrent |
| `TOGETHER` | Together |
| `UPSTAGE` | Upstage |
| `VENICE` | Venice |
+20 -20
View File
@@ -3,23 +3,23 @@
## Fields
| Field | Type | Required | Description | Example |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.<br/>This is used to track API usage per application.<br/> | |
| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.<br/> | |
| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.<br/> | |
| `category` | [Optional[operations.GetModelsCategory]](../operations/getmodelscategory.md) | :heavy_minus_sign: | Filter models by use case category | programming |
| `supported_parameters` | *Optional[str]* | :heavy_minus_sign: | Filter models by supported parameter (comma-separated) | temperature |
| `output_modalities` | *Optional[str]* | :heavy_minus_sign: | Filter models by output modality. Accepts a comma-separated list of modalities (text, image, audio, embeddings) or "all" to include all models. Defaults to "text". | text |
| `sort` | [Optional[operations.GetModelsSort]](../operations/getmodelssort.md) | :heavy_minus_sign: | Sort the returned models server-side. Prefer this over fetching the full list and sorting client-side. Options: pricing-low-to-high, pricing-high-to-low (average prompt/completion price), context-high-to-low (context length), throughput-high-to-low, latency-low-to-high (recent median performance), most-popular, top-weekly (tokens processed in the last week), newest (creation date). When omitted, the existing default ordering is preserved. | newest |
| `q` | *Optional[str]* | :heavy_minus_sign: | Free-text search by model name or slug. | gpt-4 |
| `input_modalities` | *Optional[str]* | :heavy_minus_sign: | Filter models by input modality. Comma-separated list of: text, image, audio, file. | text,image |
| `context` | *Optional[int]* | :heavy_minus_sign: | Minimum context length (tokens). Models with smaller context are excluded. | 128000 |
| `min_price` | *OptionalNullable[float]* | :heavy_minus_sign: | Minimum prompt price in $/M tokens. | 0 |
| `max_price` | *OptionalNullable[float]* | :heavy_minus_sign: | Maximum prompt price in $/M tokens. | 10 |
| `arch` | *Optional[str]* | :heavy_minus_sign: | Filter models by architecture/model family (e.g. GPT, Claude, Gemini, Llama). | GPT |
| `model_authors` | *Optional[str]* | :heavy_minus_sign: | Filter models by the organization that created the model. Comma-separated list of author slugs. | openai,anthropic |
| `providers` | *Optional[str]* | :heavy_minus_sign: | Filter models by hosting provider. Comma-separated list of provider names. | OpenAI,Anthropic |
| `distillable` | [Optional[operations.Distillable]](../operations/distillable.md) | :heavy_minus_sign: | Filter by distillation capability. "true" returns only distillable models, "false" excludes them. | true |
| `zdr` | [Optional[operations.Zdr]](../operations/zdr.md) | :heavy_minus_sign: | When set to "true", return only models with zero data retention endpoints. | true |
| `region` | [Optional[operations.Region]](../operations/region.md) | :heavy_minus_sign: | Filter to models with endpoints in the given data region. Currently only "eu" is supported. | eu |
| Field | Type | Required | Description | Example |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.<br/>This is used to track API usage per application.<br/> | |
| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.<br/> | |
| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.<br/> | |
| `category` | [Optional[operations.GetModelsCategory]](../operations/getmodelscategory.md) | :heavy_minus_sign: | Filter models by use case category | programming |
| `supported_parameters` | *Optional[str]* | :heavy_minus_sign: | Filter models by supported parameter (comma-separated) | temperature |
| `output_modalities` | *Optional[str]* | :heavy_minus_sign: | Filter models by output modality. Accepts a comma-separated list of modalities (text, image, audio, embeddings) or "all" to include all models. Defaults to "text". | text |
| `sort` | [Optional[operations.GetModelsSort]](../operations/getmodelssort.md) | :heavy_minus_sign: | Sort the returned models server-side. Prefer this over fetching the full list and sorting client-side. Options: pricing-low-to-high, pricing-high-to-low (average prompt/completion price), context-high-to-low (context length), throughput-high-to-low, latency-low-to-high (recent median performance), most-popular, top-weekly (tokens processed in the last week), newest (creation date), intelligence-high-to-low (Artificial Analysis intelligence index), design-arena-elo-high-to-low (best Design Arena ELO across arenas). Models without a score for the chosen benchmark are placed last. When omitted, the existing default ordering is preserved. | newest |
| `q` | *Optional[str]* | :heavy_minus_sign: | Free-text search by model name or slug. | gpt-4 |
| `input_modalities` | *Optional[str]* | :heavy_minus_sign: | Filter models by input modality. Comma-separated list of: text, image, audio, file. | text,image |
| `context` | *Optional[int]* | :heavy_minus_sign: | Minimum context length (tokens). Models with smaller context are excluded. | 128000 |
| `min_price` | *OptionalNullable[float]* | :heavy_minus_sign: | Minimum prompt price in $/M tokens. | 0 |
| `max_price` | *OptionalNullable[float]* | :heavy_minus_sign: | Maximum prompt price in $/M tokens. | 10 |
| `arch` | *Optional[str]* | :heavy_minus_sign: | Filter models by architecture/model family (e.g. GPT, Claude, Gemini, Llama). | GPT |
| `model_authors` | *Optional[str]* | :heavy_minus_sign: | Filter models by the organization that created the model. Comma-separated list of author slugs. | openai,anthropic |
| `providers` | *Optional[str]* | :heavy_minus_sign: | Filter models by hosting provider. Comma-separated list of provider names. | OpenAI,Anthropic |
| `distillable` | [Optional[operations.Distillable]](../operations/distillable.md) | :heavy_minus_sign: | Filter by distillation capability. "true" returns only distillable models, "false" excludes them. | true |
| `zdr` | [Optional[operations.Zdr]](../operations/zdr.md) | :heavy_minus_sign: | When set to "true", return only models with zero data retention endpoints. | true |
| `region` | [Optional[operations.Region]](../operations/region.md) | :heavy_minus_sign: | Filter to models with endpoints in the given data region. Currently only "eu" is supported. | eu |
+21 -21
View File
@@ -88,27 +88,27 @@ with OpenRouter(
### Parameters
| Parameter | Type | Required | Description | Example |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.<br/>This is used to track API usage per application.<br/> | |
| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.<br/> | |
| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.<br/> | |
| `category` | [Optional[operations.GetModelsCategory]](../../operations/getmodelscategory.md) | :heavy_minus_sign: | Filter models by use case category | programming |
| `supported_parameters` | *Optional[str]* | :heavy_minus_sign: | Filter models by supported parameter (comma-separated) | temperature |
| `output_modalities` | *Optional[str]* | :heavy_minus_sign: | Filter models by output modality. Accepts a comma-separated list of modalities (text, image, audio, embeddings) or "all" to include all models. Defaults to "text". | text |
| `sort` | [Optional[operations.GetModelsSort]](../../operations/getmodelssort.md) | :heavy_minus_sign: | Sort the returned models server-side. Prefer this over fetching the full list and sorting client-side. Options: pricing-low-to-high, pricing-high-to-low (average prompt/completion price), context-high-to-low (context length), throughput-high-to-low, latency-low-to-high (recent median performance), most-popular, top-weekly (tokens processed in the last week), newest (creation date). When omitted, the existing default ordering is preserved. | newest |
| `q` | *Optional[str]* | :heavy_minus_sign: | Free-text search by model name or slug. | gpt-4 |
| `input_modalities` | *Optional[str]* | :heavy_minus_sign: | Filter models by input modality. Comma-separated list of: text, image, audio, file. | text,image |
| `context` | *Optional[int]* | :heavy_minus_sign: | Minimum context length (tokens). Models with smaller context are excluded. | 128000 |
| `min_price` | *OptionalNullable[float]* | :heavy_minus_sign: | Minimum prompt price in $/M tokens. | 0 |
| `max_price` | *OptionalNullable[float]* | :heavy_minus_sign: | Maximum prompt price in $/M tokens. | 10 |
| `arch` | *Optional[str]* | :heavy_minus_sign: | Filter models by architecture/model family (e.g. GPT, Claude, Gemini, Llama). | GPT |
| `model_authors` | *Optional[str]* | :heavy_minus_sign: | Filter models by the organization that created the model. Comma-separated list of author slugs. | openai,anthropic |
| `providers` | *Optional[str]* | :heavy_minus_sign: | Filter models by hosting provider. Comma-separated list of provider names. | OpenAI,Anthropic |
| `distillable` | [Optional[operations.Distillable]](../../operations/distillable.md) | :heavy_minus_sign: | Filter by distillation capability. "true" returns only distillable models, "false" excludes them. | true |
| `zdr` | [Optional[operations.Zdr]](../../operations/zdr.md) | :heavy_minus_sign: | When set to "true", return only models with zero data retention endpoints. | true |
| `region` | [Optional[operations.Region]](../../operations/region.md) | :heavy_minus_sign: | Filter to models with endpoints in the given data region. Currently only "eu" is supported. | eu |
| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | |
| Parameter | Type | Required | Description | Example |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.<br/>This is used to track API usage per application.<br/> | |
| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.<br/> | |
| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.<br/> | |
| `category` | [Optional[operations.GetModelsCategory]](../../operations/getmodelscategory.md) | :heavy_minus_sign: | Filter models by use case category | programming |
| `supported_parameters` | *Optional[str]* | :heavy_minus_sign: | Filter models by supported parameter (comma-separated) | temperature |
| `output_modalities` | *Optional[str]* | :heavy_minus_sign: | Filter models by output modality. Accepts a comma-separated list of modalities (text, image, audio, embeddings) or "all" to include all models. Defaults to "text". | text |
| `sort` | [Optional[operations.GetModelsSort]](../../operations/getmodelssort.md) | :heavy_minus_sign: | Sort the returned models server-side. Prefer this over fetching the full list and sorting client-side. Options: pricing-low-to-high, pricing-high-to-low (average prompt/completion price), context-high-to-low (context length), throughput-high-to-low, latency-low-to-high (recent median performance), most-popular, top-weekly (tokens processed in the last week), newest (creation date), intelligence-high-to-low (Artificial Analysis intelligence index), design-arena-elo-high-to-low (best Design Arena ELO across arenas). Models without a score for the chosen benchmark are placed last. When omitted, the existing default ordering is preserved. | newest |
| `q` | *Optional[str]* | :heavy_minus_sign: | Free-text search by model name or slug. | gpt-4 |
| `input_modalities` | *Optional[str]* | :heavy_minus_sign: | Filter models by input modality. Comma-separated list of: text, image, audio, file. | text,image |
| `context` | *Optional[int]* | :heavy_minus_sign: | Minimum context length (tokens). Models with smaller context are excluded. | 128000 |
| `min_price` | *OptionalNullable[float]* | :heavy_minus_sign: | Minimum prompt price in $/M tokens. | 0 |
| `max_price` | *OptionalNullable[float]* | :heavy_minus_sign: | Maximum prompt price in $/M tokens. | 10 |
| `arch` | *Optional[str]* | :heavy_minus_sign: | Filter models by architecture/model family (e.g. GPT, Claude, Gemini, Llama). | GPT |
| `model_authors` | *Optional[str]* | :heavy_minus_sign: | Filter models by the organization that created the model. Comma-separated list of author slugs. | openai,anthropic |
| `providers` | *Optional[str]* | :heavy_minus_sign: | Filter models by hosting provider. Comma-separated list of provider names. | OpenAI,Anthropic |
| `distillable` | [Optional[operations.Distillable]](../../operations/distillable.md) | :heavy_minus_sign: | Filter by distillation capability. "true" returns only distillable models, "false" excludes them. | true |
| `zdr` | [Optional[operations.Zdr]](../../operations/zdr.md) | :heavy_minus_sign: | When set to "true", return only models with zero data retention endpoints. | true |
| `region` | [Optional[operations.Region]](../../operations/region.md) | :heavy_minus_sign: | Filter to models with endpoints in the given data region. Currently only "eu" is supported. | eu |
| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | |
### Response
+1
View File
@@ -46,6 +46,7 @@ with OpenRouter(
| `x_open_router_metadata` | [Optional[components.MetadataLevel]](../../components/metadatalevel.md) | :heavy_minus_sign: | Opt-in to surface routing metadata on the response under `openrouter_metadata`. Defaults to `disabled`. The legacy header `X-OpenRouter-Experimental-Metadata` is also accepted for backward compatibility. | enabled |
| `background` | *OptionalNullable[bool]* | :heavy_minus_sign: | N/A | |
| `cache_control` | [Optional[components.AnthropicCacheControlDirective]](../../components/anthropiccachecontroldirective.md) | :heavy_minus_sign: | Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. Currently supported for Anthropic Claude models. | {<br/>"type": "ephemeral"<br/>} |
| `debug` | [Optional[components.ChatDebugOptions]](../../components/chatdebugoptions.md) | :heavy_minus_sign: | Debug options for inspecting request transformations (streaming only) | {<br/>"echo_upstream_body": true<br/>} |
| `frequency_penalty` | *OptionalNullable[float]* | :heavy_minus_sign: | N/A | |
| `image_config` | Dict[str, [components.ImageConfig](../../components/imageconfig.md)] | :heavy_minus_sign: | Provider-specific image configuration options. Keys and values vary by model/provider. See https://openrouter.ai/docs/guides/overview/multimodal/image-generation for more details. | {<br/>"aspect_ratio": "16:9",<br/>"quality": "high"<br/>} |
| `include` | List[[components.ResponseIncludesEnum](../../components/responseincludesenum.md)] | :heavy_minus_sign: | N/A | |
+1 -1
View File
@@ -1,6 +1,6 @@
[project]
name = "openrouter"
version = "0.10.0"
version = "0.10.1"
description = "Official Python Client SDK for OpenRouter."
authors = [{ name = "OpenRouter" },]
readme = "README-PYPI.md"
+2 -2
View File
@@ -3,10 +3,10 @@
import importlib.metadata
__title__: str = "openrouter"
__version__: str = "0.10.0"
__version__: str = "0.10.1"
__openapi_doc_version__: str = "1.0.0"
__gen_version__: str = "2.788.4"
__user_agent__: str = "speakeasy-sdk/python 0.10.0 2.788.4 1.0.0 openrouter"
__user_agent__: str = "speakeasy-sdk/python 0.10.1 2.788.4 1.0.0 openrouter"
try:
if __package__ is not None:
+303
View File
@@ -0,0 +1,303 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from .basesdk import BaseSDK
from openrouter import components, errors, operations, utils
from openrouter._hooks import HookContext
from openrouter.types import OptionalNullable, UNSET
from openrouter.utils import get_security_from_env
from openrouter.utils.unmarshal_json_response import unmarshal_json_response
from typing import Any, Mapping, Optional
class Benchmarks(BaseSDK):
r"""Benchmarks endpoints"""
def get_benchmarks(
self,
*,
http_referer: Optional[str] = None,
x_open_router_title: Optional[str] = None,
x_open_router_categories: Optional[str] = None,
source: Optional[operations.Source] = None,
task_type: Optional[operations.TaskType] = None,
arena: Optional[operations.Arena] = None,
category: Optional[str] = None,
max_results: Optional[int] = None,
retries: OptionalNullable[utils.RetryConfig] = UNSET,
server_url: Optional[str] = None,
timeout_ms: Optional[int] = None,
http_headers: Optional[Mapping[str, str]] = None,
) -> components.UnifiedBenchmarksResponse:
r"""List Benchmarks
Unified benchmark endpoint that aggregates scores from multiple benchmark sources (Artificial Analysis, Design Arena). Filter by source to reproduce the exact shapes from the legacy per-source endpoints, or use task_type to find models suited for specific workloads. Authenticate with any valid OpenRouter API key. Rate-limited to 30 requests/minute per key and 500 requests/day per account.
:param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
:param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard.
:param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
:param source: Benchmark source to query. Determines the shape of the returned items. When omitted, returns results from all sources.
:param task_type: Filter results by task type. For Artificial Analysis, maps to the corresponding index. For Design Arena, maps to the matching category.
:param arena: Design Arena only: arena to query. Defaults to `models` when source is `design-arena`.
:param category: Design Arena only: category within the arena (e.g. `codecategories`, `uicomponent`, `gamedev`, `3d`, `dataviz`, `image`, `video`, `svg`). When omitted, returns all categories.
:param max_results: Maximum number of items to return. When omitted, all matching results are returned.
:param retries: Override the default retry configuration for this method
:param server_url: Override the default server URL for this method
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
:param http_headers: Additional headers to set or replace on requests.
"""
base_url = None
url_variables = None
if timeout_ms is None:
timeout_ms = self.sdk_configuration.timeout_ms
if server_url is not None:
base_url = server_url
else:
base_url = self._get_url(base_url, url_variables)
request = operations.GetBenchmarksRequest(
http_referer=http_referer,
x_open_router_title=x_open_router_title,
x_open_router_categories=x_open_router_categories,
source=source,
task_type=task_type,
arena=arena,
category=category,
max_results=max_results,
)
req = self._build_request(
method="GET",
path="/benchmarks",
base_url=base_url,
url_variables=url_variables,
request=request,
request_body_required=False,
request_has_path_params=False,
request_has_query_params=True,
user_agent_header="user-agent",
accept_header_value="application/json",
http_headers=http_headers,
_globals=operations.GetBenchmarksGlobals(
http_referer=self.sdk_configuration.globals.http_referer,
x_open_router_title=self.sdk_configuration.globals.x_open_router_title,
x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories,
),
security=self.sdk_configuration.security,
allow_empty_value=None,
timeout_ms=timeout_ms,
)
if retries == UNSET:
if self.sdk_configuration.retry_config is not UNSET:
retries = self.sdk_configuration.retry_config
else:
retries = utils.RetryConfig(
"backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True
)
retry_config = None
if isinstance(retries, utils.RetryConfig):
retry_config = (retries, ["5XX"])
http_res = self.do_request(
hook_ctx=HookContext(
config=self.sdk_configuration,
base_url=base_url or "",
operation_id="getBenchmarks",
oauth2_scopes=None,
security_source=get_security_from_env(
self.sdk_configuration.security, components.Security
),
),
request=req,
error_status_codes=["400", "401", "429", "4XX", "500", "5XX"],
retry_config=retry_config,
)
response_data: Any = None
if utils.match_response(http_res, "200", "application/json"):
return unmarshal_json_response(
components.UnifiedBenchmarksResponse, http_res
)
if utils.match_response(http_res, "400", "application/json"):
response_data = unmarshal_json_response(
errors.BadRequestResponseErrorData, http_res
)
raise errors.BadRequestResponseError(response_data, http_res)
if utils.match_response(http_res, "401", "application/json"):
response_data = unmarshal_json_response(
errors.UnauthorizedResponseErrorData, http_res
)
raise errors.UnauthorizedResponseError(response_data, http_res)
if utils.match_response(http_res, "429", "application/json"):
response_data = unmarshal_json_response(
errors.TooManyRequestsResponseErrorData, http_res
)
raise errors.TooManyRequestsResponseError(response_data, http_res)
if utils.match_response(http_res, "500", "application/json"):
response_data = unmarshal_json_response(
errors.InternalServerResponseErrorData, http_res
)
raise errors.InternalServerResponseError(response_data, http_res)
if utils.match_response(http_res, "4XX", "*"):
http_res_text = utils.stream_to_text(http_res)
raise errors.OpenRouterDefaultError(
"API error occurred", http_res, http_res_text
)
if utils.match_response(http_res, "5XX", "*"):
http_res_text = utils.stream_to_text(http_res)
raise errors.OpenRouterDefaultError(
"API error occurred", http_res, http_res_text
)
raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
async def get_benchmarks_async(
self,
*,
http_referer: Optional[str] = None,
x_open_router_title: Optional[str] = None,
x_open_router_categories: Optional[str] = None,
source: Optional[operations.Source] = None,
task_type: Optional[operations.TaskType] = None,
arena: Optional[operations.Arena] = None,
category: Optional[str] = None,
max_results: Optional[int] = None,
retries: OptionalNullable[utils.RetryConfig] = UNSET,
server_url: Optional[str] = None,
timeout_ms: Optional[int] = None,
http_headers: Optional[Mapping[str, str]] = None,
) -> components.UnifiedBenchmarksResponse:
r"""List Benchmarks
Unified benchmark endpoint that aggregates scores from multiple benchmark sources (Artificial Analysis, Design Arena). Filter by source to reproduce the exact shapes from the legacy per-source endpoints, or use task_type to find models suited for specific workloads. Authenticate with any valid OpenRouter API key. Rate-limited to 30 requests/minute per key and 500 requests/day per account.
:param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
:param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard.
:param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
:param source: Benchmark source to query. Determines the shape of the returned items. When omitted, returns results from all sources.
:param task_type: Filter results by task type. For Artificial Analysis, maps to the corresponding index. For Design Arena, maps to the matching category.
:param arena: Design Arena only: arena to query. Defaults to `models` when source is `design-arena`.
:param category: Design Arena only: category within the arena (e.g. `codecategories`, `uicomponent`, `gamedev`, `3d`, `dataviz`, `image`, `video`, `svg`). When omitted, returns all categories.
:param max_results: Maximum number of items to return. When omitted, all matching results are returned.
:param retries: Override the default retry configuration for this method
:param server_url: Override the default server URL for this method
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
:param http_headers: Additional headers to set or replace on requests.
"""
base_url = None
url_variables = None
if timeout_ms is None:
timeout_ms = self.sdk_configuration.timeout_ms
if server_url is not None:
base_url = server_url
else:
base_url = self._get_url(base_url, url_variables)
request = operations.GetBenchmarksRequest(
http_referer=http_referer,
x_open_router_title=x_open_router_title,
x_open_router_categories=x_open_router_categories,
source=source,
task_type=task_type,
arena=arena,
category=category,
max_results=max_results,
)
req = self._build_request_async(
method="GET",
path="/benchmarks",
base_url=base_url,
url_variables=url_variables,
request=request,
request_body_required=False,
request_has_path_params=False,
request_has_query_params=True,
user_agent_header="user-agent",
accept_header_value="application/json",
http_headers=http_headers,
_globals=operations.GetBenchmarksGlobals(
http_referer=self.sdk_configuration.globals.http_referer,
x_open_router_title=self.sdk_configuration.globals.x_open_router_title,
x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories,
),
security=self.sdk_configuration.security,
allow_empty_value=None,
timeout_ms=timeout_ms,
)
if retries == UNSET:
if self.sdk_configuration.retry_config is not UNSET:
retries = self.sdk_configuration.retry_config
else:
retries = utils.RetryConfig(
"backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True
)
retry_config = None
if isinstance(retries, utils.RetryConfig):
retry_config = (retries, ["5XX"])
http_res = await self.do_request_async(
hook_ctx=HookContext(
config=self.sdk_configuration,
base_url=base_url or "",
operation_id="getBenchmarks",
oauth2_scopes=None,
security_source=get_security_from_env(
self.sdk_configuration.security, components.Security
),
),
request=req,
error_status_codes=["400", "401", "429", "4XX", "500", "5XX"],
retry_config=retry_config,
)
response_data: Any = None
if utils.match_response(http_res, "200", "application/json"):
return unmarshal_json_response(
components.UnifiedBenchmarksResponse, http_res
)
if utils.match_response(http_res, "400", "application/json"):
response_data = unmarshal_json_response(
errors.BadRequestResponseErrorData, http_res
)
raise errors.BadRequestResponseError(response_data, http_res)
if utils.match_response(http_res, "401", "application/json"):
response_data = unmarshal_json_response(
errors.UnauthorizedResponseErrorData, http_res
)
raise errors.UnauthorizedResponseError(response_data, http_res)
if utils.match_response(http_res, "429", "application/json"):
response_data = unmarshal_json_response(
errors.TooManyRequestsResponseErrorData, http_res
)
raise errors.TooManyRequestsResponseError(response_data, http_res)
if utils.match_response(http_res, "500", "application/json"):
response_data = unmarshal_json_response(
errors.InternalServerResponseErrorData, http_res
)
raise errors.InternalServerResponseError(response_data, http_res)
if utils.match_response(http_res, "4XX", "*"):
http_res_text = await utils.stream_to_text_async(http_res)
raise errors.OpenRouterDefaultError(
"API error occurred", http_res, http_res_text
)
if utils.match_response(http_res, "5XX", "*"):
http_res_text = await utils.stream_to_text_async(http_res)
raise errors.OpenRouterDefaultError(
"API error occurred", http_res, http_res_text
)
raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
+315
View File
@@ -0,0 +1,315 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from .basesdk import BaseSDK
from openrouter import components, errors, operations, utils
from openrouter._hooks import HookContext
from openrouter.types import OptionalNullable, UNSET
from openrouter.utils import get_security_from_env
from openrouter.utils.unmarshal_json_response import unmarshal_json_response
from typing import Any, Mapping, Optional
class Classifications(BaseSDK):
r"""Task classification market-share endpoints"""
def get_task_classifications(
self,
*,
http_referer: Optional[str] = None,
x_open_router_title: Optional[str] = None,
x_open_router_categories: Optional[str] = None,
window: Optional[operations.Window] = "7d",
retries: OptionalNullable[utils.RetryConfig] = UNSET,
server_url: Optional[str] = None,
timeout_ms: Optional[int] = None,
http_headers: Optional[Mapping[str, str]] = None,
) -> components.TaskClassificationResponse:
r"""Task classification market share
Returns the market-share breakdown of OpenRouter traffic by task classification
(e.g. code generation, web search, summarization) over a trailing time window.
Each classification reports its share of classified sampled requests (`usage_share`)
and classified sampled token volume (`token_share`) as fractions between 0 and 1.
The unclassified `other` bucket is excluded. Absolute volumes are not exposed
because the underlying data is sampled.
Each classification also includes a `models` array listing the top models by
request volume within that classification, with their within-tag usage and token shares.
Classifications are grouped into macro-categories (Code, Data, Agent, General)
with aggregate shares provided for each.
Authenticate with any valid OpenRouter API key (same key used for inference).
Rate-limited to 30 requests/minute per key and 500 requests/day per account.
When republishing or quoting this data, cite as:
\"Source: OpenRouter (openrouter.ai/rankings), as of {as_of}.\"
:param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
:param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard.
:param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
:param window: Trailing time window for the classification data. Currently only `7d` (trailing 7 days) is supported.
:param retries: Override the default retry configuration for this method
:param server_url: Override the default server URL for this method
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
:param http_headers: Additional headers to set or replace on requests.
"""
base_url = None
url_variables = None
if timeout_ms is None:
timeout_ms = self.sdk_configuration.timeout_ms
if server_url is not None:
base_url = server_url
else:
base_url = self._get_url(base_url, url_variables)
request = operations.GetTaskClassificationsRequest(
http_referer=http_referer,
x_open_router_title=x_open_router_title,
x_open_router_categories=x_open_router_categories,
window=window,
)
req = self._build_request(
method="GET",
path="/classifications/task",
base_url=base_url,
url_variables=url_variables,
request=request,
request_body_required=False,
request_has_path_params=False,
request_has_query_params=True,
user_agent_header="user-agent",
accept_header_value="application/json",
http_headers=http_headers,
_globals=operations.GetTaskClassificationsGlobals(
http_referer=self.sdk_configuration.globals.http_referer,
x_open_router_title=self.sdk_configuration.globals.x_open_router_title,
x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories,
),
security=self.sdk_configuration.security,
allow_empty_value=None,
timeout_ms=timeout_ms,
)
if retries == UNSET:
if self.sdk_configuration.retry_config is not UNSET:
retries = self.sdk_configuration.retry_config
else:
retries = utils.RetryConfig(
"backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True
)
retry_config = None
if isinstance(retries, utils.RetryConfig):
retry_config = (retries, ["5XX"])
http_res = self.do_request(
hook_ctx=HookContext(
config=self.sdk_configuration,
base_url=base_url or "",
operation_id="getTaskClassifications",
oauth2_scopes=None,
security_source=get_security_from_env(
self.sdk_configuration.security, components.Security
),
),
request=req,
error_status_codes=["400", "401", "429", "4XX", "500", "5XX"],
retry_config=retry_config,
)
response_data: Any = None
if utils.match_response(http_res, "200", "application/json"):
return unmarshal_json_response(
components.TaskClassificationResponse, http_res
)
if utils.match_response(http_res, "400", "application/json"):
response_data = unmarshal_json_response(
errors.BadRequestResponseErrorData, http_res
)
raise errors.BadRequestResponseError(response_data, http_res)
if utils.match_response(http_res, "401", "application/json"):
response_data = unmarshal_json_response(
errors.UnauthorizedResponseErrorData, http_res
)
raise errors.UnauthorizedResponseError(response_data, http_res)
if utils.match_response(http_res, "429", "application/json"):
response_data = unmarshal_json_response(
errors.TooManyRequestsResponseErrorData, http_res
)
raise errors.TooManyRequestsResponseError(response_data, http_res)
if utils.match_response(http_res, "500", "application/json"):
response_data = unmarshal_json_response(
errors.InternalServerResponseErrorData, http_res
)
raise errors.InternalServerResponseError(response_data, http_res)
if utils.match_response(http_res, "4XX", "*"):
http_res_text = utils.stream_to_text(http_res)
raise errors.OpenRouterDefaultError(
"API error occurred", http_res, http_res_text
)
if utils.match_response(http_res, "5XX", "*"):
http_res_text = utils.stream_to_text(http_res)
raise errors.OpenRouterDefaultError(
"API error occurred", http_res, http_res_text
)
raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
async def get_task_classifications_async(
self,
*,
http_referer: Optional[str] = None,
x_open_router_title: Optional[str] = None,
x_open_router_categories: Optional[str] = None,
window: Optional[operations.Window] = "7d",
retries: OptionalNullable[utils.RetryConfig] = UNSET,
server_url: Optional[str] = None,
timeout_ms: Optional[int] = None,
http_headers: Optional[Mapping[str, str]] = None,
) -> components.TaskClassificationResponse:
r"""Task classification market share
Returns the market-share breakdown of OpenRouter traffic by task classification
(e.g. code generation, web search, summarization) over a trailing time window.
Each classification reports its share of classified sampled requests (`usage_share`)
and classified sampled token volume (`token_share`) as fractions between 0 and 1.
The unclassified `other` bucket is excluded. Absolute volumes are not exposed
because the underlying data is sampled.
Each classification also includes a `models` array listing the top models by
request volume within that classification, with their within-tag usage and token shares.
Classifications are grouped into macro-categories (Code, Data, Agent, General)
with aggregate shares provided for each.
Authenticate with any valid OpenRouter API key (same key used for inference).
Rate-limited to 30 requests/minute per key and 500 requests/day per account.
When republishing or quoting this data, cite as:
\"Source: OpenRouter (openrouter.ai/rankings), as of {as_of}.\"
:param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
:param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard.
:param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
:param window: Trailing time window for the classification data. Currently only `7d` (trailing 7 days) is supported.
:param retries: Override the default retry configuration for this method
:param server_url: Override the default server URL for this method
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
:param http_headers: Additional headers to set or replace on requests.
"""
base_url = None
url_variables = None
if timeout_ms is None:
timeout_ms = self.sdk_configuration.timeout_ms
if server_url is not None:
base_url = server_url
else:
base_url = self._get_url(base_url, url_variables)
request = operations.GetTaskClassificationsRequest(
http_referer=http_referer,
x_open_router_title=x_open_router_title,
x_open_router_categories=x_open_router_categories,
window=window,
)
req = self._build_request_async(
method="GET",
path="/classifications/task",
base_url=base_url,
url_variables=url_variables,
request=request,
request_body_required=False,
request_has_path_params=False,
request_has_query_params=True,
user_agent_header="user-agent",
accept_header_value="application/json",
http_headers=http_headers,
_globals=operations.GetTaskClassificationsGlobals(
http_referer=self.sdk_configuration.globals.http_referer,
x_open_router_title=self.sdk_configuration.globals.x_open_router_title,
x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories,
),
security=self.sdk_configuration.security,
allow_empty_value=None,
timeout_ms=timeout_ms,
)
if retries == UNSET:
if self.sdk_configuration.retry_config is not UNSET:
retries = self.sdk_configuration.retry_config
else:
retries = utils.RetryConfig(
"backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True
)
retry_config = None
if isinstance(retries, utils.RetryConfig):
retry_config = (retries, ["5XX"])
http_res = await self.do_request_async(
hook_ctx=HookContext(
config=self.sdk_configuration,
base_url=base_url or "",
operation_id="getTaskClassifications",
oauth2_scopes=None,
security_source=get_security_from_env(
self.sdk_configuration.security, components.Security
),
),
request=req,
error_status_codes=["400", "401", "429", "4XX", "500", "5XX"],
retry_config=retry_config,
)
response_data: Any = None
if utils.match_response(http_res, "200", "application/json"):
return unmarshal_json_response(
components.TaskClassificationResponse, http_res
)
if utils.match_response(http_res, "400", "application/json"):
response_data = unmarshal_json_response(
errors.BadRequestResponseErrorData, http_res
)
raise errors.BadRequestResponseError(response_data, http_res)
if utils.match_response(http_res, "401", "application/json"):
response_data = unmarshal_json_response(
errors.UnauthorizedResponseErrorData, http_res
)
raise errors.UnauthorizedResponseError(response_data, http_res)
if utils.match_response(http_res, "429", "application/json"):
response_data = unmarshal_json_response(
errors.TooManyRequestsResponseErrorData, http_res
)
raise errors.TooManyRequestsResponseError(response_data, http_res)
if utils.match_response(http_res, "500", "application/json"):
response_data = unmarshal_json_response(
errors.InternalServerResponseErrorData, http_res
)
raise errors.InternalServerResponseError(response_data, http_res)
if utils.match_response(http_res, "4XX", "*"):
http_res_text = await utils.stream_to_text_async(http_res)
raise errors.OpenRouterDefaultError(
"API error occurred", http_res, http_res_text
)
if utils.match_response(http_res, "5XX", "*"):
http_res_text = await utils.stream_to_text_async(http_res)
raise errors.OpenRouterDefaultError(
"API error occurred", http_res, http_res_text
)
raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
File diff suppressed because it is too large Load Diff
@@ -10,6 +10,7 @@ from typing_extensions import Annotated, NotRequired, TypedDict
AdvisorReasoningEffort = Union[
Literal[
"max",
"xhigh",
"high",
"medium",
@@ -0,0 +1,82 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .anthropiciterationcachecreation import (
AnthropicIterationCacheCreation,
AnthropicIterationCacheCreationTypedDict,
)
from openrouter.types import (
BaseModel,
Nullable,
OptionalNullable,
UNSET,
UNSET_SENTINEL,
)
from pydantic import model_serializer
from typing import Literal, Optional
from typing_extensions import NotRequired, TypedDict
AnthropicAdvisorMessageUsageIterationType = Literal["advisor_message",]
class AnthropicAdvisorMessageUsageIterationTypedDict(TypedDict):
model: str
type: AnthropicAdvisorMessageUsageIterationType
cache_creation: NotRequired[Nullable[AnthropicIterationCacheCreationTypedDict]]
cache_creation_input_tokens: NotRequired[int]
cache_read_input_tokens: NotRequired[int]
input_tokens: NotRequired[int]
output_tokens: NotRequired[int]
class AnthropicAdvisorMessageUsageIteration(BaseModel):
model: str
type: AnthropicAdvisorMessageUsageIterationType
cache_creation: OptionalNullable[AnthropicIterationCacheCreation] = UNSET
cache_creation_input_tokens: Optional[int] = None
cache_read_input_tokens: Optional[int] = None
input_tokens: Optional[int] = None
output_tokens: Optional[int] = None
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = [
"cache_creation",
"cache_creation_input_tokens",
"cache_read_input_tokens",
"input_tokens",
"output_tokens",
]
nullable_fields = ["cache_creation"]
null_default_fields = []
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k)
serialized.pop(k, None)
optional_nullable = k in optional_fields and k in nullable_fields
is_set = (
self.__pydantic_fields_set__.intersection({n})
or k in null_default_fields
) # pylint: disable=no-member
if val is not None and val != UNSET_SENTINEL:
m[k] = val
elif val != UNSET_SENTINEL and (
not k in optional_fields or (optional_nullable and is_set)
):
m[k] = val
return m
@@ -0,0 +1,79 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .anthropiciterationcachecreation import (
AnthropicIterationCacheCreation,
AnthropicIterationCacheCreationTypedDict,
)
from openrouter.types import (
BaseModel,
Nullable,
OptionalNullable,
UNSET,
UNSET_SENTINEL,
)
from pydantic import model_serializer
from typing import Literal, Optional
from typing_extensions import NotRequired, TypedDict
AnthropicCompactionUsageIterationType = Literal["compaction",]
class AnthropicCompactionUsageIterationTypedDict(TypedDict):
type: AnthropicCompactionUsageIterationType
cache_creation: NotRequired[Nullable[AnthropicIterationCacheCreationTypedDict]]
cache_creation_input_tokens: NotRequired[int]
cache_read_input_tokens: NotRequired[int]
input_tokens: NotRequired[int]
output_tokens: NotRequired[int]
class AnthropicCompactionUsageIteration(BaseModel):
type: AnthropicCompactionUsageIterationType
cache_creation: OptionalNullable[AnthropicIterationCacheCreation] = UNSET
cache_creation_input_tokens: Optional[int] = None
cache_read_input_tokens: Optional[int] = None
input_tokens: Optional[int] = None
output_tokens: Optional[int] = None
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = [
"cache_creation",
"cache_creation_input_tokens",
"cache_read_input_tokens",
"input_tokens",
"output_tokens",
]
nullable_fields = ["cache_creation"]
null_default_fields = []
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k)
serialized.pop(k, None)
optional_nullable = k in optional_fields and k in nullable_fields
is_set = (
self.__pydantic_fields_set__.intersection({n})
or k in null_default_fields
) # pylint: disable=no-member
if val is not None and val != UNSET_SENTINEL:
m[k] = val
elif val != UNSET_SENTINEL and (
not k in optional_fields or (optional_nullable and is_set)
):
m[k] = val
return m
@@ -0,0 +1,17 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.types import BaseModel
from typing import Optional
from typing_extensions import NotRequired, TypedDict
class AnthropicIterationCacheCreationTypedDict(TypedDict):
ephemeral_1h_input_tokens: NotRequired[int]
ephemeral_5m_input_tokens: NotRequired[int]
class AnthropicIterationCacheCreation(BaseModel):
ephemeral_1h_input_tokens: Optional[int] = None
ephemeral_5m_input_tokens: Optional[int] = None
@@ -0,0 +1,83 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .anthropiciterationcachecreation import (
AnthropicIterationCacheCreation,
AnthropicIterationCacheCreationTypedDict,
)
from openrouter.types import (
BaseModel,
Nullable,
OptionalNullable,
UNSET,
UNSET_SENTINEL,
)
from pydantic import model_serializer
from typing import Literal, Optional
from typing_extensions import NotRequired, TypedDict
AnthropicMessageUsageIterationType = Literal["message",]
class AnthropicMessageUsageIterationTypedDict(TypedDict):
type: AnthropicMessageUsageIterationType
cache_creation: NotRequired[Nullable[AnthropicIterationCacheCreationTypedDict]]
cache_creation_input_tokens: NotRequired[int]
cache_read_input_tokens: NotRequired[int]
input_tokens: NotRequired[int]
output_tokens: NotRequired[int]
model: NotRequired[str]
class AnthropicMessageUsageIteration(BaseModel):
type: AnthropicMessageUsageIterationType
cache_creation: OptionalNullable[AnthropicIterationCacheCreation] = UNSET
cache_creation_input_tokens: Optional[int] = None
cache_read_input_tokens: Optional[int] = None
input_tokens: Optional[int] = None
output_tokens: Optional[int] = None
model: Optional[str] = None
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = [
"cache_creation",
"cache_creation_input_tokens",
"cache_read_input_tokens",
"input_tokens",
"output_tokens",
"model",
]
nullable_fields = ["cache_creation"]
null_default_fields = []
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k)
serialized.pop(k, None)
optional_nullable = k in optional_fields and k in nullable_fields
is_set = (
self.__pydantic_fields_set__.intersection({n})
or k in null_default_fields
) # pylint: disable=no-member
if val is not None and val != UNSET_SENTINEL:
m[k] = val
elif val != UNSET_SENTINEL and (
not k in optional_fields or (optional_nullable and is_set)
):
m[k] = val
return m
@@ -0,0 +1,14 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.types import UnrecognizedStr
from typing import Literal, Union
AnthropicSpeed = Union[
Literal[
"fast",
"standard",
],
UnrecognizedStr,
]
@@ -0,0 +1,76 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .anthropiciterationcachecreation import (
AnthropicIterationCacheCreation,
AnthropicIterationCacheCreationTypedDict,
)
from openrouter.types import (
BaseModel,
Nullable,
OptionalNullable,
UNSET,
UNSET_SENTINEL,
)
from pydantic import model_serializer
from typing import Optional
from typing_extensions import NotRequired, TypedDict
class AnthropicUnknownUsageIterationTypedDict(TypedDict):
type: str
cache_creation: NotRequired[Nullable[AnthropicIterationCacheCreationTypedDict]]
cache_creation_input_tokens: NotRequired[int]
cache_read_input_tokens: NotRequired[int]
input_tokens: NotRequired[int]
output_tokens: NotRequired[int]
class AnthropicUnknownUsageIteration(BaseModel):
type: str
cache_creation: OptionalNullable[AnthropicIterationCacheCreation] = UNSET
cache_creation_input_tokens: Optional[int] = None
cache_read_input_tokens: Optional[int] = None
input_tokens: Optional[int] = None
output_tokens: Optional[int] = None
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = [
"cache_creation",
"cache_creation_input_tokens",
"cache_read_input_tokens",
"input_tokens",
"output_tokens",
]
nullable_fields = ["cache_creation"]
null_default_fields = []
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k)
serialized.pop(k, None)
optional_nullable = k in optional_fields and k in nullable_fields
is_set = (
self.__pydantic_fields_set__.intersection({n})
or k in null_default_fields
) # pylint: disable=no-member
if val is not None and val != UNSET_SENTINEL:
m[k] = val
elif val != UNSET_SENTINEL and (
not k in optional_fields or (optional_nullable and is_set)
):
m[k] = val
return m
@@ -0,0 +1,43 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .anthropicadvisormessageusageiteration import (
AnthropicAdvisorMessageUsageIteration,
AnthropicAdvisorMessageUsageIterationTypedDict,
)
from .anthropiccompactionusageiteration import (
AnthropicCompactionUsageIteration,
AnthropicCompactionUsageIterationTypedDict,
)
from .anthropicmessageusageiteration import (
AnthropicMessageUsageIteration,
AnthropicMessageUsageIterationTypedDict,
)
from .anthropicunknownusageiteration import (
AnthropicUnknownUsageIteration,
AnthropicUnknownUsageIterationTypedDict,
)
from typing import Union
from typing_extensions import TypeAliasType
AnthropicUsageIterationTypedDict = TypeAliasType(
"AnthropicUsageIterationTypedDict",
Union[
AnthropicCompactionUsageIterationTypedDict,
AnthropicUnknownUsageIterationTypedDict,
AnthropicMessageUsageIterationTypedDict,
AnthropicAdvisorMessageUsageIterationTypedDict,
],
)
AnthropicUsageIteration = TypeAliasType(
"AnthropicUsageIteration",
Union[
AnthropicCompactionUsageIteration,
AnthropicUnknownUsageIteration,
AnthropicMessageUsageIteration,
AnthropicAdvisorMessageUsageIteration,
],
)
+40
View File
@@ -0,0 +1,40 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.types import UnrecognizedStr
from typing import Literal, Union
APIErrorType = Union[
Literal[
"context_length_exceeded",
"max_tokens_exceeded",
"token_limit_exceeded",
"string_too_long",
"authentication",
"permission_denied",
"payment_required",
"rate_limit_exceeded",
"provider_overloaded",
"provider_unavailable",
"invalid_request",
"invalid_prompt",
"not_found",
"precondition_failed",
"payload_too_large",
"unprocessable",
"content_policy_violation",
"refusal",
"invalid_image",
"image_too_large",
"image_too_small",
"unsupported_image_format",
"image_not_found",
"image_download_failed",
"server",
"timeout",
"unmapped",
],
UnrecognizedStr,
]
r"""Canonical OpenRouter error type, stable across all API formats"""
@@ -1,53 +0,0 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.types import BaseModel
from typing import Literal
from typing_extensions import TypedDict
BenchmarksAAMetaSource = Literal["artificial-analysis",]
r"""Data source identifier."""
BenchmarksAAMetaSourceURL = Literal["https://artificialanalysis.ai",]
r"""URL of the upstream data source."""
BenchmarksAAMetaVersion = Literal["v1",]
r"""Dataset version."""
class BenchmarksAAMetaTypedDict(TypedDict):
as_of: str
r"""ISO-8601 timestamp of when this data was last updated."""
citation: str
r"""Required attribution when republishing this data."""
model_count: int
r"""Number of unique models in the response."""
source: BenchmarksAAMetaSource
r"""Data source identifier."""
source_url: BenchmarksAAMetaSourceURL
r"""URL of the upstream data source."""
version: BenchmarksAAMetaVersion
r"""Dataset version."""
class BenchmarksAAMeta(BaseModel):
as_of: str
r"""ISO-8601 timestamp of when this data was last updated."""
citation: str
r"""Required attribution when republishing this data."""
model_count: int
r"""Number of unique models in the response."""
source: BenchmarksAAMetaSource
r"""Data source identifier."""
source_url: BenchmarksAAMetaSourceURL
r"""URL of the upstream data source."""
version: BenchmarksAAMetaVersion
r"""Dataset version."""
@@ -1,19 +0,0 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .benchmarksaaitem import BenchmarksAAItem, BenchmarksAAItemTypedDict
from .benchmarksaameta import BenchmarksAAMeta, BenchmarksAAMetaTypedDict
from openrouter.types import BaseModel
from typing import List
from typing_extensions import TypedDict
class BenchmarksAAResponseTypedDict(TypedDict):
data: List[BenchmarksAAItemTypedDict]
meta: BenchmarksAAMetaTypedDict
class BenchmarksAAResponse(BaseModel):
data: List[BenchmarksAAItem]
meta: BenchmarksAAMeta
@@ -1,118 +0,0 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.types import BaseModel, Nullable, UNSET_SENTINEL
from pydantic import model_serializer
from typing import Literal
from typing_extensions import TypedDict
class EloBoundsTypedDict(TypedDict):
r"""ELO range across all returned models for normalization."""
max: float
r"""Maximum ELO in the result set."""
min: float
r"""Minimum ELO in the result set."""
class EloBounds(BaseModel):
r"""ELO range across all returned models for normalization."""
max: float
r"""Maximum ELO in the result set."""
min: float
r"""Minimum ELO in the result set."""
BenchmarksDAMetaSource = Literal["design-arena",]
r"""Data source identifier."""
BenchmarksDAMetaSourceURL = Literal["https://www.designarena.ai",]
r"""URL of the upstream data source."""
BenchmarksDAMetaVersion = Literal["v1",]
r"""Dataset version."""
class BenchmarksDAMetaTypedDict(TypedDict):
arena: str
r"""The arena filter applied."""
as_of: str
r"""ISO-8601 timestamp of when this data was generated."""
category: Nullable[str]
r"""The category filter applied, or null if showing all."""
citation: str
r"""Required attribution when republishing this data."""
elo_bounds: EloBoundsTypedDict
r"""ELO range across all returned models for normalization."""
model_count: int
r"""Number of unique models in the response."""
source: BenchmarksDAMetaSource
r"""Data source identifier."""
source_url: BenchmarksDAMetaSourceURL
r"""URL of the upstream data source."""
version: BenchmarksDAMetaVersion
r"""Dataset version."""
class BenchmarksDAMeta(BaseModel):
arena: str
r"""The arena filter applied."""
as_of: str
r"""ISO-8601 timestamp of when this data was generated."""
category: Nullable[str]
r"""The category filter applied, or null if showing all."""
citation: str
r"""Required attribution when republishing this data."""
elo_bounds: EloBounds
r"""ELO range across all returned models for normalization."""
model_count: int
r"""Number of unique models in the response."""
source: BenchmarksDAMetaSource
r"""Data source identifier."""
source_url: BenchmarksDAMetaSourceURL
r"""URL of the upstream data source."""
version: BenchmarksDAMetaVersion
r"""Dataset version."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = []
nullable_fields = ["category"]
null_default_fields = []
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k)
serialized.pop(k, None)
optional_nullable = k in optional_fields and k in nullable_fields
is_set = (
self.__pydantic_fields_set__.intersection({n})
or k in null_default_fields
) # pylint: disable=no-member
if val is not None and val != UNSET_SENTINEL:
m[k] = val
elif val != UNSET_SENTINEL and (
not k in optional_fields or (optional_nullable and is_set)
):
m[k] = val
return m
@@ -1,19 +0,0 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .benchmarksdaitem import BenchmarksDAItem, BenchmarksDAItemTypedDict
from .benchmarksdameta import BenchmarksDAMeta, BenchmarksDAMetaTypedDict
from openrouter.types import BaseModel
from typing import List
from typing_extensions import TypedDict
class BenchmarksDAResponseTypedDict(TypedDict):
data: List[BenchmarksDAItemTypedDict]
meta: BenchmarksDAMetaTypedDict
class BenchmarksDAResponse(BaseModel):
data: List[BenchmarksDAItem]
meta: BenchmarksDAMeta
@@ -0,0 +1,21 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.types import BaseModel
from typing import Literal
from typing_extensions import TypedDict
BooleanCapabilityType = Literal["boolean",]
class BooleanCapabilityTypedDict(TypedDict):
r"""A supported-or-not flag. Present means the parameter is accepted."""
type: BooleanCapabilityType
class BooleanCapability(BaseModel):
r"""A supported-or-not flag. Present means the parameter is accepted."""
type: BooleanCapabilityType
@@ -43,8 +43,10 @@ BYOKProviderSlug = Union[
"google-ai-studio",
"google-vertex",
"groq",
"heygen",
"inception",
"inceptron",
"inferact-vllm",
"inference-net",
"infermatic",
"inflection",
@@ -75,6 +77,7 @@ BYOKProviderSlug = Union[
"recraft",
"reka",
"relace",
"sakana-ai",
"sambanova",
"seed",
"siliconflow",
@@ -82,6 +85,7 @@ BYOKProviderSlug = Union[
"stepfun",
"streamlake",
"switchpoint",
"tenstorrent",
"together",
"upstage",
"venice",
@@ -0,0 +1,30 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .booleancapability import BooleanCapability, BooleanCapabilityTypedDict
from .enumcapability import EnumCapability, EnumCapabilityTypedDict
from .rangecapability import RangeCapability, RangeCapabilityTypedDict
from openrouter.utils import get_discriminator
from pydantic import Discriminator, Tag
from typing import Union
from typing_extensions import Annotated, TypeAliasType
CapabilityDescriptorTypedDict = TypeAliasType(
"CapabilityDescriptorTypedDict",
Union[
BooleanCapabilityTypedDict, EnumCapabilityTypedDict, RangeCapabilityTypedDict
],
)
r"""A typed descriptor for one supported request parameter."""
CapabilityDescriptor = Annotated[
Union[
Annotated[EnumCapability, Tag("enum")],
Annotated[RangeCapability, Tag("range")],
Annotated[BooleanCapability, Tag("boolean")],
],
Discriminator(lambda m: get_discriminator(m, "type", "type")),
]
r"""A typed descriptor for one supported request parameter."""
+2
View File
@@ -106,6 +106,7 @@ ChatRequestPlugin = Annotated[
ChatRequestEffort = Union[
Literal[
"max",
"xhigh",
"high",
"medium",
@@ -172,6 +173,7 @@ class ChatRequestReasoning(BaseModel):
ChatRequestReasoningEffort = Union[
Literal[
"max",
"xhigh",
"high",
"medium",
+32 -5
View File
@@ -1,6 +1,7 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .apierrortype import APIErrorType
from .chatstreamchoice import ChatStreamChoice, ChatStreamChoiceTypedDict
from .chatusage import ChatUsage, ChatUsageTypedDict
from .openroutermetadata import OpenRouterMetadata, OpenRouterMetadataTypedDict
@@ -11,21 +12,44 @@ from openrouter.types import (
UNSET,
UNSET_SENTINEL,
)
from openrouter.utils import validate_open_enum
from pydantic import model_serializer
from pydantic.functional_validators import PlainValidator
from typing import List, Literal, Optional
from typing_extensions import NotRequired, TypedDict
from typing_extensions import Annotated, NotRequired, TypedDict
class ErrorTypedDict(TypedDict):
class ChatStreamChunkMetadataTypedDict(TypedDict):
r"""Structured error metadata"""
error_type: APIErrorType
r"""Canonical OpenRouter error type, stable across all API formats"""
provider_code: NotRequired[str]
r"""Upstream provider-specific error code, when available"""
class ChatStreamChunkMetadata(BaseModel):
r"""Structured error metadata"""
error_type: Annotated[APIErrorType, PlainValidator(validate_open_enum(False))]
r"""Canonical OpenRouter error type, stable across all API formats"""
provider_code: Optional[str] = None
r"""Upstream provider-specific error code, when available"""
class ChatStreamChunkErrorTypedDict(TypedDict):
r"""Error information"""
code: int
r"""Error code"""
message: str
r"""Error message"""
metadata: NotRequired[ChatStreamChunkMetadataTypedDict]
r"""Structured error metadata"""
class Error(BaseModel):
class ChatStreamChunkError(BaseModel):
r"""Error information"""
code: int
@@ -34,6 +58,9 @@ class Error(BaseModel):
message: str
r"""Error message"""
metadata: Optional[ChatStreamChunkMetadata] = None
r"""Structured error metadata"""
ChatStreamChunkObject = Literal["chat.completion.chunk",]
@@ -50,7 +77,7 @@ class ChatStreamChunkTypedDict(TypedDict):
model: str
r"""Model used for completion"""
object: ChatStreamChunkObject
error: NotRequired[ErrorTypedDict]
error: NotRequired[ChatStreamChunkErrorTypedDict]
r"""Error information"""
openrouter_metadata: NotRequired[OpenRouterMetadataTypedDict]
service_tier: NotRequired[Nullable[str]]
@@ -78,7 +105,7 @@ class ChatStreamChunk(BaseModel):
object: ChatStreamChunkObject
error: Optional[Error] = None
error: Optional[ChatStreamChunkError] = None
r"""Error information"""
openrouter_metadata: Optional[OpenRouterMetadata] = None
+123 -50
View File
@@ -14,7 +14,7 @@ from typing import Optional
from typing_extensions import NotRequired, TypedDict
class CompletionTokensDetailsTypedDict(TypedDict):
class ChatUsageCompletionTokensDetailsTypedDict(TypedDict):
r"""Detailed completion token usage"""
accepted_prediction_tokens: NotRequired[Nullable[int]]
@@ -27,7 +27,7 @@ class CompletionTokensDetailsTypedDict(TypedDict):
r"""Rejected prediction tokens"""
class CompletionTokensDetails(BaseModel):
class ChatUsageCompletionTokensDetails(BaseModel):
r"""Detailed completion token usage"""
accepted_prediction_tokens: OptionalNullable[int] = UNSET
@@ -83,7 +83,7 @@ class CompletionTokensDetails(BaseModel):
return m
class PromptTokensDetailsTypedDict(TypedDict):
class ChatUsagePromptTokensDetailsTypedDict(TypedDict):
r"""Detailed prompt token usage"""
audio_tokens: NotRequired[int]
@@ -96,7 +96,7 @@ class PromptTokensDetailsTypedDict(TypedDict):
r"""Video input tokens"""
class PromptTokensDetails(BaseModel):
class ChatUsagePromptTokensDetails(BaseModel):
r"""Detailed prompt token usage"""
audio_tokens: Optional[int] = None
@@ -112,68 +112,141 @@ class PromptTokensDetails(BaseModel):
r"""Video input tokens"""
class ChatUsageTypedDict(TypedDict):
r"""Token usage statistics"""
class ServerToolUseDetailsTypedDict(TypedDict):
r"""Usage for server-side tool execution (e.g., web search)"""
completion_tokens: int
r"""Number of tokens in the completion"""
prompt_tokens: int
r"""Number of tokens in the prompt"""
total_tokens: int
r"""Total number of tokens"""
completion_tokens_details: NotRequired[Nullable[CompletionTokensDetailsTypedDict]]
r"""Detailed completion token usage"""
cost: NotRequired[Nullable[float]]
r"""Cost of the completion"""
cost_details: NotRequired[Nullable[CostDetailsTypedDict]]
r"""Breakdown of upstream inference costs"""
is_byok: NotRequired[bool]
r"""Whether a request was made using a Bring Your Own Key configuration"""
prompt_tokens_details: NotRequired[Nullable[PromptTokensDetailsTypedDict]]
r"""Detailed prompt token usage"""
tool_calls_executed: NotRequired[Nullable[int]]
r"""Number of OpenRouter server tool calls that executed and produced a result"""
tool_calls_requested: NotRequired[Nullable[int]]
r"""Total number of OpenRouter server-orchestrated tool calls the model requested, across all tool types. Provider-native tools (e.g. native web search) are not counted here."""
web_search_requests: NotRequired[Nullable[int]]
r"""Number of web searches performed by server-side tools. For server-orchestrated tool calls a web search is also counted in tool_calls_requested; provider-native web search may report web_search_requests only. Do not sum the two."""
class ChatUsage(BaseModel):
r"""Token usage statistics"""
class ServerToolUseDetails(BaseModel):
r"""Usage for server-side tool execution (e.g., web search)"""
completion_tokens: int
r"""Number of tokens in the completion"""
tool_calls_executed: OptionalNullable[int] = UNSET
r"""Number of OpenRouter server tool calls that executed and produced a result"""
prompt_tokens: int
r"""Number of tokens in the prompt"""
tool_calls_requested: OptionalNullable[int] = UNSET
r"""Total number of OpenRouter server-orchestrated tool calls the model requested, across all tool types. Provider-native tools (e.g. native web search) are not counted here."""
total_tokens: int
r"""Total number of tokens"""
completion_tokens_details: OptionalNullable[CompletionTokensDetails] = UNSET
r"""Detailed completion token usage"""
cost: OptionalNullable[float] = UNSET
r"""Cost of the completion"""
cost_details: OptionalNullable[CostDetails] = UNSET
r"""Breakdown of upstream inference costs"""
is_byok: Optional[bool] = None
r"""Whether a request was made using a Bring Your Own Key configuration"""
prompt_tokens_details: OptionalNullable[PromptTokensDetails] = UNSET
r"""Detailed prompt token usage"""
web_search_requests: OptionalNullable[int] = UNSET
r"""Number of web searches performed by server-side tools. For server-orchestrated tool calls a web search is also counted in tool_calls_requested; provider-native web search may report web_search_requests only. Do not sum the two."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = [
"completion_tokens_details",
"cost",
"cost_details",
"is_byok",
"prompt_tokens_details",
"tool_calls_executed",
"tool_calls_requested",
"web_search_requests",
]
nullable_fields = [
"tool_calls_executed",
"tool_calls_requested",
"web_search_requests",
]
null_default_fields = []
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k)
serialized.pop(k, None)
optional_nullable = k in optional_fields and k in nullable_fields
is_set = (
self.__pydantic_fields_set__.intersection({n})
or k in null_default_fields
) # pylint: disable=no-member
if val is not None and val != UNSET_SENTINEL:
m[k] = val
elif val != UNSET_SENTINEL and (
not k in optional_fields or (optional_nullable and is_set)
):
m[k] = val
return m
class ChatUsageTypedDict(TypedDict):
r"""Token usage statistics"""
completion_tokens: int
r"""Number of tokens in the completion"""
prompt_tokens: int
r"""Number of tokens in the prompt"""
total_tokens: int
r"""Total number of tokens"""
completion_tokens_details: NotRequired[
Nullable[ChatUsageCompletionTokensDetailsTypedDict]
]
r"""Detailed completion token usage"""
cost: NotRequired[Nullable[float]]
r"""Cost of the completion"""
cost_details: NotRequired[Nullable[CostDetailsTypedDict]]
r"""Breakdown of upstream inference costs"""
is_byok: NotRequired[bool]
r"""Whether a request was made using a Bring Your Own Key configuration"""
prompt_tokens_details: NotRequired[Nullable[ChatUsagePromptTokensDetailsTypedDict]]
r"""Detailed prompt token usage"""
server_tool_use_details: NotRequired[Nullable[ServerToolUseDetailsTypedDict]]
r"""Usage for server-side tool execution (e.g., web search)"""
class ChatUsage(BaseModel):
r"""Token usage statistics"""
completion_tokens: int
r"""Number of tokens in the completion"""
prompt_tokens: int
r"""Number of tokens in the prompt"""
total_tokens: int
r"""Total number of tokens"""
completion_tokens_details: OptionalNullable[ChatUsageCompletionTokensDetails] = (
UNSET
)
r"""Detailed completion token usage"""
cost: OptionalNullable[float] = UNSET
r"""Cost of the completion"""
cost_details: OptionalNullable[CostDetails] = UNSET
r"""Breakdown of upstream inference costs"""
is_byok: Optional[bool] = None
r"""Whether a request was made using a Bring Your Own Key configuration"""
prompt_tokens_details: OptionalNullable[ChatUsagePromptTokensDetails] = UNSET
r"""Detailed prompt token usage"""
server_tool_use_details: OptionalNullable[ServerToolUseDetails] = UNSET
r"""Usage for server-side tool execution (e.g., web search)"""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = [
"completion_tokens_details",
"cost",
"cost_details",
"is_byok",
"prompt_tokens_details",
"server_tool_use_details",
]
nullable_fields = [
"completion_tokens_details",
"cost",
"cost_details",
"prompt_tokens_details",
"server_tool_use_details",
]
null_default_fields = []
+65
View File
@@ -0,0 +1,65 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.types import BaseModel, Nullable, UnrecognizedStr
from openrouter.utils import validate_open_enum
from pydantic.functional_validators import PlainValidator
from typing import Any, Dict, Literal, Optional, Union
from typing_extensions import Annotated, NotRequired, TypedDict
Event = Union[
Literal[
"adapter_request",
"upstream_headers_received",
"first_token_received",
"upstream_body_ended",
],
UnrecognizedStr,
]
class TimingsTypedDict(TypedDict):
epoch_ms: int
event: Event
start_ms: int
class Timings(BaseModel):
epoch_ms: int
event: Annotated[Event, PlainValidator(validate_open_enum(False))]
start_ms: int
class DebugTypedDict(TypedDict):
echo_upstream_body: NotRequired[Dict[str, Nullable[Any]]]
timings: NotRequired[TimingsTypedDict]
class Debug(BaseModel):
echo_upstream_body: Optional[Dict[str, Nullable[Any]]] = None
timings: Optional[Timings] = None
DebugEventType = Literal["response.debug",]
class DebugEventTypedDict(TypedDict):
r"""Debug event emitted when debug.echo_upstream_body is true. Contains the transformed upstream request body or timing milestones."""
debug: DebugTypedDict
sequence_number: int
type: DebugEventType
class DebugEvent(BaseModel):
r"""Debug event emitted when debug.echo_upstream_body is true. Contains the transformed upstream request body or timing milestones."""
debug: Debug
sequence_number: int
type: DebugEventType
@@ -0,0 +1,24 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.types import BaseModel
from typing import List, Literal
from typing_extensions import TypedDict
EnumCapabilityType = Literal["enum",]
class EnumCapabilityTypedDict(TypedDict):
r"""A parameter that accepts one of a discrete set of string values."""
type: EnumCapabilityType
values: List[str]
class EnumCapability(BaseModel):
r"""A parameter that accepts one of a discrete set of string values."""
type: EnumCapabilityType
values: List[str]
@@ -15,6 +15,7 @@ PresetEnum = Union[
Literal[
"general-high",
"general-budget",
"general-fast",
],
UnrecognizedStr,
]
@@ -1,6 +1,10 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .anthropiccachecontroldirective import (
AnthropicCacheControlDirective,
AnthropicCacheControlDirectiveTypedDict,
)
from openrouter.types import BaseModel, Nullable, UnrecognizedStr
from openrouter.utils import validate_open_enum
from pydantic.functional_validators import PlainValidator
@@ -10,6 +14,7 @@ from typing_extensions import Annotated, NotRequired, TypedDict
FusionServerToolConfigEffort = Union[
Literal[
"max",
"xhigh",
"high",
"medium",
@@ -64,6 +69,8 @@ class FusionServerToolConfigTypedDict(TypedDict):
analysis_models: NotRequired[List[str]]
r"""Slugs of models to run in parallel as the analysis panel. Each model receives the user prompt with openrouter:web_search and openrouter:web_fetch enabled, then a judge model summarizes the collective output into structured analysis JSON. Capped at 8 models to bound cost amplification. Defaults to the Quality preset from /labs/fusion."""
cache_control: NotRequired[AnthropicCacheControlDirectiveTypedDict]
r"""Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. Currently supported for Anthropic Claude models."""
max_completion_tokens: NotRequired[int]
r"""Maximum number of output tokens (including reasoning tokens) each panelist and the judge model may produce per inner call. Controls the total output budget so reasoning-heavy models like GPT-5.5 do not exhaust their token allowance before producing visible text. When omitted, the provider's default applies."""
max_tool_calls: NotRequired[int]
@@ -73,7 +80,7 @@ class FusionServerToolConfigTypedDict(TypedDict):
reasoning: NotRequired[FusionServerToolConfigReasoningTypedDict]
r"""Reasoning configuration forwarded to panelist and judge inner calls. Use this to control reasoning effort and token budget for models that support extended thinking."""
temperature: NotRequired[float]
r"""Sampling temperature forwarded to panelist and judge inner calls. When omitted, the provider's default applies."""
r"""Temperature forwarded to panelist inner calls. The judge always runs at temperature 0 regardless of this value. When omitted, the provider's default applies."""
tools: NotRequired[List[FusionServerToolConfigToolTypedDict]]
r"""Server tools available to panelist and judge inner calls. Each entry uses the same `{ type, parameters? }` shorthand as the outer Chat Completions request. When omitted, defaults to `[{ type: \"openrouter:web_search\" }, { type: \"openrouter:web_fetch\" }]`. Pass an empty array to disable tools entirely (panelists answer from parametric knowledge only)."""
@@ -84,6 +91,9 @@ class FusionServerToolConfig(BaseModel):
analysis_models: Optional[List[str]] = None
r"""Slugs of models to run in parallel as the analysis panel. Each model receives the user prompt with openrouter:web_search and openrouter:web_fetch enabled, then a judge model summarizes the collective output into structured analysis JSON. Capped at 8 models to bound cost amplification. Defaults to the Quality preset from /labs/fusion."""
cache_control: Optional[AnthropicCacheControlDirective] = None
r"""Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. Currently supported for Anthropic Claude models."""
max_completion_tokens: Optional[int] = None
r"""Maximum number of output tokens (including reasoning tokens) each panelist and the judge model may produce per inner call. Controls the total output budget so reasoning-heavy models like GPT-5.5 do not exhaust their token allowance before producing visible text. When omitted, the provider's default applies."""
@@ -97,7 +107,7 @@ class FusionServerToolConfig(BaseModel):
r"""Reasoning configuration forwarded to panelist and judge inner calls. Use this to control reasoning effort and token budget for models that support extended thinking."""
temperature: Optional[float] = None
r"""Sampling temperature forwarded to panelist and judge inner calls. When omitted, the provider's default applies."""
r"""Temperature forwarded to panelist inner calls. The judge always runs at temperature 0 regardless of this value. When omitted, the provider's default applies."""
tools: Optional[List[FusionServerToolConfigTool]] = None
r"""Server tools available to panelist and judge inner calls. Each entry uses the same `{ type, parameters? }` shorthand as the outer Chat Completions request. When omitted, defaults to `[{ type: \"openrouter:web_search\" }, { type: \"openrouter:web_fetch\" }]`. Pass an empty array to disable tools entirely (panelists answer from parametric knowledge only)."""
@@ -0,0 +1,81 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .capabilitydescriptor import CapabilityDescriptor, CapabilityDescriptorTypedDict
from .imagepricingentry import ImagePricingEntry, ImagePricingEntryTypedDict
from openrouter.types import BaseModel, Nullable, UNSET_SENTINEL
from pydantic import model_serializer
from typing import Dict, List
from typing_extensions import TypedDict
class ImageEndpointTypedDict(TypedDict):
r"""An endpoint that serves a given image model."""
allowed_passthrough_parameters: List[str]
r"""Provider-specific options accepted under provider.options[provider_slug]."""
pricing: List[ImagePricingEntryTypedDict]
r"""Billable pricing lines for this endpoint."""
provider_name: str
r"""Provider display name"""
provider_slug: str
r"""Provider slug"""
provider_tag: Nullable[str]
r"""Provider tag for request-side selection"""
supported_parameters: Dict[str, CapabilityDescriptorTypedDict]
supports_streaming: bool
r"""Whether this endpoint supports native SSE streaming (`stream: true` in the request)."""
class ImageEndpoint(BaseModel):
r"""An endpoint that serves a given image model."""
allowed_passthrough_parameters: List[str]
r"""Provider-specific options accepted under provider.options[provider_slug]."""
pricing: List[ImagePricingEntry]
r"""Billable pricing lines for this endpoint."""
provider_name: str
r"""Provider display name"""
provider_slug: str
r"""Provider slug"""
provider_tag: Nullable[str]
r"""Provider tag for request-side selection"""
supported_parameters: Dict[str, CapabilityDescriptor]
supports_streaming: bool
r"""Whether this endpoint supports native SSE streaming (`stream: true` in the request)."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = []
nullable_fields = ["provider_tag"]
null_default_fields = []
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k)
serialized.pop(k, None)
optional_nullable = k in optional_fields and k in nullable_fields
is_set = (
self.__pydantic_fields_set__.intersection({n})
or k in null_default_fields
) # pylint: disable=no-member
if val is not None and val != UNSET_SENTINEL:
m[k] = val
elif val != UNSET_SENTINEL and (
not k in optional_fields or (optional_nullable and is_set)
):
m[k] = val
return m
@@ -0,0 +1,40 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .imagegenerationusage import ImageGenerationUsage, ImageGenerationUsageTypedDict
from openrouter.types import BaseModel
from typing import Literal, Optional
from typing_extensions import NotRequired, TypedDict
ImageGenCompletedEventType = Literal["image_generation.completed",]
r"""The event type"""
class ImageGenCompletedEventTypedDict(TypedDict):
r"""Emitted when generation completes and the final image is available"""
b64_json: str
r"""Base64-encoded final image data"""
created: int
r"""Unix timestamp (seconds) when the image was generated"""
type: ImageGenCompletedEventType
r"""The event type"""
usage: NotRequired[ImageGenerationUsageTypedDict]
r"""Token and cost usage for the image generation request, when available"""
class ImageGenCompletedEvent(BaseModel):
r"""Emitted when generation completes and the final image is available"""
b64_json: str
r"""Base64-encoded final image data"""
created: int
r"""Unix timestamp (seconds) when the image was generated"""
type: ImageGenCompletedEventType
r"""The event type"""
usage: Optional[ImageGenerationUsage] = None
r"""Token and cost usage for the image generation request, when available"""
@@ -0,0 +1,606 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .contentpartimage import ContentPartImage, ContentPartImageTypedDict
from openrouter.types import BaseModel, Nullable, UnrecognizedStr
from openrouter.utils import validate_open_enum
import pydantic
from pydantic.functional_validators import PlainValidator
from typing import Any, Dict, List, Literal, Optional, Union
from typing_extensions import Annotated, NotRequired, TypedDict
ImageGenerationRequestAspectRatio = Union[
Literal[
"1:1",
"1:2",
"1:4",
"1:8",
"2:1",
"2:3",
"3:2",
"3:4",
"4:1",
"4:3",
"4:5",
"5:4",
"8:1",
"9:16",
"16:9",
"9:19.5",
"19.5:9",
"9:20",
"20:9",
"9:21",
"21:9",
"auto",
],
UnrecognizedStr,
]
r"""Normalized aspect ratio of the generated image. Providers clamp to their supported subset."""
ImageGenerationRequestBackground = Union[
Literal[
"auto",
"transparent",
"opaque",
],
UnrecognizedStr,
]
r"""Background treatment. `transparent` requires an output_format that supports alpha (png or webp)."""
ImageGenerationRequestOutputFormat = Union[
Literal[
"png",
"jpeg",
"webp",
],
UnrecognizedStr,
]
r"""Encoding of the returned image bytes."""
class ImageGenerationRequestOptionsTypedDict(TypedDict):
r"""Provider-specific options keyed by provider slug. Only options for the matched provider are forwarded; the rest are ignored. Unrecognized keys are silently dropped."""
oneai: NotRequired[Dict[str, Nullable[Any]]]
ai21: NotRequired[Dict[str, Nullable[Any]]]
aion_labs: NotRequired[Dict[str, Nullable[Any]]]
akashml: NotRequired[Dict[str, Nullable[Any]]]
alibaba: NotRequired[Dict[str, Nullable[Any]]]
amazon_bedrock: NotRequired[Dict[str, Nullable[Any]]]
amazon_nova: NotRequired[Dict[str, Nullable[Any]]]
ambient: NotRequired[Dict[str, Nullable[Any]]]
anthropic: NotRequired[Dict[str, Nullable[Any]]]
anyscale: NotRequired[Dict[str, Nullable[Any]]]
arcee_ai: NotRequired[Dict[str, Nullable[Any]]]
atlas_cloud: NotRequired[Dict[str, Nullable[Any]]]
atoma: NotRequired[Dict[str, Nullable[Any]]]
avian: NotRequired[Dict[str, Nullable[Any]]]
azure: NotRequired[Dict[str, Nullable[Any]]]
baidu: NotRequired[Dict[str, Nullable[Any]]]
baseten: NotRequired[Dict[str, Nullable[Any]]]
black_forest_labs: NotRequired[Dict[str, Nullable[Any]]]
byteplus: NotRequired[Dict[str, Nullable[Any]]]
centml: NotRequired[Dict[str, Nullable[Any]]]
cerebras: NotRequired[Dict[str, Nullable[Any]]]
chutes: NotRequired[Dict[str, Nullable[Any]]]
cirrascale: NotRequired[Dict[str, Nullable[Any]]]
clarifai: NotRequired[Dict[str, Nullable[Any]]]
cloudflare: NotRequired[Dict[str, Nullable[Any]]]
cohere: NotRequired[Dict[str, Nullable[Any]]]
crofai: NotRequired[Dict[str, Nullable[Any]]]
crucible: NotRequired[Dict[str, Nullable[Any]]]
crusoe: NotRequired[Dict[str, Nullable[Any]]]
darkbloom: NotRequired[Dict[str, Nullable[Any]]]
decart: NotRequired[Dict[str, Nullable[Any]]]
deepinfra: NotRequired[Dict[str, Nullable[Any]]]
deepseek: NotRequired[Dict[str, Nullable[Any]]]
dekallm: NotRequired[Dict[str, Nullable[Any]]]
digitalocean: NotRequired[Dict[str, Nullable[Any]]]
enfer: NotRequired[Dict[str, Nullable[Any]]]
fake_provider: NotRequired[Dict[str, Nullable[Any]]]
featherless: NotRequired[Dict[str, Nullable[Any]]]
fireworks: NotRequired[Dict[str, Nullable[Any]]]
friendli: NotRequired[Dict[str, Nullable[Any]]]
gmicloud: NotRequired[Dict[str, Nullable[Any]]]
google_ai_studio: NotRequired[Dict[str, Nullable[Any]]]
google_vertex: NotRequired[Dict[str, Nullable[Any]]]
gopomelo: NotRequired[Dict[str, Nullable[Any]]]
groq: NotRequired[Dict[str, Nullable[Any]]]
heygen: NotRequired[Dict[str, Nullable[Any]]]
huggingface: NotRequired[Dict[str, Nullable[Any]]]
hyperbolic: NotRequired[Dict[str, Nullable[Any]]]
hyperbolic_quantized: NotRequired[Dict[str, Nullable[Any]]]
inception: NotRequired[Dict[str, Nullable[Any]]]
inceptron: NotRequired[Dict[str, Nullable[Any]]]
inferact_vllm: NotRequired[Dict[str, Nullable[Any]]]
inference_net: NotRequired[Dict[str, Nullable[Any]]]
infermatic: NotRequired[Dict[str, Nullable[Any]]]
inflection: NotRequired[Dict[str, Nullable[Any]]]
inocloud: NotRequired[Dict[str, Nullable[Any]]]
io_net: NotRequired[Dict[str, Nullable[Any]]]
ionstream: NotRequired[Dict[str, Nullable[Any]]]
klusterai: NotRequired[Dict[str, Nullable[Any]]]
lambda_: NotRequired[Dict[str, Nullable[Any]]]
lepton: NotRequired[Dict[str, Nullable[Any]]]
liquid: NotRequired[Dict[str, Nullable[Any]]]
lynn: NotRequired[Dict[str, Nullable[Any]]]
lynn_private: NotRequired[Dict[str, Nullable[Any]]]
mancer: NotRequired[Dict[str, Nullable[Any]]]
mancer_old: NotRequired[Dict[str, Nullable[Any]]]
mara: NotRequired[Dict[str, Nullable[Any]]]
meta: NotRequired[Dict[str, Nullable[Any]]]
minimax: NotRequired[Dict[str, Nullable[Any]]]
mistral: NotRequired[Dict[str, Nullable[Any]]]
modal: NotRequired[Dict[str, Nullable[Any]]]
modelrun: NotRequired[Dict[str, Nullable[Any]]]
modular: NotRequired[Dict[str, Nullable[Any]]]
moonshotai: NotRequired[Dict[str, Nullable[Any]]]
morph: NotRequired[Dict[str, Nullable[Any]]]
ncompass: NotRequired[Dict[str, Nullable[Any]]]
nebius: NotRequired[Dict[str, Nullable[Any]]]
nex_agi: NotRequired[Dict[str, Nullable[Any]]]
nextbit: NotRequired[Dict[str, Nullable[Any]]]
nineteen: NotRequired[Dict[str, Nullable[Any]]]
novita: NotRequired[Dict[str, Nullable[Any]]]
nvidia: NotRequired[Dict[str, Nullable[Any]]]
octoai: NotRequired[Dict[str, Nullable[Any]]]
open_inference: NotRequired[Dict[str, Nullable[Any]]]
openai: NotRequired[Dict[str, Nullable[Any]]]
parasail: NotRequired[Dict[str, Nullable[Any]]]
perceptron: NotRequired[Dict[str, Nullable[Any]]]
perplexity: NotRequired[Dict[str, Nullable[Any]]]
phala: NotRequired[Dict[str, Nullable[Any]]]
poolside: NotRequired[Dict[str, Nullable[Any]]]
recraft: NotRequired[Dict[str, Nullable[Any]]]
recursal: NotRequired[Dict[str, Nullable[Any]]]
reflection: NotRequired[Dict[str, Nullable[Any]]]
reka: NotRequired[Dict[str, Nullable[Any]]]
relace: NotRequired[Dict[str, Nullable[Any]]]
replicate: NotRequired[Dict[str, Nullable[Any]]]
sakana_ai: NotRequired[Dict[str, Nullable[Any]]]
sambanova: NotRequired[Dict[str, Nullable[Any]]]
sambanova_cloaked: NotRequired[Dict[str, Nullable[Any]]]
seed: NotRequired[Dict[str, Nullable[Any]]]
sf_compute: NotRequired[Dict[str, Nullable[Any]]]
siliconflow: NotRequired[Dict[str, Nullable[Any]]]
sourceful: NotRequired[Dict[str, Nullable[Any]]]
stealth: NotRequired[Dict[str, Nullable[Any]]]
stepfun: NotRequired[Dict[str, Nullable[Any]]]
streamlake: NotRequired[Dict[str, Nullable[Any]]]
switchpoint: NotRequired[Dict[str, Nullable[Any]]]
targon: NotRequired[Dict[str, Nullable[Any]]]
tenstorrent: NotRequired[Dict[str, Nullable[Any]]]
together: NotRequired[Dict[str, Nullable[Any]]]
together_lite: NotRequired[Dict[str, Nullable[Any]]]
ubicloud: NotRequired[Dict[str, Nullable[Any]]]
upstage: NotRequired[Dict[str, Nullable[Any]]]
venice: NotRequired[Dict[str, Nullable[Any]]]
wafer: NotRequired[Dict[str, Nullable[Any]]]
wandb: NotRequired[Dict[str, Nullable[Any]]]
xai: NotRequired[Dict[str, Nullable[Any]]]
xiaomi: NotRequired[Dict[str, Nullable[Any]]]
z_ai: NotRequired[Dict[str, Nullable[Any]]]
class ImageGenerationRequestOptions(BaseModel):
r"""Provider-specific options keyed by provider slug. Only options for the matched provider are forwarded; the rest are ignored. Unrecognized keys are silently dropped."""
oneai: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="01ai")
] = None
ai21: Optional[Dict[str, Nullable[Any]]] = None
aion_labs: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="aion-labs")
] = None
akashml: Optional[Dict[str, Nullable[Any]]] = None
alibaba: Optional[Dict[str, Nullable[Any]]] = None
amazon_bedrock: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="amazon-bedrock")
] = None
amazon_nova: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="amazon-nova")
] = None
ambient: Optional[Dict[str, Nullable[Any]]] = None
anthropic: Optional[Dict[str, Nullable[Any]]] = None
anyscale: Optional[Dict[str, Nullable[Any]]] = None
arcee_ai: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="arcee-ai")
] = None
atlas_cloud: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="atlas-cloud")
] = None
atoma: Optional[Dict[str, Nullable[Any]]] = None
avian: Optional[Dict[str, Nullable[Any]]] = None
azure: Optional[Dict[str, Nullable[Any]]] = None
baidu: Optional[Dict[str, Nullable[Any]]] = None
baseten: Optional[Dict[str, Nullable[Any]]] = None
black_forest_labs: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="black-forest-labs")
] = None
byteplus: Optional[Dict[str, Nullable[Any]]] = None
centml: Optional[Dict[str, Nullable[Any]]] = None
cerebras: Optional[Dict[str, Nullable[Any]]] = None
chutes: Optional[Dict[str, Nullable[Any]]] = None
cirrascale: Optional[Dict[str, Nullable[Any]]] = None
clarifai: Optional[Dict[str, Nullable[Any]]] = None
cloudflare: Optional[Dict[str, Nullable[Any]]] = None
cohere: Optional[Dict[str, Nullable[Any]]] = None
crofai: Optional[Dict[str, Nullable[Any]]] = None
crucible: Optional[Dict[str, Nullable[Any]]] = None
crusoe: Optional[Dict[str, Nullable[Any]]] = None
darkbloom: Optional[Dict[str, Nullable[Any]]] = None
decart: Optional[Dict[str, Nullable[Any]]] = None
deepinfra: Optional[Dict[str, Nullable[Any]]] = None
deepseek: Optional[Dict[str, Nullable[Any]]] = None
dekallm: Optional[Dict[str, Nullable[Any]]] = None
digitalocean: Optional[Dict[str, Nullable[Any]]] = None
enfer: Optional[Dict[str, Nullable[Any]]] = None
fake_provider: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="fake-provider")
] = None
featherless: Optional[Dict[str, Nullable[Any]]] = None
fireworks: Optional[Dict[str, Nullable[Any]]] = None
friendli: Optional[Dict[str, Nullable[Any]]] = None
gmicloud: Optional[Dict[str, Nullable[Any]]] = None
google_ai_studio: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="google-ai-studio")
] = None
google_vertex: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="google-vertex")
] = None
gopomelo: Optional[Dict[str, Nullable[Any]]] = None
groq: Optional[Dict[str, Nullable[Any]]] = None
heygen: Optional[Dict[str, Nullable[Any]]] = None
huggingface: Optional[Dict[str, Nullable[Any]]] = None
hyperbolic: Optional[Dict[str, Nullable[Any]]] = None
hyperbolic_quantized: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="hyperbolic-quantized")
] = None
inception: Optional[Dict[str, Nullable[Any]]] = None
inceptron: Optional[Dict[str, Nullable[Any]]] = None
inferact_vllm: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="inferact-vllm")
] = None
inference_net: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="inference-net")
] = None
infermatic: Optional[Dict[str, Nullable[Any]]] = None
inflection: Optional[Dict[str, Nullable[Any]]] = None
inocloud: Optional[Dict[str, Nullable[Any]]] = None
io_net: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="io-net")
] = None
ionstream: Optional[Dict[str, Nullable[Any]]] = None
klusterai: Optional[Dict[str, Nullable[Any]]] = None
lambda_: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="lambda")
] = None
lepton: Optional[Dict[str, Nullable[Any]]] = None
liquid: Optional[Dict[str, Nullable[Any]]] = None
lynn: Optional[Dict[str, Nullable[Any]]] = None
lynn_private: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="lynn-private")
] = None
mancer: Optional[Dict[str, Nullable[Any]]] = None
mancer_old: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="mancer-old")
] = None
mara: Optional[Dict[str, Nullable[Any]]] = None
meta: Optional[Dict[str, Nullable[Any]]] = None
minimax: Optional[Dict[str, Nullable[Any]]] = None
mistral: Optional[Dict[str, Nullable[Any]]] = None
modal: Optional[Dict[str, Nullable[Any]]] = None
modelrun: Optional[Dict[str, Nullable[Any]]] = None
modular: Optional[Dict[str, Nullable[Any]]] = None
moonshotai: Optional[Dict[str, Nullable[Any]]] = None
morph: Optional[Dict[str, Nullable[Any]]] = None
ncompass: Optional[Dict[str, Nullable[Any]]] = None
nebius: Optional[Dict[str, Nullable[Any]]] = None
nex_agi: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="nex-agi")
] = None
nextbit: Optional[Dict[str, Nullable[Any]]] = None
nineteen: Optional[Dict[str, Nullable[Any]]] = None
novita: Optional[Dict[str, Nullable[Any]]] = None
nvidia: Optional[Dict[str, Nullable[Any]]] = None
octoai: Optional[Dict[str, Nullable[Any]]] = None
open_inference: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="open-inference")
] = None
openai: Optional[Dict[str, Nullable[Any]]] = None
parasail: Optional[Dict[str, Nullable[Any]]] = None
perceptron: Optional[Dict[str, Nullable[Any]]] = None
perplexity: Optional[Dict[str, Nullable[Any]]] = None
phala: Optional[Dict[str, Nullable[Any]]] = None
poolside: Optional[Dict[str, Nullable[Any]]] = None
recraft: Optional[Dict[str, Nullable[Any]]] = None
recursal: Optional[Dict[str, Nullable[Any]]] = None
reflection: Optional[Dict[str, Nullable[Any]]] = None
reka: Optional[Dict[str, Nullable[Any]]] = None
relace: Optional[Dict[str, Nullable[Any]]] = None
replicate: Optional[Dict[str, Nullable[Any]]] = None
sakana_ai: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="sakana-ai")
] = None
sambanova: Optional[Dict[str, Nullable[Any]]] = None
sambanova_cloaked: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="sambanova-cloaked")
] = None
seed: Optional[Dict[str, Nullable[Any]]] = None
sf_compute: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="sf-compute")
] = None
siliconflow: Optional[Dict[str, Nullable[Any]]] = None
sourceful: Optional[Dict[str, Nullable[Any]]] = None
stealth: Optional[Dict[str, Nullable[Any]]] = None
stepfun: Optional[Dict[str, Nullable[Any]]] = None
streamlake: Optional[Dict[str, Nullable[Any]]] = None
switchpoint: Optional[Dict[str, Nullable[Any]]] = None
targon: Optional[Dict[str, Nullable[Any]]] = None
tenstorrent: Optional[Dict[str, Nullable[Any]]] = None
together: Optional[Dict[str, Nullable[Any]]] = None
together_lite: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="together-lite")
] = None
ubicloud: Optional[Dict[str, Nullable[Any]]] = None
upstage: Optional[Dict[str, Nullable[Any]]] = None
venice: Optional[Dict[str, Nullable[Any]]] = None
wafer: Optional[Dict[str, Nullable[Any]]] = None
wandb: Optional[Dict[str, Nullable[Any]]] = None
xai: Optional[Dict[str, Nullable[Any]]] = None
xiaomi: Optional[Dict[str, Nullable[Any]]] = None
z_ai: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="z-ai")
] = None
class ImageGenerationRequestProviderTypedDict(TypedDict):
r"""Provider-specific passthrough configuration"""
options: NotRequired[ImageGenerationRequestOptionsTypedDict]
class ImageGenerationRequestProvider(BaseModel):
r"""Provider-specific passthrough configuration"""
options: Optional[ImageGenerationRequestOptions] = None
ImageGenerationRequestQuality = Union[
Literal[
"auto",
"low",
"medium",
"high",
],
UnrecognizedStr,
]
r"""Rendering quality. Providers without a quality knob ignore this."""
ImageGenerationRequestResolution = Union[
Literal[
"512",
"1K",
"2K",
"4K",
],
UnrecognizedStr,
]
r"""Normalized resolution tier of the generated image. Concrete pixel dimensions are derived per-provider."""
class ImageGenerationRequestTypedDict(TypedDict):
r"""Image generation request input"""
model: str
r"""The image generation model to use"""
prompt: str
r"""Text description of the desired image"""
aspect_ratio: NotRequired[ImageGenerationRequestAspectRatio]
r"""Normalized aspect ratio of the generated image. Providers clamp to their supported subset."""
background: NotRequired[ImageGenerationRequestBackground]
r"""Background treatment. `transparent` requires an output_format that supports alpha (png or webp)."""
input_references: NotRequired[List[ContentPartImageTypedDict]]
r"""Reference images to guide image-to-image generation, as base64 data URLs or HTTP(S) URLs."""
n: NotRequired[int]
r"""Number of images to generate (1-10). Providers that only support single-image generation reject n > 1."""
output_compression: NotRequired[int]
r"""Compression level (0-100) for webp/jpeg output. Ignored for png and by providers without a compression knob."""
output_format: NotRequired[ImageGenerationRequestOutputFormat]
r"""Encoding of the returned image bytes."""
provider: NotRequired[ImageGenerationRequestProviderTypedDict]
r"""Provider-specific passthrough configuration"""
quality: NotRequired[ImageGenerationRequestQuality]
r"""Rendering quality. Providers without a quality knob ignore this."""
resolution: NotRequired[ImageGenerationRequestResolution]
r"""Normalized resolution tier of the generated image. Concrete pixel dimensions are derived per-provider."""
seed: NotRequired[int]
r"""If specified, the generation will sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed for all providers."""
size: NotRequired[str]
r"""Optional. A convenience shorthand for output dimensions — pass a tier (\"2K\", \"4K\") or explicit pixels (\"2048x2048\") and we normalize it to the right dimensions for the chosen provider. Interchangeable with resolution + aspect_ratio; use those directly for enumerated, per-model discoverable values. Conflicting size + resolution/aspect_ratio is rejected."""
stream: NotRequired[bool]
r"""If true, partial images are streamed as SSE events as they become available. Only supported by providers with native streaming (currently OpenAI). Non-streaming providers ignore this flag and return a buffered response."""
class ImageGenerationRequest(BaseModel):
r"""Image generation request input"""
model: str
r"""The image generation model to use"""
prompt: str
r"""Text description of the desired image"""
aspect_ratio: Annotated[
Optional[ImageGenerationRequestAspectRatio],
PlainValidator(validate_open_enum(False)),
] = None
r"""Normalized aspect ratio of the generated image. Providers clamp to their supported subset."""
background: Annotated[
Optional[ImageGenerationRequestBackground],
PlainValidator(validate_open_enum(False)),
] = None
r"""Background treatment. `transparent` requires an output_format that supports alpha (png or webp)."""
input_references: Optional[List[ContentPartImage]] = None
r"""Reference images to guide image-to-image generation, as base64 data URLs or HTTP(S) URLs."""
n: Optional[int] = None
r"""Number of images to generate (1-10). Providers that only support single-image generation reject n > 1."""
output_compression: Optional[int] = None
r"""Compression level (0-100) for webp/jpeg output. Ignored for png and by providers without a compression knob."""
output_format: Annotated[
Optional[ImageGenerationRequestOutputFormat],
PlainValidator(validate_open_enum(False)),
] = None
r"""Encoding of the returned image bytes."""
provider: Optional[ImageGenerationRequestProvider] = None
r"""Provider-specific passthrough configuration"""
quality: Annotated[
Optional[ImageGenerationRequestQuality],
PlainValidator(validate_open_enum(False)),
] = None
r"""Rendering quality. Providers without a quality knob ignore this."""
resolution: Annotated[
Optional[ImageGenerationRequestResolution],
PlainValidator(validate_open_enum(False)),
] = None
r"""Normalized resolution tier of the generated image. Concrete pixel dimensions are derived per-provider."""
seed: Optional[int] = None
r"""If specified, the generation will sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed for all providers."""
size: Optional[str] = None
r"""Optional. A convenience shorthand for output dimensions — pass a tier (\"2K\", \"4K\") or explicit pixels (\"2048x2048\") and we normalize it to the right dimensions for the chosen provider. Interchangeable with resolution + aspect_ratio; use those directly for enumerated, per-model discoverable values. Conflicting size + resolution/aspect_ratio is rejected."""
stream: Optional[bool] = None
r"""If true, partial images are streamed as SSE events as they become available. Only supported by providers with native streaming (currently OpenAI). Non-streaming providers ignore this flag and return a buffered response."""
@@ -0,0 +1,41 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .imagegenerationusage import ImageGenerationUsage, ImageGenerationUsageTypedDict
from openrouter.types import BaseModel
from typing import List, Optional
from typing_extensions import NotRequired, TypedDict
class ImageGenerationResponseDataTypedDict(TypedDict):
b64_json: str
r"""Base64-encoded image bytes"""
class ImageGenerationResponseData(BaseModel):
b64_json: str
r"""Base64-encoded image bytes"""
class ImageGenerationResponseTypedDict(TypedDict):
r"""Image generation response"""
created: int
r"""Unix timestamp (seconds) when the image was generated"""
data: List[ImageGenerationResponseDataTypedDict]
r"""Generated images"""
usage: NotRequired[ImageGenerationUsageTypedDict]
r"""Token and cost usage for the image generation request, when available"""
class ImageGenerationResponse(BaseModel):
r"""Image generation response"""
created: int
r"""Unix timestamp (seconds) when the image was generated"""
data: List[ImageGenerationResponseData]
r"""Generated images"""
usage: Optional[ImageGenerationUsage] = None
r"""Token and cost usage for the image generation request, when available"""
@@ -16,7 +16,7 @@ from typing import Literal, Optional, Union
from typing_extensions import Annotated, NotRequired, TypedDict
Background = Union[
ImageGenerationServerToolBackground = Union[
Literal[
"transparent",
"opaque",
@@ -64,7 +64,7 @@ Moderation = Union[
]
OutputFormat = Union[
ImageGenerationServerToolOutputFormat = Union[
Literal[
"png",
"webp",
@@ -74,7 +74,7 @@ OutputFormat = Union[
]
Quality = Union[
ImageGenerationServerToolQuality = Union[
Literal[
"low",
"medium",
@@ -103,15 +103,15 @@ class ImageGenerationServerToolTypedDict(TypedDict):
r"""Image generation tool configuration"""
type: ImageGenerationServerToolType
background: NotRequired[Background]
background: NotRequired[ImageGenerationServerToolBackground]
input_fidelity: NotRequired[Nullable[InputFidelity]]
input_image_mask: NotRequired[InputImageMaskTypedDict]
model: NotRequired[ModelEnum]
moderation: NotRequired[Moderation]
output_compression: NotRequired[int]
output_format: NotRequired[OutputFormat]
output_format: NotRequired[ImageGenerationServerToolOutputFormat]
partial_images: NotRequired[int]
quality: NotRequired[Quality]
quality: NotRequired[ImageGenerationServerToolQuality]
size: NotRequired[Size]
@@ -121,7 +121,8 @@ class ImageGenerationServerTool(BaseModel):
type: ImageGenerationServerToolType
background: Annotated[
Optional[Background], PlainValidator(validate_open_enum(False))
Optional[ImageGenerationServerToolBackground],
PlainValidator(validate_open_enum(False)),
] = None
input_fidelity: Annotated[
@@ -141,14 +142,16 @@ class ImageGenerationServerTool(BaseModel):
output_compression: Optional[int] = None
output_format: Annotated[
Optional[OutputFormat], PlainValidator(validate_open_enum(False))
Optional[ImageGenerationServerToolOutputFormat],
PlainValidator(validate_open_enum(False)),
] = None
partial_images: Optional[int] = None
quality: Annotated[Optional[Quality], PlainValidator(validate_open_enum(False))] = (
None
)
quality: Annotated[
Optional[ImageGenerationServerToolQuality],
PlainValidator(validate_open_enum(False)),
] = None
size: Annotated[Optional[Size], PlainValidator(validate_open_enum(False))] = None
@@ -0,0 +1,331 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .anthropicspeed import AnthropicSpeed
from .anthropicusageiteration import (
AnthropicUsageIteration,
AnthropicUsageIterationTypedDict,
)
from .costdetails import CostDetails, CostDetailsTypedDict
from openrouter.types import (
BaseModel,
Nullable,
OptionalNullable,
UNSET,
UNSET_SENTINEL,
)
from openrouter.utils import validate_open_enum
from pydantic import model_serializer
from pydantic.functional_validators import PlainValidator
from typing import List, Optional
from typing_extensions import Annotated, NotRequired, TypedDict
class ImageGenerationUsageCompletionTokensDetailsTypedDict(TypedDict):
audio_tokens: NotRequired[Nullable[int]]
r"""Tokens generated by the model for audio output."""
image_tokens: NotRequired[Nullable[int]]
r"""Tokens generated by the model for image output."""
reasoning_tokens: NotRequired[Nullable[int]]
r"""Tokens generated by the model for reasoning."""
class ImageGenerationUsageCompletionTokensDetails(BaseModel):
audio_tokens: OptionalNullable[int] = UNSET
r"""Tokens generated by the model for audio output."""
image_tokens: OptionalNullable[int] = UNSET
r"""Tokens generated by the model for image output."""
reasoning_tokens: OptionalNullable[int] = UNSET
r"""Tokens generated by the model for reasoning."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = ["audio_tokens", "image_tokens", "reasoning_tokens"]
nullable_fields = ["audio_tokens", "image_tokens", "reasoning_tokens"]
null_default_fields = []
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k)
serialized.pop(k, None)
optional_nullable = k in optional_fields and k in nullable_fields
is_set = (
self.__pydantic_fields_set__.intersection({n})
or k in null_default_fields
) # pylint: disable=no-member
if val is not None and val != UNSET_SENTINEL:
m[k] = val
elif val != UNSET_SENTINEL and (
not k in optional_fields or (optional_nullable and is_set)
):
m[k] = val
return m
class ImageGenerationUsagePromptTokensDetailsTypedDict(TypedDict):
r"""Breakdown of tokens used in the prompt."""
audio_tokens: NotRequired[Nullable[int]]
r"""Tokens used for input audio."""
cache_write_tokens: NotRequired[Nullable[int]]
r"""Tokens written to cache. Only returned for models with explicit caching and cache write pricing."""
cached_tokens: NotRequired[Nullable[int]]
r"""Tokens cached by the endpoint."""
file_tokens: NotRequired[Nullable[int]]
r"""Tokens used for input files/documents."""
video_tokens: NotRequired[Nullable[int]]
r"""Tokens used for input video."""
class ImageGenerationUsagePromptTokensDetails(BaseModel):
r"""Breakdown of tokens used in the prompt."""
audio_tokens: OptionalNullable[int] = UNSET
r"""Tokens used for input audio."""
cache_write_tokens: OptionalNullable[int] = UNSET
r"""Tokens written to cache. Only returned for models with explicit caching and cache write pricing."""
cached_tokens: OptionalNullable[int] = UNSET
r"""Tokens cached by the endpoint."""
file_tokens: OptionalNullable[int] = UNSET
r"""Tokens used for input files/documents."""
video_tokens: OptionalNullable[int] = UNSET
r"""Tokens used for input video."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = [
"audio_tokens",
"cache_write_tokens",
"cached_tokens",
"file_tokens",
"video_tokens",
]
nullable_fields = [
"audio_tokens",
"cache_write_tokens",
"cached_tokens",
"file_tokens",
"video_tokens",
]
null_default_fields = []
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k)
serialized.pop(k, None)
optional_nullable = k in optional_fields and k in nullable_fields
is_set = (
self.__pydantic_fields_set__.intersection({n})
or k in null_default_fields
) # pylint: disable=no-member
if val is not None and val != UNSET_SENTINEL:
m[k] = val
elif val != UNSET_SENTINEL and (
not k in optional_fields or (optional_nullable and is_set)
):
m[k] = val
return m
class ServerToolUseTypedDict(TypedDict):
r"""Usage for server-side tool execution (e.g., web search)"""
tool_calls_executed: NotRequired[Nullable[int]]
r"""Number of OpenRouter server tool calls that executed and produced a result."""
tool_calls_requested: NotRequired[Nullable[int]]
r"""Total number of OpenRouter server-orchestrated tool calls the model requested, across all tool types. Provider-native tools (e.g. native web search) are not counted here."""
web_search_requests: NotRequired[Nullable[int]]
r"""Number of web searches performed by server-side tools. For server-orchestrated tool calls a web search is also counted in tool_calls_requested; provider-native web search may report web_search_requests only. Do not sum the two."""
class ServerToolUse(BaseModel):
r"""Usage for server-side tool execution (e.g., web search)"""
tool_calls_executed: OptionalNullable[int] = UNSET
r"""Number of OpenRouter server tool calls that executed and produced a result."""
tool_calls_requested: OptionalNullable[int] = UNSET
r"""Total number of OpenRouter server-orchestrated tool calls the model requested, across all tool types. Provider-native tools (e.g. native web search) are not counted here."""
web_search_requests: OptionalNullable[int] = UNSET
r"""Number of web searches performed by server-side tools. For server-orchestrated tool calls a web search is also counted in tool_calls_requested; provider-native web search may report web_search_requests only. Do not sum the two."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = [
"tool_calls_executed",
"tool_calls_requested",
"web_search_requests",
]
nullable_fields = [
"tool_calls_executed",
"tool_calls_requested",
"web_search_requests",
]
null_default_fields = []
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k)
serialized.pop(k, None)
optional_nullable = k in optional_fields and k in nullable_fields
is_set = (
self.__pydantic_fields_set__.intersection({n})
or k in null_default_fields
) # pylint: disable=no-member
if val is not None and val != UNSET_SENTINEL:
m[k] = val
elif val != UNSET_SENTINEL and (
not k in optional_fields or (optional_nullable and is_set)
):
m[k] = val
return m
class ImageGenerationUsageTypedDict(TypedDict):
r"""Token and cost usage for the image generation request, when available"""
completion_tokens: int
r"""The tokens generated"""
prompt_tokens: int
r"""Including images, input audio, and tools if any"""
total_tokens: int
r"""Sum of the above two fields"""
completion_tokens_details: NotRequired[
Nullable[ImageGenerationUsageCompletionTokensDetailsTypedDict]
]
cost: NotRequired[Nullable[float]]
r"""Cost of the completion"""
cost_details: NotRequired[Nullable[CostDetailsTypedDict]]
r"""Breakdown of upstream inference costs"""
is_byok: NotRequired[bool]
r"""Whether a request was made using a Bring Your Own Key configuration"""
iterations: NotRequired[Nullable[List[AnthropicUsageIterationTypedDict]]]
prompt_tokens_details: NotRequired[
Nullable[ImageGenerationUsagePromptTokensDetailsTypedDict]
]
r"""Breakdown of tokens used in the prompt."""
server_tool_use: NotRequired[Nullable[ServerToolUseTypedDict]]
r"""Usage for server-side tool execution (e.g., web search)"""
service_tier: NotRequired[Nullable[str]]
r"""The service tier used by the upstream provider for this request"""
speed: NotRequired[Nullable[AnthropicSpeed]]
class ImageGenerationUsage(BaseModel):
r"""Token and cost usage for the image generation request, when available"""
completion_tokens: int
r"""The tokens generated"""
prompt_tokens: int
r"""Including images, input audio, and tools if any"""
total_tokens: int
r"""Sum of the above two fields"""
completion_tokens_details: OptionalNullable[
ImageGenerationUsageCompletionTokensDetails
] = UNSET
cost: OptionalNullable[float] = UNSET
r"""Cost of the completion"""
cost_details: OptionalNullable[CostDetails] = UNSET
r"""Breakdown of upstream inference costs"""
is_byok: Optional[bool] = None
r"""Whether a request was made using a Bring Your Own Key configuration"""
iterations: OptionalNullable[List[AnthropicUsageIteration]] = UNSET
prompt_tokens_details: OptionalNullable[ImageGenerationUsagePromptTokensDetails] = (
UNSET
)
r"""Breakdown of tokens used in the prompt."""
server_tool_use: OptionalNullable[ServerToolUse] = UNSET
r"""Usage for server-side tool execution (e.g., web search)"""
service_tier: OptionalNullable[str] = UNSET
r"""The service tier used by the upstream provider for this request"""
speed: Annotated[
OptionalNullable[AnthropicSpeed], PlainValidator(validate_open_enum(False))
] = UNSET
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = [
"completion_tokens_details",
"cost",
"cost_details",
"is_byok",
"iterations",
"prompt_tokens_details",
"server_tool_use",
"service_tier",
"speed",
]
nullable_fields = [
"completion_tokens_details",
"cost",
"cost_details",
"iterations",
"prompt_tokens_details",
"server_tool_use",
"service_tier",
"speed",
]
null_default_fields = []
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k)
serialized.pop(k, None)
optional_nullable = k in optional_fields and k in nullable_fields
is_set = (
self.__pydantic_fields_set__.intersection({n})
or k in null_default_fields
) # pylint: disable=no-member
if val is not None and val != UNSET_SENTINEL:
m[k] = val
elif val != UNSET_SENTINEL and (
not k in optional_fields or (optional_nullable and is_set)
):
m[k] = val
return m
@@ -0,0 +1,34 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.types import BaseModel
from typing import Literal
from typing_extensions import TypedDict
ImageGenPartialImageEventType = Literal["image_generation.partial_image",]
r"""The event type"""
class ImageGenPartialImageEventTypedDict(TypedDict):
r"""Emitted when a partial image becomes available during streaming generation"""
b64_json: str
r"""Base64-encoded partial image data"""
partial_image_index: int
r"""0-based index indicating which partial image this is in the sequence"""
type: ImageGenPartialImageEventType
r"""The event type"""
class ImageGenPartialImageEvent(BaseModel):
r"""Emitted when a partial image becomes available during streaming generation"""
b64_json: str
r"""Base64-encoded partial image data"""
partial_image_index: int
r"""0-based index indicating which partial image this is in the sequence"""
type: ImageGenPartialImageEventType
r"""The event type"""
@@ -0,0 +1,95 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.types import (
BaseModel,
Nullable,
OptionalNullable,
UNSET,
UNSET_SENTINEL,
)
from pydantic import model_serializer
from typing import Literal
from typing_extensions import NotRequired, TypedDict
class ImageGenStreamErrorEventErrorTypedDict(TypedDict):
r"""Provider error details"""
message: str
r"""Provider error message"""
code: NotRequired[Nullable[str]]
r"""Provider error code, when supplied"""
param: NotRequired[Nullable[str]]
r"""Request parameter associated with the error, when supplied"""
type: NotRequired[Nullable[str]]
r"""Provider error type, when supplied"""
class ImageGenStreamErrorEventError(BaseModel):
r"""Provider error details"""
message: str
r"""Provider error message"""
code: OptionalNullable[str] = UNSET
r"""Provider error code, when supplied"""
param: OptionalNullable[str] = UNSET
r"""Request parameter associated with the error, when supplied"""
type: OptionalNullable[str] = UNSET
r"""Provider error type, when supplied"""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = ["code", "param", "type"]
nullable_fields = ["code", "param", "type"]
null_default_fields = []
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k)
serialized.pop(k, None)
optional_nullable = k in optional_fields and k in nullable_fields
is_set = (
self.__pydantic_fields_set__.intersection({n})
or k in null_default_fields
) # pylint: disable=no-member
if val is not None and val != UNSET_SENTINEL:
m[k] = val
elif val != UNSET_SENTINEL and (
not k in optional_fields or (optional_nullable and is_set)
):
m[k] = val
return m
ImageGenStreamErrorEventType = Literal["error",]
r"""The event type"""
class ImageGenStreamErrorEventTypedDict(TypedDict):
r"""Emitted when streaming generation fails after the SSE response starts"""
error: ImageGenStreamErrorEventErrorTypedDict
r"""Provider error details"""
type: ImageGenStreamErrorEventType
r"""The event type"""
class ImageGenStreamErrorEvent(BaseModel):
r"""Emitted when streaming generation fails after the SSE response starts"""
error: ImageGenStreamErrorEventError
r"""Provider error details"""
type: ImageGenStreamErrorEventType
r"""The event type"""
@@ -0,0 +1,29 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .imageoutputmodality import ImageOutputModality
from .inputmodality import InputModality
from openrouter.types import BaseModel
from openrouter.utils import validate_open_enum
from pydantic.functional_validators import PlainValidator
from typing import List
from typing_extensions import Annotated, TypedDict
class ImageModelArchitectureTypedDict(TypedDict):
input_modalities: List[InputModality]
r"""Supported input modalities"""
output_modalities: List[ImageOutputModality]
r"""Supported output modalities"""
class ImageModelArchitecture(BaseModel):
input_modalities: List[
Annotated[InputModality, PlainValidator(validate_open_enum(False))]
]
r"""Supported input modalities"""
output_modalities: List[
Annotated[ImageOutputModality, PlainValidator(validate_open_enum(False))]
]
r"""Supported output modalities"""
@@ -0,0 +1,24 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .imageendpoint import ImageEndpoint, ImageEndpointTypedDict
from openrouter.types import BaseModel
from typing import List
from typing_extensions import TypedDict
class ImageModelEndpointsResponseTypedDict(TypedDict):
r"""The full per-endpoint records for an image model."""
endpoints: List[ImageEndpointTypedDict]
id: str
r"""Model slug"""
class ImageModelEndpointsResponse(BaseModel):
r"""The full per-endpoint records for an image model."""
endpoints: List[ImageEndpoint]
id: str
r"""Model slug"""
@@ -0,0 +1,56 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .capabilitydescriptor import CapabilityDescriptor, CapabilityDescriptorTypedDict
from .imagemodelarchitecture import (
ImageModelArchitecture,
ImageModelArchitectureTypedDict,
)
from openrouter.types import BaseModel
from typing import Dict
from typing_extensions import TypedDict
class ImageModelListItemTypedDict(TypedDict):
r"""A single image model in the discovery listing."""
architecture: ImageModelArchitectureTypedDict
created: int
r"""Unix timestamp (seconds) of when the model was created"""
description: str
endpoints: str
r"""Relative URL to the full per-endpoint records for this model"""
id: str
r"""Model slug"""
name: str
r"""Display name"""
supported_parameters: Dict[str, CapabilityDescriptorTypedDict]
r"""Union of supported parameters across every endpoint of this model. Coarse discovery aid; the definitive per-endpoint set is behind the endpoints URL."""
supports_streaming: bool
r"""Whether any endpoint of this model supports native SSE streaming on the dedicated Image API (i.e. `stream: true` in the request). OR across endpoints."""
class ImageModelListItem(BaseModel):
r"""A single image model in the discovery listing."""
architecture: ImageModelArchitecture
created: int
r"""Unix timestamp (seconds) of when the model was created"""
description: str
endpoints: str
r"""Relative URL to the full per-endpoint records for this model"""
id: str
r"""Model slug"""
name: str
r"""Display name"""
supported_parameters: Dict[str, CapabilityDescriptor]
r"""Union of supported parameters across every endpoint of this model. Coarse discovery aid; the definitive per-endpoint set is behind the endpoints URL."""
supports_streaming: bool
r"""Whether any endpoint of this model supports native SSE streaming on the dedicated Image API (i.e. `stream: true` in the request). OR across endpoints."""
@@ -0,0 +1,19 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .imagemodellistitem import ImageModelListItem, ImageModelListItemTypedDict
from openrouter.types import BaseModel
from typing import List
from typing_extensions import TypedDict
class ImageModelsListResponseTypedDict(TypedDict):
r"""List of image generation models."""
data: List[ImageModelListItemTypedDict]
class ImageModelsListResponse(BaseModel):
r"""List of image generation models."""
data: List[ImageModelListItem]
@@ -0,0 +1,20 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.types import UnrecognizedStr
from typing import Literal, Union
ImageOutputModality = Union[
Literal[
"text",
"image",
"embeddings",
"audio",
"video",
"rerank",
"speech",
"transcription",
],
UnrecognizedStr,
]
@@ -0,0 +1,51 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.types import BaseModel, UnrecognizedStr
from openrouter.utils import validate_open_enum
from pydantic.functional_validators import PlainValidator
from typing import Literal, Optional, Union
from typing_extensions import Annotated, NotRequired, TypedDict
Billable = Union[
Literal[
"output_image",
"input_image",
"input_font",
"input_reference",
"input_text",
],
UnrecognizedStr,
]
Unit = Union[
Literal[
"image",
"megapixel",
"token",
],
UnrecognizedStr,
]
class ImagePricingEntryTypedDict(TypedDict):
r"""One billable pricing line for an image provider."""
billable: Billable
cost_usd: float
unit: Unit
variant: NotRequired[str]
class ImagePricingEntry(BaseModel):
r"""One billable pricing line for an image provider."""
billable: Annotated[Billable, PlainValidator(validate_open_enum(False))]
cost_usd: float
unit: Annotated[Unit, PlainValidator(validate_open_enum(False))]
variant: Optional[str] = None
@@ -0,0 +1,48 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .imagegencompletedevent import (
ImageGenCompletedEvent,
ImageGenCompletedEventTypedDict,
)
from .imagegenpartialimageevent import (
ImageGenPartialImageEvent,
ImageGenPartialImageEventTypedDict,
)
from .imagegenstreamerrorevent import (
ImageGenStreamErrorEvent,
ImageGenStreamErrorEventTypedDict,
)
from openrouter.types import BaseModel
from openrouter.utils import get_discriminator
from pydantic import Discriminator, Tag
from typing import Union
from typing_extensions import Annotated, TypeAliasType, TypedDict
ImageStreamingResponseDataTypedDict = TypeAliasType(
"ImageStreamingResponseDataTypedDict",
Union[
ImageGenStreamErrorEventTypedDict,
ImageGenPartialImageEventTypedDict,
ImageGenCompletedEventTypedDict,
],
)
ImageStreamingResponseData = Annotated[
Union[
Annotated[ImageGenPartialImageEvent, Tag("image_generation.partial_image")],
Annotated[ImageGenCompletedEvent, Tag("image_generation.completed")],
Annotated[ImageGenStreamErrorEvent, Tag("error")],
],
Discriminator(lambda m: get_discriminator(m, "type", "type")),
]
class ImageStreamingResponseTypedDict(TypedDict):
data: ImageStreamingResponseDataTypedDict
class ImageStreamingResponse(BaseModel):
data: ImageStreamingResponseData
+4 -4
View File
@@ -298,11 +298,11 @@ class ContextManagement(BaseModel):
edits: Optional[List[Edit]] = None
class MetadataTypedDict(TypedDict):
class MessagesRequestMetadataTypedDict(TypedDict):
user_id: NotRequired[Nullable[str]]
class Metadata(BaseModel):
class MessagesRequestMetadata(BaseModel):
user_id: OptionalNullable[str] = UNSET
@model_serializer(mode="wrap")
@@ -1050,7 +1050,7 @@ class MessagesRequestTypedDict(TypedDict):
fallbacks: NotRequired[Nullable[List[MessagesFallbackParamTypedDict]]]
r"""Fallback models to try if the primary model fails or refuses, in order. Handled by OpenRouter multi-model routing rather than Anthropic server-side fallbacks; cannot be combined with `models`. Each entry accepts only `model`. Maximum of 3 entries."""
max_tokens: NotRequired[int]
metadata: NotRequired[MetadataTypedDict]
metadata: NotRequired[MessagesRequestMetadataTypedDict]
models: NotRequired[List[str]]
output_config: NotRequired[MessagesOutputConfigTypedDict]
r"""Configuration for controlling output behavior. Supports the effort parameter and structured output format."""
@@ -1096,7 +1096,7 @@ class MessagesRequest(BaseModel):
max_tokens: Optional[int] = None
metadata: Optional[Metadata] = None
metadata: Optional[MessagesRequestMetadata] = None
models: Optional[List[str]] = None
+7
View File
@@ -5,6 +5,7 @@ from .defaultparameters import DefaultParameters, DefaultParametersTypedDict
from .modelarchitecture import ModelArchitecture, ModelArchitectureTypedDict
from .modelbenchmarks import ModelBenchmarks, ModelBenchmarksTypedDict
from .modellinks import ModelLinks, ModelLinksTypedDict
from .modelreasoning import ModelReasoning, ModelReasoningTypedDict
from .parameter import Parameter
from .perrequestlimits import PerRequestLimits, PerRequestLimitsTypedDict
from .publicpricing import PublicPricing, PublicPricingTypedDict
@@ -62,6 +63,8 @@ class ModelTypedDict(TypedDict):
r"""Hugging Face model identifier, if applicable"""
knowledge_cutoff: NotRequired[Nullable[str]]
r"""The date up to which the model was trained on data. ISO 8601 date string (YYYY-MM-DD) or null if unknown."""
reasoning: NotRequired[ModelReasoningTypedDict]
r"""Reasoning effort configuration. Omitted for non-reasoning models and dynamic router models."""
class Model(BaseModel):
@@ -123,6 +126,9 @@ class Model(BaseModel):
knowledge_cutoff: OptionalNullable[str] = UNSET
r"""The date up to which the model was trained on data. ISO 8601 date string (YYYY-MM-DD) or null if unknown."""
reasoning: Optional[ModelReasoning] = None
r"""Reasoning effort configuration. Omitted for non-reasoning models and dynamic router models."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = [
@@ -131,6 +137,7 @@ class Model(BaseModel):
"expiration_date",
"hugging_face_id",
"knowledge_cutoff",
"reasoning",
]
nullable_fields = [
"context_length",
+107
View File
@@ -0,0 +1,107 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .reasoningeffort import ReasoningEffort
from openrouter.types import (
BaseModel,
Nullable,
OptionalNullable,
UNSET,
UNSET_SENTINEL,
UnrecognizedStr,
)
from openrouter.utils import validate_open_enum
from pydantic import model_serializer
from pydantic.functional_validators import PlainValidator
from typing import List, Literal, Optional, Union
from typing_extensions import Annotated, NotRequired, TypedDict
DefaultEffort = Union[
Literal[
"max",
"xhigh",
"high",
"medium",
"low",
"minimal",
"none",
],
UnrecognizedStr,
]
r"""Default reasoning effort when the client enables reasoning without specifying effort. Maps to `reasoning.effort` in chat requests. When `\"none\"`, prefer omitting effort unless the user explicitly disables reasoning."""
class ModelReasoningTypedDict(TypedDict):
r"""Reasoning effort configuration. Omitted for non-reasoning models and dynamic router models."""
mandatory: bool
r"""When true, reasoning cannot be disabled and effort \"none\" is rejected."""
default_effort: NotRequired[Nullable[DefaultEffort]]
default_enabled: NotRequired[bool]
r"""Default reasoning enabled state when the client does not set `reasoning.enabled`."""
supported_efforts: NotRequired[Nullable[List[Nullable[ReasoningEffort]]]]
r"""Allowed reasoning effort values for this model, in descending effort order (highest first). Null means no allowlist — all gateway effort values are accepted."""
supports_max_tokens: NotRequired[bool]
r"""Present and `true` when the model accepts `reasoning.max_tokens` in requests (Anthropic-style) instead of or in addition to `reasoning.effort`. Omitted otherwise."""
class ModelReasoning(BaseModel):
r"""Reasoning effort configuration. Omitted for non-reasoning models and dynamic router models."""
mandatory: bool
r"""When true, reasoning cannot be disabled and effort \"none\" is rejected."""
default_effort: Annotated[
OptionalNullable[DefaultEffort], PlainValidator(validate_open_enum(False))
] = UNSET
default_enabled: Optional[bool] = None
r"""Default reasoning enabled state when the client does not set `reasoning.enabled`."""
supported_efforts: OptionalNullable[
List[
Annotated[
Nullable[ReasoningEffort], PlainValidator(validate_open_enum(False))
]
]
] = UNSET
r"""Allowed reasoning effort values for this model, in descending effort order (highest first). Null means no allowlist — all gateway effort values are accepted."""
supports_max_tokens: Optional[bool] = None
r"""Present and `true` when the model accepts `reasoning.max_tokens` in requests (Anthropic-style) instead of or in addition to `reasoning.effort`. Omitted otherwise."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = [
"default_effort",
"default_enabled",
"supported_efforts",
"supports_max_tokens",
]
nullable_fields = ["default_effort", "supported_efforts"]
null_default_fields = []
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k)
serialized.pop(k, None)
optional_nullable = k in optional_fields and k in nullable_fields
is_set = (
self.__pydantic_fields_set__.intersection({n})
or k in null_default_fields
) # pylint: disable=no-member
if val is not None and val != UNSET_SENTINEL:
m[k] = val
elif val != UNSET_SENTINEL and (
not k in optional_fields or (optional_nullable and is_set)
):
m[k] = val
return m
@@ -15,6 +15,7 @@ from typing_extensions import Annotated, NotRequired, TypedDict
class ObservabilityArizeDestinationConfigTypedDict(TypedDict):
api_key: str
model_id: str
r"""The name of the tracing project in Arize AX"""
space_key: str
base_url: NotRequired[str]
headers: NotRequired[Dict[str, str]]
@@ -25,6 +26,7 @@ class ObservabilityArizeDestinationConfig(BaseModel):
api_key: Annotated[str, pydantic.Field(alias="apiKey")]
model_id: Annotated[str, pydantic.Field(alias="modelId")]
r"""The name of the tracing project in Arize AX"""
space_key: Annotated[str, pydantic.Field(alias="spaceKey")]
@@ -1,6 +1,7 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .apierrortype import APIErrorType
from .applypatchservertool import ApplyPatchServerTool, ApplyPatchServerToolTypedDict
from .baseinputs_union import BaseInputsUnion, BaseInputsUnionTypedDict
from .basereasoningconfig import BaseReasoningConfig, BaseReasoningConfigTypedDict
@@ -203,6 +204,8 @@ class OpenResponsesResultTypedDict(TypedDict):
usage: NotRequired[Nullable[UsageTypedDict]]
r"""Token usage information for the response"""
user: NotRequired[Nullable[str]]
error_type: NotRequired[APIErrorType]
r"""Canonical OpenRouter error type, stable across all API formats"""
openrouter_metadata: NotRequired[OpenRouterMetadataTypedDict]
@@ -285,6 +288,11 @@ class OpenResponsesResult(BaseModel):
user: OptionalNullable[str] = UNSET
error_type: Annotated[
Optional[APIErrorType], PlainValidator(validate_open_enum(False))
] = None
r"""Canonical OpenRouter error type, stable across all API formats"""
openrouter_metadata: Optional[OpenRouterMetadata] = None
@model_serializer(mode="wrap")
@@ -306,6 +314,7 @@ class OpenResponsesResult(BaseModel):
"truncation",
"usage",
"user",
"error_type",
"openrouter_metadata",
]
nullable_fields = [
@@ -44,12 +44,14 @@ ProviderName = Union[
"Google",
"Google AI Studio",
"Groq",
"HeyGen",
"Inception",
"Inceptron",
"InferenceNet",
"Ionstream",
"Infermatic",
"Io Net",
"Inferact vLLM",
"Inflection",
"Liquid",
"Mara",
@@ -76,6 +78,7 @@ ProviderName = Union[
"Recraft",
"Reka",
"Relace",
"Sakana AI",
"SambaNova",
"Seed",
"SiliconFlow",
@@ -84,6 +87,7 @@ ProviderName = Union[
"Stealth",
"StreamLake",
"Switchpoint",
"Tenstorrent",
"Together",
"Upstage",
"Venice",
@@ -55,11 +55,13 @@ class ProviderOptionsTypedDict(TypedDict):
google_vertex: NotRequired[Dict[str, Nullable[Any]]]
gopomelo: NotRequired[Dict[str, Nullable[Any]]]
groq: NotRequired[Dict[str, Nullable[Any]]]
heygen: NotRequired[Dict[str, Nullable[Any]]]
huggingface: NotRequired[Dict[str, Nullable[Any]]]
hyperbolic: NotRequired[Dict[str, Nullable[Any]]]
hyperbolic_quantized: NotRequired[Dict[str, Nullable[Any]]]
inception: NotRequired[Dict[str, Nullable[Any]]]
inceptron: NotRequired[Dict[str, Nullable[Any]]]
inferact_vllm: NotRequired[Dict[str, Nullable[Any]]]
inference_net: NotRequired[Dict[str, Nullable[Any]]]
infermatic: NotRequired[Dict[str, Nullable[Any]]]
inflection: NotRequired[Dict[str, Nullable[Any]]]
@@ -104,6 +106,7 @@ class ProviderOptionsTypedDict(TypedDict):
reka: NotRequired[Dict[str, Nullable[Any]]]
relace: NotRequired[Dict[str, Nullable[Any]]]
replicate: NotRequired[Dict[str, Nullable[Any]]]
sakana_ai: NotRequired[Dict[str, Nullable[Any]]]
sambanova: NotRequired[Dict[str, Nullable[Any]]]
sambanova_cloaked: NotRequired[Dict[str, Nullable[Any]]]
seed: NotRequired[Dict[str, Nullable[Any]]]
@@ -115,6 +118,7 @@ class ProviderOptionsTypedDict(TypedDict):
streamlake: NotRequired[Dict[str, Nullable[Any]]]
switchpoint: NotRequired[Dict[str, Nullable[Any]]]
targon: NotRequired[Dict[str, Nullable[Any]]]
tenstorrent: NotRequired[Dict[str, Nullable[Any]]]
together: NotRequired[Dict[str, Nullable[Any]]]
together_lite: NotRequired[Dict[str, Nullable[Any]]]
ubicloud: NotRequired[Dict[str, Nullable[Any]]]
@@ -240,6 +244,8 @@ class ProviderOptions(BaseModel):
groq: Optional[Dict[str, Nullable[Any]]] = None
heygen: Optional[Dict[str, Nullable[Any]]] = None
huggingface: Optional[Dict[str, Nullable[Any]]] = None
hyperbolic: Optional[Dict[str, Nullable[Any]]] = None
@@ -252,6 +258,10 @@ class ProviderOptions(BaseModel):
inceptron: Optional[Dict[str, Nullable[Any]]] = None
inferact_vllm: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="inferact-vllm")
] = None
inference_net: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="inference-net")
] = None
@@ -354,6 +364,10 @@ class ProviderOptions(BaseModel):
replicate: Optional[Dict[str, Nullable[Any]]] = None
sakana_ai: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="sakana-ai")
] = None
sambanova: Optional[Dict[str, Nullable[Any]]] = None
sambanova_cloaked: Annotated[
@@ -380,6 +394,8 @@ class ProviderOptions(BaseModel):
targon: Optional[Dict[str, Nullable[Any]]] = None
tenstorrent: Optional[Dict[str, Nullable[Any]]] = None
together: Optional[Dict[str, Nullable[Any]]] = None
together_lite: Annotated[
@@ -77,12 +77,14 @@ ProviderResponseProviderName = Union[
"Google",
"Google AI Studio",
"Groq",
"HeyGen",
"Inception",
"Inceptron",
"InferenceNet",
"Ionstream",
"Infermatic",
"Io Net",
"Inferact vLLM",
"Inflection",
"Liquid",
"Mara",
@@ -109,6 +111,7 @@ ProviderResponseProviderName = Union[
"Recraft",
"Reka",
"Relace",
"Sakana AI",
"SambaNova",
"Seed",
"SiliconFlow",
@@ -117,6 +120,7 @@ ProviderResponseProviderName = Union[
"Stealth",
"StreamLake",
"Switchpoint",
"Tenstorrent",
"Together",
"Upstage",
"Venice",
@@ -0,0 +1,27 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.types import BaseModel
from typing import Literal
from typing_extensions import TypedDict
RangeCapabilityType = Literal["range",]
class RangeCapabilityTypedDict(TypedDict):
r"""A parameter that accepts any value within an inclusive numeric range."""
max: float
min: float
type: RangeCapabilityType
class RangeCapability(BaseModel):
r"""A parameter that accepts any value within an inclusive numeric range."""
max: float
min: float
type: RangeCapabilityType
@@ -7,6 +7,7 @@ from typing import Literal, Union
ReasoningEffort = Union[
Literal[
"max",
"xhigh",
"high",
"medium",
@@ -16,6 +16,7 @@ from .applypatchservertool_openrouter import (
)
from .autorouterplugin import AutoRouterPlugin, AutoRouterPluginTypedDict
from .bashservertool import BashServerTool, BashServerToolTypedDict
from .chatdebugoptions import ChatDebugOptions, ChatDebugOptionsTypedDict
from .chatsearchmodelsservertool import (
ChatSearchModelsServerTool,
ChatSearchModelsServerToolTypedDict,
@@ -291,6 +292,8 @@ class ResponsesRequestTypedDict(TypedDict):
background: NotRequired[Nullable[bool]]
cache_control: NotRequired[AnthropicCacheControlDirectiveTypedDict]
r"""Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. Currently supported for Anthropic Claude models."""
debug: NotRequired[ChatDebugOptionsTypedDict]
r"""Debug options for inspecting request transformations (streaming only)"""
frequency_penalty: NotRequired[Nullable[float]]
image_config: NotRequired[Dict[str, ImageConfigTypedDict]]
r"""Provider-specific image configuration options. Keys and values vary by model/provider. See https://openrouter.ai/docs/guides/overview/multimodal/image-generation for more details."""
@@ -348,6 +351,9 @@ class ResponsesRequest(BaseModel):
cache_control: Optional[AnthropicCacheControlDirective] = None
r"""Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. Currently supported for Anthropic Claude models."""
debug: Optional[ChatDebugOptions] = None
r"""Debug options for inspecting request transformations (streaming only)"""
frequency_penalty: OptionalNullable[float] = UNSET
image_config: Optional[Dict[str, ImageConfig]] = None
@@ -448,6 +454,7 @@ class ResponsesRequest(BaseModel):
optional_fields = [
"background",
"cache_control",
"debug",
"frequency_penalty",
"image_config",
"include",
+17 -14
View File
@@ -20,6 +20,7 @@ from .customtoolcallinputdoneevent import (
CustomToolCallInputDoneEvent,
CustomToolCallInputDoneEventTypedDict,
)
from .debugevent import DebugEvent, DebugEventTypedDict
from .errorevent import ErrorEvent, ErrorEventTypedDict
from .functioncallargsdeltaevent import (
FunctionCallArgsDeltaEvent,
@@ -152,34 +153,35 @@ from typing_extensions import Annotated, TypeAliasType
StreamEventsTypedDict = TypeAliasType(
"StreamEventsTypedDict",
Union[
OpenResponsesCreatedEventTypedDict,
DebugEventTypedDict,
OpenResponsesInProgressEventTypedDict,
StreamEventsResponseCompletedTypedDict,
StreamEventsResponseIncompleteTypedDict,
StreamEventsResponseFailedTypedDict,
FusionCallInProgressEventTypedDict,
OpenResponsesCreatedEventTypedDict,
FusionCallCompletedEventTypedDict,
StreamEventsResponseOutputItemAddedTypedDict,
WebSearchCallCompletedEventTypedDict,
StreamEventsResponseOutputItemDoneTypedDict,
FusionCallCompletedEventTypedDict,
ImageGenCallInProgressEventTypedDict,
StreamEventsResponseOutputItemAddedTypedDict,
ImageGenCallCompletedEventTypedDict,
ImageGenCallGeneratingEventTypedDict,
ImageGenCallCompletedEventTypedDict,
FusionCallInProgressEventTypedDict,
WebSearchCallInProgressEventTypedDict,
WebSearchCallSearchingEventTypedDict,
FusionCallAnalysisInProgressEventTypedDict,
FusionCallPanelAddedEventTypedDict,
CustomToolCallInputDoneEventTypedDict,
CustomToolCallInputDeltaEventTypedDict,
FunctionCallArgsDeltaEventTypedDict,
ApplyPatchCallOperationDiffDeltaEventTypedDict,
ErrorEventTypedDict,
FunctionCallArgsDeltaEventTypedDict,
ApplyPatchCallOperationDiffDoneEventTypedDict,
FusionCallPanelAddedEventTypedDict,
FusionCallAnalysisInProgressEventTypedDict,
FusionCallAnalysisCompletedEventTypedDict,
ReasoningSummaryPartDoneEventTypedDict,
RefusalDoneEventTypedDict,
ErrorEventTypedDict,
ReasoningSummaryTextDoneEventTypedDict,
RefusalDoneEventTypedDict,
ReasoningSummaryTextDeltaEventTypedDict,
ReasoningSummaryPartDoneEventTypedDict,
ReasoningSummaryPartAddedEventTypedDict,
ReasoningDoneEventTypedDict,
ReasoningDeltaEventTypedDict,
@@ -187,13 +189,13 @@ StreamEventsTypedDict = TypeAliasType(
ContentPartAddedEventTypedDict,
ImageGenCallPartialImageEventTypedDict,
RefusalDeltaEventTypedDict,
ContentPartDoneEventTypedDict,
FusionCallPanelDeltaEventTypedDict,
FusionCallPanelReasoningDeltaEventTypedDict,
FusionCallPanelCompletedEventTypedDict,
FusionCallPanelFailedEventTypedDict,
TextDeltaEventTypedDict,
ContentPartDoneEventTypedDict,
TextDoneEventTypedDict,
TextDeltaEventTypedDict,
FusionCallPanelFailedEventTypedDict,
AnnotationAddedEventTypedDict,
],
)
@@ -221,6 +223,7 @@ StreamEvents = Annotated[
Annotated[
CustomToolCallInputDoneEvent, Tag("response.custom_tool_call_input.done")
],
Annotated[DebugEvent, Tag("response.debug")],
Annotated[StreamEventsResponseFailed, Tag("response.failed")],
Annotated[
FunctionCallArgsDeltaEvent, Tag("response.function_call_arguments.delta")
@@ -10,6 +10,7 @@ from typing_extensions import Annotated, NotRequired, TypedDict
SubagentReasoningEffort = Union[
Literal[
"max",
"xhigh",
"high",
"medium",
@@ -0,0 +1,55 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .taskclassificationmodel import (
TaskClassificationModel,
TaskClassificationModelTypedDict,
)
from openrouter.types import BaseModel
from typing import List
from typing_extensions import TypedDict
class TaskClassificationItemTypedDict(TypedDict):
category_token_share: float
r"""Fraction of this classification's token volume within its macro-category (01). Sums to 1 across all classifications sharing the same `macro_category`."""
category_usage_share: float
r"""Fraction of this classification's usage within its macro-category (01). Sums to 1 across all classifications sharing the same `macro_category`."""
display_name: str
r"""Human-readable label for the classification."""
macro_category: str
r"""Coarse grouping derived from the tag prefix: `code`, `data`, `agent`, or `general`."""
models: List[TaskClassificationModelTypedDict]
r"""Top models for this classification by request volume, sorted descending. Each entry reports the model's share of this classification's requests and tokens."""
tag: str
r"""Classification tag identifier (e.g. `code:general_impl`, `agent:web_search`)."""
token_share: float
r"""Fraction of classified sampled token volume (prompt + completion) attributed to this classification (01). The unclassified `other` bucket is excluded from the denominator."""
usage_share: float
r"""Fraction of classified sampled requests attributed to this classification (01). The unclassified `other` bucket is excluded from the denominator."""
class TaskClassificationItem(BaseModel):
category_token_share: float
r"""Fraction of this classification's token volume within its macro-category (01). Sums to 1 across all classifications sharing the same `macro_category`."""
category_usage_share: float
r"""Fraction of this classification's usage within its macro-category (01). Sums to 1 across all classifications sharing the same `macro_category`."""
display_name: str
r"""Human-readable label for the classification."""
macro_category: str
r"""Coarse grouping derived from the tag prefix: `code`, `data`, `agent`, or `general`."""
models: List[TaskClassificationModel]
r"""Top models for this classification by request volume, sorted descending. Each entry reports the model's share of this classification's requests and tokens."""
tag: str
r"""Classification tag identifier (e.g. `code:general_impl`, `agent:web_search`)."""
token_share: float
r"""Fraction of classified sampled token volume (prompt + completion) attributed to this classification (01). The unclassified `other` bucket is excluded from the denominator."""
usage_share: float
r"""Fraction of classified sampled requests attributed to this classification (01). The unclassified `other` bucket is excluded from the denominator."""
@@ -0,0 +1,30 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.types import BaseModel
from typing_extensions import TypedDict
class TaskClassificationMacroCategoryTypedDict(TypedDict):
key: str
r"""Macro-category identifier."""
label: str
r"""Human-readable label for the macro-category."""
token_share: float
r"""Combined token share of all classifications in this macro-category (01)."""
usage_share: float
r"""Combined usage share of all classifications in this macro-category (01)."""
class TaskClassificationMacroCategory(BaseModel):
key: str
r"""Macro-category identifier."""
label: str
r"""Human-readable label for the macro-category."""
token_share: float
r"""Combined token share of all classifications in this macro-category (01)."""
usage_share: float
r"""Combined usage share of all classifications in this macro-category (01)."""
@@ -0,0 +1,25 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.types import BaseModel
from typing_extensions import TypedDict
class TaskClassificationModelTypedDict(TypedDict):
id: str
r"""Model identifier (permaslug)."""
tag_token_share: float
r"""Fraction of this classification's sampled token volume attributed to this model (01). Sums to ≤1 across the returned models (only top-N are included and unattributed requests are excluded)."""
tag_usage_share: float
r"""Fraction of this classification's sampled requests attributed to this model (01). Sums to ≤1 across the returned models (only top-N are included and unattributed requests are excluded)."""
class TaskClassificationModel(BaseModel):
id: str
r"""Model identifier (permaslug)."""
tag_token_share: float
r"""Fraction of this classification's sampled token volume attributed to this model (01). Sums to ≤1 across the returned models (only top-N are included and unattributed requests are excluded)."""
tag_usage_share: float
r"""Fraction of this classification's sampled requests attributed to this model (01). Sums to ≤1 across the returned models (only top-N are included and unattributed requests are excluded)."""
@@ -0,0 +1,47 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .taskclassificationitem import (
TaskClassificationItem,
TaskClassificationItemTypedDict,
)
from .taskclassificationmacrocategory import (
TaskClassificationMacroCategory,
TaskClassificationMacroCategoryTypedDict,
)
from openrouter.types import BaseModel
from typing import List
from typing_extensions import TypedDict
class TaskClassificationResponseDataTypedDict(TypedDict):
as_of: str
r"""UTC date (YYYY-MM-DD) of the window upper bound (yesterday). Data is exclusive of the current incomplete UTC day. This is the expected latest date in the snapshot; it does not confirm data presence for that date."""
classifications: List[TaskClassificationItemTypedDict]
r"""Per-task classification market-share data, sorted by usage_share descending."""
macro_categories: List[TaskClassificationMacroCategoryTypedDict]
r"""Aggregate market-share data per macro-category (code, data, agent, general)."""
window_days: int
r"""Number of trailing days covered by this snapshot."""
class TaskClassificationResponseData(BaseModel):
as_of: str
r"""UTC date (YYYY-MM-DD) of the window upper bound (yesterday). Data is exclusive of the current incomplete UTC day. This is the expected latest date in the snapshot; it does not confirm data presence for that date."""
classifications: List[TaskClassificationItem]
r"""Per-task classification market-share data, sorted by usage_share descending."""
macro_categories: List[TaskClassificationMacroCategory]
r"""Aggregate market-share data per macro-category (code, data, agent, general)."""
window_days: int
r"""Number of trailing days covered by this snapshot."""
class TaskClassificationResponseTypedDict(TypedDict):
data: TaskClassificationResponseDataTypedDict
class TaskClassificationResponse(BaseModel):
data: TaskClassificationResponseData
@@ -5,7 +5,7 @@ from openrouter.types import BaseModel
from typing_extensions import TypedDict
class BenchmarkPricingTypedDict(TypedDict):
class UnifiedBenchmarkPricingTypedDict(TypedDict):
r"""OpenRouter pricing per token for this model. Null if pricing is unavailable."""
completion: str
@@ -14,7 +14,7 @@ class BenchmarkPricingTypedDict(TypedDict):
r"""Cost per input token (USD, decimal string)."""
class BenchmarkPricing(BaseModel):
class UnifiedBenchmarkPricing(BaseModel):
r"""OpenRouter pricing per token for this model. Null if pricing is unavailable."""
completion: str
@@ -1,46 +1,59 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .benchmarkpricing import BenchmarkPricing, BenchmarkPricingTypedDict
from .unifiedbenchmarkpricing import (
UnifiedBenchmarkPricing,
UnifiedBenchmarkPricingTypedDict,
)
from openrouter.types import BaseModel, Nullable, UNSET_SENTINEL
from pydantic import model_serializer
from typing import Literal
from typing_extensions import TypedDict
class BenchmarksAAItemTypedDict(TypedDict):
aa_name: str
r"""Model name as listed on Artificial Analysis."""
UnifiedBenchmarksAAItemSource = Literal["artificial-analysis",]
r"""Benchmark source discriminator."""
class UnifiedBenchmarksAAItemTypedDict(TypedDict):
agentic_index: Nullable[float]
r"""Artificial Analysis Agentic Index composite score. Higher is better."""
coding_index: Nullable[float]
r"""Artificial Analysis Coding Index composite score. Higher is better."""
display_name: str
r"""Model name as listed on Artificial Analysis."""
intelligence_index: Nullable[float]
r"""Artificial Analysis Intelligence Index composite score. Higher is better."""
model_permaslug: str
r"""Stable OpenRouter model identifier."""
pricing: Nullable[BenchmarkPricingTypedDict]
pricing: Nullable[UnifiedBenchmarkPricingTypedDict]
r"""OpenRouter pricing per token for this model. Null if pricing is unavailable."""
source: UnifiedBenchmarksAAItemSource
r"""Benchmark source discriminator."""
class BenchmarksAAItem(BaseModel):
aa_name: str
r"""Model name as listed on Artificial Analysis."""
class UnifiedBenchmarksAAItem(BaseModel):
agentic_index: Nullable[float]
r"""Artificial Analysis Agentic Index composite score. Higher is better."""
coding_index: Nullable[float]
r"""Artificial Analysis Coding Index composite score. Higher is better."""
display_name: str
r"""Model name as listed on Artificial Analysis."""
intelligence_index: Nullable[float]
r"""Artificial Analysis Intelligence Index composite score. Higher is better."""
model_permaslug: str
r"""Stable OpenRouter model identifier."""
pricing: Nullable[BenchmarkPricing]
pricing: Nullable[UnifiedBenchmarkPricing]
r"""OpenRouter pricing per token for this model. Null if pricing is unavailable."""
source: UnifiedBenchmarksAAItemSource
r"""Benchmark source discriminator."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = []
@@ -1,12 +1,20 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .benchmarkpricing import BenchmarkPricing, BenchmarkPricingTypedDict
from .unifiedbenchmarkpricing import (
UnifiedBenchmarkPricing,
UnifiedBenchmarkPricingTypedDict,
)
from openrouter.types import BaseModel, Nullable, UNSET_SENTINEL
from pydantic import model_serializer
from typing import Literal
from typing_extensions import TypedDict
UnifiedBenchmarksDAItemSource = Literal["design-arena",]
r"""Benchmark source discriminator."""
class TournamentStatsTypedDict(TypedDict):
r"""Placement distribution from tournament matches."""
@@ -67,7 +75,7 @@ class TournamentStats(BaseModel):
return m
class BenchmarksDAItemTypedDict(TypedDict):
class UnifiedBenchmarksDAItemTypedDict(TypedDict):
arena: str
r"""Arena this ranking belongs to."""
avg_generation_time_ms: Nullable[float]
@@ -79,16 +87,18 @@ class BenchmarksDAItemTypedDict(TypedDict):
elo: float
r"""ELO rating from head-to-head arena battles."""
model_permaslug: str
r"""Stable OpenRouter model identifier when the model is on OpenRouter; otherwise the upstream Design Arena model id. Use pricing != null to detect OpenRouter-mapped models."""
pricing: Nullable[BenchmarkPricingTypedDict]
r"""Stable OpenRouter model identifier when mapped; otherwise the upstream Design Arena model id."""
pricing: Nullable[UnifiedBenchmarkPricingTypedDict]
r"""OpenRouter pricing per token for this model. Null if pricing is unavailable."""
source: UnifiedBenchmarksDAItemSource
r"""Benchmark source discriminator."""
tournament_stats: TournamentStatsTypedDict
r"""Placement distribution from tournament matches."""
win_rate: float
r"""Win rate as a percentage (0100)."""
class BenchmarksDAItem(BaseModel):
class UnifiedBenchmarksDAItem(BaseModel):
arena: str
r"""Arena this ranking belongs to."""
@@ -105,11 +115,14 @@ class BenchmarksDAItem(BaseModel):
r"""ELO rating from head-to-head arena battles."""
model_permaslug: str
r"""Stable OpenRouter model identifier when the model is on OpenRouter; otherwise the upstream Design Arena model id. Use pricing != null to detect OpenRouter-mapped models."""
r"""Stable OpenRouter model identifier when mapped; otherwise the upstream Design Arena model id."""
pricing: Nullable[BenchmarkPricing]
pricing: Nullable[UnifiedBenchmarkPricing]
r"""OpenRouter pricing per token for this model. Null if pricing is unavailable."""
source: UnifiedBenchmarksDAItemSource
r"""Benchmark source discriminator."""
tournament_stats: TournamentStats
r"""Placement distribution from tournament matches."""
@@ -0,0 +1,95 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.types import BaseModel, Nullable, UNSET_SENTINEL, UnrecognizedStr
from openrouter.utils import validate_open_enum
from pydantic import model_serializer
from pydantic.functional_validators import PlainValidator
from typing import Literal, Union
from typing_extensions import Annotated, TypedDict
UnifiedBenchmarksMetaSource = Union[
Literal[
"artificial-analysis",
"design-arena",
],
UnrecognizedStr,
]
r"""The source filter applied, or null when all sources are returned."""
UnifiedBenchmarksMetaVersion = Literal["v1",]
r"""Dataset version."""
class UnifiedBenchmarksMetaTypedDict(TypedDict):
as_of: str
r"""ISO-8601 timestamp of when this data was last updated."""
citation: Nullable[str]
r"""Required attribution when republishing this data, or null when results span multiple sources (attribute each item individually by its `source` discriminator)."""
model_count: int
r"""Number of unique models in the response."""
source: Nullable[UnifiedBenchmarksMetaSource]
r"""The source filter applied, or null when all sources are returned."""
source_url: Nullable[str]
r"""URL of the upstream data source, or null when results span multiple sources."""
task_type: Nullable[str]
r"""The task_type filter applied, or null if showing all."""
version: UnifiedBenchmarksMetaVersion
r"""Dataset version."""
class UnifiedBenchmarksMeta(BaseModel):
as_of: str
r"""ISO-8601 timestamp of when this data was last updated."""
citation: Nullable[str]
r"""Required attribution when republishing this data, or null when results span multiple sources (attribute each item individually by its `source` discriminator)."""
model_count: int
r"""Number of unique models in the response."""
source: Annotated[
Nullable[UnifiedBenchmarksMetaSource], PlainValidator(validate_open_enum(False))
]
r"""The source filter applied, or null when all sources are returned."""
source_url: Nullable[str]
r"""URL of the upstream data source, or null when results span multiple sources."""
task_type: Nullable[str]
r"""The task_type filter applied, or null if showing all."""
version: UnifiedBenchmarksMetaVersion
r"""Dataset version."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = []
nullable_fields = ["citation", "source", "source_url", "task_type"]
null_default_fields = []
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k)
serialized.pop(k, None)
optional_nullable = k in optional_fields and k in nullable_fields
is_set = (
self.__pydantic_fields_set__.intersection({n})
or k in null_default_fields
) # pylint: disable=no-member
if val is not None and val != UNSET_SENTINEL:
m[k] = val
elif val != UNSET_SENTINEL and (
not k in optional_fields or (optional_nullable and is_set)
):
m[k] = val
return m
@@ -0,0 +1,43 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from .unifiedbenchmarksaaitem import (
UnifiedBenchmarksAAItem,
UnifiedBenchmarksAAItemTypedDict,
)
from .unifiedbenchmarksdaitem import (
UnifiedBenchmarksDAItem,
UnifiedBenchmarksDAItemTypedDict,
)
from .unifiedbenchmarksmeta import UnifiedBenchmarksMeta, UnifiedBenchmarksMetaTypedDict
from openrouter.types import BaseModel
from openrouter.utils import get_discriminator
from pydantic import Discriminator, Tag
from typing import List, Union
from typing_extensions import Annotated, TypeAliasType, TypedDict
UnifiedBenchmarksResponseDataTypedDict = TypeAliasType(
"UnifiedBenchmarksResponseDataTypedDict",
Union[UnifiedBenchmarksAAItemTypedDict, UnifiedBenchmarksDAItemTypedDict],
)
UnifiedBenchmarksResponseData = Annotated[
Union[
Annotated[UnifiedBenchmarksAAItem, Tag("artificial-analysis")],
Annotated[UnifiedBenchmarksDAItem, Tag("design-arena")],
],
Discriminator(lambda m: get_discriminator(m, "source", "source")),
]
class UnifiedBenchmarksResponseTypedDict(TypedDict):
data: List[UnifiedBenchmarksResponseDataTypedDict]
meta: UnifiedBenchmarksMetaTypedDict
class UnifiedBenchmarksResponse(BaseModel):
data: List[UnifiedBenchmarksResponseData]
meta: UnifiedBenchmarksMeta
@@ -11,7 +11,7 @@ from typing import Any, Dict, List, Literal, Optional, Union
from typing_extensions import Annotated, NotRequired, TypedDict
AspectRatio = Union[
VideoGenerationRequestAspectRatio = Union[
Literal[
"16:9",
"9:16",
@@ -28,7 +28,7 @@ AspectRatio = Union[
r"""Aspect ratio of the generated video"""
class OptionsTypedDict(TypedDict):
class VideoGenerationRequestOptionsTypedDict(TypedDict):
r"""Provider-specific options keyed by provider slug. Only options for the matched provider are forwarded; the rest are ignored. Unrecognized keys are silently dropped."""
oneai: NotRequired[Dict[str, Nullable[Any]]]
@@ -76,11 +76,13 @@ class OptionsTypedDict(TypedDict):
google_vertex: NotRequired[Dict[str, Nullable[Any]]]
gopomelo: NotRequired[Dict[str, Nullable[Any]]]
groq: NotRequired[Dict[str, Nullable[Any]]]
heygen: NotRequired[Dict[str, Nullable[Any]]]
huggingface: NotRequired[Dict[str, Nullable[Any]]]
hyperbolic: NotRequired[Dict[str, Nullable[Any]]]
hyperbolic_quantized: NotRequired[Dict[str, Nullable[Any]]]
inception: NotRequired[Dict[str, Nullable[Any]]]
inceptron: NotRequired[Dict[str, Nullable[Any]]]
inferact_vllm: NotRequired[Dict[str, Nullable[Any]]]
inference_net: NotRequired[Dict[str, Nullable[Any]]]
infermatic: NotRequired[Dict[str, Nullable[Any]]]
inflection: NotRequired[Dict[str, Nullable[Any]]]
@@ -125,6 +127,7 @@ class OptionsTypedDict(TypedDict):
reka: NotRequired[Dict[str, Nullable[Any]]]
relace: NotRequired[Dict[str, Nullable[Any]]]
replicate: NotRequired[Dict[str, Nullable[Any]]]
sakana_ai: NotRequired[Dict[str, Nullable[Any]]]
sambanova: NotRequired[Dict[str, Nullable[Any]]]
sambanova_cloaked: NotRequired[Dict[str, Nullable[Any]]]
seed: NotRequired[Dict[str, Nullable[Any]]]
@@ -136,6 +139,7 @@ class OptionsTypedDict(TypedDict):
streamlake: NotRequired[Dict[str, Nullable[Any]]]
switchpoint: NotRequired[Dict[str, Nullable[Any]]]
targon: NotRequired[Dict[str, Nullable[Any]]]
tenstorrent: NotRequired[Dict[str, Nullable[Any]]]
together: NotRequired[Dict[str, Nullable[Any]]]
together_lite: NotRequired[Dict[str, Nullable[Any]]]
ubicloud: NotRequired[Dict[str, Nullable[Any]]]
@@ -148,7 +152,7 @@ class OptionsTypedDict(TypedDict):
z_ai: NotRequired[Dict[str, Nullable[Any]]]
class Options(BaseModel):
class VideoGenerationRequestOptions(BaseModel):
r"""Provider-specific options keyed by provider slug. Only options for the matched provider are forwarded; the rest are ignored. Unrecognized keys are silently dropped."""
oneai: Annotated[
@@ -261,6 +265,8 @@ class Options(BaseModel):
groq: Optional[Dict[str, Nullable[Any]]] = None
heygen: Optional[Dict[str, Nullable[Any]]] = None
huggingface: Optional[Dict[str, Nullable[Any]]] = None
hyperbolic: Optional[Dict[str, Nullable[Any]]] = None
@@ -273,6 +279,10 @@ class Options(BaseModel):
inceptron: Optional[Dict[str, Nullable[Any]]] = None
inferact_vllm: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="inferact-vllm")
] = None
inference_net: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="inference-net")
] = None
@@ -375,6 +385,10 @@ class Options(BaseModel):
replicate: Optional[Dict[str, Nullable[Any]]] = None
sakana_ai: Annotated[
Optional[Dict[str, Nullable[Any]]], pydantic.Field(alias="sakana-ai")
] = None
sambanova: Optional[Dict[str, Nullable[Any]]] = None
sambanova_cloaked: Annotated[
@@ -401,6 +415,8 @@ class Options(BaseModel):
targon: Optional[Dict[str, Nullable[Any]]] = None
tenstorrent: Optional[Dict[str, Nullable[Any]]] = None
together: Optional[Dict[str, Nullable[Any]]] = None
together_lite: Annotated[
@@ -429,16 +445,16 @@ class Options(BaseModel):
class VideoGenerationRequestProviderTypedDict(TypedDict):
r"""Provider-specific passthrough configuration"""
options: NotRequired[OptionsTypedDict]
options: NotRequired[VideoGenerationRequestOptionsTypedDict]
class VideoGenerationRequestProvider(BaseModel):
r"""Provider-specific passthrough configuration"""
options: Optional[Options] = None
options: Optional[VideoGenerationRequestOptions] = None
Resolution = Union[
VideoGenerationRequestResolution = Union[
Literal[
"480p",
"720p",
@@ -455,7 +471,7 @@ r"""Resolution of the generated video"""
class VideoGenerationRequestTypedDict(TypedDict):
model: str
prompt: str
aspect_ratio: NotRequired[AspectRatio]
aspect_ratio: NotRequired[VideoGenerationRequestAspectRatio]
r"""Aspect ratio of the generated video"""
callback_url: NotRequired[str]
r"""URL to receive a webhook notification when the video generation job completes. Overrides the workspace-level default callback URL if set. Must be HTTPS."""
@@ -469,7 +485,7 @@ class VideoGenerationRequestTypedDict(TypedDict):
r"""Reference assets to guide video generation. Accepts image, audio, and video references. Audio and video references are only honored by providers that support them (currently BytePlus Seedance 2.0); other providers use image references and ignore the rest."""
provider: NotRequired[VideoGenerationRequestProviderTypedDict]
r"""Provider-specific passthrough configuration"""
resolution: NotRequired[Resolution]
resolution: NotRequired[VideoGenerationRequestResolution]
r"""Resolution of the generated video"""
seed: NotRequired[int]
r"""If specified, the generation will sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed for all providers."""
@@ -483,7 +499,8 @@ class VideoGenerationRequest(BaseModel):
prompt: str
aspect_ratio: Annotated[
Optional[AspectRatio], PlainValidator(validate_open_enum(False))
Optional[VideoGenerationRequestAspectRatio],
PlainValidator(validate_open_enum(False)),
] = None
r"""Aspect ratio of the generated video"""
@@ -506,7 +523,8 @@ class VideoGenerationRequest(BaseModel):
r"""Provider-specific passthrough configuration"""
resolution: Annotated[
Optional[Resolution], PlainValidator(validate_open_enum(False))
Optional[VideoGenerationRequestResolution],
PlainValidator(validate_open_enum(False)),
] = None
r"""Resolution of the generated video"""
-536
View File
@@ -426,542 +426,6 @@ class Datasets(BaseSDK):
raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
def get_benchmarks_artificial_analysis(
self,
*,
http_referer: Optional[str] = None,
x_open_router_title: Optional[str] = None,
x_open_router_categories: Optional[str] = None,
max_results: Optional[int] = 50,
retries: OptionalNullable[utils.RetryConfig] = UNSET,
server_url: Optional[str] = None,
timeout_ms: Optional[int] = None,
http_headers: Optional[Mapping[str, str]] = None,
) -> components.BenchmarksAAResponse:
r"""Artificial Analysis Benchmark Indices
Returns composite index scores (Intelligence, Coding, Agentic) from Artificial Analysis for LLM models. Includes OpenRouter pricing per model. Authenticate with any valid OpenRouter API key. Rate-limited to 30 requests/minute per key and 500 requests/day per account.
:param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
:param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard.
:param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
:param max_results: Max results to return (1100, default 50).
:param retries: Override the default retry configuration for this method
:param server_url: Override the default server URL for this method
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
:param http_headers: Additional headers to set or replace on requests.
"""
base_url = None
url_variables = None
if timeout_ms is None:
timeout_ms = self.sdk_configuration.timeout_ms
if server_url is not None:
base_url = server_url
else:
base_url = self._get_url(base_url, url_variables)
request = operations.GetBenchmarksArtificialAnalysisRequest(
http_referer=http_referer,
x_open_router_title=x_open_router_title,
x_open_router_categories=x_open_router_categories,
max_results=max_results,
)
req = self._build_request(
method="GET",
path="/datasets/benchmarks/artificial-analysis",
base_url=base_url,
url_variables=url_variables,
request=request,
request_body_required=False,
request_has_path_params=False,
request_has_query_params=True,
user_agent_header="user-agent",
accept_header_value="application/json",
http_headers=http_headers,
_globals=operations.GetBenchmarksArtificialAnalysisGlobals(
http_referer=self.sdk_configuration.globals.http_referer,
x_open_router_title=self.sdk_configuration.globals.x_open_router_title,
x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories,
),
security=self.sdk_configuration.security,
allow_empty_value=None,
timeout_ms=timeout_ms,
)
if retries == UNSET:
if self.sdk_configuration.retry_config is not UNSET:
retries = self.sdk_configuration.retry_config
else:
retries = utils.RetryConfig(
"backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True
)
retry_config = None
if isinstance(retries, utils.RetryConfig):
retry_config = (retries, ["5XX"])
http_res = self.do_request(
hook_ctx=HookContext(
config=self.sdk_configuration,
base_url=base_url or "",
operation_id="getBenchmarksArtificialAnalysis",
oauth2_scopes=None,
security_source=get_security_from_env(
self.sdk_configuration.security, components.Security
),
),
request=req,
error_status_codes=["400", "401", "429", "4XX", "500", "5XX"],
retry_config=retry_config,
)
response_data: Any = None
if utils.match_response(http_res, "200", "application/json"):
return unmarshal_json_response(components.BenchmarksAAResponse, http_res)
if utils.match_response(http_res, "400", "application/json"):
response_data = unmarshal_json_response(
errors.BadRequestResponseErrorData, http_res
)
raise errors.BadRequestResponseError(response_data, http_res)
if utils.match_response(http_res, "401", "application/json"):
response_data = unmarshal_json_response(
errors.UnauthorizedResponseErrorData, http_res
)
raise errors.UnauthorizedResponseError(response_data, http_res)
if utils.match_response(http_res, "429", "application/json"):
response_data = unmarshal_json_response(
errors.TooManyRequestsResponseErrorData, http_res
)
raise errors.TooManyRequestsResponseError(response_data, http_res)
if utils.match_response(http_res, "500", "application/json"):
response_data = unmarshal_json_response(
errors.InternalServerResponseErrorData, http_res
)
raise errors.InternalServerResponseError(response_data, http_res)
if utils.match_response(http_res, "4XX", "*"):
http_res_text = utils.stream_to_text(http_res)
raise errors.OpenRouterDefaultError(
"API error occurred", http_res, http_res_text
)
if utils.match_response(http_res, "5XX", "*"):
http_res_text = utils.stream_to_text(http_res)
raise errors.OpenRouterDefaultError(
"API error occurred", http_res, http_res_text
)
raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
async def get_benchmarks_artificial_analysis_async(
self,
*,
http_referer: Optional[str] = None,
x_open_router_title: Optional[str] = None,
x_open_router_categories: Optional[str] = None,
max_results: Optional[int] = 50,
retries: OptionalNullable[utils.RetryConfig] = UNSET,
server_url: Optional[str] = None,
timeout_ms: Optional[int] = None,
http_headers: Optional[Mapping[str, str]] = None,
) -> components.BenchmarksAAResponse:
r"""Artificial Analysis Benchmark Indices
Returns composite index scores (Intelligence, Coding, Agentic) from Artificial Analysis for LLM models. Includes OpenRouter pricing per model. Authenticate with any valid OpenRouter API key. Rate-limited to 30 requests/minute per key and 500 requests/day per account.
:param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
:param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard.
:param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
:param max_results: Max results to return (1100, default 50).
:param retries: Override the default retry configuration for this method
:param server_url: Override the default server URL for this method
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
:param http_headers: Additional headers to set or replace on requests.
"""
base_url = None
url_variables = None
if timeout_ms is None:
timeout_ms = self.sdk_configuration.timeout_ms
if server_url is not None:
base_url = server_url
else:
base_url = self._get_url(base_url, url_variables)
request = operations.GetBenchmarksArtificialAnalysisRequest(
http_referer=http_referer,
x_open_router_title=x_open_router_title,
x_open_router_categories=x_open_router_categories,
max_results=max_results,
)
req = self._build_request_async(
method="GET",
path="/datasets/benchmarks/artificial-analysis",
base_url=base_url,
url_variables=url_variables,
request=request,
request_body_required=False,
request_has_path_params=False,
request_has_query_params=True,
user_agent_header="user-agent",
accept_header_value="application/json",
http_headers=http_headers,
_globals=operations.GetBenchmarksArtificialAnalysisGlobals(
http_referer=self.sdk_configuration.globals.http_referer,
x_open_router_title=self.sdk_configuration.globals.x_open_router_title,
x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories,
),
security=self.sdk_configuration.security,
allow_empty_value=None,
timeout_ms=timeout_ms,
)
if retries == UNSET:
if self.sdk_configuration.retry_config is not UNSET:
retries = self.sdk_configuration.retry_config
else:
retries = utils.RetryConfig(
"backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True
)
retry_config = None
if isinstance(retries, utils.RetryConfig):
retry_config = (retries, ["5XX"])
http_res = await self.do_request_async(
hook_ctx=HookContext(
config=self.sdk_configuration,
base_url=base_url or "",
operation_id="getBenchmarksArtificialAnalysis",
oauth2_scopes=None,
security_source=get_security_from_env(
self.sdk_configuration.security, components.Security
),
),
request=req,
error_status_codes=["400", "401", "429", "4XX", "500", "5XX"],
retry_config=retry_config,
)
response_data: Any = None
if utils.match_response(http_res, "200", "application/json"):
return unmarshal_json_response(components.BenchmarksAAResponse, http_res)
if utils.match_response(http_res, "400", "application/json"):
response_data = unmarshal_json_response(
errors.BadRequestResponseErrorData, http_res
)
raise errors.BadRequestResponseError(response_data, http_res)
if utils.match_response(http_res, "401", "application/json"):
response_data = unmarshal_json_response(
errors.UnauthorizedResponseErrorData, http_res
)
raise errors.UnauthorizedResponseError(response_data, http_res)
if utils.match_response(http_res, "429", "application/json"):
response_data = unmarshal_json_response(
errors.TooManyRequestsResponseErrorData, http_res
)
raise errors.TooManyRequestsResponseError(response_data, http_res)
if utils.match_response(http_res, "500", "application/json"):
response_data = unmarshal_json_response(
errors.InternalServerResponseErrorData, http_res
)
raise errors.InternalServerResponseError(response_data, http_res)
if utils.match_response(http_res, "4XX", "*"):
http_res_text = await utils.stream_to_text_async(http_res)
raise errors.OpenRouterDefaultError(
"API error occurred", http_res, http_res_text
)
if utils.match_response(http_res, "5XX", "*"):
http_res_text = await utils.stream_to_text_async(http_res)
raise errors.OpenRouterDefaultError(
"API error occurred", http_res, http_res_text
)
raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
def get_benchmarks_design_arena(
self,
*,
http_referer: Optional[str] = None,
x_open_router_title: Optional[str] = None,
x_open_router_categories: Optional[str] = None,
arena: Optional[operations.Arena] = "models",
category: Optional[str] = None,
max_results: Optional[int] = 50,
retries: OptionalNullable[utils.RetryConfig] = UNSET,
server_url: Optional[str] = None,
timeout_ms: Optional[int] = None,
http_headers: Optional[Mapping[str, str]] = None,
) -> components.BenchmarksDAResponse:
r"""Design Arena Benchmark Rankings
Returns ELO ratings from head-to-head arena battles on Design Arena. Filterable by arena (models/builders/agents) and category. Includes OpenRouter pricing per model. Authenticate with any valid OpenRouter API key. Rate-limited to 30 requests/minute per key and 500 requests/day per account.
:param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
:param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard.
:param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
:param arena: Arena to query. Defaults to `models`.
:param category: Category within the arena (e.g. `codecategories`, `uicomponent`, `gamedev`, `3d`, `dataviz`, `image`, `video`, `svg`). When omitted, returns all categories.
:param max_results: Max results to return: per category when no category filter is applied (1100, default 50).
:param retries: Override the default retry configuration for this method
:param server_url: Override the default server URL for this method
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
:param http_headers: Additional headers to set or replace on requests.
"""
base_url = None
url_variables = None
if timeout_ms is None:
timeout_ms = self.sdk_configuration.timeout_ms
if server_url is not None:
base_url = server_url
else:
base_url = self._get_url(base_url, url_variables)
request = operations.GetBenchmarksDesignArenaRequest(
http_referer=http_referer,
x_open_router_title=x_open_router_title,
x_open_router_categories=x_open_router_categories,
arena=arena,
category=category,
max_results=max_results,
)
req = self._build_request(
method="GET",
path="/datasets/benchmarks/design-arena",
base_url=base_url,
url_variables=url_variables,
request=request,
request_body_required=False,
request_has_path_params=False,
request_has_query_params=True,
user_agent_header="user-agent",
accept_header_value="application/json",
http_headers=http_headers,
_globals=operations.GetBenchmarksDesignArenaGlobals(
http_referer=self.sdk_configuration.globals.http_referer,
x_open_router_title=self.sdk_configuration.globals.x_open_router_title,
x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories,
),
security=self.sdk_configuration.security,
allow_empty_value=None,
timeout_ms=timeout_ms,
)
if retries == UNSET:
if self.sdk_configuration.retry_config is not UNSET:
retries = self.sdk_configuration.retry_config
else:
retries = utils.RetryConfig(
"backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True
)
retry_config = None
if isinstance(retries, utils.RetryConfig):
retry_config = (retries, ["5XX"])
http_res = self.do_request(
hook_ctx=HookContext(
config=self.sdk_configuration,
base_url=base_url or "",
operation_id="getBenchmarksDesignArena",
oauth2_scopes=None,
security_source=get_security_from_env(
self.sdk_configuration.security, components.Security
),
),
request=req,
error_status_codes=["400", "401", "429", "4XX", "500", "5XX"],
retry_config=retry_config,
)
response_data: Any = None
if utils.match_response(http_res, "200", "application/json"):
return unmarshal_json_response(components.BenchmarksDAResponse, http_res)
if utils.match_response(http_res, "400", "application/json"):
response_data = unmarshal_json_response(
errors.BadRequestResponseErrorData, http_res
)
raise errors.BadRequestResponseError(response_data, http_res)
if utils.match_response(http_res, "401", "application/json"):
response_data = unmarshal_json_response(
errors.UnauthorizedResponseErrorData, http_res
)
raise errors.UnauthorizedResponseError(response_data, http_res)
if utils.match_response(http_res, "429", "application/json"):
response_data = unmarshal_json_response(
errors.TooManyRequestsResponseErrorData, http_res
)
raise errors.TooManyRequestsResponseError(response_data, http_res)
if utils.match_response(http_res, "500", "application/json"):
response_data = unmarshal_json_response(
errors.InternalServerResponseErrorData, http_res
)
raise errors.InternalServerResponseError(response_data, http_res)
if utils.match_response(http_res, "4XX", "*"):
http_res_text = utils.stream_to_text(http_res)
raise errors.OpenRouterDefaultError(
"API error occurred", http_res, http_res_text
)
if utils.match_response(http_res, "5XX", "*"):
http_res_text = utils.stream_to_text(http_res)
raise errors.OpenRouterDefaultError(
"API error occurred", http_res, http_res_text
)
raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
async def get_benchmarks_design_arena_async(
self,
*,
http_referer: Optional[str] = None,
x_open_router_title: Optional[str] = None,
x_open_router_categories: Optional[str] = None,
arena: Optional[operations.Arena] = "models",
category: Optional[str] = None,
max_results: Optional[int] = 50,
retries: OptionalNullable[utils.RetryConfig] = UNSET,
server_url: Optional[str] = None,
timeout_ms: Optional[int] = None,
http_headers: Optional[Mapping[str, str]] = None,
) -> components.BenchmarksDAResponse:
r"""Design Arena Benchmark Rankings
Returns ELO ratings from head-to-head arena battles on Design Arena. Filterable by arena (models/builders/agents) and category. Includes OpenRouter pricing per model. Authenticate with any valid OpenRouter API key. Rate-limited to 30 requests/minute per key and 500 requests/day per account.
:param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
:param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard.
:param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
:param arena: Arena to query. Defaults to `models`.
:param category: Category within the arena (e.g. `codecategories`, `uicomponent`, `gamedev`, `3d`, `dataviz`, `image`, `video`, `svg`). When omitted, returns all categories.
:param max_results: Max results to return: per category when no category filter is applied (1100, default 50).
:param retries: Override the default retry configuration for this method
:param server_url: Override the default server URL for this method
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
:param http_headers: Additional headers to set or replace on requests.
"""
base_url = None
url_variables = None
if timeout_ms is None:
timeout_ms = self.sdk_configuration.timeout_ms
if server_url is not None:
base_url = server_url
else:
base_url = self._get_url(base_url, url_variables)
request = operations.GetBenchmarksDesignArenaRequest(
http_referer=http_referer,
x_open_router_title=x_open_router_title,
x_open_router_categories=x_open_router_categories,
arena=arena,
category=category,
max_results=max_results,
)
req = self._build_request_async(
method="GET",
path="/datasets/benchmarks/design-arena",
base_url=base_url,
url_variables=url_variables,
request=request,
request_body_required=False,
request_has_path_params=False,
request_has_query_params=True,
user_agent_header="user-agent",
accept_header_value="application/json",
http_headers=http_headers,
_globals=operations.GetBenchmarksDesignArenaGlobals(
http_referer=self.sdk_configuration.globals.http_referer,
x_open_router_title=self.sdk_configuration.globals.x_open_router_title,
x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories,
),
security=self.sdk_configuration.security,
allow_empty_value=None,
timeout_ms=timeout_ms,
)
if retries == UNSET:
if self.sdk_configuration.retry_config is not UNSET:
retries = self.sdk_configuration.retry_config
else:
retries = utils.RetryConfig(
"backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True
)
retry_config = None
if isinstance(retries, utils.RetryConfig):
retry_config = (retries, ["5XX"])
http_res = await self.do_request_async(
hook_ctx=HookContext(
config=self.sdk_configuration,
base_url=base_url or "",
operation_id="getBenchmarksDesignArena",
oauth2_scopes=None,
security_source=get_security_from_env(
self.sdk_configuration.security, components.Security
),
),
request=req,
error_status_codes=["400", "401", "429", "4XX", "500", "5XX"],
retry_config=retry_config,
)
response_data: Any = None
if utils.match_response(http_res, "200", "application/json"):
return unmarshal_json_response(components.BenchmarksDAResponse, http_res)
if utils.match_response(http_res, "400", "application/json"):
response_data = unmarshal_json_response(
errors.BadRequestResponseErrorData, http_res
)
raise errors.BadRequestResponseError(response_data, http_res)
if utils.match_response(http_res, "401", "application/json"):
response_data = unmarshal_json_response(
errors.UnauthorizedResponseErrorData, http_res
)
raise errors.UnauthorizedResponseError(response_data, http_res)
if utils.match_response(http_res, "429", "application/json"):
response_data = unmarshal_json_response(
errors.TooManyRequestsResponseErrorData, http_res
)
raise errors.TooManyRequestsResponseError(response_data, http_res)
if utils.match_response(http_res, "500", "application/json"):
response_data = unmarshal_json_response(
errors.InternalServerResponseErrorData, http_res
)
raise errors.InternalServerResponseError(response_data, http_res)
if utils.match_response(http_res, "4XX", "*"):
http_res_text = await utils.stream_to_text_async(http_res)
raise errors.OpenRouterDefaultError(
"API error occurred", http_res, http_res_text
)
if utils.match_response(http_res, "5XX", "*"):
http_res_text = await utils.stream_to_text_async(http_res)
raise errors.OpenRouterDefaultError(
"API error occurred", http_res, http_res_text
)
raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
def get_rankings_daily(
self,
*,
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -298,7 +298,7 @@ class Models(BaseSDK):
:param category: Filter models by use case category
:param supported_parameters: Filter models by supported parameter (comma-separated)
:param output_modalities: Filter models by output modality. Accepts a comma-separated list of modalities (text, image, audio, embeddings) or \"all\" to include all models. Defaults to \"text\".
:param sort: Sort the returned models server-side. Prefer this over fetching the full list and sorting client-side. Options: pricing-low-to-high, pricing-high-to-low (average prompt/completion price), context-high-to-low (context length), throughput-high-to-low, latency-low-to-high (recent median performance), most-popular, top-weekly (tokens processed in the last week), newest (creation date). When omitted, the existing default ordering is preserved.
:param sort: Sort the returned models server-side. Prefer this over fetching the full list and sorting client-side. Options: pricing-low-to-high, pricing-high-to-low (average prompt/completion price), context-high-to-low (context length), throughput-high-to-low, latency-low-to-high (recent median performance), most-popular, top-weekly (tokens processed in the last week), newest (creation date), intelligence-high-to-low (Artificial Analysis intelligence index), design-arena-elo-high-to-low (best Design Arena ELO across arenas). Models without a score for the chosen benchmark are placed last. When omitted, the existing default ordering is preserved.
:param q: Free-text search by model name or slug.
:param input_modalities: Filter models by input modality. Comma-separated list of: text, image, audio, file.
:param context: Minimum context length (tokens). Models with smaller context are excluded.
@@ -459,7 +459,7 @@ class Models(BaseSDK):
:param category: Filter models by use case category
:param supported_parameters: Filter models by supported parameter (comma-separated)
:param output_modalities: Filter models by output modality. Accepts a comma-separated list of modalities (text, image, audio, embeddings) or \"all\" to include all models. Defaults to \"text\".
:param sort: Sort the returned models server-side. Prefer this over fetching the full list and sorting client-side. Options: pricing-low-to-high, pricing-high-to-low (average prompt/completion price), context-high-to-low (context length), throughput-high-to-low, latency-low-to-high (recent median performance), most-popular, top-weekly (tokens processed in the last week), newest (creation date). When omitted, the existing default ordering is preserved.
:param sort: Sort the returned models server-side. Prefer this over fetching the full list and sorting client-side. Options: pricing-low-to-high, pricing-high-to-low (average prompt/completion price), context-high-to-low (context length), throughput-high-to-low, latency-low-to-high (recent median performance), most-popular, top-weekly (tokens processed in the last week), newest (creation date), intelligence-high-to-low (Artificial Analysis intelligence index), design-arena-elo-high-to-low (best Design Arena ELO across arenas). Models without a score for the chosen benchmark are placed last. When omitted, the existing default ordering is preserved.
:param q: Free-text search by model name or slug.
:param input_modalities: Filter models by input modality. Comma-separated list of: text, image, audio, file.
:param context: Minimum context length (tokens). Models with smaller context are excluded.
+91 -28
View File
@@ -81,6 +81,8 @@ if TYPE_CHECKING:
ContentText,
ContentTextTypedDict,
ContentTypedDict,
CostDetails,
CostDetailsTypedDict,
CreateEmbeddingsData,
CreateEmbeddingsDataTypedDict,
CreateEmbeddingsGlobals,
@@ -117,6 +119,14 @@ if TYPE_CHECKING:
CreateGuardrailRequest,
CreateGuardrailRequestTypedDict,
)
from .createimages import (
CreateImagesGlobals,
CreateImagesGlobalsTypedDict,
CreateImagesRequest,
CreateImagesRequestTypedDict,
CreateImagesResponse,
CreateImagesResponseTypedDict,
)
from .createkeys import (
CreateKeysData,
CreateKeysDataTypedDict,
@@ -290,18 +300,14 @@ if TYPE_CHECKING:
GetAppRankingsSort,
Subcategory,
)
from .getbenchmarksartificialanalysis import (
GetBenchmarksArtificialAnalysisGlobals,
GetBenchmarksArtificialAnalysisGlobalsTypedDict,
GetBenchmarksArtificialAnalysisRequest,
GetBenchmarksArtificialAnalysisRequestTypedDict,
)
from .getbenchmarksdesignarena import (
from .getbenchmarks import (
Arena,
GetBenchmarksDesignArenaGlobals,
GetBenchmarksDesignArenaGlobalsTypedDict,
GetBenchmarksDesignArenaRequest,
GetBenchmarksDesignArenaRequestTypedDict,
GetBenchmarksGlobals,
GetBenchmarksGlobalsTypedDict,
GetBenchmarksRequest,
GetBenchmarksRequestTypedDict,
Source,
TaskType,
)
from .getbyokkey import (
GetBYOKKeyGlobals,
@@ -400,6 +406,13 @@ if TYPE_CHECKING:
GetRankingsDailyRequest,
GetRankingsDailyRequestTypedDict,
)
from .gettaskclassifications import (
GetTaskClassificationsGlobals,
GetTaskClassificationsGlobalsTypedDict,
GetTaskClassificationsRequest,
GetTaskClassificationsRequestTypedDict,
Window,
)
from .getuseractivity import (
GetUserActivityGlobals,
GetUserActivityGlobalsTypedDict,
@@ -497,6 +510,18 @@ if TYPE_CHECKING:
ListGuardrailsResponse,
ListGuardrailsResponseTypedDict,
)
from .listimagemodelendpoints import (
ListImageModelEndpointsGlobals,
ListImageModelEndpointsGlobalsTypedDict,
ListImageModelEndpointsRequest,
ListImageModelEndpointsRequestTypedDict,
)
from .listimagemodels import (
ListImageModelsGlobals,
ListImageModelsGlobalsTypedDict,
ListImageModelsRequest,
ListImageModelsRequestTypedDict,
)
from .listkeyassignments import (
ListKeyAssignmentsGlobals,
ListKeyAssignmentsGlobalsTypedDict,
@@ -723,6 +748,8 @@ __all__ = [
"ContentText",
"ContentTextTypedDict",
"ContentTypedDict",
"CostDetails",
"CostDetailsTypedDict",
"CreateAudioSpeechGlobals",
"CreateAudioSpeechGlobalsTypedDict",
"CreateAudioSpeechRequest",
@@ -764,6 +791,12 @@ __all__ = [
"CreateGuardrailGlobalsTypedDict",
"CreateGuardrailRequest",
"CreateGuardrailRequestTypedDict",
"CreateImagesGlobals",
"CreateImagesGlobalsTypedDict",
"CreateImagesRequest",
"CreateImagesRequestTypedDict",
"CreateImagesResponse",
"CreateImagesResponseTypedDict",
"CreateKeysData",
"CreateKeysDataTypedDict",
"CreateKeysGlobals",
@@ -899,14 +932,10 @@ __all__ = [
"GetBYOKKeyGlobalsTypedDict",
"GetBYOKKeyRequest",
"GetBYOKKeyRequestTypedDict",
"GetBenchmarksArtificialAnalysisGlobals",
"GetBenchmarksArtificialAnalysisGlobalsTypedDict",
"GetBenchmarksArtificialAnalysisRequest",
"GetBenchmarksArtificialAnalysisRequestTypedDict",
"GetBenchmarksDesignArenaGlobals",
"GetBenchmarksDesignArenaGlobalsTypedDict",
"GetBenchmarksDesignArenaRequest",
"GetBenchmarksDesignArenaRequestTypedDict",
"GetBenchmarksGlobals",
"GetBenchmarksGlobalsTypedDict",
"GetBenchmarksRequest",
"GetBenchmarksRequestTypedDict",
"GetCreditsData",
"GetCreditsDataTypedDict",
"GetCreditsGlobals",
@@ -969,6 +998,10 @@ __all__ = [
"GetRankingsDailyGlobalsTypedDict",
"GetRankingsDailyRequest",
"GetRankingsDailyRequestTypedDict",
"GetTaskClassificationsGlobals",
"GetTaskClassificationsGlobalsTypedDict",
"GetTaskClassificationsRequest",
"GetTaskClassificationsRequestTypedDict",
"GetUserActivityGlobals",
"GetUserActivityGlobalsTypedDict",
"GetUserActivityRequest",
@@ -1045,6 +1078,14 @@ __all__ = [
"ListGuardrailsRequestTypedDict",
"ListGuardrailsResponse",
"ListGuardrailsResponseTypedDict",
"ListImageModelEndpointsGlobals",
"ListImageModelEndpointsGlobalsTypedDict",
"ListImageModelEndpointsRequest",
"ListImageModelEndpointsRequestTypedDict",
"ListImageModelsGlobals",
"ListImageModelsGlobalsTypedDict",
"ListImageModelsRequest",
"ListImageModelsRequestTypedDict",
"ListKeyAssignmentsGlobals",
"ListKeyAssignmentsGlobalsTypedDict",
"ListKeyAssignmentsRequest",
@@ -1163,7 +1204,9 @@ __all__ = [
"SendChatCompletionRequestRequestTypedDict",
"SendChatCompletionRequestResponse",
"SendChatCompletionRequestResponseTypedDict",
"Source",
"Subcategory",
"TaskType",
"TimeRange",
"TimeRangeTypedDict",
"TypeImageURL",
@@ -1211,6 +1254,7 @@ __all__ = [
"Value2",
"Value2TypedDict",
"ValueType",
"Window",
"Zdr",
]
@@ -1269,6 +1313,8 @@ _dynamic_imports: dict[str, str] = {
"ContentText": ".createembeddings",
"ContentTextTypedDict": ".createembeddings",
"ContentTypedDict": ".createembeddings",
"CostDetails": ".createembeddings",
"CostDetailsTypedDict": ".createembeddings",
"CreateEmbeddingsData": ".createembeddings",
"CreateEmbeddingsDataTypedDict": ".createembeddings",
"CreateEmbeddingsGlobals": ".createembeddings",
@@ -1302,6 +1348,12 @@ _dynamic_imports: dict[str, str] = {
"CreateGuardrailGlobalsTypedDict": ".createguardrail",
"CreateGuardrailRequest": ".createguardrail",
"CreateGuardrailRequestTypedDict": ".createguardrail",
"CreateImagesGlobals": ".createimages",
"CreateImagesGlobalsTypedDict": ".createimages",
"CreateImagesRequest": ".createimages",
"CreateImagesRequestTypedDict": ".createimages",
"CreateImagesResponse": ".createimages",
"CreateImagesResponseTypedDict": ".createimages",
"CreateKeysData": ".createkeys",
"CreateKeysDataTypedDict": ".createkeys",
"CreateKeysGlobals": ".createkeys",
@@ -1435,15 +1487,13 @@ _dynamic_imports: dict[str, str] = {
"GetAppRankingsResponseTypedDict": ".getapprankings",
"GetAppRankingsSort": ".getapprankings",
"Subcategory": ".getapprankings",
"GetBenchmarksArtificialAnalysisGlobals": ".getbenchmarksartificialanalysis",
"GetBenchmarksArtificialAnalysisGlobalsTypedDict": ".getbenchmarksartificialanalysis",
"GetBenchmarksArtificialAnalysisRequest": ".getbenchmarksartificialanalysis",
"GetBenchmarksArtificialAnalysisRequestTypedDict": ".getbenchmarksartificialanalysis",
"Arena": ".getbenchmarksdesignarena",
"GetBenchmarksDesignArenaGlobals": ".getbenchmarksdesignarena",
"GetBenchmarksDesignArenaGlobalsTypedDict": ".getbenchmarksdesignarena",
"GetBenchmarksDesignArenaRequest": ".getbenchmarksdesignarena",
"GetBenchmarksDesignArenaRequestTypedDict": ".getbenchmarksdesignarena",
"Arena": ".getbenchmarks",
"GetBenchmarksGlobals": ".getbenchmarks",
"GetBenchmarksGlobalsTypedDict": ".getbenchmarks",
"GetBenchmarksRequest": ".getbenchmarks",
"GetBenchmarksRequestTypedDict": ".getbenchmarks",
"Source": ".getbenchmarks",
"TaskType": ".getbenchmarks",
"GetBYOKKeyGlobals": ".getbyokkey",
"GetBYOKKeyGlobalsTypedDict": ".getbyokkey",
"GetBYOKKeyRequest": ".getbyokkey",
@@ -1515,6 +1565,11 @@ _dynamic_imports: dict[str, str] = {
"GetRankingsDailyGlobalsTypedDict": ".getrankingsdaily",
"GetRankingsDailyRequest": ".getrankingsdaily",
"GetRankingsDailyRequestTypedDict": ".getrankingsdaily",
"GetTaskClassificationsGlobals": ".gettaskclassifications",
"GetTaskClassificationsGlobalsTypedDict": ".gettaskclassifications",
"GetTaskClassificationsRequest": ".gettaskclassifications",
"GetTaskClassificationsRequestTypedDict": ".gettaskclassifications",
"Window": ".gettaskclassifications",
"GetUserActivityGlobals": ".getuseractivity",
"GetUserActivityGlobalsTypedDict": ".getuseractivity",
"GetUserActivityRequest": ".getuseractivity",
@@ -1586,6 +1641,14 @@ _dynamic_imports: dict[str, str] = {
"ListGuardrailsRequestTypedDict": ".listguardrails",
"ListGuardrailsResponse": ".listguardrails",
"ListGuardrailsResponseTypedDict": ".listguardrails",
"ListImageModelEndpointsGlobals": ".listimagemodelendpoints",
"ListImageModelEndpointsGlobalsTypedDict": ".listimagemodelendpoints",
"ListImageModelEndpointsRequest": ".listimagemodelendpoints",
"ListImageModelEndpointsRequestTypedDict": ".listimagemodelendpoints",
"ListImageModelsGlobals": ".listimagemodels",
"ListImageModelsGlobalsTypedDict": ".listimagemodels",
"ListImageModelsRequest": ".listimagemodels",
"ListImageModelsRequestTypedDict": ".listimagemodels",
"ListKeyAssignmentsGlobals": ".listkeyassignments",
"ListKeyAssignmentsGlobalsTypedDict": ".listkeyassignments",
"ListKeyAssignmentsRequest": ".listkeyassignments",
@@ -344,6 +344,54 @@ class CreateEmbeddingsData(BaseModel):
Object = Literal["list",]
class CostDetailsTypedDict(TypedDict):
r"""Breakdown of upstream inference costs"""
upstream_inference_completions_cost: float
upstream_inference_prompt_cost: float
upstream_inference_cost: NotRequired[Nullable[float]]
class CostDetails(BaseModel):
r"""Breakdown of upstream inference costs"""
upstream_inference_completions_cost: float
upstream_inference_prompt_cost: float
upstream_inference_cost: OptionalNullable[float] = UNSET
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = ["upstream_inference_cost"]
nullable_fields = ["upstream_inference_cost"]
null_default_fields = []
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k)
serialized.pop(k, None)
optional_nullable = k in optional_fields and k in nullable_fields
is_set = (
self.__pydantic_fields_set__.intersection({n})
or k in null_default_fields
) # pylint: disable=no-member
if val is not None and val != UNSET_SENTINEL:
m[k] = val
elif val != UNSET_SENTINEL and (
not k in optional_fields or (optional_nullable and is_set)
):
m[k] = val
return m
class PromptTokensDetailsTypedDict(TypedDict):
r"""Per-modality token breakdown. Only present when the input contains 2+ modalities (e.g. text + image) and the upstream provider returns modality-level usage data. Only non-zero modality counts are included."""
@@ -387,6 +435,10 @@ class CreateEmbeddingsUsageTypedDict(TypedDict):
r"""Total number of tokens used"""
cost: NotRequired[float]
r"""Cost of the request in credits"""
cost_details: NotRequired[Nullable[CostDetailsTypedDict]]
r"""Breakdown of upstream inference costs"""
is_byok: NotRequired[bool]
r"""Whether a request was made using a Bring Your Own Key configuration"""
prompt_tokens_details: NotRequired[PromptTokensDetailsTypedDict]
r"""Per-modality token breakdown. Only present when the input contains 2+ modalities (e.g. text + image) and the upstream provider returns modality-level usage data. Only non-zero modality counts are included."""
@@ -403,9 +455,45 @@ class CreateEmbeddingsUsage(BaseModel):
cost: Optional[float] = None
r"""Cost of the request in credits"""
cost_details: OptionalNullable[CostDetails] = UNSET
r"""Breakdown of upstream inference costs"""
is_byok: Optional[bool] = None
r"""Whether a request was made using a Bring Your Own Key configuration"""
prompt_tokens_details: Optional[PromptTokensDetails] = None
r"""Per-modality token breakdown. Only present when the input contains 2+ modalities (e.g. text + image) and the upstream provider returns modality-level usage data. Only non-zero modality counts are included."""
@model_serializer(mode="wrap")
def serialize_model(self, handler):
optional_fields = ["cost", "cost_details", "is_byok", "prompt_tokens_details"]
nullable_fields = ["cost_details"]
null_default_fields = []
serialized = handler(self)
m = {}
for n, f in type(self).model_fields.items():
k = f.alias or n
val = serialized.get(k)
serialized.pop(k, None)
optional_nullable = k in optional_fields and k in nullable_fields
is_set = (
self.__pydantic_fields_set__.intersection({n})
or k in null_default_fields
) # pylint: disable=no-member
if val is not None and val != UNSET_SENTINEL:
m[k] = val
elif val != UNSET_SENTINEL and (
not k in optional_fields or (optional_nullable and is_set)
):
m[k] = val
return m
class CreateEmbeddingsResponseBodyTypedDict(TypedDict):
r"""Embeddings response containing embedding vectors"""
+150
View File
@@ -0,0 +1,150 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.components import (
imagegenerationrequest as components_imagegenerationrequest,
imagegenerationresponse as components_imagegenerationresponse,
imagestreamingresponse as components_imagestreamingresponse,
)
from openrouter.types import BaseModel
from openrouter.utils import (
FieldMetadata,
HeaderMetadata,
RequestMetadata,
eventstreaming,
)
import pydantic
from typing import Optional, Union
from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict
class CreateImagesGlobalsTypedDict(TypedDict):
http_referer: NotRequired[str]
r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
"""
x_open_router_title: NotRequired[str]
r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
"""
x_open_router_categories: NotRequired[str]
r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
"""
class CreateImagesGlobals(BaseModel):
http_referer: Annotated[
Optional[str],
pydantic.Field(alias="HTTP-Referer"),
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
] = None
r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
"""
x_open_router_title: Annotated[
Optional[str],
pydantic.Field(alias="X-OpenRouter-Title"),
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
] = None
r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
"""
x_open_router_categories: Annotated[
Optional[str],
pydantic.Field(alias="X-OpenRouter-Categories"),
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
] = None
r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
"""
class CreateImagesRequestTypedDict(TypedDict):
image_generation_request: (
components_imagegenerationrequest.ImageGenerationRequestTypedDict
)
http_referer: NotRequired[str]
r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
"""
x_open_router_title: NotRequired[str]
r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
"""
x_open_router_categories: NotRequired[str]
r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
"""
class CreateImagesRequest(BaseModel):
image_generation_request: Annotated[
components_imagegenerationrequest.ImageGenerationRequest,
FieldMetadata(request=RequestMetadata(media_type="application/json")),
]
http_referer: Annotated[
Optional[str],
pydantic.Field(alias="HTTP-Referer"),
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
] = None
r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
"""
x_open_router_title: Annotated[
Optional[str],
pydantic.Field(alias="X-OpenRouter-Title"),
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
] = None
r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
"""
x_open_router_categories: Annotated[
Optional[str],
pydantic.Field(alias="X-OpenRouter-Categories"),
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
] = None
r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
"""
CreateImagesResponseTypedDict = TypeAliasType(
"CreateImagesResponseTypedDict",
Union[
components_imagegenerationresponse.ImageGenerationResponseTypedDict,
Union[
eventstreaming.EventStream[
components_imagestreamingresponse.ImageStreamingResponseDataTypedDict
],
eventstreaming.EventStreamAsync[
components_imagestreamingresponse.ImageStreamingResponseDataTypedDict
],
],
],
)
CreateImagesResponse = TypeAliasType(
"CreateImagesResponse",
Union[
components_imagegenerationresponse.ImageGenerationResponse,
Union[
eventstreaming.EventStream[
components_imagestreamingresponse.ImageStreamingResponseData
],
eventstreaming.EventStreamAsync[
components_imagestreamingresponse.ImageStreamingResponseData
],
],
],
)
+178
View File
@@ -0,0 +1,178 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.types import BaseModel, UnrecognizedStr
from openrouter.utils import (
FieldMetadata,
HeaderMetadata,
QueryParamMetadata,
validate_open_enum,
)
import pydantic
from pydantic.functional_validators import PlainValidator
from typing import Literal, Optional, Union
from typing_extensions import Annotated, NotRequired, TypedDict
class GetBenchmarksGlobalsTypedDict(TypedDict):
http_referer: NotRequired[str]
r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
"""
x_open_router_title: NotRequired[str]
r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
"""
x_open_router_categories: NotRequired[str]
r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
"""
class GetBenchmarksGlobals(BaseModel):
http_referer: Annotated[
Optional[str],
pydantic.Field(alias="HTTP-Referer"),
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
] = None
r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
"""
x_open_router_title: Annotated[
Optional[str],
pydantic.Field(alias="X-OpenRouter-Title"),
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
] = None
r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
"""
x_open_router_categories: Annotated[
Optional[str],
pydantic.Field(alias="X-OpenRouter-Categories"),
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
] = None
r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
"""
Source = Union[
Literal[
"artificial-analysis",
"design-arena",
],
UnrecognizedStr,
]
r"""Benchmark source to query. Determines the shape of the returned items. When omitted, returns results from all sources."""
TaskType = Union[
Literal[
"coding",
"intelligence",
"agentic",
],
UnrecognizedStr,
]
r"""Filter results by task type. For Artificial Analysis, maps to the corresponding index. For Design Arena, maps to the matching category."""
Arena = Union[
Literal[
"models",
"builders",
"agents",
],
UnrecognizedStr,
]
r"""Design Arena only: arena to query. Defaults to `models` when source is `design-arena`."""
class GetBenchmarksRequestTypedDict(TypedDict):
http_referer: NotRequired[str]
r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
"""
x_open_router_title: NotRequired[str]
r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
"""
x_open_router_categories: NotRequired[str]
r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
"""
source: NotRequired[Source]
r"""Benchmark source to query. Determines the shape of the returned items. When omitted, returns results from all sources."""
task_type: NotRequired[TaskType]
r"""Filter results by task type. For Artificial Analysis, maps to the corresponding index. For Design Arena, maps to the matching category."""
arena: NotRequired[Arena]
r"""Design Arena only: arena to query. Defaults to `models` when source is `design-arena`."""
category: NotRequired[str]
r"""Design Arena only: category within the arena (e.g. `codecategories`, `uicomponent`, `gamedev`, `3d`, `dataviz`, `image`, `video`, `svg`). When omitted, returns all categories."""
max_results: NotRequired[int]
r"""Maximum number of items to return. When omitted, all matching results are returned."""
class GetBenchmarksRequest(BaseModel):
http_referer: Annotated[
Optional[str],
pydantic.Field(alias="HTTP-Referer"),
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
] = None
r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
"""
x_open_router_title: Annotated[
Optional[str],
pydantic.Field(alias="X-OpenRouter-Title"),
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
] = None
r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
"""
x_open_router_categories: Annotated[
Optional[str],
pydantic.Field(alias="X-OpenRouter-Categories"),
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
] = None
r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
"""
source: Annotated[
Annotated[Optional[Source], PlainValidator(validate_open_enum(False))],
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
] = None
r"""Benchmark source to query. Determines the shape of the returned items. When omitted, returns results from all sources."""
task_type: Annotated[
Annotated[Optional[TaskType], PlainValidator(validate_open_enum(False))],
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
] = None
r"""Filter results by task type. For Artificial Analysis, maps to the corresponding index. For Design Arena, maps to the matching category."""
arena: Annotated[
Annotated[Optional[Arena], PlainValidator(validate_open_enum(False))],
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
] = None
r"""Design Arena only: arena to query. Defaults to `models` when source is `design-arena`."""
category: Annotated[
Optional[str],
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
] = None
r"""Design Arena only: category within the arena (e.g. `codecategories`, `uicomponent`, `gamedev`, `3d`, `dataviz`, `image`, `video`, `svg`). When omitted, returns all categories."""
max_results: Annotated[
Optional[int],
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
] = None
r"""Maximum number of items to return. When omitted, all matching results are returned."""
+5 -3
View File
@@ -98,10 +98,12 @@ GetModelsSort = Union[
"context-high-to-low",
"throughput-high-to-low",
"latency-low-to-high",
"intelligence-high-to-low",
"design-arena-elo-high-to-low",
],
UnrecognizedStr,
]
r"""Sort the returned models server-side. Prefer this over fetching the full list and sorting client-side. Options: pricing-low-to-high, pricing-high-to-low (average prompt/completion price), context-high-to-low (context length), throughput-high-to-low, latency-low-to-high (recent median performance), most-popular, top-weekly (tokens processed in the last week), newest (creation date). When omitted, the existing default ordering is preserved."""
r"""Sort the returned models server-side. Prefer this over fetching the full list and sorting client-side. Options: pricing-low-to-high, pricing-high-to-low (average prompt/completion price), context-high-to-low (context length), throughput-high-to-low, latency-low-to-high (recent median performance), most-popular, top-weekly (tokens processed in the last week), newest (creation date), intelligence-high-to-low (Artificial Analysis intelligence index), design-arena-elo-high-to-low (best Design Arena ELO across arenas). Models without a score for the chosen benchmark are placed last. When omitted, the existing default ordering is preserved."""
Distillable = Union[
@@ -143,7 +145,7 @@ class GetModelsRequestTypedDict(TypedDict):
output_modalities: NotRequired[str]
r"""Filter models by output modality. Accepts a comma-separated list of modalities (text, image, audio, embeddings) or \"all\" to include all models. Defaults to \"text\"."""
sort: NotRequired[GetModelsSort]
r"""Sort the returned models server-side. Prefer this over fetching the full list and sorting client-side. Options: pricing-low-to-high, pricing-high-to-low (average prompt/completion price), context-high-to-low (context length), throughput-high-to-low, latency-low-to-high (recent median performance), most-popular, top-weekly (tokens processed in the last week), newest (creation date). When omitted, the existing default ordering is preserved."""
r"""Sort the returned models server-side. Prefer this over fetching the full list and sorting client-side. Options: pricing-low-to-high, pricing-high-to-low (average prompt/completion price), context-high-to-low (context length), throughput-high-to-low, latency-low-to-high (recent median performance), most-popular, top-weekly (tokens processed in the last week), newest (creation date), intelligence-high-to-low (Artificial Analysis intelligence index), design-arena-elo-high-to-low (best Design Arena ELO across arenas). Models without a score for the chosen benchmark are placed last. When omitted, the existing default ordering is preserved."""
q: NotRequired[str]
r"""Free-text search by model name or slug."""
input_modalities: NotRequired[str]
@@ -221,7 +223,7 @@ class GetModelsRequest(BaseModel):
Annotated[Optional[GetModelsSort], PlainValidator(validate_open_enum(False))],
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
] = None
r"""Sort the returned models server-side. Prefer this over fetching the full list and sorting client-side. Options: pricing-low-to-high, pricing-high-to-low (average prompt/completion price), context-high-to-low (context length), throughput-high-to-low, latency-low-to-high (recent median performance), most-popular, top-weekly (tokens processed in the last week), newest (creation date). When omitted, the existing default ordering is preserved."""
r"""Sort the returned models server-side. Prefer this over fetching the full list and sorting client-side. Options: pricing-low-to-high, pricing-high-to-low (average prompt/completion price), context-high-to-low (context length), throughput-high-to-low, latency-low-to-high (recent median performance), most-popular, top-weekly (tokens processed in the last week), newest (creation date), intelligence-high-to-low (Artificial Analysis intelligence index), design-arena-elo-high-to-low (best Design Arena ELO across arenas). Models without a score for the chosen benchmark are placed last. When omitted, the existing default ordering is preserved."""
q: Annotated[
Optional[str],
@@ -1,20 +1,14 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.types import BaseModel, UnrecognizedStr
from openrouter.utils import (
FieldMetadata,
HeaderMetadata,
QueryParamMetadata,
validate_open_enum,
)
from openrouter.types import BaseModel
from openrouter.utils import FieldMetadata, HeaderMetadata, QueryParamMetadata
import pydantic
from pydantic.functional_validators import PlainValidator
from typing import Literal, Optional, Union
from typing import Literal, Optional
from typing_extensions import Annotated, NotRequired, TypedDict
class GetBenchmarksDesignArenaGlobalsTypedDict(TypedDict):
class GetTaskClassificationsGlobalsTypedDict(TypedDict):
http_referer: NotRequired[str]
r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
@@ -30,7 +24,7 @@ class GetBenchmarksDesignArenaGlobalsTypedDict(TypedDict):
"""
class GetBenchmarksDesignArenaGlobals(BaseModel):
class GetTaskClassificationsGlobals(BaseModel):
http_referer: Annotated[
Optional[str],
pydantic.Field(alias="HTTP-Referer"),
@@ -60,18 +54,11 @@ class GetBenchmarksDesignArenaGlobals(BaseModel):
"""
Arena = Union[
Literal[
"models",
"builders",
"agents",
],
UnrecognizedStr,
]
r"""Arena to query. Defaults to `models`."""
Window = Literal["7d",]
r"""Trailing time window for the classification data. Currently only `7d` (trailing 7 days) is supported."""
class GetBenchmarksDesignArenaRequestTypedDict(TypedDict):
class GetTaskClassificationsRequestTypedDict(TypedDict):
http_referer: NotRequired[str]
r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
@@ -85,15 +72,11 @@ class GetBenchmarksDesignArenaRequestTypedDict(TypedDict):
r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
"""
arena: NotRequired[Arena]
r"""Arena to query. Defaults to `models`."""
category: NotRequired[str]
r"""Category within the arena (e.g. `codecategories`, `uicomponent`, `gamedev`, `3d`, `dataviz`, `image`, `video`, `svg`). When omitted, returns all categories."""
max_results: NotRequired[int]
r"""Max results to return: per category when no category filter is applied (1100, default 50)."""
window: NotRequired[Window]
r"""Trailing time window for the classification data. Currently only `7d` (trailing 7 days) is supported."""
class GetBenchmarksDesignArenaRequest(BaseModel):
class GetTaskClassificationsRequest(BaseModel):
http_referer: Annotated[
Optional[str],
pydantic.Field(alias="HTTP-Referer"),
@@ -122,20 +105,8 @@ class GetBenchmarksDesignArenaRequest(BaseModel):
"""
arena: Annotated[
Annotated[Optional[Arena], PlainValidator(validate_open_enum(False))],
window: Annotated[
Optional[Window],
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
] = "models"
r"""Arena to query. Defaults to `models`."""
category: Annotated[
Optional[str],
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
] = None
r"""Category within the arena (e.g. `codecategories`, `uicomponent`, `gamedev`, `3d`, `dataviz`, `image`, `video`, `svg`). When omitted, returns all categories."""
max_results: Annotated[
Optional[int],
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
] = 50
r"""Max results to return: per category when no category filter is applied (1100, default 50)."""
] = "7d"
r"""Trailing time window for the classification data. Currently only `7d` (trailing 7 days) is supported."""
@@ -101,8 +101,10 @@ Provider = Union[
"google-ai-studio",
"google-vertex",
"groq",
"heygen",
"inception",
"inceptron",
"inferact-vllm",
"inference-net",
"infermatic",
"inflection",
@@ -133,6 +135,7 @@ Provider = Union[
"recraft",
"reka",
"relace",
"sakana-ai",
"sambanova",
"seed",
"siliconflow",
@@ -140,6 +143,7 @@ Provider = Union[
"stepfun",
"streamlake",
"switchpoint",
"tenstorrent",
"together",
"upstage",
"venice",
@@ -0,0 +1,114 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.types import BaseModel
from openrouter.utils import FieldMetadata, HeaderMetadata, PathParamMetadata
import pydantic
from typing import Optional
from typing_extensions import Annotated, NotRequired, TypedDict
class ListImageModelEndpointsGlobalsTypedDict(TypedDict):
http_referer: NotRequired[str]
r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
"""
x_open_router_title: NotRequired[str]
r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
"""
x_open_router_categories: NotRequired[str]
r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
"""
class ListImageModelEndpointsGlobals(BaseModel):
http_referer: Annotated[
Optional[str],
pydantic.Field(alias="HTTP-Referer"),
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
] = None
r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
"""
x_open_router_title: Annotated[
Optional[str],
pydantic.Field(alias="X-OpenRouter-Title"),
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
] = None
r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
"""
x_open_router_categories: Annotated[
Optional[str],
pydantic.Field(alias="X-OpenRouter-Categories"),
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
] = None
r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
"""
class ListImageModelEndpointsRequestTypedDict(TypedDict):
author: str
r"""Model author/organization"""
slug: str
r"""Model slug"""
http_referer: NotRequired[str]
r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
"""
x_open_router_title: NotRequired[str]
r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
"""
x_open_router_categories: NotRequired[str]
r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
"""
class ListImageModelEndpointsRequest(BaseModel):
author: Annotated[
str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False))
]
r"""Model author/organization"""
slug: Annotated[
str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False))
]
r"""Model slug"""
http_referer: Annotated[
Optional[str],
pydantic.Field(alias="HTTP-Referer"),
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
] = None
r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
"""
x_open_router_title: Annotated[
Optional[str],
pydantic.Field(alias="X-OpenRouter-Title"),
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
] = None
r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
"""
x_open_router_categories: Annotated[
Optional[str],
pydantic.Field(alias="X-OpenRouter-Categories"),
FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
] = None
r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
"""
@@ -2,13 +2,13 @@
from __future__ import annotations
from openrouter.types import BaseModel
from openrouter.utils import FieldMetadata, HeaderMetadata, QueryParamMetadata
from openrouter.utils import FieldMetadata, HeaderMetadata
import pydantic
from typing import Optional
from typing_extensions import Annotated, NotRequired, TypedDict
class GetBenchmarksArtificialAnalysisGlobalsTypedDict(TypedDict):
class ListImageModelsGlobalsTypedDict(TypedDict):
http_referer: NotRequired[str]
r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
@@ -24,7 +24,7 @@ class GetBenchmarksArtificialAnalysisGlobalsTypedDict(TypedDict):
"""
class GetBenchmarksArtificialAnalysisGlobals(BaseModel):
class ListImageModelsGlobals(BaseModel):
http_referer: Annotated[
Optional[str],
pydantic.Field(alias="HTTP-Referer"),
@@ -54,7 +54,7 @@ class GetBenchmarksArtificialAnalysisGlobals(BaseModel):
"""
class GetBenchmarksArtificialAnalysisRequestTypedDict(TypedDict):
class ListImageModelsRequestTypedDict(TypedDict):
http_referer: NotRequired[str]
r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
@@ -68,11 +68,9 @@ class GetBenchmarksArtificialAnalysisRequestTypedDict(TypedDict):
r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
"""
max_results: NotRequired[int]
r"""Max results to return (1100, default 50)."""
class GetBenchmarksArtificialAnalysisRequest(BaseModel):
class ListImageModelsRequest(BaseModel):
http_referer: Annotated[
Optional[str],
pydantic.Field(alias="HTTP-Referer"),
@@ -100,9 +98,3 @@ class GetBenchmarksArtificialAnalysisRequest(BaseModel):
r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
"""
max_results: Annotated[
Optional[int],
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
] = 50
r"""Max results to return (1100, default 50)."""
+24 -4
View File
@@ -1295,7 +1295,10 @@ class Presets(BaseSDK):
] = UNSET,
max_tokens: Optional[int] = None,
metadata: Optional[
Union[components.Metadata, components.MetadataTypedDict]
Union[
components.MessagesRequestMetadata,
components.MessagesRequestMetadataTypedDict,
]
] = None,
models: Optional[List[str]] = None,
output_config: Optional[
@@ -1424,7 +1427,7 @@ class Presets(BaseSDK):
messages, Nullable[List[components.MessagesMessageParam]]
),
metadata=utils.get_pydantic_model(
metadata, Optional[components.Metadata]
metadata, Optional[components.MessagesRequestMetadata]
),
model=model,
models=models,
@@ -1599,7 +1602,10 @@ class Presets(BaseSDK):
] = UNSET,
max_tokens: Optional[int] = None,
metadata: Optional[
Union[components.Metadata, components.MetadataTypedDict]
Union[
components.MessagesRequestMetadata,
components.MessagesRequestMetadataTypedDict,
]
] = None,
models: Optional[List[str]] = None,
output_config: Optional[
@@ -1728,7 +1734,7 @@ class Presets(BaseSDK):
messages, Nullable[List[components.MessagesMessageParam]]
),
metadata=utils.get_pydantic_model(
metadata, Optional[components.Metadata]
metadata, Optional[components.MessagesRequestMetadata]
),
model=model,
models=models,
@@ -1886,6 +1892,9 @@ class Presets(BaseSDK):
components.AnthropicCacheControlDirectiveTypedDict,
]
] = None,
debug: Optional[
Union[components.ChatDebugOptions, components.ChatDebugOptionsTypedDict]
] = None,
frequency_penalty: OptionalNullable[float] = UNSET,
image_config: Optional[
Union[
@@ -1981,6 +1990,7 @@ class Presets(BaseSDK):
:param background:
:param cache_control: Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. Currently supported for Anthropic Claude models.
:param debug: Debug options for inspecting request transformations (streaming only)
:param frequency_penalty:
:param image_config: Provider-specific image configuration options. Keys and values vary by model/provider. See https://openrouter.ai/docs/guides/overview/multimodal/image-generation for more details.
:param include:
@@ -2040,6 +2050,9 @@ class Presets(BaseSDK):
cache_control=utils.get_pydantic_model(
cache_control, Optional[components.AnthropicCacheControlDirective]
),
debug=utils.get_pydantic_model(
debug, Optional[components.ChatDebugOptions]
),
frequency_penalty=frequency_penalty,
image_config=image_config,
include=include,
@@ -2212,6 +2225,9 @@ class Presets(BaseSDK):
components.AnthropicCacheControlDirectiveTypedDict,
]
] = None,
debug: Optional[
Union[components.ChatDebugOptions, components.ChatDebugOptionsTypedDict]
] = None,
frequency_penalty: OptionalNullable[float] = UNSET,
image_config: Optional[
Union[
@@ -2307,6 +2323,7 @@ class Presets(BaseSDK):
:param background:
:param cache_control: Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. Currently supported for Anthropic Claude models.
:param debug: Debug options for inspecting request transformations (streaming only)
:param frequency_penalty:
:param image_config: Provider-specific image configuration options. Keys and values vary by model/provider. See https://openrouter.ai/docs/guides/overview/multimodal/image-generation for more details.
:param include:
@@ -2366,6 +2383,9 @@ class Presets(BaseSDK):
cache_control=utils.get_pydantic_model(
cache_control, Optional[components.AnthropicCacheControlDirective]
),
debug=utils.get_pydantic_model(
debug, Optional[components.ChatDebugOptions]
),
frequency_penalty=frequency_penalty,
image_config=image_config,
include=include,
+30
View File
@@ -33,6 +33,9 @@ class Responses(BaseSDK):
components.AnthropicCacheControlDirectiveTypedDict,
]
] = None,
debug: Optional[
Union[components.ChatDebugOptions, components.ChatDebugOptionsTypedDict]
] = None,
frequency_penalty: OptionalNullable[float] = UNSET,
image_config: Optional[
Union[
@@ -128,6 +131,7 @@ class Responses(BaseSDK):
:param x_open_router_metadata: Opt-in to surface routing metadata on the response under `openrouter_metadata`. Defaults to `disabled`. The legacy header `X-OpenRouter-Experimental-Metadata` is also accepted for backward compatibility.
:param background:
:param cache_control: Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. Currently supported for Anthropic Claude models.
:param debug: Debug options for inspecting request transformations (streaming only)
:param frequency_penalty:
:param image_config: Provider-specific image configuration options. Keys and values vary by model/provider. See https://openrouter.ai/docs/guides/overview/multimodal/image-generation for more details.
:param include:
@@ -184,6 +188,9 @@ class Responses(BaseSDK):
components.AnthropicCacheControlDirectiveTypedDict,
]
] = None,
debug: Optional[
Union[components.ChatDebugOptions, components.ChatDebugOptionsTypedDict]
] = None,
frequency_penalty: OptionalNullable[float] = UNSET,
image_config: Optional[
Union[
@@ -279,6 +286,7 @@ class Responses(BaseSDK):
:param x_open_router_metadata: Opt-in to surface routing metadata on the response under `openrouter_metadata`. Defaults to `disabled`. The legacy header `X-OpenRouter-Experimental-Metadata` is also accepted for backward compatibility.
:param background:
:param cache_control: Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. Currently supported for Anthropic Claude models.
:param debug: Debug options for inspecting request transformations (streaming only)
:param frequency_penalty:
:param image_config: Provider-specific image configuration options. Keys and values vary by model/provider. See https://openrouter.ai/docs/guides/overview/multimodal/image-generation for more details.
:param include:
@@ -334,6 +342,9 @@ class Responses(BaseSDK):
components.AnthropicCacheControlDirectiveTypedDict,
]
] = None,
debug: Optional[
Union[components.ChatDebugOptions, components.ChatDebugOptionsTypedDict]
] = None,
frequency_penalty: OptionalNullable[float] = UNSET,
image_config: Optional[
Union[
@@ -429,6 +440,7 @@ class Responses(BaseSDK):
:param x_open_router_metadata: Opt-in to surface routing metadata on the response under `openrouter_metadata`. Defaults to `disabled`. The legacy header `X-OpenRouter-Experimental-Metadata` is also accepted for backward compatibility.
:param background:
:param cache_control: Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. Currently supported for Anthropic Claude models.
:param debug: Debug options for inspecting request transformations (streaming only)
:param frequency_penalty:
:param image_config: Provider-specific image configuration options. Keys and values vary by model/provider. See https://openrouter.ai/docs/guides/overview/multimodal/image-generation for more details.
:param include:
@@ -489,6 +501,9 @@ class Responses(BaseSDK):
cache_control=utils.get_pydantic_model(
cache_control, Optional[components.AnthropicCacheControlDirective]
),
debug=utils.get_pydantic_model(
debug, Optional[components.ChatDebugOptions]
),
frequency_penalty=frequency_penalty,
image_config=image_config,
include=include,
@@ -767,6 +782,9 @@ class Responses(BaseSDK):
components.AnthropicCacheControlDirectiveTypedDict,
]
] = None,
debug: Optional[
Union[components.ChatDebugOptions, components.ChatDebugOptionsTypedDict]
] = None,
frequency_penalty: OptionalNullable[float] = UNSET,
image_config: Optional[
Union[
@@ -862,6 +880,7 @@ class Responses(BaseSDK):
:param x_open_router_metadata: Opt-in to surface routing metadata on the response under `openrouter_metadata`. Defaults to `disabled`. The legacy header `X-OpenRouter-Experimental-Metadata` is also accepted for backward compatibility.
:param background:
:param cache_control: Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. Currently supported for Anthropic Claude models.
:param debug: Debug options for inspecting request transformations (streaming only)
:param frequency_penalty:
:param image_config: Provider-specific image configuration options. Keys and values vary by model/provider. See https://openrouter.ai/docs/guides/overview/multimodal/image-generation for more details.
:param include:
@@ -918,6 +937,9 @@ class Responses(BaseSDK):
components.AnthropicCacheControlDirectiveTypedDict,
]
] = None,
debug: Optional[
Union[components.ChatDebugOptions, components.ChatDebugOptionsTypedDict]
] = None,
frequency_penalty: OptionalNullable[float] = UNSET,
image_config: Optional[
Union[
@@ -1013,6 +1035,7 @@ class Responses(BaseSDK):
:param x_open_router_metadata: Opt-in to surface routing metadata on the response under `openrouter_metadata`. Defaults to `disabled`. The legacy header `X-OpenRouter-Experimental-Metadata` is also accepted for backward compatibility.
:param background:
:param cache_control: Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. Currently supported for Anthropic Claude models.
:param debug: Debug options for inspecting request transformations (streaming only)
:param frequency_penalty:
:param image_config: Provider-specific image configuration options. Keys and values vary by model/provider. See https://openrouter.ai/docs/guides/overview/multimodal/image-generation for more details.
:param include:
@@ -1068,6 +1091,9 @@ class Responses(BaseSDK):
components.AnthropicCacheControlDirectiveTypedDict,
]
] = None,
debug: Optional[
Union[components.ChatDebugOptions, components.ChatDebugOptionsTypedDict]
] = None,
frequency_penalty: OptionalNullable[float] = UNSET,
image_config: Optional[
Union[
@@ -1163,6 +1189,7 @@ class Responses(BaseSDK):
:param x_open_router_metadata: Opt-in to surface routing metadata on the response under `openrouter_metadata`. Defaults to `disabled`. The legacy header `X-OpenRouter-Experimental-Metadata` is also accepted for backward compatibility.
:param background:
:param cache_control: Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. Currently supported for Anthropic Claude models.
:param debug: Debug options for inspecting request transformations (streaming only)
:param frequency_penalty:
:param image_config: Provider-specific image configuration options. Keys and values vary by model/provider. See https://openrouter.ai/docs/guides/overview/multimodal/image-generation for more details.
:param include:
@@ -1223,6 +1250,9 @@ class Responses(BaseSDK):
cache_control=utils.get_pydantic_model(
cache_control, Optional[components.AnthropicCacheControlDirective]
),
debug=utils.get_pydantic_model(
debug, Optional[components.ChatDebugOptions]
),
frequency_penalty=frequency_penalty,
image_config=image_config,
include=include,
+12
View File
@@ -18,9 +18,11 @@ import weakref
if TYPE_CHECKING:
from openrouter.analytics import Analytics
from openrouter.api_keys import APIKeys
from openrouter.benchmarks import Benchmarks
from openrouter.beta import Beta
from openrouter.byok import Byok
from openrouter.chat import Chat
from openrouter.classifications import Classifications
from openrouter.credits import Credits
from openrouter.datasets import Datasets
from openrouter.embeddings import Embeddings
@@ -28,6 +30,7 @@ if TYPE_CHECKING:
from openrouter.files import Files
from openrouter.generations import Generations
from openrouter.guardrails import Guardrails
from openrouter.images import Images
from openrouter.models_ import Models
from openrouter.oauth import OAuth
from openrouter.observability import Observability
@@ -55,9 +58,13 @@ class OpenRouter(BaseSDK):
r"""Speech-to-text endpoints"""
o_auth: "OAuth"
r"""OAuth authentication endpoints"""
benchmarks: "Benchmarks"
r"""Benchmarks endpoints"""
byok: "Byok"
r"""BYOK endpoints"""
chat: "Chat"
classifications: "Classifications"
r"""Task classification market-share endpoints"""
credits: "Credits"
r"""Credit management endpoints"""
datasets: "Datasets"
@@ -72,6 +79,8 @@ class OpenRouter(BaseSDK):
r"""Generation history endpoints"""
guardrails: "Guardrails"
r"""Guardrails endpoints"""
images: "Images"
r"""Images endpoints"""
api_keys: "APIKeys"
r"""API key management endpoints"""
models: "Models"
@@ -96,8 +105,10 @@ class OpenRouter(BaseSDK):
"tts": ("openrouter.tts", "Tts"),
"stt": ("openrouter.stt", "Stt"),
"o_auth": ("openrouter.oauth", "OAuth"),
"benchmarks": ("openrouter.benchmarks", "Benchmarks"),
"byok": ("openrouter.byok", "Byok"),
"chat": ("openrouter.chat", "Chat"),
"classifications": ("openrouter.classifications", "Classifications"),
"credits": ("openrouter.credits", "Credits"),
"datasets": ("openrouter.datasets", "Datasets"),
"embeddings": ("openrouter.embeddings", "Embeddings"),
@@ -105,6 +116,7 @@ class OpenRouter(BaseSDK):
"files": ("openrouter.files", "Files"),
"generations": ("openrouter.generations", "Generations"),
"guardrails": ("openrouter.guardrails", "Guardrails"),
"images": ("openrouter.images", "Images"),
"api_keys": ("openrouter.api_keys", "APIKeys"),
"models": ("openrouter.models_", "Models"),
"observability": ("openrouter.observability", "Observability"),
+4 -4
View File
@@ -21,7 +21,7 @@ class VideoGeneration(BaseSDK):
http_referer: Optional[str] = None,
x_open_router_title: Optional[str] = None,
x_open_router_categories: Optional[str] = None,
aspect_ratio: Optional[components.AspectRatio] = None,
aspect_ratio: Optional[components.VideoGenerationRequestAspectRatio] = None,
callback_url: Optional[str] = None,
duration: Optional[int] = None,
frame_images: Optional[
@@ -40,7 +40,7 @@ class VideoGeneration(BaseSDK):
components.VideoGenerationRequestProviderTypedDict,
]
] = None,
resolution: Optional[components.Resolution] = None,
resolution: Optional[components.VideoGenerationRequestResolution] = None,
seed: Optional[int] = None,
size: Optional[str] = None,
retries: OptionalNullable[utils.RetryConfig] = UNSET,
@@ -222,7 +222,7 @@ class VideoGeneration(BaseSDK):
http_referer: Optional[str] = None,
x_open_router_title: Optional[str] = None,
x_open_router_categories: Optional[str] = None,
aspect_ratio: Optional[components.AspectRatio] = None,
aspect_ratio: Optional[components.VideoGenerationRequestAspectRatio] = None,
callback_url: Optional[str] = None,
duration: Optional[int] = None,
frame_images: Optional[
@@ -241,7 +241,7 @@ class VideoGeneration(BaseSDK):
components.VideoGenerationRequestProviderTypedDict,
]
] = None,
resolution: Optional[components.Resolution] = None,
resolution: Optional[components.VideoGenerationRequestResolution] = None,
seed: Optional[int] = None,
size: Optional[str] = None,
retries: OptionalNullable[utils.RetryConfig] = UNSET,
Generated
+1 -1
View File
@@ -220,7 +220,7 @@ wheels = [
[[package]]
name = "openrouter"
version = "0.10.0"
version = "0.10.1"
source = { editable = "." }
dependencies = [
{ name = "httpcore" },