from enum import Enum class OpenAIModel(str, Enum): gpt_5_1 = "gpt-5.1" gpt_4o = "gpt-4o" gpt_4o_mini = "gpt-4o-mini" gpt_4_1 = "gpt-4.1" gpt_4_1_mini = "gpt-4.1-mini" gpt_4_turbo = "gpt-4-turbo" gpt_3_5_turbo = "gpt-3.5-turbo-0125" class AnthropicModel(str, Enum): claude_3_5_sonnet = "claude-3-5-sonnet-20240620" claude_3_5_haiku = "claude-3-5-haiku-20241022" claude_3_opus = "claude-3-opus-20240229" class GeminiModel(str, Enum): gemini_3_pro_preview = "gemini-3-pro-preview" gemini_2_5_flash = "gemini-2.5-flash" gemini_2_5_pro = "gemini-2.5-pro" class OSSModel(str, Enum): llama3_70b_instruct = "meta-llama/Meta-Llama-3-70B-Instruct" llama3_8b_instruct = "meta-llama/Meta-Llama-3.1-8B-Instruct" qwen2_7b_instruct = "Qwen/Qwen2.5-7B-Instruct" deepseek_v3_terminus = "deepseek-ai/DeepSeek-V3.1-Terminus" deepseek_r1 = "deepseek-ai/DeepSeek-R1" gpt_oss_120b = "openai/gpt-oss-120b" kimi_k2_thinking = "moonshotai/Kimi-K2-Thinking", qwen_3_coder = 'Qwen/Qwen3-Coder-480B-A35B-Instruct' class EnumNamespace: """Proxy to expose Enum members as attribute-accessed .value strings.""" def __init__(self, enum_cls: type[Enum]): self._enum_cls = enum_cls def __getattr__(self, item: str) -> str: try: return getattr(self._enum_cls, item).value except AttributeError as exc: raise AttributeError(f"{self._enum_cls.__name__} has no member '{item}'") from exc def __dir__(self) -> list[str]: return [name for name in self._enum_cls.__members__] def members(self) -> list[Enum]: """Return the actual Enum members if needed.""" return list(self._enum_cls) class LLMModelType: """Namespaced access to curated model enums, e.g. LLMModelType.openai.gpt_5_1.""" openai = EnumNamespace(OpenAIModel) claude = EnumNamespace(AnthropicModel) gemini = EnumNamespace(GeminiModel) open_source = EnumNamespace(OSSModel) class LLMProviderType(str, Enum): OPENAI = "openai" GEMINI = "gemini" CLAUDE = "claude" HF = "hf" OPENROUTER = "openrouter"