Some checks are pending
Build and Push Docker Images / changes (push) Waiting to run
Build and Push Docker Images / build-backend (push) Blocked by required conditions
Build and Push Docker Images / build-frontend (push) Blocked by required conditions
Build and Push Docker Images / build-admin-frontend (push) Blocked by required conditions
74 lines
2.3 KiB
Python
74 lines
2.3 KiB
Python
"""适配器注册表 - 支持动态注册和工厂创建。"""
|
|
|
|
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)
|