4.2 KiB
02. 架构设计 (Architecture Design - Framework Aligned)
1. 总体架构图 (Pragmatic Architecture)
本架构旨在最大限度复用 AstrBot 框架能力,通过职责拆分(而非分层解耦)来降低 AutoScheduler 的复杂度。
graph TD
subgraph "AstrBot Framework (宿主环境)"
TaskScheduler["Context.task_scheduler\n(APScheduler)"]
Context["Context\n(Session/Event/PlatformManager)"]
StarTools["StarTools\n(Message/Image)"]
end
subgraph "Plugin Core (核心逻辑)"
Bootstrap["Plugin Bootstrap\n(main.py)"]
SchedulerJob["Scheduler Job\n(定时任务回调)"]
AnalysisOrchestrator["Analysis Orchestrator\n(原有逻辑拆分)"]
subgraph "Extracted Modules (提取模块)"
MessageSender["Message Sender\n(统一发送+降级)"]
ReportDispatcher["Report Dispatcher\n(报告生成+分发)"]
BotManagerEnh["Bot Manager\n(Session管理+群发现)"]
end
end
subgraph "Infrastructure Enhancements (基建增强)"
TraceContext["Trace Context\n(contextvars)"]
LLMClient["LLM Client\n(CircuitBreaker + RateLimit)"]
end
%% Flow
Bootstrap -->|Register Job| TaskScheduler
TaskScheduler -->|Trigger| SchedulerJob
SchedulerJob -->|Set TraceID| TraceContext
SchedulerJob -->|Invoke| AnalysisOrchestrator
AnalysisOrchestrator -->|Get Groups| BotManagerEnh
BotManagerEnh -->|Query| Context
AnalysisOrchestrator -->|Analyze| LLMClient
AnalysisOrchestrator -->|Generate Report| ReportDispatcher
ReportDispatcher -->|Send Report| MessageSender
MessageSender -->|Use| StarTools
MessageSender -->|Fallback| Context
2. 核心组件详解
2.1 任务调度 (Scheduler)
不再自建循环。直接使用 AstrBot 提供的 Context.task_scheduler (APScheduler 实例)。
- 注册: 在
__init__或OnPlatformLoaded中注册 cron job。 - 优势: 自动处理时区、任务持久化(如果配置)、优雅关闭。
2.2 消息发送 (MessageSender)
统一发送入口。将散落在各处的发送逻辑收敛到 src/core/message_sender.py。
- 职责:
- 协议适配: 优先构建
AstrMessageEvent(即使是主动发送,也可构造虚拟 Event),调用Context.send_message。 - 降级策略: URL发送失败 -> 下载转Base64发送 -> 纯文本回退。
- 合并转发: 封装 OneBot v11 的 Forward Message 构建细节。
- 协议适配: 优先构建
- 依赖: 依赖
Context和StarTools,而非直接依赖bot.api。
2.3 分析编排 (AnalysisOrchestrator / ReportDispatcher)
逻辑拆分。
ReportDispatcher: 接收AnalysisResult,决定调用哪个渲染器(HTML/Text/PDF),并调用MessageSender发送。AnalysisOrchestrator: 负责并发控制(Semaphore)和错误处理(Partial Failure)。
2.4 可观测性 (TraceContext)
零侵入追踪。
- 使用
contextvars.ContextVar存储trace_id。 - 实现
TraceLogFilter自动注入 logging record。 - 效果:在
SchedulerJob入口设置一次 ID,后续深层调用的所有logger.info自动带上[trace_id: xxx]。
2.5 LLM 客户端增强
原地增强。不重写 LLMAnalyzer,而是在 call_provider_with_retry 层面增加:
- CircuitBreaker: 简单的失败计数器 (Windowed Counter)。
- RateLimiter:
asyncio.Semaphore全局控制并发数。
3. 发送流程演进
旧流程 (Current)
AutoScheduler -> _send_image_message -> bot.api.call_action("send_group_msg") -> (失败) -> RetryManager queue -> RetryManager worker -> bot.api
新流程 (Proposed)
SchedulerJob -> ReportDispatcher -> MessageSender.send_image(url)
-> Attempt 1: Context.send_message(image(url))
-> Fail: Catch generic exception
-> Attempt 2: Download -> Context.send_message(image(base64))
-> Fail: Catch exception
-> Fallback: MessageSender.send_text(report.text) (Instant Fallback, no complex queue)
注: 如果确实需要异步低优先级的重试队列,可以将
MessageSender的失败任务推送到Context.task_scheduler的一次性延时任务中,复用框架能力。