# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

from typing import Dict, List, Union, Optional
from typing_extensions import Literal, Annotated, TypeAlias

from ..._utils import PropertyInfo
from ..._models import BaseModel
from ..completion_usage import CompletionUsage
from .chat_completion_message import ChatCompletionMessage
from .chat_completion_token_logprob import ChatCompletionTokenLogprob

__all__ = [
    "ChatCompletion",
    "Choice",
    "ChoiceLogprobs",
    "Moderation",
    "ModerationInput",
    "ModerationInputModerationResults",
    "ModerationInputModerationResultsResult",
    "ModerationInputError",
    "ModerationOutput",
    "ModerationOutputModerationResults",
    "ModerationOutputModerationResultsResult",
    "ModerationOutputError",
]


class ChoiceLogprobs(BaseModel):
    """Log probability information for the choice."""

    content: Optional[List[ChatCompletionTokenLogprob]] = None
    """A list of message content tokens with log probability information."""

    refusal: Optional[List[ChatCompletionTokenLogprob]] = None
    """A list of message refusal tokens with log probability information."""


class Choice(BaseModel):
    finish_reason: Literal["stop", "length", "tool_calls", "content_filter", "function_call"]
    """The reason the model stopped generating tokens.

    This will be `stop` if the model hit a natural stop point or a provided stop
    sequence, `length` if the maximum number of tokens specified in the request was
    reached, `content_filter` if content was omitted due to a flag from our content
    filters, `tool_calls` if the model called a tool, or `function_call`
    (deprecated) if the model called a function. Read the
    [Model Spec](https://model-spec.openai.com/2025-12-18.html) for more.
    """

    index: int
    """The index of the choice in the list of choices."""

    logprobs: Optional[ChoiceLogprobs] = None
    """Log probability information for the choice."""

    message: ChatCompletionMessage
    """A chat completion message generated by the model."""


class ModerationInputModerationResultsResult(BaseModel):
    """A moderation result produced for the response input or output."""

    categories: Dict[str, bool]
    """
    A dictionary of moderation categories to booleans, True if the input is flagged
    under this category.
    """

    category_applied_input_types: Dict[str, List[Literal["text", "image"]]]
    """Which modalities of input are reflected by the score for each category."""

    category_scores: Dict[str, float]
    """A dictionary of moderation categories to scores."""

    flagged: bool
    """A boolean indicating whether the content was flagged by any category."""

    model: str
    """The moderation model that produced this result."""

    type: Literal["moderation_result"]
    """
    The object type, which was always `moderation_result` for successful moderation
    results.
    """


class ModerationInputModerationResults(BaseModel):
    """Successful moderation results for the request input or generated output."""

    model: str
    """The moderation model used to generate the results."""

    results: List[ModerationInputModerationResultsResult]
    """A list of moderation results."""

    type: Literal["moderation_results"]
    """The object type, which is always `moderation_results`."""


class ModerationInputError(BaseModel):
    """An error produced while attempting moderation."""

    code: str
    """The error code."""

    message: str
    """The error message."""

    type: Literal["error"]
    """The object type, which is always `error`."""


ModerationInput: TypeAlias = Annotated[
    Union[ModerationInputModerationResults, ModerationInputError], PropertyInfo(discriminator="type")
]


class ModerationOutputModerationResultsResult(BaseModel):
    """A moderation result produced for the response input or output."""

    categories: Dict[str, bool]
    """
    A dictionary of moderation categories to booleans, True if the input is flagged
    under this category.
    """

    category_applied_input_types: Dict[str, List[Literal["text", "image"]]]
    """Which modalities of input are reflected by the score for each category."""

    category_scores: Dict[str, float]
    """A dictionary of moderation categories to scores."""

    flagged: bool
    """A boolean indicating whether the content was flagged by any category."""

    model: str
    """The moderation model that produced this result."""

    type: Literal["moderation_result"]
    """
    The object type, which was always `moderation_result` for successful moderation
    results.
    """


class ModerationOutputModerationResults(BaseModel):
    """Successful moderation results for the request input or generated output."""

    model: str
    """The moderation model used to generate the results."""

    results: List[ModerationOutputModerationResultsResult]
    """A list of moderation results."""

    type: Literal["moderation_results"]
    """The object type, which is always `moderation_results`."""


class ModerationOutputError(BaseModel):
    """An error produced while attempting moderation."""

    code: str
    """The error code."""

    message: str
    """The error message."""

    type: Literal["error"]
    """The object type, which is always `error`."""


ModerationOutput: TypeAlias = Annotated[
    Union[ModerationOutputModerationResults, ModerationOutputError], PropertyInfo(discriminator="type")
]


class Moderation(BaseModel):
    """
    Moderation results for the request input and generated output, if moderated
    completions were requested.
    """

    input: ModerationInput
    """Moderation for the request input."""

    output: ModerationOutput
    """Moderation for the generated output."""


class ChatCompletion(BaseModel):
    """
    Represents a chat completion response returned by model, based on the provided input.
    """

    id: str
    """A unique identifier for the chat completion."""

    choices: List[Choice]
    """A list of chat completion choices.

    Can be more than one if `n` is greater than 1.
    """

    created: int
    """The Unix timestamp (in seconds) of when the chat completion was created."""

    model: str
    """The model used for the chat completion."""

    object: Literal["chat.completion"]
    """The object type, which is always `chat.completion`."""

    moderation: Optional[Moderation] = None
    """
    Moderation results for the request input and generated output, if moderated
    completions were requested.
    """

    service_tier: Optional[Literal["auto", "default", "flex", "scale", "priority"]] = None
    """Specifies the processing type used for serving the request.

    - If set to 'auto', then the request will be processed with the service tier
      configured in the Project settings. Unless otherwise configured, the Project
      will use 'default'.
    - If set to 'default', then the request will be processed with the standard
      pricing and performance for the selected model.
    - If set to '[flex](https://platform.openai.com/docs/guides/flex-processing)' or
      '[priority](https://openai.com/api-priority-processing/)', then the request
      will be processed with the corresponding service tier.
    - When not set, the default behavior is 'auto'.

    When the `service_tier` parameter is set, the response body will include the
    `service_tier` value based on the processing mode actually used to serve the
    request. This response value may be different from the value set in the
    parameter.
    """

    system_fingerprint: Optional[str] = None
    """This fingerprint represents the backend configuration that the model runs with.

    Can be used in conjunction with the `seed` request parameter to understand when
    backend changes have been made that might impact determinism.
    """

    usage: Optional[CompletionUsage] = None
    """Usage statistics for the completion request."""
