graph TD subgraph "A. 消息生产与清洗并入库(独立运行,不拥堵)" Q1["读取config.py中的定时任务"] Q2["读取config.py中的直播间地址"] Q3["读取config.py中的MESSAGE_FILTER_SETTINGS"] A1["直播间获取消息<br>(调用 \\utils\\DouyinLiveWebFetcher)"<br>预热模式:关闭] A2["手动发送自定义消息"] A3["定时发送自定义消息"] B1["构建消息<br>(携带类型: chat, like, follow等)"] B2["构建消息<br>(携带类型: chat, like, follow, tts_direct,base_talk等)"] B3["消息滤网[关键词|用户名|类型]类似黑名单"] C1[(消息池 message pool<br>消息60秒过期机制<br>读取config.py中的# Message Pool Settings)] Q3 --> B3 Q2 --> A1 Q1 --> A3 A2 --> B2 A3 --> B2 A1 --> B1 B1 --> B3 B2 --> B3 B3 --"消息过滤后进入"--> C1 end subgraph "B. 消息处理与决策" C1 --> D1["拉取消息池发送至N8N_DECISION_WEBHOOK并返回消息 id"] D1 --> E1["根据消息 id 从消息池中取出<br>(在消息池中会相应删除)"] E1 --> F1{读取config.py中的Maps message types<br>并匹配优先级} F1 --> G1["消息优先级属于P0?"] G1 --"是"--> H1["将消息发送至N8N_LLM_WEBHOOK并返回响应"] G1 --"否"--> G2["消息优先级属于P1?"] G2 --"是"--> H2["将消息发送至N8N_LLM_WEBHOOK并返回响应"] G2 --"否"--> G3["消息优先级属于P2?"] G3 --"是"--> H3["将消息发送至N8N_LLM_WEBHOOK并返回响应"] G3 --"否"--> G99["消息优先级属于P99?"] G99 --"是"--> H99["将消息发送至N8N_LLM_WEBHOOK并返回响应"] H1 --> I1["TTS服务端socket_server.py"] H2 --> I2["TTS服务端socket_server.py"] H3 --> I3["TTS服务端socket_server.py"] H99 --> I99["TTS服务端socket_server.py"] J999[(持久堆积P99音频块池)] Z1["音频块推送员<br>独立运行<br>当后续音频池为空时才会推送音频<br>每次完整推送所有音频块"] I1 --> K1 I2 --> K1 I3 --> K1 I99 --> K1 K1["音频池管理器"] K1 --> J999 J999 --> Z1 K1 --"音频入音频池后返回拉取消息池并循环"--> D1 end subgraph "C. TTS播报层,<br>预热模式:关闭" L1["播放器 (异步+优先级轮询音频流池: P0 > P1 > P2 > P99)"] K1 --> L1 end subgraph "音频池区" J1[(音频池P0)] J2[(音频池P1)] J3[(音频池P2)] J99[(音频池P99)] K1 --> J1 K1 --> J2 K1 --> J3 K1 --> J99 Z1 --> J99 end

testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest