Fedir Zadniprovskyi 2024-07-03
feat: add language field to the model response type
@4468033129925a87f3332f45002b1bacc328a918
faster_whisper_server/main.py
--- faster_whisper_server/main.py
+++ faster_whisper_server/main.py
@@ -87,18 +87,27 @@
 
 @app.get("/v1/models")
 def get_models() -> ModelListResponse:
-    models = huggingface_hub.list_models(library="ctranslate2", tags="automatic-speech-recognition")
-    models = [
-        ModelObject(
+    models = huggingface_hub.list_models(library="ctranslate2", tags="automatic-speech-recognition", cardData=True)
+    transformed_models: list[ModelObject] = []
+    for model in models:
+        assert model.created_at is not None
+        assert model.card_data is not None
+        assert model.card_data.language is None or isinstance(model.card_data.language, str | list)
+        if model.card_data.language is None:
+            language = []
+        elif isinstance(model.card_data.language, str):
+            language = [model.card_data.language]
+        else:
+            language = model.card_data.language
+        transformed_model = ModelObject(
             id=model.id,
             created=int(model.created_at.timestamp()),
             object_="model",
             owned_by=model.id.split("/")[0],
+            language=language,
         )
-        for model in models
-        if model.created_at is not None
-    ]
-    return ModelListResponse(data=models)
+        transformed_models.append(transformed_model)
+    return ModelListResponse(data=transformed_models)
 
 
 @app.get("/v1/models/{model_name:path}")
@@ -107,7 +116,9 @@
     model_name: Annotated[str, Path(example="Systran/faster-distil-whisper-large-v3")],
 ) -> ModelObject:
     models = list(
-        huggingface_hub.list_models(model_name=model_name, library="ctranslate2", tags="automatic-speech-recognition")
+        huggingface_hub.list_models(
+            model_name=model_name, library="ctranslate2", tags="automatic-speech-recognition", cardData=True
+        )
     )
     if len(models) == 0:
         raise HTTPException(status_code=404, detail="Model doesn't exists")
@@ -122,11 +133,20 @@
             detail=f"Model doesn't exists. Possible matches: {", ".join([model.id for model in models])}",
         )
     assert exact_match.created_at is not None
+    assert exact_match.card_data is not None
+    assert exact_match.card_data.language is None or isinstance(exact_match.card_data.language, str | list)
+    if exact_match.card_data.language is None:
+        language = []
+    elif isinstance(exact_match.card_data.language, str):
+        language = [exact_match.card_data.language]
+    else:
+        language = exact_match.card_data.language
     return ModelObject(
         id=exact_match.id,
         created=int(exact_match.created_at.timestamp()),
         object_="model",
         owned_by=exact_match.id.split("/")[0],
+        language=language,
     )
 
 
faster_whisper_server/server_models.py
--- faster_whisper_server/server_models.py
+++ faster_whisper_server/server_models.py
@@ -133,6 +133,8 @@
     """The object type, which is always "model"."""
     owned_by: str
     """The organization that owns the model."""
+    language: list[str] = Field(default_factory=list)
+    """List of ISO 639-3 supported by the model. It's possible that the list will be empty. This field is not a part of the OpenAI API spec and is added for convenience."""  # noqa: E501
 
     model_config = ConfigDict(
         populate_by_name=True,
Add a comment
List