Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion docs/design.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,23 @@ SQLite 没有原生日期时间类型,状态存储需要直接对 TEXT 做范

## 失败语义

任一已配置 RSS 源重试耗尽会终止任务并增加失败计数。失败计数首次达到阈值时通过投递 provider 发送一次运维提醒,成功任务会重置计数。无更新检测按“最后一次看见该源任意文章”计算,不因当天过滤而丢失活跃信号;同一轮长期无更新只提醒一次,看到更新后才重新开放下一次陈旧提醒。没有 RSS 配置时不会创建 RSS 请求或健康告警,天气 API 继续驱动每小时任务。
### RSS 失败

RSS 是可选补充源,其失败不影响任务成功率;天气 API 是主要信息来源。

**获取失败** — 单个 RSS 源经可配置次数重试(默认 3 次,间隔 3–5 秒)后仍无法获取或解析。行为:记录警告日志,本次运行继续使用已成功获取的 RSS 内容和天气 API 数据。

**长期无更新** — RSS 源在配置的小时数(默认 24)内未曾见到任何新文章。判定基准为 `source_health` 表中记录的最后一次文章时间,不受当天本地日期筛选影响。

**告警** — 连续获取失败达到可配置阈值(`RSS_FAILURE_THRESHOLD`,默认 3)时向运维渠道发送告警;成功记录告警状态后,同一失败周期不再重复告警,源恢复后重置计数器并重新开放告警。长期无更新采用相同规则,看到新文章后重新开放。两类 RSS 健康告警均为至少一次投递:投递或状态写入失败只记录日志并在后续任务中重试,不得终止简报任务;投递成功但状态写入失败时可能产生内容相同的重复告警,接收端应按告警类型、源集合和失败周期去重。

未配置任何 RSS 源时不创建 RSS 请求或健康告警,天气 API 独立驱动每小时和每日任务。

### 任务失败

**触发条件**:天气上下文获取失败(所有 provider 均不可用)、辅助上下文源获取失败(例如 `HTTPContextSource.fetch()` 抛出 `SourceFetchError`)、LLM 调用或输出校验失败、配置校验失败。

**行为**:终止当前任务,并立即通过投递 provider 发送一次性运维提醒。投递失败时在后续任务失败中继续重试;成功投递后,同一失败周期不再重复告警。成功的任务重置计数和告警状态。RSS 获取失败不计入任务失败计数。
Comment thread
coderabbitai[bot] marked this conversation as resolved.

小时 LLM 结果包含布尔字段 `should_publish`。模型比较当前及历史 API 快照,仅在降雨、显著天气变化、预警或灾害动态值得打扰时设为真;活动预警不允许与 false 同时出现。false 结果不投递消息,但当前快照、文章去重和预警状态仍持久化。

Expand Down
4 changes: 2 additions & 2 deletions docs/requirements.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@
## 可靠性

1. RSS 请求失败后随机等待 3–5 秒并重试;重试次数可配置。
2. 重试耗尽则本次任务失败
3. 连续三次任务失败,或任一已配置 RSS 源超过 24 小时没有新文章,向运维通知渠道报警。未配置 RSS 不属于故障。
2. 重试耗尽则记录警告日志并继续任务;RSS 是可选补充源,其获取失败不终止任务,但连续失败达到阈值时独立发出运维告警。连续失败和长期无更新告警均采用至少一次投递;投递或状态写入失败时记录日志并在后续任务中重试,不得使简报任务失败,接收端应按告警类型、源集合和失败周期去重
3. 任务发生非 RSS 错误时立即向运维通知渠道报警;投递失败时在后续任务失败中重试,成功投递后同一轮失败不重复告警,任务成功后重新开放。RSS 获取连续失败达到可配置阈值(默认 3)时独立报警,与任务失败隔离。任一已配置 RSS 源超过配置的时长(默认 24 小时)没有新文章也触发报警。未配置 RSS 不属于故障。

## 架构与隐私

Expand Down
2 changes: 1 addition & 1 deletion env.example
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,6 @@ BRIEFING_MAX_CHARACTERS=3500

# Optional state and reliability tuning.
BRIEFING_STATE_PATH=state/weather.sqlite3
TASK_FAILURE_THRESHOLD=3
RSS_FAILURE_THRESHOLD=3
WARNING_RETENTION_HOURS=12
HISTORY_HOURS=48
2 changes: 1 addition & 1 deletion tests/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,7 @@ def _make_fake_settings(**overrides: object) -> object:
"rss_retry_min_seconds": 3,
"rss_retry_max_seconds": 5,
"rss_stale_hours": 24,
"task_failure_threshold": 3,
"rss_failure_threshold": 3,
"warning_retention_hours": 12,
"history_hours": 48,
"briefing_max_characters": 3500,
Expand Down
2 changes: 1 addition & 1 deletion tests/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,8 +223,8 @@ def test_debug_accepts_truthy_values_with_optional_outer_quotes(monkeypatch, val
"name",
(
"HTTP_TIMEOUT_SECONDS",
"RSS_FAILURE_THRESHOLD",
"RSS_STALE_HOURS",
"TASK_FAILURE_THRESHOLD",
"WARNING_RETENTION_HOURS",
"HISTORY_HOURS",
),
Comment thread
IceCodeNew marked this conversation as resolved.
Expand Down
Loading
Loading