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

import enum
import typing

T_Result = typing.TypeVar("T_Result")


class LlmModel(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_O_MINI = "gpt-4o-mini"
    GPT_4_O = "gpt-4o"
    GPT_4 = "gpt-4"
    MIXTRAL_SMALL_8_X_7_B_0211 = "mixtral-small-8x7b-0211"
    MISTRAL_LARGE_0224 = "mistral-large-0224"
    MIXTRAL_8_X_22_B_INSTRUCT = "mixtral-8x22b-instruct"
    LLAMA_V_38_B_INSTRUCT = "llama-v3-8b-instruct"
    LLAMA_V_370_B_INSTRUCT = "llama-v3-70b-instruct"
    CLAUDE_35_SONNET_20240620 = "claude-3-5-sonnet-20240620"
    CLAUDE_3_OPUS_20240229 = "claude-3-opus-20240229"
    CLAUDE_3_SONNET_20240229 = "claude-3-sonnet-20240229"
    CLAUDE_3_HAIKU_20240307 = "claude-3-haiku-20240307"
    GROQ_MIXTRAL_8_X_7_B_32768 = "groq-mixtral-8x7b-32768"
    GROQ_LLAMA_38_B_8192 = "groq-llama3-8b-8192"
    GROQ_LLAMA_370_B_8192 = "groq-llama3-70b-8192"
    GROQ_GEMMA_7_B_IT = "groq-gemma-7b-it"
    DATABRICKS_DBRX = "databricks-dbrx"
    GOOGLE_GEMINI_10_PRO_LATEST = "google-gemini-1.0-pro-latest"
    GOOGLE_GEMINI_15_PRO_LATEST = "google-gemini-1.5-pro-latest"
    GOOGLE_GEMINI_15_FLASH_001 = "google-gemini-1.5-flash-001"
    GOOGLE_GEMINI_15_PRO_001 = "google-gemini-1.5-pro-001"

    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_o_mini: typing.Callable[[], T_Result],
        gpt_4_o: 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],
        mixtral_8_x_22_b_instruct: typing.Callable[[], T_Result],
        llama_v_38_b_instruct: typing.Callable[[], T_Result],
        llama_v_370_b_instruct: typing.Callable[[], T_Result],
        claude_35_sonnet_20240620: 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],
        groq_mixtral_8_x_7_b_32768: typing.Callable[[], T_Result],
        groq_llama_38_b_8192: typing.Callable[[], T_Result],
        groq_llama_370_b_8192: typing.Callable[[], T_Result],
        groq_gemma_7_b_it: typing.Callable[[], T_Result],
        databricks_dbrx: typing.Callable[[], T_Result],
        google_gemini_10_pro_latest: typing.Callable[[], T_Result],
        google_gemini_15_pro_latest: typing.Callable[[], T_Result],
        google_gemini_15_flash_001: typing.Callable[[], T_Result],
        google_gemini_15_pro_001: typing.Callable[[], T_Result],
    ) -> T_Result:
        if self is LlmModel.GPT_35_TURBO:
            return gpt_35_turbo()
        if self is LlmModel.GPT_4_TURBO:
            return gpt_4_turbo()
        if self is LlmModel.GPT_4_TURBO_PREVIEW:
            return gpt_4_turbo_preview()
        if self is LlmModel.GPT_4_O_MINI:
            return gpt_4_o_mini()
        if self is LlmModel.GPT_4_O:
            return gpt_4_o()
        if self is LlmModel.GPT_4:
            return gpt_4()
        if self is LlmModel.MIXTRAL_SMALL_8_X_7_B_0211:
            return mixtral_small_8_x_7_b_0211()
        if self is LlmModel.MISTRAL_LARGE_0224:
            return mistral_large_0224()
        if self is LlmModel.MIXTRAL_8_X_22_B_INSTRUCT:
            return mixtral_8_x_22_b_instruct()
        if self is LlmModel.LLAMA_V_38_B_INSTRUCT:
            return llama_v_38_b_instruct()
        if self is LlmModel.LLAMA_V_370_B_INSTRUCT:
            return llama_v_370_b_instruct()
        if self is LlmModel.CLAUDE_35_SONNET_20240620:
            return claude_35_sonnet_20240620()
        if self is LlmModel.CLAUDE_3_OPUS_20240229:
            return claude_3_opus_20240229()
        if self is LlmModel.CLAUDE_3_SONNET_20240229:
            return claude_3_sonnet_20240229()
        if self is LlmModel.CLAUDE_3_HAIKU_20240307:
            return claude_3_haiku_20240307()
        if self is LlmModel.GROQ_MIXTRAL_8_X_7_B_32768:
            return groq_mixtral_8_x_7_b_32768()
        if self is LlmModel.GROQ_LLAMA_38_B_8192:
            return groq_llama_38_b_8192()
        if self is LlmModel.GROQ_LLAMA_370_B_8192:
            return groq_llama_370_b_8192()
        if self is LlmModel.GROQ_GEMMA_7_B_IT:
            return groq_gemma_7_b_it()
        if self is LlmModel.DATABRICKS_DBRX:
            return databricks_dbrx()
        if self is LlmModel.GOOGLE_GEMINI_10_PRO_LATEST:
            return google_gemini_10_pro_latest()
        if self is LlmModel.GOOGLE_GEMINI_15_PRO_LATEST:
            return google_gemini_15_pro_latest()
        if self is LlmModel.GOOGLE_GEMINI_15_FLASH_001:
            return google_gemini_15_flash_001()
        if self is LlmModel.GOOGLE_GEMINI_15_PRO_001:
            return google_gemini_15_pro_001()
