ForcePilot/backend/package/yuxi/channels/adapters/__init__.py
Kris 0d067d61d3 chore: 批量更新契约与实现,修复多处细节问题
本次提交包含多类代码优化与修复:
1. 重命名适配器协议类:WebhookTestable→WebhookTestAdapter、AttachmentUploadable→AttachmentUploadAdapter,并同步更新所有引用
2. 为飞书/企业微信插件添加凭证克隆能力开关配置
3. 修复飞书入站适配器URL解析错误,使用hostname替代host属性
4. 新增批量发送消息DTO与已读状态DTO
5. 新增插件目录列表接口与插件能力校验规则
6. 修复权限阶段配置,添加analytics权限映射
7. 优化健康检查、限流模块的环境变量配置支持
8. 修复配对过期扫描器参数名不匹配问题
9. 优化日志调用、文档注释与代码可读性
10. 移除废弃的AuditExportTask聚合根与相关导入
2026-07-02 18:27:06 +08:00

116 lines
5.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""渠道被驱动适配器包。
聚合导出 11 个被驱动适配器实现与 ``DrivenAdapters`` 聚合 dataclass
供框架层装配使用。``create_driven_adapters(db, outbox_config, redis_client,
arq_pool, execution_port)`` factory 创建请求级适配器实例:需要共享
``AsyncSession`` 的适配器(``ChannelPersistenceAdapter`` /
``ConversationAdapter`` / ``SqlAlchemyTransactionAdapter``)共享同一 ``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 .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``
共享同一 ``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)
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),
identity_resolver=None,
)
__all__ = [
"DrivenAdapters",
"create_driven_adapters",
"ChannelPersistenceAdapter",
"ConversationAdapter",
"AgentRunAdapter",
"AgentRunExecutionAdapter",
"ARQQueueAdapter",
"MaskingAdapter",
"RedisConfigAdapter",
"RedisCacheAdapter",
"StructuredLoggerAdapter",
"OpenTelemetryTracerAdapter",
"IdentityResolverAdapter",
"SqlAlchemyTransactionAdapter",
]