zhoujie 4d83c0f4a9
Some checks failed
CI / Lint (ruff) (push) Has been cancelled
CI / Import Check (push) Has been cancelled
feat(scheduler): 新增热点自动采集功能并优化发布路径
- 新增热点自动采集后台线程,支持定时搜索关键词并执行 AI 分析,结果缓存至结构化状态
- 新增热点分析状态管理接口,提供线程安全的 `get_last_analysis` 和 `set_last_analysis` 方法
- 新增热点数据桥接函数 `feed_hotspot_to_engine`,将分析结果注入 TopicEngine 实现热点加权推荐
- 新增热点选题下拉组件,分析完成后自动填充推荐选题,选中后自动写入选题输入框
- 优化 `generate_from_hotspot` 函数,自动获取结构化分析摘要并增强生成上下文
- 新增热点自动采集配置节点,支持通过 `config.json` 管理关键词和采集间隔

♻️ refactor(queue): 实现智能排期引擎并统一发布路径

- 新增智能排期引擎,基于 `AnalyticsService` 的 `time_weights` 自动计算最优发布时段
- 新增 `PublishQueue.suggest_schedule_time` 和 `auto_schedule_item` 方法,支持时段冲突检测和内容分布控制
- 修改 `generate_to_queue` 函数,新增 `auto_schedule` 和 `auto_approve` 参数,支持自动排期和自动审核
- 重构 `_scheduler_loop` 的自动发布分支,改为调用 `generate_to_queue` 通过队列发布,统一发布路径
- 重构 `auto_publish_once` 函数,移除直接发布逻辑,改为生成内容入队并返回队列信息
- 新增队列时段使用情况查询方法 `get_slot_usage`,支持 UI 热力图展示

📝 docs(openspec): 新增内容排期优化和热点探测优化规范文档

- 新增 `smart-schedule-engine` 规范,定义智能排期引擎的功能需求和场景
- 新增 `unified-publish-path` 规范,定义统一发布路径的改造方案
- 新增 `hotspot-analysis-state` 规范,定义热点分析状态存储的线程安全接口
- 新增 `hotspot-auto-collector` 规范,定义定时热点自动采集的任务流程
- 新增 `hotspot-engine-bridge` 规范,定义热点数据注入 TopicEngine 的桥接机制
- 新增 `hotspot-topic-selector` 规范,定义热点选题下拉组件的交互行为
- 更新 `services-queue`、`services-scheduler` 和 `services-hotspot` 规范,反映功能修改和新增参数

🔧 chore(config): 新增热点自动采集默认配置

- 在 `DEFAULT_CONFIG` 中新增 `hotspot_auto_collect` 配置节点,包含 `enabled`、`keywords` 和 `interval_hours` 字段
- 提供默认关键词列表 `["穿搭", "美妆", "好物"]` 和默认采集间隔 4 小时

🐛 fix(llm): 增强 JSON 解析容错能力

- 新增 `_try_fix_truncated_json` 方法,尝试修复被 token 限制截断的 JSON 输出
- 支持多种截断场景的自动补全,包括字符串值、数组和嵌套对象的截断修复
- 提高 LLM 分析热点等返回 JSON 的函数的稳定性

💄 style(ui): 优化队列管理和热点探测界面

- 在队列生成区域新增自动排期复选框,勾选后隐藏手动排期输入框
- 在日历视图旁新增推荐时段 Markdown 面板,展示各时段权重和建议热力图
- 在热点探测 Tab 新增推荐选题下拉组件,分析完成后动态填充选项
- 在热点探测 Tab 新增热点自动采集控制区域,支持启动、停止和配置采集参数
2026-02-28 22:22:27 +08:00

35 lines
3.4 KiB
Markdown
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.

## Why
当前热点探测流程存在两个问题:
1. **数据流断裂**`analyze_and_suggest` 调用 LLM 分析出的结构化数据(热门选题列表、推荐建议)在渲染成 Markdown 后即被丢弃,后续生成环节拿到的 `topic_from_hotspot` 仍是原始搜索关键词,与分析结论完全脱节;分析结果也从未传入 `TopicEngine` 评分体系,导致智能选题引擎无热点输入可用。
2. **完全依赖手动触发**热点搜索和分析没有自动化机制需要用户每次手动点击「搜索」和「AI 分析」才能获取最新热点;调度器已具备定时任务能力(`services/scheduler.py`),但从未被用于热点采集,导致系统在无人操作时完全感知不到当前热点变化。
## What Changes
- **保留结构化分析结果**`analyze_and_suggest` 将 LLM 返回的 `dict` 缓存至模块级状态UI 层仍显示 Markdown但结构数据可供后续环节使用
- **修复选题传递逻辑**:将"推荐选题"下拉列表绑定到解析后的 `suggestions`,用户选择某条建议后 `topic_from_hotspot` 填入该建议标题,而非搜索关键词
- **扩大生成参考上下文**`generate_from_hotspot` 同时接收结构化分析摘要 + 原始搜索片段,替换现有的粗暴 `[:2000]` 截断
- **接入 TopicEngine**:分析完成后将 `hotspot_data` 注入 `TopicEngine.recommend_topics()`,使智能选题 Tab 可获得热点加权推荐
- **自动采集热点**:在调度器中新增定时热点采集任务,按配置的关键词列表和间隔自动执行「搜索 → LLM 分析 → 更新状态缓存」全流程,结果写入 `_last_analysis`UI 打开时可直接读取最新数据
## Capabilities
### New Capabilities
- `hotspot-analysis-state`:在 `services/hotspot.py` 中维护会话级结构化分析状态(`_last_analysis`),供同模块其他函数读取;提供 `get_last_analysis()` / `set_last_analysis()` 线程安全存取接口
- `hotspot-topic-selector`:在热点探测 UI 中新增"选题下拉"组件,由分析结果的 `suggestions` 动态填充,选中后自动写入 `topic_from_hotspot`
- `hotspot-engine-bridge`:新增 `feed_hotspot_to_engine(hotspot_data, topic_engine)` 函数,将热点分析结果注入 `TopicEngine`,使其 `recommend_topics()` 获得实时热点评分
- `hotspot-auto-collector`:在调度器中新增 `schedule_hotspot_collection(keywords, interval_hours, mcp_url, llm_model)` 函数,按间隔自动执行热点搜索与 LLM 分析,结果写入 `hotspot-analysis-state`;配置项存储于 `config.json``hotspot_auto_collect` 节点(`enabled``keywords``interval_hours`
### Modified Capabilities
- `services-hotspot``analyze_and_suggest` 返回值新增结构化分析状态的副作用写入;`generate_from_hotspot` 签名扩展,接受可选的 `analysis_summary` 参数用于增强生成上下文
## Impact
- **代码**`services/hotspot.py`(主要改动)、`services/scheduler.py`(新增定时采集任务)、`ui/app.py`(新增下拉组件绑定)、`services/topic_engine.py`(调用方新增 hotspot 输入)、`services/config_manager.py`(新增 `hotspot_auto_collect` 配置节点)
- **API**`generate_from_hotspot` 函数签名向后兼容(新增可选参数)
- **依赖**:无新增外部依赖
- **数据**:分析状态为进程内内存缓存,不持久化;自动采集配置持久化至 `config.json`