# This file was auto-generated by Fern from our API Definition.

import enum
import typing

T_Result = typing.TypeVar("T_Result")


class Model(str, enum.Enum):
    """
    An enumeration.
    """

    GPT_35_TURBO = "gpt-3.5-turbo"
    GPT_4_TURBO = "gpt-4-turbo"
    GPT_4_TURBO_PREVIEW = "gpt-4-turbo-preview"
    GPT_4 = "gpt-4"
    MIXTRAL_SMALL_8_X_7_B_0211 = "mixtral-small-8x7b-0211"
    MISTRAL_LARGE_0224 = "mistral-large-0224"
    LLAMA_V_270_B_CHAT = "llama-v2-70b-chat"
    CLAUDE_3_OPUS_20240229 = "claude-3-opus-20240229"
    CLAUDE_3_SONNET_20240229 = "claude-3-sonnet-20240229"
    CLAUDE_3_HAIKU_20240307 = "claude-3-haiku-20240307"
    GOOGLE_GEMINI_10_PRO_LATEST = "google-gemini-1.0-pro-latest"
    DATABRICKS_DBRX = "databricks-dbrx"

    def visit(
        self,
        gpt_35_turbo: typing.Callable[[], T_Result],
        gpt_4_turbo: typing.Callable[[], T_Result],
        gpt_4_turbo_preview: typing.Callable[[], T_Result],
        gpt_4: typing.Callable[[], T_Result],
        mixtral_small_8_x_7_b_0211: typing.Callable[[], T_Result],
        mistral_large_0224: typing.Callable[[], T_Result],
        llama_v_270_b_chat: typing.Callable[[], T_Result],
        claude_3_opus_20240229: typing.Callable[[], T_Result],
        claude_3_sonnet_20240229: typing.Callable[[], T_Result],
        claude_3_haiku_20240307: typing.Callable[[], T_Result],
        google_gemini_10_pro_latest: typing.Callable[[], T_Result],
        databricks_dbrx: typing.Callable[[], T_Result],
    ) -> T_Result:
        if self is Model.GPT_35_TURBO:
            return gpt_35_turbo()
        if self is Model.GPT_4_TURBO:
            return gpt_4_turbo()
        if self is Model.GPT_4_TURBO_PREVIEW:
            return gpt_4_turbo_preview()
        if self is Model.GPT_4:
            return gpt_4()
        if self is Model.MIXTRAL_SMALL_8_X_7_B_0211:
            return mixtral_small_8_x_7_b_0211()
        if self is Model.MISTRAL_LARGE_0224:
            return mistral_large_0224()
        if self is Model.LLAMA_V_270_B_CHAT:
            return llama_v_270_b_chat()
        if self is Model.CLAUDE_3_OPUS_20240229:
            return claude_3_opus_20240229()
        if self is Model.CLAUDE_3_SONNET_20240229:
            return claude_3_sonnet_20240229()
        if self is Model.CLAUDE_3_HAIKU_20240307:
            return claude_3_haiku_20240307()
        if self is Model.GOOGLE_GEMINI_10_PRO_LATEST:
            return google_gemini_10_pro_latest()
        if self is Model.DATABRICKS_DBRX:
            return databricks_dbrx()
