jonashertner/sentinel
GitHub: jonashertner/sentinel
SENTINEL 是一个自动化全球疾病情报系统,为瑞士公共卫生机构整合多源疫情数据、进行混合风险评分并生成每日情报简报。
Stars: 0 | Forks: 0
# SENTINEL
**瑞士流行病通知与威胁情报引擎**
[](https://github.com/user/sentinel/actions/workflows/ci.yml)
[](https://github.com/user/sentinel/actions/workflows/pipeline.yml)
[](LICENSE)
[](https://www.python.org/downloads/)
[](https://nextjs.org/)
## 什么是 SENTINEL?
SENTINEL 每天自动筛选全球公共卫生数据源,并生成经过风险评分、与瑞士相关的情报简报。它服务于 **瑞士联邦食品安全与兽医办公室 (BLV)** 和 **联邦公共卫生办公室 (BAG)**,在 **One Health** 框架下运行 —— 将人类、动物和环境健康监测整合为一个统一的作战视图。
每天早上 06:00 UTC,该 pipeline 会从五个国际来源收集事件,进行标准化和去重,应用混合风险评分引擎(确定性规则 + Claude LLM 分析),并将结果发布到静态仪表板 —— 全部在 GitHub Actions 上运行,零基础设施成本。
## 架构
```
graph LR
subgraph Sources["Data Sources"]
WHO["WHO DON"]
EIOS["WHO EIOS"]
PRO["ProMED-mail"]
ECDC["ECDC"]
WOAH["WOAH/WAHIS"]
end
subgraph Pipeline["Analysis Pipeline (GitHub Actions)"]
direction TB
COLLECT["Collectors"]
NORM["Normalizer"]
DEDUP["Deduplicator"]
RULE["Rule Engine"]
SWISS["Swiss Relevance"]
LLM["Claude LLM Analysis"]
REPORT["Daily Brief"]
end
subgraph Store["Data Store"]
JSON["data/*.json"]
end
subgraph Dashboard["Dashboard (GitHub Pages)"]
direction TB
CMD["Command Center"]
MAP["Global Map"]
TRI["Triage Queue"]
SIT["Situations"]
ANA["Analytics"]
WL["Watchlists"]
EXP["Export Center"]
end
WHO --> COLLECT
EIOS --> COLLECT
PRO --> COLLECT
ECDC --> COLLECT
WOAH --> COLLECT
COLLECT --> NORM --> DEDUP --> RULE --> SWISS --> LLM --> REPORT
LLM --> JSON
REPORT --> JSON
JSON --> Dashboard
style Sources fill:#1a1a2e,stroke:#e94560,color:#eee
style Pipeline fill:#1a1a2e,stroke:#0f3460,color:#eee
style Store fill:#1a1a2e,stroke:#16213e,color:#eee
style Dashboard fill:#1a1a2e,stroke:#533483,color:#eee
```
## 功能
### 自动化每日情报 Pipeline
该 pipeline 在 GitHub Actions 上无人值守运行,并行收集所有五个来源的数据,然后通过八阶段分析链处理事件:
1. **收集** -- RSS 源 (WHO DON, ProMED, ECDC),REST API (WOAH/WAHIS, WHO EIOS)
2. **标准化** -- 规范疾病名称(40+ 个别名),ISO 3166 国家代码,WHO 区域分配
3. **去重** -- 使用疾病 + 国家 + 3 天窗口分组进行跨源合并
4. **规则引擎** -- 确定性评分:地理邻近性、疾病严重程度、人畜共患标志、病死率、来源权威性
5. **瑞士相关性** -- 接壤国家、贸易伙伴、病媒栖息地、人畜共患/食源性标签
6. **执行运营层** -- 置信度评分、概率/影响分解、IMS 激活级别、牵头机构 (BAG/BLV/联合)、决策窗口和行动标志
7. **决策手册** -- 危害类别分配(大流行性呼吸道疾病、人畜共患溢出、食源性疾病、虫媒传染病)、SLA 计时器和升级工作流
8. **LLM 分析** -- Claude Haiku 用于批量筛选,Claude Sonnet 用于高风险事件。生成包含瑞士特定建议的结构化风险叙述
### 七视图仪表板
| 视图 | 用途 |
|------|---------|
| **指挥中心** | KPI 卡片、风险热力图、优先事件、趋势迷你图 |
| **全球地图** | 具有可切换图层的交互式疾病事件可视化 |
| **分流队列** | 基于卡片的分析师工作流:分配、注释、覆盖、批处理 |
| **态势** | 看板,追踪跨来源和时间的演变爆发 |
| **分析** | 疾病趋势、来源比较、风险时间线、地理传播 |
| **监视列表** | 具有预构建模板的自定义警报条件 |
| **导出中心** | PDF、CSV、JSON、Markdown 导出,带有特定机构模板 |
### 多机构支持
| 机构 | 重点 | 优先来源 |
|--------|-------|------------------|
| **BLV** | 人畜共患病、食品安全、虫媒传染病、AMR、动物健康 | WOAH, ECDC, ProMED |
| **BAG** | 大流行、呼吸道疾病、疫苗可预防疾病、旅行健康 | WHO DON, ECDC, WHO EIOS |
| **联合** | One Health 协调 —— 人畜共患溢出、AMR | 所有来源 |
### One Health 方法
SENTINEL 在人类-动物-环境界面标记和追踪事件:
- **人畜共患** -- 动物到人类的溢出潜力(禽流感、埃博拉、MERS、尼帕病毒、狂犬病、布鲁氏菌病、Q 热等)
- **虫媒传染** -- 在瑞士气候区具有已确立或新兴病媒的疾病(登革热、西尼罗河热、基孔肯雅热、寨卡、蓝舌病)
- **食源性** -- 弯曲杆菌病、沙门氏菌病、李斯特菌病、与瑞士进口链有关的大肠杆菌
- **AMR** -- 抗菌素耐药性追踪(结核病、弯曲杆菌、沙门氏菌)
## 数据来源
| 来源 | 方法 | 重点 | One Health 领域 | 更新频率 |
|--------|--------|-------|-------------------|--------|
| [WHO DON](https://www.who.int/emergencies/disease-outbreak-news) | RSS feed | 官方爆发报告 | 人类 | 每日 |
| [WHO EIOS](https://www.who.int/initiatives/eios) | REST API | 基于媒体的流行病情报 | 人类 / 环境 | 每日 |
| [ProMED-mail](https://promedmail.org) | RSS feed | 早期预警专家报告 | 人类 / 动物 | 每日 |
| [ECDC](https://www.ecdc.europa.eu) | RSS feed | 欧洲威胁评估 | 人类 | 每日 |
| [WOAH/WAHIS](https://wahis.woah.org) | REST API | 全球动物疾病爆发 | 动物 | 每日 |
每个来源都实现了可插拔的 `BaseCollector` 接口。添加新来源只需要一个 Python 类。
## 快速开始
### 前置条件
- Python 3.12+
- Node.js 20+
- [uv](https://docs.astral.sh/uv/) (Python 包管理器)
### 1. 克隆并安装
```
git clone https://github.com/user/sentinel.git
cd sentinel
# Backend
cd backend && uv sync --dev && cd ..
# Frontend
cd frontend && npm ci && cd ..
```
### 2. 运行 pipeline
```
# 设置 Anthropic API key(可选 -- Pipeline 无需 LLM 分析即可运行)
export SENTINEL_ANTHROPIC_API_KEY="sk-ant-..."
# 运行 Collection 和 Analysis Pipeline
cd backend && uv run python -m sentinel.pipeline
```
### 3. 运行仪表板
```
# 启动开发服务器(将根目录 data/ 同步到 frontend/public/data/)
cd frontend && npm run dev
```
打开 [http://localhost:3000](http://localhost:3000) 查看仪表板。
## 技术栈
| 组件 | 技术 |
|-----------|------------|
| **后端** | Python 3.12, FastAPI, Pydantic v2, httpx, feedparser |
| **LLM** | Anthropic Claude API (Haiku 4.5 用于筛选,Sonnet 4.6 用于深度分析) |
| **前端** | Next.js 14, React 18, TypeScript |
| **样式** | Tailwind CSS (瑞士极简主义 / 国际排版风格) |
| **图表** | Recharts, D3.js |
| **地图** | Mapbox GL JS |
| **测试** | pytest + pytest-asyncio (后端), Vitest (前端) |
| **CI/CD** | GitHub Actions (CI, 每日 pipeline, Pages 部署) |
| **部署** | GitHub Pages (静态导出,零成本) |
## 项目结构
```
sentinel/
├── .github/workflows/
│ ├── ci.yml # Lint, type-check, test on PRs
│ ├── pipeline.yml # Daily data collection (06:00 UTC)
│ └── deploy-dashboard.yml # Auto-deploy dashboard on data change
├── backend/
│ ├── pyproject.toml
│ └── sentinel/
│ ├── pipeline.py # Orchestrates the full pipeline
│ ├── config.py # Environment-based settings
│ ├── store.py # JSON file-based data persistence
│ ├── collectors/ # Source-specific data collectors
│ │ ├── base.py # BaseCollector ABC
│ │ ├── who_don.py # WHO Disease Outbreak News
│ │ ├── who_eios.py # WHO Epidemic Intelligence
│ │ ├── promed.py # ProMED-mail
│ │ ├── ecdc.py # European CDC
│ │ └── woah.py # World Organisation for Animal Health
│ ├── analysis/ # Processing and scoring
│ │ ├── normalizer.py # Disease name + country code normalization
│ │ ├── deduplicator.py # Cross-source event merging
│ │ ├── rule_engine.py # Deterministic risk scoring
│ │ ├── swiss_relevance.py # Switzerland-specific scoring
│ │ └── llm_analyzer.py # Claude-powered risk analysis
│ ├── models/ # Pydantic data models
│ │ ├── event.py # HealthEvent (core entity)
│ │ ├── situation.py # Situation (outbreak threading)
│ │ ├── annotation.py # Analyst annotations
│ │ └── organization.py # BLV/BAG/Joint agency configs
│ ├── api/ # FastAPI REST endpoints
│ │ ├── events.py # Event listing, filtering, search
│ │ ├── situations.py # Situation CRUD and event linking
│ │ ├── annotations.py # Analyst annotation management
│ │ ├── analytics.py # Trend and timeline data
│ │ ├── watchlists.py # Custom alert criteria
│ │ └── exports.py # CSV, JSON, Markdown export
│ └── reports/ # Report generation
│ ├── daily_brief.py # Markdown intelligence brief
│ └── csv_export.py # Tabular data export
├── frontend/ # Next.js 14 dashboard
│ └── src/
│ ├── app/ # Page routes
│ ├── components/ui/ # Reusable UI components
│ └── lib/ # API client, types, constants
├── data/ # Pipeline output (git-committed)
│ ├── events/ # Daily event JSON files
│ ├── reports/ # Daily Markdown briefs
│ ├── situations/ # Active situation tracking
│ └── annotations/ # Analyst annotations
└── docs/ # Documentation
├── architecture.md
├── data-sources.md
├── risk-scoring.md
├── deployment.md
├── analyst-guide.md
└── api-reference.md
```
## 风险评分
SENTINEL 使用结合确定性规则和 LLM 分析的 **混合评分方法**:
1. **规则引擎** (0--10 分) -- 距瑞士的地理邻近性、疾病严重程度、人畜共患/虫媒传染标志、病死率数据、来源权威性
2. **瑞士相关性** (0--10 分) -- 邻国距离、贸易伙伴状态、病媒栖息地适宜性、One Health 标签相关性
3. **LLM 调整** -- Claude 审查得分 >= 4.0 的事件,提供结构化的风险叙述,并可根据流行病学判断调整自动评分
| 类别 | 分数范围 | 行动 |
|----------|-------------|--------|
| **危急** | 8.0 -- 10.0 | 立即分析师审查,跨机构警报 |
| **高** | 6.0 -- 7.9 | 优先分流,创建态势 |
| **中** | 4.0 -- 5.9 | 标准监测,LLM 分析 |
| **低** | 0.0 -- 3.9 | 记录在案,可供搜索 |
完整方法:[docs/risk-scoring.md](docs/risk-scoring.md)
## 配置
所有设置均通过带有 `SENTINEL_` 前缀的环境变量控制:
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `SENTINEL_ANTHROPIC_API_KEY` | `""` | 用于 LLM 分析的 Anthropic API 密钥 |
| `SENTINEL_DATA_DIR` | `data` | Pipeline 输出目录 |
| `SENTINEL_LOG_LEVEL` | `INFO` | 日志详细程度 |
| `SENTINEL_MAPBOX_TOKEN` | `""` | 用于地图视图的 Mapbox GL 令牌 |
| `SENTINEL_ENABLE_WHO_DON` | `true` | 切换 WHO DON 收集器 |
| `SENTINEL_ENABLE_WHO_EIOS` | `true` | 切换 WHO EIOS 收集器 |
| `SENTINEL_ENABLE_PROMED` | `true` | 切换 ProMED 收集器 |
| `SENTINEL_ENABLE_ECDC` | `true` | 切换 ECDC 收集器 |
| `SENTINEL_ENABLE_WOAH` | `true` | 切换 WOAH 收集器 |
## 文档
| 文档 | 描述 |
|----------|-------------|
| [架构](docs/architecture.md) | 系统设计、数据流、组件交互、设计决策 |
| [数据来源](docs/data-sources.md) | 每个来源的详细信息:URL、格式、速率限制、错误处理 |
| [风险评分](docs/risk-scoring.md) | 完整方法,包含权重、LLM 提示词和示例 |
| [部署](docs/deployment.md) | 分步指南:fork、secrets、Actions、Pages |
| [分析师指南](docs/analyst-guide.md) | BLV/BAG 分析师用户手册 |
| [API 参考](docs/api-reference.md) | 所有端点及请求/响应示例 |
| [贡献](CONTRIBUTING.md) | 如何添加来源、代码标准、PR 流程 |
## 贡献
有关添加新数据源、代码标准和 PR 流程的指南,请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。
## 许可证
MIT -- 详情见 [LICENSE](LICENSE)。
## 致谢
- **瑞士联邦食品安全与兽医办公室 (BLV)** -- 动物健康、食品安全和人畜共患疾病职能
- **瑞士联邦公共卫生办公室 (BAG)** -- 人类健康和大流行防范职能
- **One Health** 方法(由 WHO, WOAH (OIE) 和 FAO 倡导)-- 认识到人类、动物和环境的健康是相互关联的
标签:Claude, CVE检测, ECDC, ESC4, GitHub Actions, One Health, OSINT, ProMED, Python, WHO, WOAH, 全健康, 公共卫生监测, 大语言模型分析, 数据管道, 数据规范化, 无后门, 流行病情报, 瑞士, 生物安全, 疫情预警, 自动化情报引擎, 自动化攻击, 自动日报, 自动笔记, 软件工程, 运行时操纵, 零基础设施成本, 静态仪表盘