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

from __future__ import annotations
from .agenthandoffentry import AgentHandoffEntry, AgentHandoffEntryTypedDict
from .conversationusageinfo import ConversationUsageInfo, ConversationUsageInfoTypedDict
from .functioncallentry import FunctionCallEntry, FunctionCallEntryTypedDict
from .messageoutputentry import MessageOutputEntry, MessageOutputEntryTypedDict
from .toolexecutionentry import ToolExecutionEntry, ToolExecutionEntryTypedDict
from mistralai.client.types import (
    BaseModel,
    Nullable,
    OptionalNullable,
    UNSET,
    UNSET_SENTINEL,
)
from mistralai.client.utils import validate_const
import pydantic
from pydantic import 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


ConversationResponseOutputTypedDict = TypeAliasType(
    "ConversationResponseOutputTypedDict",
    Union[
        MessageOutputEntryTypedDict,
        AgentHandoffEntryTypedDict,
        ToolExecutionEntryTypedDict,
        FunctionCallEntryTypedDict,
    ],
)


ConversationResponseOutput = TypeAliasType(
    "ConversationResponseOutput",
    Union[MessageOutputEntry, AgentHandoffEntry, ToolExecutionEntry, FunctionCallEntry],
)


class ConversationResponseTypedDict(TypedDict):
    r"""The response after appending new entries to the conversation."""

    conversation_id: str
    outputs: List[ConversationResponseOutputTypedDict]
    usage: ConversationUsageInfoTypedDict
    object: Literal["conversation.response"]
    guardrails: NotRequired[Nullable[List[Dict[str, Any]]]]


class ConversationResponse(BaseModel):
    r"""The response after appending new entries to the conversation."""

    conversation_id: str

    outputs: List[ConversationResponseOutput]

    usage: ConversationUsageInfo

    object: Annotated[
        Annotated[
            Optional[Literal["conversation.response"]],
            AfterValidator(validate_const("conversation.response")),
        ],
        pydantic.Field(alias="object"),
    ] = "conversation.response"

    guardrails: OptionalNullable[List[Dict[str, Any]]] = UNSET

    @model_serializer(mode="wrap")
    def serialize_model(self, handler):
        optional_fields = set(["object", "guardrails"])
        nullable_fields = set(["guardrails"])
        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:
    ConversationResponse.model_rebuild()
except NameError:
    pass
