"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations from openrouter.components import providerresponse as components_providerresponse from openrouter.types import ( BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL, UnrecognizedStr, ) from openrouter.utils import ( FieldMetadata, HeaderMetadata, QueryParamMetadata, validate_open_enum, ) import pydantic 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 class GetGenerationGlobalsTypedDict(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 GetGenerationGlobals(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 GetGenerationRequestTypedDict(TypedDict): id: str r"""The generation ID""" 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 GetGenerationRequest(BaseModel): id: Annotated[ str, FieldMetadata(query=QueryParamMetadata(style="form", explode=True)) ] r"""The generation ID""" 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. """ APIType = Union[ Literal[ "completions", "embeddings", "rerank", "video", ], UnrecognizedStr, ] r"""Type of API used for the generation""" class GetGenerationDataTypedDict(TypedDict): r"""Generation data""" api_type: Nullable[APIType] r"""Type of API used for the generation""" app_id: int r"""ID of the app that made the request""" cache_discount: 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""" external_user: Nullable[str] r"""External user identifier""" finish_reason: Nullable[str] r"""Reason the generation finished""" generation_time: 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: float r"""Total latency in milliseconds""" model: str r"""Model used for the generation""" moderation_latency: float r"""Moderation latency in milliseconds""" native_finish_reason: Nullable[str] r"""Native finish reason as reported by provider""" native_tokens_cached: int r"""Native cached tokens as reported by provider""" native_tokens_completion: int r"""Native completion tokens as reported by provider""" native_tokens_completion_images: int r"""Native completion image tokens as reported by provider""" native_tokens_prompt: int r"""Native prompt tokens as reported by provider""" native_tokens_reasoning: int r"""Native reasoning tokens as reported by provider""" num_input_audio_prompt: int r"""Number of audio inputs in the prompt""" num_media_completion: int r"""Number of media items in the completion""" num_media_prompt: int r"""Number of media items in the prompt""" num_search_results: int r"""Number of search results included""" origin: str r"""Origin URL of the request""" provider_name: Nullable[str] r"""Name of the provider that served the request""" provider_responses: Nullable[ List[components_providerresponse.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)""" streamed: Nullable[bool] r"""Whether the response was streamed""" tokens_completion: int r"""Number of tokens in the completion""" tokens_prompt: 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: 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""" request_id: NotRequired[Nullable[str]] r"""Unique identifier grouping all generations from a single API request""" session_id: NotRequired[Nullable[str]] r"""Session identifier grouping multiple generations in the same session""" class GetGenerationData(BaseModel): r"""Generation data""" api_type: Annotated[Nullable[APIType], PlainValidator(validate_open_enum(False))] r"""Type of API used for the generation""" app_id: int r"""ID of the app that made the request""" cache_discount: 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""" external_user: Nullable[str] r"""External user identifier""" finish_reason: Nullable[str] r"""Reason the generation finished""" generation_time: 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: float r"""Total latency in milliseconds""" model: str r"""Model used for the generation""" moderation_latency: float r"""Moderation latency in milliseconds""" native_finish_reason: Nullable[str] r"""Native finish reason as reported by provider""" native_tokens_cached: int r"""Native cached tokens as reported by provider""" native_tokens_completion: int r"""Native completion tokens as reported by provider""" native_tokens_completion_images: int r"""Native completion image tokens as reported by provider""" native_tokens_prompt: int r"""Native prompt tokens as reported by provider""" native_tokens_reasoning: int r"""Native reasoning tokens as reported by provider""" num_input_audio_prompt: int r"""Number of audio inputs in the prompt""" num_media_completion: int r"""Number of media items in the completion""" num_media_prompt: int r"""Number of media items in the prompt""" num_search_results: int r"""Number of search results included""" origin: str r"""Origin URL of the request""" provider_name: Nullable[str] r"""Name of the provider that served the request""" provider_responses: Nullable[List[components_providerresponse.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)""" streamed: Nullable[bool] r"""Whether the response was streamed""" tokens_completion: int r"""Number of tokens in the completion""" tokens_prompt: 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: 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""" request_id: OptionalNullable[str] = UNSET r"""Unique identifier grouping all generations from a single API request""" 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", "session_id"] nullable_fields = [ "api_type", "cancelled", "external_user", "finish_reason", "http_referer", "native_finish_reason", "provider_name", "provider_responses", "request_id", "router", "session_id", "streamed", "upstream_id", "user_agent", ] 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 GetGenerationResponseTypedDict(TypedDict): r"""Generation response""" data: GetGenerationDataTypedDict r"""Generation data""" class GetGenerationResponse(BaseModel): r"""Generation response""" data: GetGenerationData r"""Generation data"""