"""适配器注册表 - 支持动态注册和工厂创建。""" from typing import TYPE_CHECKING if TYPE_CHECKING: from app.services.adapters.base import AdapterConfig, BaseAdapter class AdapterRegistry: """适配器注册表,管理所有已注册的适配器类。""" _adapters: dict[str, type["BaseAdapter"]] = {} @classmethod def register(cls, adapter_type: str, adapter_name: str): """装饰器:注册适配器类。 用法: @AdapterRegistry.register("text", "text_primary") class TextPrimaryAdapter(BaseAdapter[StoryOutput]): ... """ def decorator(adapter_class: type["BaseAdapter"]): key = f"{adapter_type}:{adapter_name}" cls._adapters[key] = adapter_class # 自动设置类属性 adapter_class.adapter_type = adapter_type adapter_class.adapter_name = adapter_name return adapter_class return decorator @classmethod def get(cls, adapter_type: str, adapter_name: str) -> type["BaseAdapter"] | None: """获取已注册的适配器类。""" key = f"{adapter_type}:{adapter_name}" return cls._adapters.get(key) @classmethod def list_adapters(cls, adapter_type: str | None = None) -> list[str]: """列出所有已注册的适配器。 Args: adapter_type: 可选,筛选特定类型 (text/image/tts) Returns: 适配器键列表,格式为 "type:name" """ if adapter_type: return [k for k in cls._adapters if k.startswith(f"{adapter_type}:")] return list(cls._adapters.keys()) @classmethod def create( cls, adapter_type: str, adapter_name: str, config: "AdapterConfig", ) -> "BaseAdapter": """工厂方法:创建适配器实例。 Raises: ValueError: 适配器未注册 """ adapter_class = cls.get(adapter_type, adapter_name) if not adapter_class: available = cls.list_adapters(adapter_type) raise ValueError( f"适配器 '{adapter_type}:{adapter_name}' 未注册。" f"可用: {available}" ) return adapter_class(config)