视频/图片/文本事实核查工具。支持多平台视频 URL、图片上传、文本输入,通过 Gemini/OpenAI + Google Search Grounding 自动核查事实。集成飞书机器人和 Notion 同步,支持知识管理和持久化备份。
┌──────────────────────────────────────────────────┐
│ Docker Container (:8000) │
│ │
│ Gateway Service (FastAPI) │
│ ├── /api/check 文本/图片事实核查 │
│ ├── /api/check/stream 流式事实核查 │
│ ├── /api/pipeline 视频核查流程 │
│ ├── /api/history 历史记录管理 │
│ ├── /api/llm-config 大模型配置 │
│ ├── /api/notion-config Notion 同步配置 │
│ ├── /api/notion/sync 手动同步到 Notion │
│ ├── /api/prompt 提示词管理 │
│ ├── /api/cookies 平台 Cookie 管理 │
│ ├── /api/health 健康检查 │
│ │ │
│ ├── downloaders/ 视频下载器 │
│ │ ├── 优先: 第三方解析 API (所有平台) │
│ │ └── 回退: yt-dlp + cookies │
│ │ │
│ ├── feishu/ 飞书机器人 (WebSocket) │
│ │ ├── 文本消息 → 事实核查 │
│ │ ├── 图片消息 → 多模态核查 │
│ │ └── 视频链接 → 视频核查流程 │
│ │ │
│ ├── notion/ Notion 同步 │
│ │ ├── 自动同步: 核查完成后自动写入 │
│ │ └── 手动同步: 历史记录一键同步 │
│ │ │
│ └── frontend/ 单页面 Web UI │
└──────────────┬───────────────────────────────────┘
│ HTTP POST /transcribe
┌──────────────▼───────────────────────────────────┐
│ Whisper Service (宿主机 launchd :8001) │
│ Apple Silicon GPU · mlx-whisper │
└──────────────────────────────────────────────────┘
核心流程:
- 文本 → Gemini/OpenAI + Google Search Grounding 事实核查
- 图片 + 文本 → 多模态 Gemini 事实核查
- 视频 URL → 下载音频 → 获取字幕/Whisper 转写 → 观点总结 + 事实核查
- 核查结果 → 自动/手动同步到 Notion 子页面
fact_check/
├── backend/
│ ├── main.py # FastAPI 入口,生命周期管理
│ ├── config.py # 环境变量配置 (Pydantic Settings)
│ ├── routers/
│ │ ├── check.py # 文本/图片事实核查 (GET/POST, 流式)
│ │ ├── pipeline.py # 视频核查流程 (POST 提交, GET 轮询)
│ │ ├── history.py # 历史记录 CRUD
│ │ ├── prompt.py # 提示词模板管理
│ │ ├── cookies.py # 平台 Cookie 管理
│ │ ├── llm_config.py # 大模型配置管理
│ │ ├── notion.py # Notion 同步 API
│ │ ├── feishu.py # 飞书 WebSocket 集成
│ │ └── health.py # 健康检查
│ ├── services/
│ │ ├── llm.py # GeminiService / OpenAIService (多模型)
│ │ ├── pipeline.py # 视频核查 Pipeline 编排
│ │ ├── whisper_client.py # Whisper HTTP 客户端
│ │ ├── prompt_manager.py # 提示词模板管理
│ │ ├── llm_config.py # LLM 配置持久化
│ │ ├── notion_config.py # Notion 配置持久化
│ │ ├── notion_client.py # Notion 写入服务 (Markdown → Blocks)
│ │ ├── cookie_manager.py # 平台 Cookie 管理
│ │ ├── history_manager.py # 历史记录管理 (线程安全, 自动同步)
│ │ ├── feishu_client.py # 飞书 SDK 封装 (消息卡片)
│ │ ├── feishu_handler.py # 飞书消息处理逻辑
│ │ └── feishu_card.py # 飞书卡片模板构建
│ ├── downloaders/
│ │ ├── base.py # Downloader 基类 (API 优先 + yt-dlp 回退)
│ │ ├── bilibili.py # B站下载器 + 字幕提取
│ │ ├── youtube.py # YouTube 下载器 + 字幕提取
│ │ ├── douyin.py # 抖音下载器
│ │ └── kuaishou.py # 快手下载器
│ ├── models/
│ │ ├── task.py # TaskStatus 枚举
│ │ ├── download.py # AudioDownloadResult
│ │ ├── transcript.py # TranscriptResult / Segment
│ │ └── pipeline.py # PipelineRequest / Result
│ └── utils/
│ └── url_parser.py # URL 平台识别 + video_id 提取
├── whisper_service/ # Whisper 独立服务 (宿主机运行)
│ ├── main.py # FastAPI 入口
│ ├── transcriber.py # mlx-whisper 封装
│ └── pyproject.toml # 独立依赖
├── frontend/
│ └── index.html # 单页面 Web UI (暗色/亮色主题)
├── homebrew/
│ └── com.fact-check.whisper.plist # launchd 配置
├── Makefile
├── Dockerfile
├── docker-compose.yml
├── pyproject.toml
├── prompt_config.json # 提示词模板
├── cookies_config.json # 平台 Cookie 存储
├── llm_config.json # LLM 配置存储
└── notion_config.json # Notion 配置存储
- Python 3.12+
- uv 包管理器
- Docker(生产部署)
- ffmpeg(音频提取)
- Apple Silicon Mac(Whisper 转写服务,可选)
git clone <repo-url> && cd fact_check所有核心配置均可在前端页面的 Settings 面板中管理,无需手动编辑配置文件:
- LLM Configuration — API Key、模型名称、代理地址、Whisper 服务地址
- Notion Configuration — Notion Integration Token、目标页面 ID
环境变量(.env)仅用于飞书机器人和视频解析 API 等可选功能:
| 变量 | 说明 | 必填 |
|---|---|---|
VIDEO_API_URL |
视频解析 API 地址 | 否 |
VIDEO_API_CLIENT_ID |
解析 API Client ID | 否 |
VIDEO_API_SECRET_KEY |
解析 API Secret Key | 否 |
FEISHU_APP_ID |
飞书应用 ID | 否 |
FEISHU_APP_SECRET |
飞书应用 Secret | 否 |
# 安装依赖并启动
uv sync
make devmake upWhisper 使用 mlx-whisper 运行在 Apple Silicon GPU 上,不能放在 Docker 内,需要在宿主机单独部署:
# 安装依赖 + 注册 launchd 服务
make whisper-install
# 启动服务
make whisper-start
# 验证服务状态
make whisper-status
# → {"status": "ok", "model": "mlx-community/whisper-large-v3-turbo", "runtime": "mlx-whisper"}在 Text Check 标签页输入文本,点击 Verify Content。支持流式/非流式响应。
在 Text Check 标签页上传图片(拖拽、粘贴或点击上传),配合文本输入进行多模态事实核查。
在 Video Check 标签页粘贴视频 URL,点击 Analyze Video。
支持的平台:
| 平台 | URL 示例 |
|---|---|
| Bilibili | https://www.bilibili.com/video/BVxxxxxx |
| YouTube | https://www.youtube.com/watch?v=xxxxx |
| 抖音 | https://www.douyin.com/video/xxxxx |
| 快手 | https://www.kuaishou.com/short-video/xxxxx |
视频下载策略:优先使用第三方解析 API(需配置 VIDEO_API_*),失败则回退到 yt-dlp。
转写策略:优先获取平台字幕(Bilibili/YouTube),无字幕则使用 Whisper 转写。
配置 FEISHU_APP_ID 和 FEISHU_APP_SECRET 后,启动时自动连接飞书 WebSocket。在飞书群聊中:
- 发送文本 → 自动事实核查,结果以卡片形式回复
- 发送图片 → 多模态事实核查
- 发送视频链接 → 触发视频核查流程,实时进度卡片更新
将核查和总结结果同步到 Notion,作为知识管理和持久化备份。
配置步骤:
- 访问 notion.com/my-integrations 创建 Integration
- 复制 Internal Integration Token
- 在 Notion 中打开目标页面 → ⋯ → Add connections → 选择你的 Integration
- 复制页面链接中的 Page ID(URL 中 32 位字符串)
- 在前端 Settings → Notion Configuration 中填入 Token 和 Page ID,勾选启用
功能特性:
- 自动同步:核查/总结完成后自动创建 Notion 子页面(仅同步成功的记录)
- 手动同步:历史记录中点击 📤 按钮或详情页中点击 "Sync to Notion"
- 去重机制:已同步的记录不会重复创建,点击同步直接打开已有页面
- 格式保留:Markdown 内联格式(粗体、斜体、
代码、删除线、链接)完整转换为 Notion 原生格式 - 纯页面方案:每次创建子页面,规避 Notion 免费版 100 行数据库限制
- 全渠道:Web 端和飞书的核查结果统一同步
所有配置均可通过前端页面右上角设置按钮管理,无需重启服务:
- Prompt Configuration — 编辑事实核查提示词模板,
{query}作为输入占位符 - Summary Prompt Configuration — 编辑视频观点总结提示词模板
- Cookie Configuration — 为各平台设置 Cookie,用于访问需要登录的内容
- LLM Configuration — 配置 API Key、模型名称、代理地址、Whisper 服务地址(支持 Gemini/OpenAI)
- Notion Configuration — 配置 Notion 同步(Token、Page ID、启用开关)
左侧边栏显示查询历史(最多 200 条),支持按类型(文本/视频)筛选、查看详情、删除和同步到 Notion。
| 端点 | 方法 | 说明 |
|---|---|---|
/api/check?query=... |
GET | 文本事实核查 |
/api/check/stream?query=... |
GET | 文本事实核查(流式) |
/api/check |
POST | 多模态事实核查(文本 + 图片) |
/api/check/stream |
POST | 多模态事实核查(流式) |
/api/pipeline |
POST | 提交视频核查任务 |
/api/pipeline/{task_id} |
GET | 查询任务状态和结果 |
/api/history |
GET | 获取历史记录列表 |
/api/history/{id} |
GET | 获取单条历史详情 |
/api/history/{id} |
DELETE | 删除单条历史 |
/api/history |
DELETE | 清空所有历史 |
/api/prompt |
GET/POST | 查看/修改提示词模板 |
/api/cookies |
GET/POST | 查看/修改平台 Cookie |
/api/llm-config |
GET/POST | 查看/修改大模型配置 |
/api/notion-config |
GET/POST | 查看/修改 Notion 配置 |
/api/notion/test |
POST | 测试 Notion 连接 |
/api/notion/sync/{id} |
POST | 手动同步单条记录到 Notion |
/api/health |
GET | 健康检查 |
# 提交任务
curl -X POST http://localhost:8000/api/pipeline \
-H "Content-Type: application/json" \
-d '{"video_url": "https://www.bilibili.com/video/BVxxxxxx"}'
# → {"task_id": "uuid", "status": "PENDING"}
# 轮询状态
curl http://localhost:8000/api/pipeline/{task_id}
# → {"status": "DOWNLOADING"}
# → {"status": "TRANSCRIBING"}
# → {"status": "FACT_CHECKING"}
# → {"status": "SUCCESS", "result": {...}}curl -X POST http://localhost:8000/api/check \
-F "query=这张图片中的说法是否属实?" \
-F "images=@screenshot.jpg"make dev # 开发模式(本机直接运行,热重载)
make up # Docker 构建并启动
make down # 停止 Docker
make logs # 查看 Docker 日志
make whisper-install # 安装 Whisper 服务
make whisper-start # 启动 Whisper 服务
make whisper-stop # 停止 Whisper 服务
make whisper-log # 查看 Whisper 日志
make whisper-status # 检查 Whisper 服务状态
make start-all # 启动 Whisper + Docker- 后端:FastAPI, Pydantic, uvicorn
- 大模型:Google Gemini / OpenAI + Google Search Grounding
- 音频转写:mlx-whisper(Apple Silicon GPU 加速)
- 视频下载:yt-dlp + ffmpeg + 第三方解析 API
- 飞书集成:lark-oapi(WebSocket 长连接)
- Notion 集成:notion-client(异步 API,Markdown → Blocks 转换)
- 前端:原生 HTML/CSS/JS, marked.js, DOMPurify
- 部署:Docker, launchd
- 包管理:uv