jonashertner/sentinel

GitHub: jonashertner/sentinel

SENTINEL 是一个自动化全球疾病情报系统,为瑞士公共卫生机构整合多源疫情数据、进行混合风险评分并生成每日情报简报。

Stars: 0 | Forks: 0

# SENTINEL **瑞士流行病通知与威胁情报引擎** [![CI](https://github.com/user/sentinel/actions/workflows/ci.yml/badge.svg)](https://github.com/user/sentinel/actions/workflows/ci.yml) [![Daily Pipeline](https://github.com/user/sentinel/actions/workflows/pipeline.yml/badge.svg)](https://github.com/user/sentinel/actions/workflows/pipeline.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![Python 3.12+](https://img.shields.io/badge/python-3.12+-3776AB.svg)](https://www.python.org/downloads/) [![Next.js 14](https://img.shields.io/badge/Next.js-14-000000.svg)](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, 全健康, 公共卫生监测, 大语言模型分析, 数据管道, 数据规范化, 无后门, 流行病情报, 瑞士, 生物安全, 疫情预警, 自动化情报引擎, 自动化攻击, 自动日报, 自动笔记, 软件工程, 运行时操纵, 零基础设施成本, 静态仪表盘