ForcePilot/backend/package/yuxi/channels/adapters/__init__.py

121 lines
5.7 KiB
Python
Raw Normal View History

"""渠道被驱动适配器包。
聚合导出 11 个被驱动适配器实现与 ``DrivenAdapters`` 聚合 dataclass
供框架层装配使用``create_driven_adapters(db, outbox_config, redis_client,
arq_pool, execution_port)`` factory 创建请求级适配器实例需要共享
``AsyncSession`` 的适配器``ChannelPersistenceAdapter`` /
``ConversationAdapter`` / ``SqlAlchemyTransactionAdapter`` /
``AuditExportTaskRepositoryAdapter``共享同一 ``db``无状态适配器
Logger / Tracer使用模块级全局实例``identity_resolver`` 默认为
``None``由插件注册时注入``RedisConfigAdapter`` /
``RedisCacheAdapter`` 接受 ``redis_client````ARQQueueAdapter`` 接受
``arq_pool````AgentRunAdapter`` 接受 ``execution_port``构造注入INV-5 /
ADP-001 / ADP-005 / ADP-022
"""
from __future__ import annotations
from arq import ArqRedis
from redis.asyncio import Redis
from sqlalchemy.ext.asyncio import AsyncSession
from yuxi.channels.contract.dtos.outbox import OutboxConfig
from yuxi.channels.contract.ports.driven.agent_run_execution_port import (
AgentRunExecutionPort,
)
from yuxi.channels.contract.ports.driven.aggregate import DrivenAdapters
from .agent_run_adapter import AgentRunAdapter
from .agent_run_execution_adapter import AgentRunExecutionAdapter
from .arq_queue_adapter import ARQQueueAdapter
from .audit_export_task_repository_adapter import AuditExportTaskRepositoryAdapter
from .channel_persistence_adapter import ChannelPersistenceAdapter
from .conversation_adapter import ConversationAdapter
from .identity_resolver_adapter import IdentityResolverAdapter
from .masking_adapter import MaskingAdapter
from .opentelemetry_tracer_adapter import OpenTelemetryTracerAdapter
from .redis_cache_adapter import RedisCacheAdapter
from .redis_config_adapter import RedisConfigAdapter
from .sqlalchemy_transaction_adapter import SqlAlchemyTransactionAdapter
from .structured_logger_adapter import StructuredLoggerAdapter
# 无状态适配器全局实例Masking / Logger / Tracer跨请求复用避免重复构造。
# Masking 无状态无依赖最先构造Logger 注入 Masking 以便日志 kwargs 自动脱敏;
# Tracer 注入 Logger 以便在追踪故障降级时记录日志(避免静默吞异常)。
_masking_adapter = MaskingAdapter()
_logger_adapter = StructuredLoggerAdapter(masking_port=_masking_adapter)
_tracer_adapter = OpenTelemetryTracerAdapter(_logger_adapter)
def create_driven_adapters(
db: AsyncSession,
outbox_config: OutboxConfig,
redis_client: Redis,
arq_pool: ArqRedis,
execution_port: AgentRunExecutionPort,
) -> DrivenAdapters:
"""创建被驱动适配器聚合实例。
请求级适配器``ChannelPersistenceAdapter`` / ``ConversationAdapter`` /
``SqlAlchemyTransactionAdapter`` / ``AuditExportTaskRepositoryAdapter``
共享同一 ``db`` 会话以保证事务一致性无状态适配器Logger / Tracer
使用模块级全局实例其余适配器按需构造``ConversationAdapter`` 仅依赖
共享 ``db`` 会话合并策略开关决策已上移至 usecase ``ConfigPort`` /
``PersistencePort`` 死依赖已移除``RedisConfigAdapter`` /
``RedisCacheAdapter`` 接受 ``redis_client`` 执行配置读写与缓存操作
``ARQQueueAdapter`` 接受 ``arq_pool`` 入队``AgentRunAdapter`` 接受
``execution_port`` 委托 Agent 运行技术操作构造注入INV-5 / ADP-001 /
ADP-005 / ADP-022``identity_resolver`` 默认为 ``None``由插件注册时注入
Args:
db: SQLAlchemy 异步会话由框架层注入persistence / conversation /
transaction 适配器共享此会话
outbox_config: 发件箱配置注入到 ``ChannelPersistenceAdapter`` 替代
直接读取全局 ``app_config``§6.1 应用服务层禁止依赖具体技术适配器
redis_client: ``redis.asyncio.Redis`` 客户端实例注入到
``RedisConfigAdapter`` ``RedisCacheAdapter``构造注入INV-5
arq_pool: ``arq.ArqRedis`` 连接池实例注入到 ``ARQQueueAdapter``
用于入队构造注入ADP-005
execution_port: ``AgentRunExecutionPort`` 实例注入到 ``AgentRunAdapter``
委托 Agent 运行技术操作构造注入ADP-001
Returns:
DrivenAdapters 聚合实例
"""
config = RedisConfigAdapter(redis_client=redis_client, logger=_logger_adapter)
persistence = ChannelPersistenceAdapter(db, outbox_config=outbox_config, logger=_logger_adapter)
audit_export_task_repo = AuditExportTaskRepositoryAdapter(db, logger=_logger_adapter)
return DrivenAdapters(
persistence=persistence,
conversation=ConversationAdapter(db, logger=_logger_adapter),
agent_run=AgentRunAdapter(execution_port=execution_port, logger=_logger_adapter),
queue=ARQQueueAdapter(arq_pool=arq_pool, logger=_logger_adapter),
config=config,
cache=RedisCacheAdapter(redis_client=redis_client, logger=_logger_adapter),
logger=_logger_adapter,
tracer=_tracer_adapter,
masking=_masking_adapter,
transaction=SqlAlchemyTransactionAdapter(db),
audit_export_task_repo=audit_export_task_repo,
identity_resolver=None,
)
__all__ = [
"DrivenAdapters",
"create_driven_adapters",
"ChannelPersistenceAdapter",
"ConversationAdapter",
"AgentRunAdapter",
"AgentRunExecutionAdapter",
"ARQQueueAdapter",
"AuditExportTaskRepositoryAdapter",
"MaskingAdapter",
"RedisConfigAdapter",
"RedisCacheAdapter",
"StructuredLoggerAdapter",
"OpenTelemetryTracerAdapter",
"IdentityResolverAdapter",
"SqlAlchemyTransactionAdapter",
]