"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
# @generated-id: 58e3ae67f149

from __future__ import annotations
from .codeinterpretertool import CodeInterpreterTool, CodeInterpreterToolTypedDict
from .completionargs import CompletionArgs, CompletionArgsTypedDict
from .conversationinputs import ConversationInputs, ConversationInputsTypedDict
from .customconnector import CustomConnector, CustomConnectorTypedDict
from .documentlibrarytool import DocumentLibraryTool, DocumentLibraryToolTypedDict
from .functiontool import FunctionTool, FunctionToolTypedDict
from .guardrailconfig import GuardrailConfig, GuardrailConfigTypedDict
from .imagegenerationtool import ImageGenerationTool, ImageGenerationToolTypedDict
from .websearchpremiumtool import WebSearchPremiumTool, WebSearchPremiumToolTypedDict
from .websearchtool import WebSearchTool, WebSearchToolTypedDict
from mistralai.client.types import (
    BaseModel,
    Nullable,
    OptionalNullable,
    UNSET,
    UNSET_SENTINEL,
)
from mistralai.client.utils import validate_const
import pydantic
from pydantic import Field, model_serializer
from pydantic.functional_validators import AfterValidator
from typing import Any, Dict, List, Literal, Optional, Union
from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict


ConversationRequestHandoffExecution = Literal[
    "client",
    "server",
]


ConversationRequestToolTypedDict = TypeAliasType(
    "ConversationRequestToolTypedDict",
    Union[
        FunctionToolTypedDict,
        WebSearchToolTypedDict,
        WebSearchPremiumToolTypedDict,
        CodeInterpreterToolTypedDict,
        ImageGenerationToolTypedDict,
        DocumentLibraryToolTypedDict,
        CustomConnectorTypedDict,
    ],
)


ConversationRequestTool = Annotated[
    Union[
        CodeInterpreterTool,
        CustomConnector,
        DocumentLibraryTool,
        FunctionTool,
        ImageGenerationTool,
        WebSearchTool,
        WebSearchPremiumTool,
    ],
    Field(discriminator="type"),
]


ConversationRequestAgentVersionTypedDict = TypeAliasType(
    "ConversationRequestAgentVersionTypedDict", Union[str, int]
)


ConversationRequestAgentVersion = TypeAliasType(
    "ConversationRequestAgentVersion", Union[str, int]
)


class ConversationRequestTypedDict(TypedDict):
    inputs: ConversationInputsTypedDict
    stream: Literal[False]
    store: NotRequired[Nullable[bool]]
    handoff_execution: NotRequired[Nullable[ConversationRequestHandoffExecution]]
    instructions: NotRequired[Nullable[str]]
    tools: NotRequired[Nullable[List[ConversationRequestToolTypedDict]]]
    completion_args: NotRequired[Nullable[CompletionArgsTypedDict]]
    guardrails: NotRequired[Nullable[List[GuardrailConfigTypedDict]]]
    name: NotRequired[Nullable[str]]
    description: NotRequired[Nullable[str]]
    metadata: NotRequired[Nullable[Dict[str, Any]]]
    agent_id: NotRequired[Nullable[str]]
    agent_version: NotRequired[Nullable[ConversationRequestAgentVersionTypedDict]]
    model: NotRequired[Nullable[str]]


class ConversationRequest(BaseModel):
    inputs: ConversationInputs

    stream: Annotated[
        Annotated[Optional[Literal[False]], AfterValidator(validate_const(False))],
        pydantic.Field(alias="stream"),
    ] = False

    store: OptionalNullable[bool] = UNSET

    handoff_execution: OptionalNullable[ConversationRequestHandoffExecution] = UNSET

    instructions: OptionalNullable[str] = UNSET

    tools: OptionalNullable[List[ConversationRequestTool]] = UNSET

    completion_args: OptionalNullable[CompletionArgs] = UNSET

    guardrails: OptionalNullable[List[GuardrailConfig]] = UNSET

    name: OptionalNullable[str] = UNSET

    description: OptionalNullable[str] = UNSET

    metadata: OptionalNullable[Dict[str, Any]] = UNSET

    agent_id: OptionalNullable[str] = UNSET

    agent_version: OptionalNullable[ConversationRequestAgentVersion] = UNSET

    model: OptionalNullable[str] = UNSET

    @model_serializer(mode="wrap")
    def serialize_model(self, handler):
        optional_fields = set(
            [
                "stream",
                "store",
                "handoff_execution",
                "instructions",
                "tools",
                "completion_args",
                "guardrails",
                "name",
                "description",
                "metadata",
                "agent_id",
                "agent_version",
                "model",
            ]
        )
        nullable_fields = set(
            [
                "store",
                "handoff_execution",
                "instructions",
                "tools",
                "completion_args",
                "guardrails",
                "name",
                "description",
                "metadata",
                "agent_id",
                "agent_version",
                "model",
            ]
        )
        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


try:
    ConversationRequest.model_rebuild()
except NameError:
    pass
