# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# pyformat: disable

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

from __future__ import annotations
from .. import BaseModel, UNSET_SENTINEL, UnrecognizedStr
from .servicetier import ServiceTier
from .step import Step, StepParam
from .usage import Usage, UsageTypedDict
from pydantic import model_serializer
from typing import List, Literal, Optional, Union
from typing_extensions import NotRequired, TypedDict


InteractionSseEventInteractionStatus = Union[
    Literal[
        "in_progress",
        "requires_action",
        "completed",
        "failed",
        "cancelled",
        "incomplete",
    ],
    UnrecognizedStr,
]
r"""Required. Output only. The status of the interaction."""


class InteractionSseEventInteractionTypedDict(TypedDict):
    r"""Partial interaction resource emitted by interaction lifecycle SSE events.
    Streaming lifecycle payloads may omit fields that are only available on
    full non-streaming Interaction responses.

    """

    id: str
    r"""Required. Output only. A unique identifier for the interaction completion."""
    status: InteractionSseEventInteractionStatus
    r"""Required. Output only. The status of the interaction."""
    object: NotRequired[str]
    r"""Output only. The resource type."""
    model: NotRequired[str]
    r"""The model that will complete your prompt."""
    agent: NotRequired[str]
    r"""The agent to interact with."""
    created: NotRequired[str]
    r"""Output only. The time at which the response was created in ISO 8601 format."""
    updated: NotRequired[str]
    r"""Output only. The time at which the response was last updated in ISO 8601 format."""
    service_tier: NotRequired[ServiceTier]
    usage: NotRequired[UsageTypedDict]
    r"""Statistics on the interaction request's token usage."""
    steps: NotRequired[List[StepParam]]
    r"""Output only. The steps that make up the interaction, if included in this event."""


class InteractionSseEventInteraction(BaseModel):
    r"""Partial interaction resource emitted by interaction lifecycle SSE events.
    Streaming lifecycle payloads may omit fields that are only available on
    full non-streaming Interaction responses.

    """

    id: str
    r"""Required. Output only. A unique identifier for the interaction completion."""

    status: InteractionSseEventInteractionStatus
    r"""Required. Output only. The status of the interaction."""

    object: Optional[str] = None
    r"""Output only. The resource type."""

    model: Optional[str] = None
    r"""The model that will complete your prompt."""

    agent: Optional[str] = None
    r"""The agent to interact with."""

    created: Optional[str] = None
    r"""Output only. The time at which the response was created in ISO 8601 format."""

    updated: Optional[str] = None
    r"""Output only. The time at which the response was last updated in ISO 8601 format."""

    service_tier: Optional[ServiceTier] = None

    usage: Optional[Usage] = None
    r"""Statistics on the interaction request's token usage."""

    steps: Optional[List[Step]] = None
    r"""Output only. The steps that make up the interaction, if included in this event."""

    @model_serializer(mode="wrap")
    def serialize_model(self, handler):
        optional_fields = set(
            [
                "object",
                "model",
                "agent",
                "created",
                "updated",
                "service_tier",
                "usage",
                "steps",
            ]
        )
        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))

            if val != UNSET_SENTINEL:
                if val is not None or k not in optional_fields:
                    m[k] = val

        return m
