diff --git a/api/ai/ai_response_model.py b/api/ai/ai_response_model.py index ee1029e..72d303d 100644 --- a/api/ai/ai_response_model.py +++ b/api/ai/ai_response_model.py @@ -14,8 +14,10 @@ class WorkflowRequest(BaseModel): class ModelInfo(BaseModel): + name: str provider: str description: str + is_thinking: bool capabilities: List[str] context_window: Optional[int] = None diff --git a/api/ai/ai_service.py b/api/ai/ai_service.py index 751b8e9..fbccd53 100644 --- a/api/ai/ai_service.py +++ b/api/ai/ai_service.py @@ -106,8 +106,10 @@ def get_available_models_service() -> AvailableModelsResponse: models = {} for model_name, model_data in available_models_dict.items(): models[model_name] = ModelInfo( + name=model_data["name"], provider=model_data["provider"], description=model_data["description"], + is_thinking=model_data["is_thinking"], capabilities=model_data["capabilities"], context_window=model_data.get("context_window") ) diff --git a/api/llm/registry.py b/api/llm/registry.py index f91fa6b..b4127d0 100644 --- a/api/llm/registry.py +++ b/api/llm/registry.py @@ -13,6 +13,7 @@ required_credential="ANTHROPIC_API_KEY", build=build_anthropic, description="Claude Sonnet 4.0 (2025-05-14)", + display_name="Claude Sonnet 4", capabilities=("text", "reasoning", "translation"), context_window=200000, aliases=(), @@ -23,6 +24,7 @@ required_credential="ANTHROPIC_API_KEY", build=build_anthropic, description="Claude 3.5 Haiku (2024-10-22)", + display_name="Claude 3.5 Haiku", capabilities=("text", "translation"), context_window=200000, ), @@ -32,6 +34,7 @@ required_credential="ANTHROPIC_API_KEY", build=build_anthropic, description="Claude 3 Opus (2024-02-29)", + display_name="Claude 3 Opus", capabilities=("text", "reasoning", "translation"), context_window=200000, ), @@ -41,6 +44,7 @@ required_credential="ANTHROPIC_API_KEY", build=build_anthropic, description="Claude Haiku 4.5 (2025-10-01)", + display_name="Claude Haiku 4.5", capabilities=("text", "reasoning", "translation", "advanced-reasoning"), context_window=200000, ), @@ -50,6 +54,7 @@ required_credential="ANTHROPIC_API_KEY", build=build_anthropic, description="Claude Sonnet 4.5 (2025-09-29)", + display_name="Claude Sonnet 4.5", capabilities=("text", "reasoning", "translation", "advanced-reasoning"), context_window=200000, ), @@ -59,6 +64,7 @@ required_credential="OPENAI_API_KEY", build=build_openai, description="GPT-4", + display_name="GPT-4", capabilities=("text", "reasoning", "translation"), context_window=128000, ), @@ -68,6 +74,7 @@ required_credential="OPENAI_API_KEY", build=build_openai, description="GPT-4 Turbo", + display_name="GPT-4 Turbo", capabilities=("text", "reasoning", "translation"), context_window=128000, ), @@ -77,6 +84,7 @@ required_credential="OPENAI_API_KEY", build=build_openai, description="GPT-3.5 Turbo", + display_name="GPT-3.5 Turbo", capabilities=("text", "translation"), context_window=16385, ), @@ -86,6 +94,7 @@ required_credential="GEMINI_API_KEY", build=build_gemini, description="Gemini 2.5 Pro", + display_name="Gemini 2.5 Pro", capabilities=("text", "reasoning", "translation"), context_window=30720, ), @@ -95,6 +104,7 @@ required_credential="GEMINI_API_KEY", build=build_gemini, description="Gemini 2.5 Flash (fast)", + display_name="Gemini 2.5 Flash", capabilities=("text", "reasoning", "translation"), context_window=30720, ), @@ -104,6 +114,8 @@ required_credential="GEMINI_API_KEY", build=build_gemini, description="Virtual: Gemini 2.5 Flash with thinking", + display_name="Gemini 2.5 Flash Thinking", + is_thinking=True, capabilities=("text", "reasoning", "translation"), context_window=30720, provider_model_name="gemini-2.5-flash", @@ -115,6 +127,7 @@ required_credential="GEMINI_API_KEY", build=build_gemini, description="Gemini Pro Vision", + display_name="Gemini Pro Vision", capabilities=("text", "vision", "translation"), context_window=30720, ), @@ -124,6 +137,7 @@ required_credential="GEMINI_API_KEY", build=build_gemini, description="Gemini Pro", + display_name="Gemini Pro", capabilities=("text", "reasoning", "translation"), context_window=30720, ), @@ -133,6 +147,7 @@ required_credential="DHARMAMITRA_TOKEN", build=build_dharmamitra, description="Dharmamitra Chat Translate (mitra-base)", + display_name="Dharmamitra", capabilities=("text", "translation"), context_window=None, ), diff --git a/api/llm/router.py b/api/llm/router.py index df338ec..e3a3c98 100644 --- a/api/llm/router.py +++ b/api/llm/router.py @@ -39,8 +39,10 @@ def available_models(self) -> Dict[str, Dict[str, Any]]: for name, spec in REGISTRY.items(): if self._has_credential(spec): out[name] = { + "name": spec.display_name, "provider": spec.provider, "description": spec.description, + "is_thinking": spec.is_thinking, "capabilities": list(spec.capabilities), "context_window": spec.context_window, } diff --git a/api/llm/types.py b/api/llm/types.py index 5a0bc1e..dca76cf 100644 --- a/api/llm/types.py +++ b/api/llm/types.py @@ -16,6 +16,8 @@ class ModelSpec: required_credential: Optional[str] = None build: BuildFn = None description: str = "" + display_name: str = "" + is_thinking: bool = False capabilities: Sequence[str] = field(default_factory=tuple) context_window: Optional[int] = None aliases: Sequence[str] = field(default_factory=tuple)