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

34 lines
2.9 KiB
Markdown
Raw Permalink 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
当前系统存在两条独立的发布路径:`scheduler.py``auto_publish_once` 直接生成并发布,完全绕过队列;而 `PublishQueue` + `QueuePublisher` 提供了另一套排期发布机制。两套系统互不感知,导致:
1. **排期时间全靠手动输入** — 用户必须自己判断最佳发布时间并以文本形式输入 `scheduled_time``analytics_service.py` 中已有的 `time_weights`基于历史数据的3小时段权重完全没有被利用。
2. **调度器发布绕过队列** — 自动化调度器的发布操作不经过审核流程,没有草稿预览、排期管理的保障;而队列系统又缺少自动化生成能力,两者无法联动。
3. **无内容分布控制** — 没有机制防止多篇内容扎堆发布,也没有将内容分散到高流量时段的能力。
## What Changes
- 新增**智能排期引擎**:基于 `AnalyticsService``time_weights` 自动计算最佳发布时间槽peak hours为入队内容自动分配 `scheduled_time`,避免同一时段拥堵
- 新增**自动排期模式**:内容生成入队时可选择"自动排期",系统自动跨天分散安排到高权重时段
- 将调度器的 `auto_publish_once` 重构为**通过队列发布**,统一发布路径,所有发布都经过队列 → 审核 → 排期 → 发布的标准流程
- 修改内容排期 UI增加一键自动排期、排期建议、时段热力图展示
## Capabilities
### New Capabilities
- `smart-schedule-engine`: 智能排期引擎 — 基于 `time_weights` 分析数据计算最优发布时段,自动为队列项分配排期时间,支持内容间距控制和时段负载均衡
- `unified-publish-path`: 统一发布路径 — 将 `scheduler.py` 的自动发布改为生成内容到队列 + 自动审核 + QueuePublisher 发布,消除绕过队列的直接发布
### Modified Capabilities
- `services-queue`: 队列添加时支持 `auto_schedule=True` 参数调用智能排期引擎;`generate_to_queue` 新增自动排期选项
- `services-scheduler`: `_scheduler_loop` 的 publish 分支改为调用 `generate_to_queue`(自动排期 + 自动审核),不再直接调用 `auto_publish_once` 的发布逻辑
## Impact
- **代码变更**: `services/publish_queue.py`(新增排期引擎方法)、`services/queue_ops.py``generate_to_queue` 增加自动排期参数)、`services/scheduler.py`publish 路径重构)、`services/analytics_service.py`(暴露 `time_weights` 查询接口)、`ui/app.py`(排期 UI 增强)
- **数据依赖**: 智能排期依赖 `content_weights.json` 中的 `time_weights` 字段;首次使用若无数据则 fallback 到默认高流量时段08-10, 12-14, 18-22
- **行为变更**: 调度器的自动发布不再即时发布,改为入队后由 QueuePublisher 按排期时间发布,会有分钟级延迟
- **向后兼容**: 手动输入 `scheduled_time` 仍然有效,智能排期仅在用户未手动指定时生效