luisassardo/disarm-tagger
GitHub: luisassardo/disarm-tagger
一款基于 DISARM 框架的虚假信息分析工具,让记者通过自然语言描述即可获取对应的战术、技术、反制措施及推荐资源。
Stars: 0 | Forks: 0
# DISARM Tagger — `disarm.j-lab.tools`
这是一款面向记者的工具,用于将虚假信息活动映射到
[DISARM 框架](https://github.com/DISARMFoundation)。记者无需在分析矩阵中勾选
复选框,只需**用自然语言描述活动**,
AI 助手(基于 Claude 工具调用)会**建议观察到的 DISARM 技术**,
并将其限制在有效的框架 ID 内。记者确认/编辑后,即可导出
具有可操作性且支持双语的报告。
J-Lab 新闻工具包的一部分。作为 C-LAB 的配套桥梁:导出的
Navigator 层是一种互操作格式,C-LAB 可将其摄取到威胁情报
平台中。
## 为什么选择此工具而不是 DISARM Navigator?
官方的 Navigator 是一款出色的分析师工具(MITRE ATT&CK
Navigator 的一个分支),但它仅支持英语,且是围绕标记矩阵构建的。此工具
保持了 DISARM 分类法的准确性(阶段 → 战术 → 技术 → 反制措施,
规范的 ID),同时改变了*工作流*以适应新闻报道:输入叙述性文字,
输出接地气的技术,并导出双语报告和 Navigator 层。
## 技术栈
Flask + `anthropic` SDK,可部署在 Render 上。镜像了 J-Lab 托管工具的
模式(服务端 API 密钥,优雅的本地回退,ES/EN)。
前端使用 **ARGUS / J-LAB 设计系统**(Space Grotesk + IBM Plex
Mono,战术暗黑 OKLCH 配色,J-LAB 琥珀玫瑰色调),存放在
`static/argus/` 目录下(`desk.css` 应用外壳 + `node.js` i18n/时钟 + `icons.js`)。
i18n 基于 `data-en`/`data-es` 属性,通过 `window.ArgusLang` 实现。
### 布局
- **第 1 行**:案件描述(附带可选链接) · 类似已记录案件
(真实的 DISARM 事件 + 每个事件都带有“阅读报告”搜索链接)。
- **第 2 行**:三列 — 技术 · 战术 · 反制措施。反制措施
进行了颜色编码(绿色 = 针对此案件建议的措施)。
- **第 3 行**:推荐工具与资源(J-LAB 工具 + 外部组织),
根据所涉及的战术进行排名。
每次点击都会展开项目以显示其完整的 DISARM 定义。
## 设置
```
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
# 1. 从上游 DISARM SQLite 构建数据集(运行一次 / 更新时运行):
python scripts/build_dataset.py \
--sqlite ../../DISARMframeworks-17/generated_files/DISARM_database.sqlite
# 2. (可选)通过 Claude 填充西班牙语翻译 — 需要 ANTHROPIC_API_KEY:
python scripts/build_dataset.py --translate
# 3. 运行:
cp .env.example .env # add your ANTHROPIC_API_KEY (optional)
flask run # or: gunicorn app:app
```
如果没有 `ANTHROPIC_API_KEY`,该应用也能正常运行,并使用**本地关键词
引擎**来提供建议。
## API
| Endpoint | Method | 用途 |
| --- | --- | --- |
| `/` | GET | 应用 UI (`?lang=es|en`) |
| `/api/health` | GET | `{ai_enabled, model, langs, disarm_version, ai_budget}` |
| `/api/framework?lang=` | GET | 为浏览器提供的完整本地化数据集 |
| `/api/suggest` | POST | `{description, links[], lang}` → 完整的数据包:`{techniques, tactics, counters, similar_cases, resources}` |
| `/api/report` | POST | `{title, description, techniques[], lang}` → `{markdown, layer}` |
## 数据与许可
- 框架内容 (`data/disarm_en.json`) 派生自 **DISARM Frameworks
v1.7, © DISARM Foundation, CC BY-SA 4.0**。
- 西班牙语翻译 (`data/disarm_es.json`) 是 J-Lab 的衍生作品,同样遵循
**CC BY-SA 4.0** 协议,并已声明出处。
- 应用程序代码遵循 **MIT** 协议。
请参阅 [`NOTICE`](NOTICE) 获取完整的归属声明。该数据集可通过
`scripts/build_dataset.py` 从上游重新生成,而无需触及应用代码。
## 成本
旨在以低成本且可预测的方式运行(自我维护,目标约为 5 美元/月)。采用分层
策略,优先使用最便宜的方案:
1. **Anthropic 控制台支出限制(硬性后盾)。** 设置月度支出限制
(例如 5 美元)+ 在工作区/密钥上设置电子邮件提醒,网址为
[console.anthropic.com](https://console.anthropic.com)。这是真正的
上限:下面的任何配置都无法超过它。
2. **廉价模型 + 严格上限。** `claude-haiku-4-5`,`max_tokens=2000`,
`AI_MAX_TOOL_TURNS=3`。
3. **Prompt 缓存。** 系统 Prompt 和工具 schema(繁重的静态输入)
已被缓存,因此重复调用的成本约为输入的 10%。
4. **每日预算。** `AI_DAILY_LIMIT`(默认 50)限制每个 UTC 日的分析次数;超过限制后,
应用会静默降级为免费的本地关键词引擎。`/api/health`
会报告 `ai_budget.remaining`。
5. **基于 IP 的速率限制。** `/api/suggest` 限制为 3 次/分钟和 10 次/小时(超出则返回 HTTP 429)。
6. **输入上限。** `MAX_CASE_CHARS`(默认 6000)限制了输入 token。
在 v0.1 版本中,故意未接入用于获取真实报告链接的 **Web 搜索**功能(因为它会增加
每次请求的成本);“类似案件”改用搜索链接代替。
## 部署 (Railway)
包含 `railway.json` + `.python-version`;Railway 通过 Nixpacks 构建并
使用 gunicorn 运行 `Procfile`/`startCommand`。步骤:
1. 从代码库创建一个 Railway 项目。
2. 设置环境变量(仪表板):`ANTHROPIC_API_KEY` (密钥),`ANTHROPIC_MODEL`,
`AI_MAX_TOOL_TURNS`,`AI_DAILY_LIMIT`,`MAX_CASE_CHARS`。
3. 部署;健康检查 endpoint 为 `/api/health`。
4. 将 `disarm.j-lab.tools` 添加为自定义域名,然后在 Cloudflare 中添加指向
Railway 提供的域名的 **CNAME** 记录。
`render.yaml` 保留作为备选主机。
## 范围 (v0.1)
包含:AI 辅助标记 (ES/EN),框架浏览器,报告 + Navigator 层
导出,本地回退。不包含(后续推出):德语,持久化/账户,原生 STIX
导出(待 C-LAB 接入 OpenCTI 后推出),完整的蓝队框架缓解指南。
标签:DISARM框架, Flask, IPv6支持, 人工智能辅助, 信息作战防御, 威胁情报, 开发者工具, 新闻业工具, 虚假信息分析, 逆向工具