"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations from .providerresponse import ProviderResponse, ProviderResponseTypedDict 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, Union from typing_extensions import Annotated, NotRequired, TypedDict APIType = Union[ Literal[ "completions", "embeddings", "rerank", "tts", "stt", "video", "image", ], UnrecognizedStr, ] r"""Type of API used for the generation""" DataRegion = Union[ Literal[ "global", "europe", ], UnrecognizedStr, ] r"""The data region this generation was routed through. 'europe' for EU-routed requests, 'global' otherwise.""" class GenerationResponseDataTypedDict(TypedDict): r"""Generation data""" api_type: Nullable[APIType] r"""Type of API used for the generation""" app_id: Nullable[int] r"""ID of the app that made the request""" cache_discount: Nullable[float] r"""Discount applied due to caching""" cancelled: Nullable[bool] r"""Whether the generation was cancelled""" created_at: str r"""ISO 8601 timestamp of when the generation was created""" data_region: DataRegion r"""The data region this generation was routed through. 'europe' for EU-routed requests, 'global' otherwise.""" external_user: Nullable[str] r"""External user identifier""" finish_reason: Nullable[str] r"""Reason the generation finished""" generation_time: Nullable[float] r"""Time taken for generation in milliseconds""" http_referer: Nullable[str] r"""Referer header from the request""" id: str r"""Unique identifier for the generation""" is_byok: bool r"""Whether this used bring-your-own-key""" latency: Nullable[float] r"""Total latency in milliseconds""" model: str r"""Model used for the generation""" moderation_latency: Nullable[float] r"""Moderation latency in milliseconds""" native_finish_reason: Nullable[str] r"""Native finish reason as reported by provider""" native_tokens_cached: Nullable[int] r"""Native cached tokens as reported by provider""" native_tokens_completion: Nullable[int] r"""Native completion tokens as reported by provider""" native_tokens_completion_images: Nullable[int] r"""Native completion image tokens as reported by provider""" native_tokens_prompt: Nullable[int] r"""Native prompt tokens as reported by provider""" native_tokens_reasoning: Nullable[int] r"""Native reasoning tokens as reported by provider""" num_fetches: Nullable[int] r"""Number of web fetches performed""" num_input_audio_prompt: Nullable[int] r"""Number of audio inputs in the prompt""" num_media_completion: Nullable[int] r"""Number of media items in the completion""" num_media_prompt: Nullable[int] r"""Number of media items in the prompt""" num_search_results: Nullable[int] r"""Number of search results included""" origin: str r"""Origin URL of the request""" preset_id: Nullable[str] r"""ID of the preset used for this generation, null if no preset was used""" provider_name: Nullable[str] r"""Name of the provider that served the request""" provider_responses: Nullable[List[ProviderResponseTypedDict]] r"""List of provider responses for this generation, including fallback attempts""" router: Nullable[str] r"""Router used for the request (e.g., openrouter/auto)""" service_tier: Nullable[str] r"""Service tier the upstream provider reported running this request on, or null if it did not report one.""" streamed: Nullable[bool] r"""Whether the response was streamed""" tokens_completion: Nullable[int] r"""Number of tokens in the completion""" tokens_prompt: Nullable[int] r"""Number of tokens in the prompt""" total_cost: float r"""Total cost of the generation in USD""" upstream_id: Nullable[str] r"""Upstream provider's identifier for this generation""" upstream_inference_cost: Nullable[float] r"""Cost charged by the upstream provider""" usage: float r"""Usage amount in USD""" user_agent: Nullable[str] r"""User-Agent header from the request""" web_search_engine: Nullable[str] r"""The resolved web search engine used for this generation (e.g. exa, firecrawl, parallel)""" request_id: NotRequired[Nullable[str]] r"""Unique identifier grouping all generations from a single API request""" response_cache_source_id: NotRequired[Nullable[str]] r"""If this generation was served from response cache, contains the original generation ID. Null otherwise.""" session_id: NotRequired[Nullable[str]] r"""Session identifier grouping multiple generations in the same session""" class GenerationResponseData(BaseModel): r"""Generation data""" api_type: Annotated[Nullable[APIType], PlainValidator(validate_open_enum(False))] r"""Type of API used for the generation""" app_id: Nullable[int] r"""ID of the app that made the request""" cache_discount: Nullable[float] r"""Discount applied due to caching""" cancelled: Nullable[bool] r"""Whether the generation was cancelled""" created_at: str r"""ISO 8601 timestamp of when the generation was created""" data_region: Annotated[DataRegion, PlainValidator(validate_open_enum(False))] r"""The data region this generation was routed through. 'europe' for EU-routed requests, 'global' otherwise.""" external_user: Nullable[str] r"""External user identifier""" finish_reason: Nullable[str] r"""Reason the generation finished""" generation_time: Nullable[float] r"""Time taken for generation in milliseconds""" http_referer: Nullable[str] r"""Referer header from the request""" id: str r"""Unique identifier for the generation""" is_byok: bool r"""Whether this used bring-your-own-key""" latency: Nullable[float] r"""Total latency in milliseconds""" model: str r"""Model used for the generation""" moderation_latency: Nullable[float] r"""Moderation latency in milliseconds""" native_finish_reason: Nullable[str] r"""Native finish reason as reported by provider""" native_tokens_cached: Nullable[int] r"""Native cached tokens as reported by provider""" native_tokens_completion: Nullable[int] r"""Native completion tokens as reported by provider""" native_tokens_completion_images: Nullable[int] r"""Native completion image tokens as reported by provider""" native_tokens_prompt: Nullable[int] r"""Native prompt tokens as reported by provider""" native_tokens_reasoning: Nullable[int] r"""Native reasoning tokens as reported by provider""" num_fetches: Nullable[int] r"""Number of web fetches performed""" num_input_audio_prompt: Nullable[int] r"""Number of audio inputs in the prompt""" num_media_completion: Nullable[int] r"""Number of media items in the completion""" num_media_prompt: Nullable[int] r"""Number of media items in the prompt""" num_search_results: Nullable[int] r"""Number of search results included""" origin: str r"""Origin URL of the request""" preset_id: Nullable[str] r"""ID of the preset used for this generation, null if no preset was used""" provider_name: Nullable[str] r"""Name of the provider that served the request""" provider_responses: Nullable[List[ProviderResponse]] r"""List of provider responses for this generation, including fallback attempts""" router: Nullable[str] r"""Router used for the request (e.g., openrouter/auto)""" service_tier: Nullable[str] r"""Service tier the upstream provider reported running this request on, or null if it did not report one.""" streamed: Nullable[bool] r"""Whether the response was streamed""" tokens_completion: Nullable[int] r"""Number of tokens in the completion""" tokens_prompt: Nullable[int] r"""Number of tokens in the prompt""" total_cost: float r"""Total cost of the generation in USD""" upstream_id: Nullable[str] r"""Upstream provider's identifier for this generation""" upstream_inference_cost: Nullable[float] r"""Cost charged by the upstream provider""" usage: float r"""Usage amount in USD""" user_agent: Nullable[str] r"""User-Agent header from the request""" web_search_engine: Nullable[str] r"""The resolved web search engine used for this generation (e.g. exa, firecrawl, parallel)""" request_id: OptionalNullable[str] = UNSET r"""Unique identifier grouping all generations from a single API request""" response_cache_source_id: OptionalNullable[str] = UNSET r"""If this generation was served from response cache, contains the original generation ID. Null otherwise.""" session_id: OptionalNullable[str] = UNSET r"""Session identifier grouping multiple generations in the same session""" @model_serializer(mode="wrap") def serialize_model(self, handler): optional_fields = ["request_id", "response_cache_source_id", "session_id"] nullable_fields = [ "api_type", "app_id", "cache_discount", "cancelled", "external_user", "finish_reason", "generation_time", "http_referer", "latency", "moderation_latency", "native_finish_reason", "native_tokens_cached", "native_tokens_completion", "native_tokens_completion_images", "native_tokens_prompt", "native_tokens_reasoning", "num_fetches", "num_input_audio_prompt", "num_media_completion", "num_media_prompt", "num_search_results", "preset_id", "provider_name", "provider_responses", "request_id", "response_cache_source_id", "router", "service_tier", "session_id", "streamed", "tokens_completion", "tokens_prompt", "upstream_id", "upstream_inference_cost", "user_agent", "web_search_engine", ] 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 GenerationResponseTypedDict(TypedDict): r"""Generation response""" data: GenerationResponseDataTypedDict r"""Generation data""" class GenerationResponse(BaseModel): r"""Generation response""" data: GenerationResponseData r"""Generation data"""