project-89/veritas

GitHub: project-89/veritas

Veritas 是一个开源叙事情报 OSINT 平台,用于追踪和对比同一事件跨媒体来源的叙事分歧,并提供基于证据的可审计验证。

Stars: 0 | Forks: 0

# Veritas — 叙事情报平台 Veritas 追踪叙事如何在开放式网络中出现、分化并传播。这是一个免费、开源的 OSINT 平台,其构建基于一个核心原则:**任务是看清谁在说什么——而不是决定什么是真相。** 来源被视作一种结构性事实(谁控制着媒体、谁为其提供资金、它的受众是谁);绝不预设立场。当平台提出事实性主张时,它会以证据为基础并展示其推导过程;如果无法做到,它就会选择弃权并如实相告。 ## Veritas 的功能 - **揭示叙事分歧** — 跨媒体平台聚合同一个现实世界的报道,并按*视角类别*(国内官方媒体、国际官方媒体、公共广播机构、独立媒体)并排展示其报道内容。官方如何向本国民众与世界传达信息,与独立媒体对同一事件的报道之间存在的差异,正是核心信号所在。 - **接入实时全球事件 feed** — 持续轮询来自 8 个信号源(地震、灾害、天气、冲突、市场、新闻)和约 160 个精选 RSS feed 的全球数据流,并在交互式地球仪和 NERV 风格的战术地图上呈现,同时带有分区域的**激增检测**(仅当某个区域超过其*自身*基线时才会被标记,而非仅凭绝对数量)。 - **执行定向扫描** — 覆盖 11 个平台 connector,具备严格的词汇匹配功能,并包含一个 LLM **查询优化**层,能将模糊的主题转化为敏锐且词汇匹配的查询,所有结果均基于实时网络数据。 - **提取基于证据的案例** — 例如,一个追踪来源的真实世界 AI 模型失败语料库。每个条目都引用了其原始帖子的逐字摘录(经过机器验证),并经过对抗性怀疑测试的考验,以剔除无实质互动的内容。 - **调查行为者** — 跨 connector 的单用户时间线,跨平台身份发现(Sherlock,400+ 网络),协同操纵与机器人检测,以及“谁受益”(cui-bono)推理分析。 - **检测操纵** — 17 种政治宣传技术(基于技术特征,而非针对行为者),基于证据的主张验证(链上数据 / SEC / GitHub / Wayback / Wikipedia),以及平台可信度评分。 - **翻译与留存** — 非英语官方媒体(俄语、波斯语)的内容在接入时会进行机器翻译,并始终保留原文;append-only 的历史记录会捕捉编辑修改(隐蔽重命名),并且无 TTL 的归档会保留新闻框架数据以进行纵向分析。 - **支持 Agent 操作** — 整个 pipeline 通过 MCP 暴露,因此外部 agent 可以自主执行扫描、分析、验证、优化查询以及提取案例。 ## 设计原则 - **诚实的降级。** 每个基于 LLM 的阶段都有明确的 fallback,并会说明结果是由哪种模式生成的(语义匹配还是 hash-fallback embeddings,基于 LLM 的验证还是启发式验证)。缺少关键依赖项时会以可见的方式降级某项功能,而不是伪造输出。 - **来源重于观点。** 所有权分类体系(`independent` / `public-broadcaster` / `state-media` / `state-official`)是结构性的,且**与阵营无关** — 对华盛顿、布鲁塞尔、莫斯科和北京一视同仁。美国政府的 feed 会被标记为 `state-official`,这与标记俄罗斯政府部门 feed 的方式完全相同。 - **零漂移。** UI 的能力展示(connectors、feed 统计、信号源、LLM 状态)均基于实时的 `/capabilities` endpoint 构建出来,绝不使用硬编码列表 — 如果某个 connector 掉线,各处均会自动显示其为离线状态。 - **有据可依或保持沉默。** 提出主张和提取案例时必须引用可验证的证据;无法验证的内容会被丢弃并*计入统计*,因此输出结果会明确说明过滤了哪些内容,而不是悄无声息地减少数量。 ## 架构 ``` 11 platform connectors ─┐ 8 signal sources ────────┼─► BullMQ scan queue ─► MongoDB (live + append-only history/archive) ~160 RSS feeds ──────────┘ │ ▼ Analysis (libs/analysis): Gemini semantic clustering · claim verification · propaganda · deep investigation · divergence clustering · failure extraction · translation · surge aggregation │ Memgraph (MAGE) social graph ── Redis (queues + scan events) ▼ NestJS API (apps/api) ─► Next.js NERV dashboard (apps/veritas-client) └► MCP server (apps/veritas-mcp) for agent control ``` **Monorepo (Nx):** `apps/{api, veritas-client, veritas-mcp}` · `libs/{analysis, ingestion, database, shared, content-classification, visualization}` · `packages/atlas-plugin`。 ## 数据源 ### 平台 connector(已注册 11 个 — 实时状态请参见 `GET /capabilities`) | 平台 | 方法 | 认证 | |----------|--------|------| | Twitter/X | `@haruhunab1320/twitter-scraper` | Cookies 或登录 | | Bluesky | AT Protocol AppView API | 无 | | 4chan | 公开 JSON API | 无 | | YouTube | yt-dlp CLI (+ 字幕) | 无 | | Farcaster | Neynar API v2 | 免费密钥 | | Telegram | t.me 网页预览抓取 | 无 | | Wikipedia | 时事门户 API | 无 | | GDELT | GDELT DOC 2.0 API | 无 | | RSS / 新闻 | 约 160 个精选 feed | 无 | | Reddit | Application-only OAuth | `REDDIT_CLIENT_ID` + `SECRET` | | Facebook | 通过 Jina Reader 进行主页监控 | `FACEBOOK_PAGE_URLS` | ### RSS 目录(约 160 个 feed,89 个 tier-1) 包含独立媒体,加上 **19 个公共广播机构**(BBC、DW、France 24、NPR、Al Jazeera 等)以及 **14 个官方媒体**(Xinhua/CGTN、RT/Sputnik/TASS、Press TV、Anadolu、teleSUR),并标记了其所有权和受众属性。**9 个面向国内受众的 feed**(俄语和波斯语,如 RIA Novosti、TASS-ru、Lenta、Rossiyskaya Gazeta、IRNA)在接入时会进行机器翻译,同时保留原文。 ### 全球事件信号源(8 个,无需密钥) USGS(地震) · GDACS(灾害) · NASA EONET(自然事件) · NOAA/NWS(天气预警) · ACLED(冲突) · GDELT(新闻) · CoinGecko(市场) · RSS tier-1。 ### 证据与关联适配器 主张验证基于 Etherscan、DexScreener、GitHub、SEC EDGAR、Wayback Machine 和 Wikipedia 进行交叉比对。下游影响关联分析接入了 Yahoo Finance、World Bank 和 FRED。 ### 网络搜索(无需密钥) 使用 DuckDuckGo HTML + Google News RSS 进行查询扩充;当设置了 `BRAVE_SEARCH_API_KEY` 时,会自动使用 Brave Search API。 ## 快速开始 ### 前置条件 - Node.js 18+、MongoDB、Redis - Python 3(用于 yt-dlp、sherlock) - 可选:安装带有 MAGE 的 Memgraph 以使用图算法 ``` npm install pip install yt-dlp sherlock-project cp .env.example .env # edit — minimum: GEMINI_API_KEY, MONGODB_URI docker compose -f docker-compose.dev.yml up -d # MongoDB, Redis, Memgraph (MAGE) npx nx serve api # backend → :3000 npx nx serve veritas-client # frontend → :4200 ``` ### 环境变量 **必填** ``` GEMINI_API_KEY= # analysis (clustering, verification, translation, refinement) MONGODB_URI=mongodb://localhost:27017 REDIS_HOST=localhost REDIS_PORT=6379 ``` 如果没有 `GEMINI_API_KEY`,应用程序依然可以运行 — 分析功能会降级为启发式/弃权模式,并会明确提示。 **可选(每一项都会解锁一项功能,并在 `/capabilities` 和 Monitor 面板中展示)** ``` TWITTER_COOKIES= # or TWITTER_USERNAME/PASSWORD/EMAIL — Twitter/X REDDIT_CLIENT_ID= # + REDDIT_CLIENT_SECRET — Reddit (free script app) NEYNAR_API_KEY= # Farcaster FACEBOOK_PAGE_URLS= # Facebook page monitoring FRED_API_KEY= # Federal Reserve data ETHERSCAN_API_KEY= # on-chain evidence GITHUB_TOKEN= # GitHub evidence (higher rate limit) BRAVE_SEARCH_API_KEY= # upgrades web search ranking MEMGRAPH_HOST= # graph database ``` ## 仪表盘 - **指令 / 战术** — 主页仪表盘和 NERV 六边形战术地图(分类六边形、激增环、严重性雷达、区域滚动条)。 - **世界地图** — 带有分类/严重性过滤器和搜索飞至功能的实时全球事件 feed 交互式 3D 地球仪。 - **视角** — 叙事分歧视图:在可选时间窗口(24小时/48小时/7天)内,争议最大新闻的主从明细列表,按视角类别进行拆分。 - **搜索** — 基于能力驱动的扫描构建器,带有查询优化功能。 - **监控** — 调查、警报以及实时的系统功能面板。 - **图集** — 可复用的推理透镜提取(plugin)。 ## MCP 工具 `veritas_scan` · `veritas_wait_for_scan` · `veritas_get_scan(_posts)` · `veritas_analyze_narratives` · `veritas_verify_claim` · `veritas_extract_failure_examples` · `veritas_web_search` · `veritas_refine_query` · `veritas_coverage_probe` · `veritas_recent_scans`。 ## 测试 ``` npx nx test analysis # ~560 tests npx nx test ingestion # ~390 tests npx nx test api npx tsc --noEmit # type check ``` ## 许可证 参见仓库的许可证。
标签:叙事分析, 媒体监测, 搜索引擎查询, 数据溯源, 版权保护, 自动化攻击, 舆情监测, 身份溯源, 逆向工具