"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations from .inputaudio import InputAudio, InputAudioTypedDict from .inputfile import InputFile, InputFileTypedDict from .inputtext import InputText, InputTextTypedDict from .inputvideo import InputVideo, InputVideoTypedDict from openrouter.types import ( BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL, UnrecognizedStr, ) from openrouter.utils import get_discriminator from pydantic import Discriminator, Tag, model_serializer from typing import Any, List, Literal, Optional, Union from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict EasyInputMessageDetail = Union[ Literal[ "auto", "high", "low", "original", ], UnrecognizedStr, ] EasyInputMessageTypeInputImage = Literal["input_image",] class EasyInputMessageContentInputImageTypedDict(TypedDict): r"""Image input content item""" detail: EasyInputMessageDetail type: EasyInputMessageTypeInputImage image_url: NotRequired[Nullable[str]] class EasyInputMessageContentInputImage(BaseModel): r"""Image input content item""" detail: EasyInputMessageDetail type: EasyInputMessageTypeInputImage image_url: OptionalNullable[str] = UNSET @model_serializer(mode="wrap") def serialize_model(self, handler): optional_fields = set(["image_url"]) nullable_fields = set(["image_url"]) serialized = handler(self) m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k, serialized.get(n)) is_nullable_and_explicitly_set = ( k in nullable_fields and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member ) if val != UNSET_SENTINEL: if ( val is not None or k not in optional_fields or is_nullable_and_explicitly_set ): m[k] = val return m EasyInputMessageContentUnion1TypedDict = TypeAliasType( "EasyInputMessageContentUnion1TypedDict", Union[ InputAudioTypedDict, InputVideoTypedDict, InputTextTypedDict, EasyInputMessageContentInputImageTypedDict, InputFileTypedDict, ], ) EasyInputMessageContentUnion1 = Annotated[ Union[ Annotated[InputText, Tag("input_text")], Annotated[EasyInputMessageContentInputImage, Tag("input_image")], Annotated[InputFile, Tag("input_file")], Annotated[InputAudio, Tag("input_audio")], Annotated[InputVideo, Tag("input_video")], ], Discriminator(lambda m: get_discriminator(m, "type", "type")), ] EasyInputMessageContentUnion2TypedDict = TypeAliasType( "EasyInputMessageContentUnion2TypedDict", Union[List[EasyInputMessageContentUnion1TypedDict], str, Any], ) EasyInputMessageContentUnion2 = TypeAliasType( "EasyInputMessageContentUnion2", Union[List[EasyInputMessageContentUnion1], str, Any], ) EasyInputMessagePhaseFinalAnswer = Literal["final_answer",] EasyInputMessagePhaseCommentary = Literal["commentary",] EasyInputMessagePhaseUnionTypedDict = TypeAliasType( "EasyInputMessagePhaseUnionTypedDict", Union[EasyInputMessagePhaseCommentary, EasyInputMessagePhaseFinalAnswer, Any], ) r"""The phase of an assistant message. Use `commentary` for an intermediate assistant message and `final_answer` for the final assistant message. For follow-up requests with models like `gpt-5.3-codex` and later, preserve and resend phase on all assistant messages. Omitting it can degrade performance. Not used for user messages.""" EasyInputMessagePhaseUnion = TypeAliasType( "EasyInputMessagePhaseUnion", Union[EasyInputMessagePhaseCommentary, EasyInputMessagePhaseFinalAnswer, Any], ) r"""The phase of an assistant message. Use `commentary` for an intermediate assistant message and `final_answer` for the final assistant message. For follow-up requests with models like `gpt-5.3-codex` and later, preserve and resend phase on all assistant messages. Omitting it can degrade performance. Not used for user messages.""" EasyInputMessageRoleDeveloper = Literal["developer",] EasyInputMessageRoleAssistant = Literal["assistant",] EasyInputMessageRoleSystem = Literal["system",] EasyInputMessageRoleUser = Literal["user",] EasyInputMessageRoleUnionTypedDict = TypeAliasType( "EasyInputMessageRoleUnionTypedDict", Union[ EasyInputMessageRoleUser, EasyInputMessageRoleSystem, EasyInputMessageRoleAssistant, EasyInputMessageRoleDeveloper, ], ) EasyInputMessageRoleUnion = TypeAliasType( "EasyInputMessageRoleUnion", Union[ EasyInputMessageRoleUser, EasyInputMessageRoleSystem, EasyInputMessageRoleAssistant, EasyInputMessageRoleDeveloper, ], ) EasyInputMessageTypeMessage = Literal["message",] class EasyInputMessageTypedDict(TypedDict): role: EasyInputMessageRoleUnionTypedDict content: NotRequired[Nullable[EasyInputMessageContentUnion2TypedDict]] phase: NotRequired[Nullable[EasyInputMessagePhaseUnionTypedDict]] r"""The phase of an assistant message. Use `commentary` for an intermediate assistant message and `final_answer` for the final assistant message. For follow-up requests with models like `gpt-5.3-codex` and later, preserve and resend phase on all assistant messages. Omitting it can degrade performance. Not used for user messages.""" type: NotRequired[EasyInputMessageTypeMessage] class EasyInputMessage(BaseModel): role: EasyInputMessageRoleUnion content: OptionalNullable[EasyInputMessageContentUnion2] = UNSET phase: OptionalNullable[EasyInputMessagePhaseUnion] = UNSET r"""The phase of an assistant message. Use `commentary` for an intermediate assistant message and `final_answer` for the final assistant message. For follow-up requests with models like `gpt-5.3-codex` and later, preserve and resend phase on all assistant messages. Omitting it can degrade performance. Not used for user messages.""" type: Optional[EasyInputMessageTypeMessage] = None @model_serializer(mode="wrap") def serialize_model(self, handler): optional_fields = set(["content", "phase", "type"]) nullable_fields = set(["content", "phase"]) serialized = handler(self) m = {} for n, f in type(self).model_fields.items(): k = f.alias or n val = serialized.get(k, serialized.get(n)) is_nullable_and_explicitly_set = ( k in nullable_fields and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member ) if val != UNSET_SENTINEL: if ( val is not None or k not in optional_fields or is_nullable_and_explicitly_set ): m[k] = val return m