from __future__ import annotations from dataclasses import dataclass from app.errors import OpenAICompatibleError @dataclass class EngineRegistry: model_to_engine: dict[str, object] def get_engine(self, model_name: str) -> object: normalized = model_name.strip().lower() if normalized not in self.model_to_engine: raise OpenAICompatibleError( status_code=400, message=f"Unsupported model '{model_name}'.", param="model", code="model_not_found", ) return self.model_to_engine[normalized] def list_models(self) -> list[str]: return sorted(self.model_to_engine) def list_voice_bindings(self, model: str | None = None) -> list[dict[str, str]]: if model: engine = self.get_engine(model) return engine.list_voice_bindings() seen: set[tuple[str, str]] = set() rows: list[dict[str, str]] = [] for engine in {id(engine): engine for engine in self.model_to_engine.values()}.values(): for row in engine.list_voice_bindings(): key = (row["model"], row["alias"]) if key in seen: continue seen.add(key) rows.append(row) return rows _REGISTRY: EngineRegistry | None = None def set_engine_registry(registry: EngineRegistry) -> None: global _REGISTRY _REGISTRY = registry def get_engine_registry() -> EngineRegistry: if _REGISTRY is None: raise OpenAICompatibleError( status_code=500, message="Engine registry not initialized.", error_type="server_error", code="engine_registry_not_initialized", ) return _REGISTRY