From ec92d7f14ef41d42460ecf097f3e8d62f1196075 Mon Sep 17 00:00:00 2001 From: Chang Su Date: Mon, 1 Dec 2025 07:20:38 -0800 Subject: [PATCH] [model-gateway] fix v1/models response format to be oai compatible (#13693) Co-authored-by: Simo Lin --- .../e2e_grpc/basic/test_openai_server.py | 3 +-- .../function_call/test_tool_choice.py | 3 +-- sgl-router/src/routers/router_manager.rs | 22 ++++++++++++++++--- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/sgl-router/py_test/e2e_grpc/basic/test_openai_server.py b/sgl-router/py_test/e2e_grpc/basic/test_openai_server.py index 2a2206a3c..a3c73b95c 100644 --- a/sgl-router/py_test/e2e_grpc/basic/test_openai_server.py +++ b/sgl-router/py_test/e2e_grpc/basic/test_openai_server.py @@ -277,8 +277,7 @@ The SmartHome Mini is a compact smart home assistant available in black or white def test_model_list(self): client = openai.Client(api_key=self.api_key, base_url=self.base_url) - # TODO: Update the logic here when router /v1/models response format matching the openai api standard - models = list(client.models.list().models) + models = list(client.models.list().data) assert len(models) == 1 # assert isinstance(getattr(models[0], "max_model_len", None), int) diff --git a/sgl-router/py_test/e2e_grpc/function_call/test_tool_choice.py b/sgl-router/py_test/e2e_grpc/function_call/test_tool_choice.py index 87f4db236..4e1668527 100644 --- a/sgl-router/py_test/e2e_grpc/function_call/test_tool_choice.py +++ b/sgl-router/py_test/e2e_grpc/function_call/test_tool_choice.py @@ -70,8 +70,7 @@ class TestToolChoiceLlama32(CustomTestCase): def setUp(self): self.client = openai.Client(base_url=self.base_url, api_key=self.api_key) - # TODO: Update the logic here when router /v1/models response format matching the openai api standard - self.model_name = self.client.models.list().models[0] + self.model_name = self.client.models.list().data[0].id def _is_flaky_test(self): """Check if the current test is marked as flaky for this class""" diff --git a/sgl-router/src/routers/router_manager.rs b/sgl-router/src/routers/router_manager.rs index c3738b04c..68fcfb3bd 100644 --- a/sgl-router/src/routers/router_manager.rs +++ b/sgl-router/src/routers/router_manager.rs @@ -334,14 +334,30 @@ impl RouterTrait for RouterManager { } async fn get_models(&self, _req: Request) -> Response { - let models = self.worker_registry.get_models(); + let model_names = self.worker_registry.get_models(); - if models.is_empty() { + if model_names.is_empty() { (StatusCode::SERVICE_UNAVAILABLE, "No models available").into_response() } else { + // Convert model names to OpenAI-compatible model objects + let models: Vec = model_names + .iter() + .map(|name| { + serde_json::json!({ + "id": name, + "object": "model", + "owned_by": "local" + }) + }) + .collect(); + ( StatusCode::OK, - serde_json::json!({ "models": models }).to_string(), + serde_json::json!({ + "object": "list", + "data": models + }) + .to_string(), ) .into_response() }