每个安全研究人员都有这种感觉——你发现了一个有趣的 GitHub 仓库、一篇新的 CVE 文章、一篇关于新利用技术的博客。你把它转发到自己的 WhatsApp 上。它立刻淹没在聊天记录中。几周后你真正需要那篇文章时——却找不到了。
别再给自己发送那些再也找不到的链接了——一次性发送给 Samuraizer,它们会被总结、打标签,并永久可搜索。
| 之前 😵 | 之后 🗡️ |
|---|---|
![]() 散乱的链接淹没在聊天记录中 | ![]() 已分析、打标签,随时可被找到 |
🎯 额外隐私模式(仅本地)——使用 ollama 运行,所有数据保留在你的机器上。
samuraizer.db + 通过 Ollama 的本地 AI 嵌入。ollama pull qwen3:4b,ollama pull qwen3-embedding:8b)。.pdf,.docx,.pptx,.txt,.md


/yt-channels API 运行,并在 UI 的 RSS/YT 部分显示
![]() 分析 URL | ![]() 每日推荐阅读 |
@ 自动补全,或使用 @ 浏览按钮
![]() 带来源分数的 RAG 聊天 | ![]() 固定上下文的聊天 |
[!IMPORTANT] 塑造 Samuraizer 的未来! 我们目前正在对新功能(如本地 LLM 和 Obsidian 导出)进行投票。 在此处投票!
flowchart LR
Browser[浏览器 UI] -->|HTTP| Frontend[React 前端]
Frontend -->|REST/NDJSON| Backend[Flask API]
Backend -->|SQL| SQLite[(samuraizer.db)]
Backend -->|API| Gemini[Gemini 2.5 Flash]
Backend -->|local API| Ollama[Ollama - 本地 LLM]
Backend -->|GitHub API| GitHub[GitHub]
Backend -->|RSS| RSS[RSS 订阅源]
Telegram[Telegram 机器人] -->|HTTP| Backend
samuraizer.db 中,并呈现在前端。PATCH /entries/<id> 持久化更新)| 层 | 技术/库 |
|---|---|
| 后端 | Python,Flask,SQLite,feedparser,PyMuPDF |
选择你偏好的设置方式:
git clone https://github.com/zomry1/Samuraizer.git
cd Samuraizer
复制 .env.example 到 .env 并填入你的值。
你也可以打开 Web UI,转到 设置 标签,在保存前调整设置(提供商、API 密钥、Ollama 模型名称、嵌入模型名称)。
cp .env.example .env
运行完整堆栈最简单的方式——一条命令构建并启动所有内容。
git clone https://github.com/zomry1/Samuraizer.git
cd Samuraizer
cp .env.example .env
# 编辑 .env 并填入 GEMINI_API_KEY(以及任何你需要的其他值)
所有 Docker 文件位于 docker/ 文件夹中。从项目根目录运行命令:
Gemini(云端)— 默认:
docker compose -f docker/docker-compose.yml up -d
Ollama 在 CPU 上:
docker compose -f docker/docker-compose.yml --profile ollama up -d
Ollama 在 NVIDIA GPU 上:
docker compose -f docker/docker-compose.yml --profile ollama-nvidia up -d
Windows(WSL 2):
youtube-transcript-api?最初的实现使用了开源的 youtube-transcript-api Python 库。它在本地运行良好,但在实践中有一个关键限制:YouTube 会积极屏蔽进行自动化转录请求的 IP 地址,尤其是:
这意味着在分析仅仅几个视频后,整个服务器就会被屏蔽,随后的每个转录请求都会失败,出现 IPBlocked / RequestBlocked 错误——完全破坏 YouTube 视频分析。
transcriptapi.comSamuraizer 现在使用 transcriptapi.com——一个第三方付费 API,它负责在它们那边处理 YouTube 转录获取,通过不会被屏蔽的基础设施路由。
优点:
GET /api/v2/youtube/transcript)缺点:
设置: 在 .env 中添加:
POST /analyze
Body:
{ "url": "https://github.com/owner/repo" }
POST /analyze-pdf
Body: multipart/form-data,包含一个带有 .pdf 文件的 file 字段。
流式 NDJSON 事件,格式与 /analyze 相同(使用文件名作为 url 键)。
GET /entries/<id>/pdf — 在内联浏览器中提供 PDF 文件。
GET /entries/<id>/pdf?dl=1 — 作为文件下载提供 PDF。
MIT
| LLM |
| Gemini 2.5 Flash(Gemini API),Ollama(本地可选) |
| 前端 | React 18,Vite,Tailwind CSS |
| 机器人 | python-telegram-bot v20 |
| 转录 | transcriptapi.com |
| 变量 | 必填 | 获取方式 |
|---|
LLM_PROVIDER | 否 | gemini(默认,云端)或 ollama(本地) |
GEMINI_API_KEY | 使用 gemini 时 | Google AI Studio → 获取 API 密钥 |
OLLAMA_URL | 使用 ollama 时 | Ollama API URL(默认:http://localhost:11434) |
OLLAMA_MODEL | 使用 ollama 时 | 推理模型(默认:qwen3:14b) |
OLLAMA_EMBED_MODEL | 使用 ollama 时 | 嵌入模型(默认:qwen3-embedding:8b) |
TELEGRAM_BOT_TOKEN | 否 | 通过 Telegram 上的 @BotFather 创建机器人 |
GITHUB_TOKEN | 否 | GitHub → 设置 → 开发者设置 → 个人访问令牌 — 将 API 频率限制从 60 提高到 5000 次/小时 |
TRANSCRIPTAPI | 否 | transcriptapi.com/dashboard/api-keys — YouTube 转录获取所必需 |
SAMURAIZER_URL | 否 | 后端 URL(默认:http://localhost:8000),供 Telegram 机器人使用 |
使用 Ollama 完全离线运行 Samuraizer:
# 安装 Ollama CLI(取决于平台)
# macOS
curl -fsSL https://ollama.com/install.sh | sh
# Windows
irm https://ollama.com/install.ps1 | iex
# Linux(Ubuntu/Debian)
curl -fsSL https://ollama.com/install.sh | sh
# 启动 Ollama 服务
ollama serve
# 安装模型
ollama pull qwen3:4b # 推理
ollama pull qwen3-embedding:8b # 嵌入
# 在 .env 中设置提供商
LLM_PROVIDER=ollama
如果你已有 Gemini 嵌入,切换到 Ollama 将在下次启动时自动清除它们(维度不匹配)。通过 UI 或 POST /entries/embed-all 重新嵌入。
# 创建并激活虚拟环境
python -m venv .venv
source .venv/bin/activate # 在 Windows 上:.venv\Scripts\activate
pip install -r requirements.txt
cd frontend
npm install
cd ..
python server.py
cd frontend
npm run dev
python telegram_bot.py
wsl --install
wsl --update
Docker Desktop for Windows 会自动捆绑 NVIDIA 容器运行时 — 无需额外步骤。
Linux:
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
Ollama 在 AMD GPU 上 (需要支持 ROCm 的 GPU + Linux 上的 amdgpu 驱动):
docker compose -f docker/docker-compose.yml --profile ollama-amd up -d
就是这样。前端位于 **http://localhost**,API 位于 **http://localhost:8000**。
提示: 使用任何 Ollama 配置文件时,在
.env中设置LLM_PROVIDER=ollama。容器内部会自动设置OLLAMA_URL=http://ollama:11434— 你无需更改。
首次启动 Ollama 后,拉取模型(使用与你启动的配置文件匹配的容器名称):
# --profile ollama
docker exec -it samuraizer-ollama-1 ollama pull qwen3:4b
docker exec -it samuraizer-ollama-1 ollama pull qwen3-embedding:8b
# --profile ollama-nvidia
docker exec -it samuraizer-ollama-nvidia-1 ollama pull qwen3:4b
docker exec -it samuraizer-ollama-nvidia-1 ollama pull qwen3-embedding:8b
# --profile ollama-amd
docker exec -it samuraizer-ollama-amd-1 ollama pull qwen3:4b
docker exec -it samuraizer-ollama-amd-1 ollama pull qwen3-embedding:8b
data/ 目录下,备份存储在 db_backups/ 目录下。ollama_data Docker 卷中(重启后持久化)。docker compose -f docker/docker-compose.yml --profile ollama-nvidia --profile bot up -d
git pull
docker compose -f docker/docker-compose.yml up -d --build
docker compose -f docker/docker-compose.yml down
TRANSCRIPTAPI=your_key_here
| 选项 | 工作原理 | IP 屏蔽风险 | 费用 |
|---|---|---|---|
| transcriptapi.com (当前) | 托管 REST API | 无(他们的责任) | 基于积分 |
| yt-dlp | 通过 --write-sub --skip-download 下载字幕 | 低(模拟浏览器) | 免费,自托管 |
youtube-transcript-api + cookies | 传入已登录浏览器会话的 Netscape cookies.txt | 中等(有弃用账户风险) | 免费 |
| YouTube Data API v3 | 官方 Google API,无需抓取 | 无 | 免费配额,之后付费 |
| Supadata | 类似的托管 REST API | 无 | 免费层级(100 次/天) |
最佳免费替代方案: yt-dlp——它维护活跃,模拟真实浏览器请求,不太可能像普通 HTTP 请求那样被快速屏蔽。要切换,请替换 _fetch_youtube_content 为调用 yt-dlp --write-auto-sub --sub-format vtt --skip-download 并解析生成的 .vtt 文件。
GET /entries(支持过滤器:search,category,tag,source,list_id,read,useful)
GET /yt-channels — 列出已订阅频道(id,channel_id,channel_url,name,last_checked)POST /yt-channels/preview — body { "url": "https://www.youtube.com/@handle" },返回频道信息 + 最新视频(url/title/published)POST /yt-channels — body { "url": "...", "name": "optional", "analyze_urls": ["https://...", ...] };创建订阅并可选分析所选视频POST /yt-channels/<id>/poll — 立即手动轮询频道DELETE /yt-channels/<id> — 移除订阅PATCH /entries/<id> 进行,JSON 格式 { "tags": ["tag1","tag2"] }