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

from __future__ import annotations
from .checkpoint import Checkpoint, CheckpointTypedDict
from .classifiertargetresult import (
    ClassifierTargetResult,
    ClassifierTargetResultTypedDict,
)
from .classifiertrainingparameters import (
    ClassifierTrainingParameters,
    ClassifierTrainingParametersTypedDict,
)
from .event import Event, EventTypedDict
from .jobmetadata import JobMetadata, JobMetadataTypedDict
from .wandbintegrationresult import (
    WandbIntegrationResult,
    WandbIntegrationResultTypedDict,
)
from mistralai.client.types import (
    BaseModel,
    Nullable,
    OptionalNullable,
    UNSET,
    UNSET_SENTINEL,
    UnrecognizedStr,
)
from mistralai.client.utils import validate_const
import pydantic
from pydantic import ConfigDict, model_serializer
from pydantic.functional_validators import AfterValidator
from typing import Any, List, Literal, Optional, Union
from typing_extensions import Annotated, NotRequired, TypedDict


ClassifierFineTuningJobDetailsStatus = Union[
    Literal[
        "QUEUED",
        "STARTED",
        "VALIDATING",
        "VALIDATED",
        "RUNNING",
        "FAILED_VALIDATION",
        "FAILED",
        "SUCCESS",
        "CANCELLED",
        "CANCELLATION_REQUESTED",
    ],
    UnrecognizedStr,
]


ClassifierFineTuningJobDetailsIntegrationTypedDict = WandbIntegrationResultTypedDict


class UnknownClassifierFineTuningJobDetailsIntegration(BaseModel):
    r"""A ClassifierFineTuningJobDetailsIntegration variant the SDK doesn't recognize. Preserves the raw payload."""

    type: Literal["UNKNOWN"] = "UNKNOWN"
    raw: Any
    is_unknown: Literal[True] = True

    model_config = ConfigDict(frozen=True)


_CLASSIFIER_FINE_TUNING_JOB_DETAILS_INTEGRATION_VARIANTS: dict[str, Any] = {
    "wandb": WandbIntegrationResult,
}


ClassifierFineTuningJobDetailsIntegration = WandbIntegrationResult


class ClassifierFineTuningJobDetailsTypedDict(TypedDict):
    id: str
    auto_start: bool
    model: str
    status: ClassifierFineTuningJobDetailsStatus
    created_at: int
    modified_at: int
    training_files: List[str]
    hyperparameters: ClassifierTrainingParametersTypedDict
    classifier_targets: List[ClassifierTargetResultTypedDict]
    validation_files: NotRequired[Nullable[List[str]]]
    object: Literal["job"]
    fine_tuned_model: NotRequired[Nullable[str]]
    suffix: NotRequired[Nullable[str]]
    integrations: NotRequired[
        Nullable[List[ClassifierFineTuningJobDetailsIntegrationTypedDict]]
    ]
    trained_tokens: NotRequired[Nullable[int]]
    metadata: NotRequired[Nullable[JobMetadataTypedDict]]
    job_type: Literal["classifier"]
    events: NotRequired[List[EventTypedDict]]
    r"""Event items are created every time the status of a fine-tuning job changes. The timestamped list of all events is accessible here."""
    checkpoints: NotRequired[List[CheckpointTypedDict]]


class ClassifierFineTuningJobDetails(BaseModel):
    id: str

    auto_start: bool

    model: str

    status: ClassifierFineTuningJobDetailsStatus

    created_at: int

    modified_at: int

    training_files: List[str]

    hyperparameters: ClassifierTrainingParameters

    classifier_targets: List[ClassifierTargetResult]

    validation_files: OptionalNullable[List[str]] = UNSET

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

    fine_tuned_model: OptionalNullable[str] = UNSET

    suffix: OptionalNullable[str] = UNSET

    integrations: OptionalNullable[List[ClassifierFineTuningJobDetailsIntegration]] = (
        UNSET
    )

    trained_tokens: OptionalNullable[int] = UNSET

    metadata: OptionalNullable[JobMetadata] = UNSET

    job_type: Annotated[
        Annotated[Literal["classifier"], AfterValidator(validate_const("classifier"))],
        pydantic.Field(alias="job_type"),
    ] = "classifier"

    events: Optional[List[Event]] = None
    r"""Event items are created every time the status of a fine-tuning job changes. The timestamped list of all events is accessible here."""

    checkpoints: Optional[List[Checkpoint]] = None

    @model_serializer(mode="wrap")
    def serialize_model(self, handler):
        optional_fields = set(
            [
                "validation_files",
                "object",
                "fine_tuned_model",
                "suffix",
                "integrations",
                "trained_tokens",
                "metadata",
                "events",
                "checkpoints",
            ]
        )
        nullable_fields = set(
            [
                "validation_files",
                "fine_tuned_model",
                "suffix",
                "integrations",
                "trained_tokens",
                "metadata",
            ]
        )
        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:
    ClassifierFineTuningJobDetails.model_rebuild()
except NameError:
    pass
