graph TD subgraph "A. 消息生产与清洗并入库(独立运行,不拥堵)" A1["读取config.py中的定时任务"] A2["读取config.py中的直播监听类型"] A3["读取config.py中的抖音DOUYIN_LIVE_URL"] A15["读取config.py中的抖音TAOBAO_LIVE_URL"] A4["读取config.py中的MESSAGE_FILTER_SETTINGS"] A5["读取config.py中的INIT_MESSAGES"] A6["直播间获取消息<br>(调用 \\utils\\DouyinLiveWebFetcher)"<br>预热模式:关闭] A7["直播间获取消息<br>(调用 \\utils\\WeixinLiveWebFetcher)"<br>预热模式:关闭] A16["直播间获取消息<br>(调用 \\utils\\TaobaoLiveWebFetcher)"<br>预热模式:关闭] A8["手动发送自定义消息"] A9["定时发送自定义消息"] A10["构建初始化消息(一次性)"] A11["构建消息<br>(携带类型: chat, like, follow等)"] A12["构建消息<br>(携带类型: chat, like, follow, tts_direct,base_talk,welcome等)"] A13["消息滤网[关键词|用户名|类型]类似黑名单"] A14[(消息池 message pool<br>消息60秒过期机制<br>读取config.py中的# Message Pool Settings)] A5 --> A10 A4 --> A13 A3 --> A6 A2 --"DOUYIN"--> A3 A2 --"WEIXIN"--> A7 A2 --"TAOBAO"--> A15 A1 --> A9 A8 --> A12 A9 --> A12 A10 --> A12 A7 --> A11 A6 --> A11 A15 --> A16 A16 --> A11 A11 --> A13 A12 --> A13 A13 --"消息过滤后进入"--> A14 end subgraph "B. 消息处理与决策" B1["拉取消息池发送至N8N_DECISION_WEBHOOK并返回消息 id"] B2["根据消息 id 从消息池中取出<br>(在消息池中会相应删除)"] B3{读取config.py中的Maps message types<br>并匹配优先级} B4["消息优先级属于P0?"] B5["将消息发送至N8N_LLM_WEBHOOK并返回响应"] B6["消息优先级属于P1?"] B7["将消息发送至N8N_LLM_WEBHOOK并返回响应"] B8["消息优先级属于P2?"] B9["将消息发送至N8N_LLM_WEBHOOK并返回响应"] B10["消息优先级属于P99?"] B11["将消息发送至N8N_LLM_WEBHOOK并返回响应"] B12["TTS服务端socket_server.py"] B13[(持久堆积P99音频块池)] B14["音频块推送员<br>独立运行<br>当后续音频池为空时才会推送音频<br>每次完整推送所有音频块"] B15["音频池管理器"] A14 --> B1 B1 --> B2 B2 --> B3 B3 --> B4 B4 --"是"--> B5 B4 --"否"--> B6 B6 --"是"--> B7 B6 --"否"--> B8 B8 --"是"--> B9 B8 --"否"--> B10 B10 --"是"--> B11 B5 --"ws连接/control端口"--> B12 B7 --"ws连接/control端口"--> B12 B9 --"ws连接/control端口"--> B12 B11 --"ws连接/control端口"--> B12 B12 --"ws连接/listen端口"--> B15 B15 --> B13 B13 --> B14 B15 --"音频入音频池后返回拉取消息池并循环"--> B1 end subgraph "C. 音频池" C1["音频池P0"] C2["音频池P1"] C3["音频池P2"] C4["音频池P99"] B15 --> C1 B15 --> C2 B15 --> C3 B15 --> C4 B14 --> C4 end subgraph "D. TTS播报层" D1["播放器 (异步+优先级轮询音频流池: P0 > P1 > P2 > P99)<br>预热模式:关闭"] B15 --> D1 end

testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest