@@ -197,6 +197,37 @@ def _extract_tag_value(tags: list[str], prefix: str) -> str | None:
197197 return None
198198
199199
200+ def _apply_openai_capability_metadata (model_info : dict , tags : list [str ], model_mode : str ) -> None :
201+ """Normalize capability fields into OpenAI-style model_info supports_* keys."""
202+ tagset = {str (tag ).lower () for tag in (tags or [])}
203+
204+ has_chat = "capability:chat" in tagset
205+ has_completion = "capability:completion" in tagset
206+ has_tools = "capability:tools" in tagset or "capability:function_calling" in tagset
207+ has_vision = "capability:vision" in tagset
208+ has_audio = "capability:audio" in tagset or "capability:audio_input" in tagset
209+
210+ # Prefer capability tags to infer mode; fallback to requested mode.
211+ if has_chat :
212+ normalized_mode = "chat"
213+ elif has_completion and not has_chat :
214+ normalized_mode = "completion"
215+ else :
216+ normalized_mode = "completion" if model_mode == "completion" else "chat"
217+
218+ model_info ["mode" ] = normalized_mode
219+ model_info ["supports_chat" ] = has_chat or normalized_mode == "chat"
220+ model_info ["supports_completion" ] = has_completion or normalized_mode == "completion"
221+ model_info ["supports_function_calling" ] = has_tools
222+ model_info ["supports_tool_choice" ] = has_tools
223+ model_info ["supports_vision" ] = has_vision
224+ model_info ["supports_audio_input" ] = has_audio
225+
226+ if model_info ["supports_chat" ]:
227+ model_info .setdefault ("supports_system_messages" , True )
228+ model_info .setdefault ("supports_native_streaming" , True )
229+
230+
200231async def list_routing_group_deployments (config ) -> list [dict ]:
201232 """Return LiteLLM models tagged as routing groups."""
202233 if not config .litellm_base_url :
@@ -358,6 +389,7 @@ async def push_model_to_litellm(
358389
359390 litellm_params ["tags" ] = tags
360391 model_info ["tags" ] = tags
392+ _apply_openai_capability_metadata (model_info , tags , model_mode )
361393
362394 # Add access_groups
363395 access_groups = model .get_effective_access_groups ()
0 commit comments