"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""

from __future__ import annotations
from opperai.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL
from pydantic import model_serializer
from typing import Any, Dict, List, Optional
from typing_extensions import NotRequired, TypedDict


class AppAPIPublicV2FunctionsCallFunctionResponseTypedDict(TypedDict):
    span_id: str
    r"""The ID of the span of the call"""
    message: NotRequired[Nullable[str]]
    r"""Result of the task if the call does not use an output schema"""
    json_payload: NotRequired[Nullable[Any]]
    r"""Result of the task if the call uses an output schema"""
    cached: NotRequired[bool]
    r"""True if the result was returned from a cached results"""
    images: NotRequired[Nullable[List[str]]]
    r"""The images generated by the call. Only available for image models. Depending on the configuration, the response can either be a list of image urls or a base64 encoded images."""
    usage: NotRequired[Nullable[Dict[str, Any]]]
    r"""The usage of the call split into input and output tokens as well as the total tokens and an optional breakdown of the input and output tokens.The input tokens are the tokens sent to the model and the output tokens are the tokens received from the model. The total tokens is the sum of input and output tokens."""
    cost: NotRequired[Nullable[Dict[str, Any]]]
    r"""The cost in USD of the call split into total, generation and platform costs where total is the sum of generation and platform costs"""


class AppAPIPublicV2FunctionsCallFunctionResponse(BaseModel):
    span_id: str
    r"""The ID of the span of the call"""

    message: OptionalNullable[str] = UNSET
    r"""Result of the task if the call does not use an output schema"""

    json_payload: OptionalNullable[Any] = UNSET
    r"""Result of the task if the call uses an output schema"""

    cached: Optional[bool] = False
    r"""True if the result was returned from a cached results"""

    images: OptionalNullable[List[str]] = UNSET
    r"""The images generated by the call. Only available for image models. Depending on the configuration, the response can either be a list of image urls or a base64 encoded images."""

    usage: OptionalNullable[Dict[str, Any]] = UNSET
    r"""The usage of the call split into input and output tokens as well as the total tokens and an optional breakdown of the input and output tokens.The input tokens are the tokens sent to the model and the output tokens are the tokens received from the model. The total tokens is the sum of input and output tokens."""

    cost: OptionalNullable[Dict[str, Any]] = UNSET
    r"""The cost in USD of the call split into total, generation and platform costs where total is the sum of generation and platform costs"""

    @model_serializer(mode="wrap")
    def serialize_model(self, handler):
        optional_fields = [
            "message",
            "json_payload",
            "cached",
            "images",
            "usage",
            "cost",
        ]
        nullable_fields = ["message", "json_payload", "images", "usage", "cost"]
        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
