-
-
- 项目概述 -
- 部署拓扑 -
- 环境配置 -
- CLI 命令参考 -
- M1 — 新闻抓取 -
- M2 — 正文提取 -
- M3 — 三层去重 -
- M4 — 翻译 + 事件抽取 -
- M5 — 向量生成 -
- M6 — Qdrant 入库与检索 -
- M7 — 全链路管道 + 日报 -
- M8 — MCP 服务 -
- 数据目录结构 -
- 定时任务 -
- 常见问题 -
1. 项目概述
+ +一、系统架构
+ -本项目构建面向国际英文财经新闻的私有化 Deep Research 平台。
++┌──────────────────────────────────────────────────────┐ +│ Pi 4 (8GB) │ +│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │ +│ │ M1 抓取 │──▶│ M2 正文 │──▶│ M3 三层去重 │ │ +│ │ headful │ │ trafilat.│ │ URL/Content/SimH │ │ +│ │ Playwright│ │ │ │ │ │ +│ │ + HTTP 代 │ │ │ │ │ │ +│ │ 理(海外) │ │ │ │ │ │ +│ └──────────┘ └──────────┘ └────────┬─────────┘ │ +│ ▼ │ +│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │ +│ │ M6 Qdrant│◀──│ M5 向量 │◀──│ M4 翻译+事件抽取 │ │ +│ │ 入库 │ │ DashScope│ │ DeepSeek v4 │ │ +│ └────┬─────┘ └──────────┘ └──────────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌──────────┐ ┌──────────┐ │ +│ │ M7 日报 │──▶│ doorcome │ │ +│ │ 生成 │ │ 上传 │ │ +│ └──────────┘ └──────────┘ │ +│ │ │ +│ ▼ │ +│ ┌────────────────────────────────────────────────┐ │ +│ │ M8 MCP 服务(Cherry Studio / Claude Code) │ │ +│ └────────────────────────────────────────────────┘ │ +└──────────────────────────────────────────────────────┘ +-
-
-
- 英文财经新闻抓取(Crawl4AI,12 源) -
- 正文提取(trafilatura) -
- 全文英译中(DeepSeek LLM) -
- 投资事件抽取 + 美股代码识别 -
- 双语向量知识库(Qdrant 1024维) -
- 中文语义检索 -
- MCP 服务(Agent 深度研究) -
- 每日 AI 摘要日报(HTML) -
-
-
- 自动交易系统 -
- 股票预测系统 -
- 投资顾问系统 -
Privoxy → SOCKS5 (ss-local) 代理访问海外新闻网站。+反爬策略:2026-07-23 更新 — 启用 Crawl4AI
magic 全自动反检测 + Playwright stealth 模式。investing.com 改用 Google News RSS 代理。
news/),架构模式可复用。
+
+二、部署指南
+ +2.1 环境要求
+-
+
- Python 3.11 + uv +
- Xvfb(headful Playwright 虚拟显示器) +
- Shadowsocks-libev + v2ray-plugin(SOCKS5 代理) +
- Privoxy(HTTP → SOCKS5 转换) +
2.2 初始化安装
++# 1. 克隆仓库 +git clone ssh://gitea:2222/simon/intl_news /home/pi/intlnews +cd /home/pi/intlnews + +# 2. Python 环境 +uv sync + +# 3. 环境变量 +cp .env.example .env +# 填入: DEEPSEEK_API_KEY, DASHSCOPE_API_KEY, QDRANT_URL + +# 4. Xvfb 虚拟显示器 +sudo apt install xvfb +Xvfb :99 -screen 0 1280x1024x24 -ac +extension RANDR & + +# 5. Shadowsocks + Privoxy(海外代理) +sudo apt install shadowsocks-libev privoxy +# 配置 /etc/shadowsocks-libev/config.json +# 配置 /etc/privoxy/config: forward-socks5t / 127.0.0.1:1088 . +sudo systemctl enable --now shadowsocks-libev-local +sudo systemctl enable --now privoxy ++ +
2.3 定时调度(crontab)
++# crontab -e 添加: +0 6 * * * cd /home/pi/intlnews && bash scripts/domestic_full.sh >> logs/full.log 2>&1 +0 12 * * * cd /home/pi/intlnews && bash scripts/domestic_full.sh >> logs/full.log 2>&1 +0 18 * * * cd /home/pi/intlnews && bash scripts/domestic_full.sh >> logs/full.log 2>&1 +0 22 * * * cd /home/pi/intlnews && bash scripts/domestic_full.sh >> logs/full.log 2>&1 +@reboot Xvfb :99 -screen 0 1280x1024x24 -ac +extension RANDR & ++ + +
三、操作命令
+ +3.1 全流程运行
++# 一键全流程(M1→M6→日报) +bash scripts/domestic_full.sh ++ +
3.2 M1 抓取
++# 抓取全部 13 个源 +bash scripts/domestic_crawl_8g.sh + +# 单源调试 +bash scripts/domestic_crawl_8g.sh investing +bash scripts/domestic_crawl_8g.sh investinglive +bash scripts/domestic_crawl_8g.sh reuters ++ +
3.3 M2→M6 管道
+
+# 完整管道(需要先有 raw 数据)
+bash scripts/pipeline.sh
+
+# 或逐步执行:
+PYTHONPATH=. .venv/bin/python3 -c "from scheduler.pipeline import run_pipeline; run_pipeline('$(date +%Y%m%d)')"
+
+
+3.4 日报
++# 生成当日日报 +PYTHONPATH=. .venv/bin/python3 -c "from scheduler.reporter import generate_report; print(generate_report())" + +# 查看日报列表 +ls -lt data/reports/ ++ +
3.5 日志查看
++# 全量日志 +tail -100 logs/full.log + +# 筛选指定源 +grep 'investing\|investinglive' logs/full.log | tail -20 ++ + +
四、新闻源状态
+ +| 源 | ID | 策略 | 日产量 | 状态 |
|---|---|---|---|---|
| Reuters | reuters | Google News RSS | ~30 篇 | +摘要 DataDome | +
| CNBC | cnbc | CNBC RSS | ~25 篇 | +正常 | +
| MarketWatch | marketwatch | RSS + stealth | ~25 篇 | +正常 | +
| Financial Times | ft | FT RSS | ~20 篇 | +摘要 付费墙 | +
| Yahoo Finance | yahoo_finance | Yahoo RSS | ~30 篇 | +正常 | +
| Investing.com | investing | Google News RSS + stealth | 25 篇 | +已修复 RSS 代理 | +
| Seeking Alpha | seekingalpha | RSS + stealth | ~20 篇 | +正常 | +
| Barron's | barrons | Dow Jones RSS + stealth | ~20 篇 | +正常 | +
| WSJ | wsj | Dow Jones RSS + stealth | ~20 篇 | +正常 | +
| Economist | economist | RSS + stealth | ~15 篇 | +正常 | +
| InvestingLive | investinglive | RSS(全文) | 25 篇 | +2026-07-23 新增 | +
| ZeroHedge | zerohedge | FeedBurner RSS | ~15 篇 | +正常 | +
| ForexLive | forexlive | — | — | +已移除 301→investinglive | +
2. 部署拓扑
+ +五、数据存储
-┌──────────────────────────────────────────────────┐
-│ Overseas Server (海外) │
-│ M1 Crawl4AI 抓取 → data/raw/ │
-│ 每天 4 次打包 → rsync 推送 │
-│ SSH: <海外服务器> │
-│ 路径: /opt/intlgrab │
-└────────────────────┬─────────────────────────────┘
- │ rsync
- ▼
-┌──────────────────────────────────────────────────┐
-│ Domestic Server (国内) │
-│ M2 正文提取 → M3 去重 → M4 翻译+事件 │
-│ → M5 向量生成 → M6 Qdrant 入库 │
-│ → M7 调度 + 日报 → M8 MCP 服务 │
-│ SSH: <国内服务器> │
-│ 路径: /home/pi/intlnews │
-└──────────────────────────────────────────────────┘
+
+/home/pi/intlnews/
+├── data/
+│ ├── raw/{source_id}/{yyyymmdd}/ M1 原始抓取(.html + .md + index.jsonl)
+│ ├── processed/{source_id}/ M2 正文提取结果
+│ ├── dedup/ M3 去重指纹库(SQLite)
+│ ├── translations/{yyyymmdd}/ M4 翻译+事件抽取(JSONL)
+│ ├── embeddings/{yyyymmdd}/ M5 向量文件(JSONL)
+│ ├── reports/ M7 日报(HTML)
+│ └── vectorstore/ M6 Qdrant 本地数据
+├── configs/
+│ ├── sources.yaml 新闻源定义(13 个源)
+│ ├── system.yaml 系统参数
+│ └── profiles/8g_headful.yaml Pi 抓取配置
+├── logs/full.log 运行日志
+└── prompts/ LLM Prompt 模板
+
-
-3. 环境配置
+ +六、MCP 服务
-3.1 依赖安装
-cd /home/pi/intlnews
-uv sync
+M8 模块提供 MCP(Model Context Protocol)服务,供 Cherry Studio / Claude Code / Cursor 等客户端接入。
-3.2 配置文件
+6.1 启动
++cd /home/pi/intlnews +PYTHONPATH=. .venv/bin/python3 -m mcp_server.server ++
6.2 可用工具
| 文件 | 用途 | 注意 |
|---|---|---|
.env | API Key / URL | 不入 Git,从 .env.example 复制 |
configs/system.yaml | 功能参数 | 模型名、阈值、超时、调度 |
configs/sources.yaml | 新闻源定义 | 12 个英文财经源 |
| Tool | 参数 | 功能 |
en_news_search | query, top_k | 语义搜索知识库 |
en_news_filter | source_id, date, sentiment | 按条件筛选事件 |
en_news_trending | days | 获取近期热点 |
en_news_report | — | 获取最新日报 |
en_news_daily_brief | — | 一键生成简报 |
3.3 必需环境变量
- -# DeepSeek(M4 翻译+事件抽取)
-DEEPSEEK_API_KEY=sk-your-key
-DEEPSEEK_BASE_URL=https://api.deepseek.com
-
-# Qwen(备选 LLM)
-QWEN_API_KEY=sk-your-key
-QWEN_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
-
-# DashScope(M5 向量生成)
-DASHSCOPE_API_KEY=sk-your-key
-
-# Qdrant(留空使用本地文件模式)
-QDRANT_URL=http://localhost:6333
-QDRANT_API_KEY=
-
-3.4 关键配置项
- -# configs/system.yaml(关键项)
-crawler.max_memory_mb: 1800 # 内存上限
-dedup.hamming_distance_threshold: 3
-dedup.simhash_window_days: 30
-llm.provider: "deepseek"
-llm.deepseek_model: "deepseek-v4-flash"
-llm.concurrency: 3
-embedding.dashscope_model: "text-embedding-v3"
-embedding.dimension: 1024
-qdrant.collection: "en_finance_news"
-schedule.day_cutoff_hour: 6 # 新闻日切分点
-
-
-4. CLI 命令参考
- -所有命令通过 uv run en-news 执行:
七、配置参考
+7.1 环境变量(.env)
| 命令 | Milestone | 功能 |
|---|---|---|
crawl | M1 | 抓取英文财经新闻 |
extract | M2 | 正文提取 |
dedup | M3 | 三层去重 |
translate | M4 | 翻译 + 事件抽取 |
embed | M5 | 向量生成 |
index | M6 | Qdrant 入库 |
search <query> | M6 | 语义检索 |
pipeline | M7 | 一键全链路 M2→M6 |
report | M7 | 日报生成 |
mcp-server | M8 | 启动 MCP 服务 |
| 变量 | 用途 | |
DEEPSEEK_API_KEY | DeepSeek LLM(翻译+事件抽取) | |
DASHSCOPE_API_KEY | DashScope Embedding(向量生成) | |
QDRANT_URL | Qdrant 服务地址 |
# 常用选项
-uv run en-news crawl --source forexlive # 指定源
-uv run en-news search "美联储" --top-k 5 # 指定返回数
-uv run en-news index --recreate # 重建 Qdrant
-uv run en-news pipeline --skip-report # 跳过日报
+7.2 新闻源配置(sources.yaml)
+每个源包含:id, name, homepage, rss_url, article_url_pattern, anti_bot_mode 等。
+新增源时参考现有格式,启用/禁用通过 enabled: true/false。
5. M1 — 新闻抓取
+7.3 Profile 配置
+Pi 服务器使用 8g_headful profile(环境变量 EN_NEWS_PROFILE),通过 Privoxy HTTP 代理访问海外网站。
-
+
proxy.enabled: true— 启用 HTTP 代理
+ crawler.headful: true— 有头浏览器 + Xvfb
+ crawler.magic: true— Crawl4AI 全自动反检测
+ crawler.enable_stealth: true— Playwright stealth
+
5.1 手动抓取
-uv run en-news crawl # 全部源
-uv run en-news crawl -s forexlive # 指定源
-
-5.2 12 个英文财经源
+ +八、常见排障
| 源 ID | 名称 | 类型 |
|---|---|---|
| reuters | Reuters | 综合财经 |
| cnbc | CNBC | 市场新闻 |
| marketwatch | MarketWatch | 市场数据 |
| ft | Financial Times | 财经深度 |
| yahoo_finance | Yahoo Finance | 综合 |
| investing | Investing.com | 全球市场 |
| seekingalpha | Seeking Alpha | 投资分析 |
| barrons | Barrons | 市场评论 |
| wsj | WSJ | 综合财经 |
| economist | The Economist | 经济分析 |
| forexlive | ForexLive | 外汇新闻 |
| zerohedge | ZeroHedge | 另类财经 |
| 现象 | 排查步骤 | |
| 抓取 0 篇 | +
+ 1. 检查 logs/full.log 看 RSS/Web 错误+ 2. bash scripts/domestic_crawl_8g.sh <source_id> 单源测试+ 3. 检查代理是否正常: curl -I --proxy 127.0.0.1:3128 https://example.com
+ |
+|
| RSS 超时 | +
+ 1. 确认 Shadowsocks 和 Privoxy 在运行 + 2. systemctl status shadowsocks-libev-local privoxy+ 3. 环境变量 HTTP_PROXY 是否设置
+ |
+|
| Cloudflare 拦截 | +
+ 1. 已启用 magic + stealth 自动反检测+ 2. 仍失败则需更换代理 IP(数据中心 IP 被标记) + 3. 改用 Google News RSS 代理(已为 investing/reuters 启用) + |
+|
| 日报无数据 | +
+ 1. 检查 data/translations/{date}/ 是否有 JSONL+ 2. 检查 data/embeddings/{date}/ 是否有向量
+ |
+|
| MCP 连接失败 | +
+ 1. 确认 MCP 服务进程在运行 + 2. 检查端口监听: ss -tlnp | grep 8080
+ |
+
5.3 增量抓取机制
- -抓取采用两层增量确保不重复下载和存储:
+ +九、变更记录
| 层级 | 位置 | 机制 |
|---|---|---|
| 抓取层 | _extract_article_urls | 读取当日 index.jsonl 中已抓取的 url_hash,跳过已存在的 URL,不重复下载 |
| 存储层 | write_index_jsonl | 追加写入前再次检查 url_hash,已存在则跳过 |
| 日期 | 变更 | |
| 2026-07-23 | +
+ 反爬策略增强: + - crawler.py: magic/stealth/--disable-webrtc/remove_consent_popups + - rss_crawler.py: httpx 代理支持 + - investing.com: Google News RSS 代理(绕过 Cloudflare) + - forexlive → investinglive 迁移(域名已 301 重定向) + |
+|
| 2026-07-14 | +
+ - 海外服务器停用,Pi 全链路独立运行 + - 8g_headful profile 新增(headful + HTTP 代理) + - Shadowsocks + Privoxy 部署 + |
+
同一天内多次执行 crawl,只有新文章才会被下载和存储。
5.4 产物
-data/raw/{source_id}/{YYYYMMDD}/
-├── {url_hash}.html # 原始 HTML
-├── {url_hash}.md # Crawl4AI Markdown
-└── index.jsonl # 文章索引
-
-5.5 反爬策略
- -部分新闻源有反爬保护(如 DataDome)。系统支持三种策略,按优先级自动选择:
- -| 优先级 | 策略 | 配置 | 说明 |
|---|---|---|---|
| 1 | RSS 抓取 | rss_url | 通过 Feed 获取文章,完全绕过反爬 ✅ MarketWatch |
| 2 | Stealth | anti_bot_mode: "stealth" | 隐藏 webdriver 特征 |
| 3 | Headful | anti_bot_mode: "headful" | 非 headless 浏览器,最像真人 |
已验证:MarketWatch RSS 10/10 ✅ · WSJ RSS 20/20 ✅ · ForexLive 17/17 ✅ · ZeroHedge 15/15 ✅ · Barron's RSS 10/10 ✅ · Reuters ⚠️ · SeekingAlpha ⚠️
- - -6. M2 — 正文提取
- -uv run en-news extract # 全部源
-uv run en-news extract -s forexlive # 指定源
-
-技术方案:优先 Crawl4AI Markdown → 回退 trafilatura(英文优化)。最小正文 50 词。
- -data/processed/{source_id}/{YYYYMMDD}/
-└── {url_hash}.json # ProcessedArticle
-
-
-7. M3 — 三层去重
- -uv run en-news dedup
-
-| 层级 | 方法 | 说明 |
|---|---|---|
| L1 | URL Hash | 完全相同 URL |
| L2 | 内容 Hash | SHA1[:16] 去标点空白后匹配 |
| L3 | SimHash | 字符 3-gram,汉明距离 ≤ 3,30 天窗口 |
data/dedup/fingerprints.sqlite3 # SQLite 指纹库
-data/deduped/{YYYYMMDD}/uniques/ # 唯一文章
-
-
-8. M4 — 翻译 + 事件抽取
- -uv run en-news translate
-
--
-
- Provider: DeepSeek v4-flash(默认)/ Qwen 备选 -
- 单次调用完成翻译+抽取,节省 token -
- 并发 3 线程,3 次指数退避重试 -
- 正文截断 8000 字符 -
14 种事件类型
-- 财报披露 - 并购收购 - 产品发布 - 监管政策 - 宏观经济 - 央行决议 - 行业动态 - 技术突破 - 高管变动 - 诉讼法律 - 市场异动 - 地缘政治 - 大宗商品 - 外汇波动 -
- -情绪标签
-- 🟢 positive 利好 - ⚪ neutral 中性 - 🔴 negative 利空 -
- - -9. M5 — 向量生成
- -uv run en-news embed
-
-技术方案:DashScope text-embedding-v3,1024 维。嵌入文本 = 中文标题 + 事件标签 + 中文正文(4000 字符截断)。
data/embeddings/{YYYYMMDD}/
-└── {url_hash}.json # EmbeddingResult (1024 floats)
-
-
-10. M6 — Qdrant 入库与检索
- -入库
-uv run en-news index # 增量入库
-uv run en-news index --recreate # 重建 collection
-
-语义搜索
-uv run en-news search "美联储利率决议"
-uv run en-news search "伊朗霍尔木兹海峡" --top-k 5
-
--
-
- 模式: 本地文件(
data/qdrant_storage/),无需 Docker
- - Collection:
en_finance_news
- - 距离: Cosine · 维度: 1024 -
- Payload: title / title_zh / url / events / content_zh_preview -
11. M7 — 全链路管道 + 日报
- -手动全链路运行(完整流程)
- -当需要手工执行完整的数据处理流程时,按顺序执行:
- -# 步骤 1(海外): 抓取英文财经新闻
-ssh <海外服务器> "cd /opt/intlgrab && uv run en-news crawl"
-
-# 步骤 2(海外): 打包 raw 数据
-ssh <海外服务器> "cd /opt/intlgrab && bash scripts/overseas_pack.sh"
-
-# 步骤 3(国内): 拉取海外数据
-cd /home/pi/intlnews && bash scripts/domestic_sync.sh
-
-# 步骤 4: 一键全链路 M2→M6 + 日报
-cd /home/pi/intlnews && uv run en-news pipeline
-
-也可以分步执行(适合调试):
- -uv run en-news extract # M2: 正文提取
-uv run en-news dedup # M3: 三层去重
-uv run en-news translate # M4: 翻译 + 事件抽取
-uv run en-news embed # M5: 向量生成
-uv run en-news index # M6: Qdrant 入库
-uv run en-news report # 日报生成
-
-一键管道(自动)
-uv run en-news pipeline # 全链路 M2→M6 + 日报
-uv run en-news pipeline --skip-report # 跳过日报
-uv run en-news report # 仅日报
-
-管道流程
-HTML 日报五板块
--
-
- 🤖 AI 摘要 — LLM 根据 important≥4 事件生成要点总结 -
- 🔥 重要事件 — 事件表格(情绪/重要度/摘要/链接) -
- 📊 数据总览 — M1→M6 管道统计数字 -
- 📈 情绪分布 — 利好/利空/中性比例条 -
- 📋 事件类型 TOP 10 -
本地: data/reports/intl_news_daily_{YYYYMMDD}.html
线上: 自动上传到 https://echart.doorcome.cn/research/{YYYYMMDD}/
上传配置在 configs/system.yaml → report.upload_host / report.upload_path
12. M8 — MCP 服务
- -启动
-uv run en-news mcp-server
-
-5 个 MCP Tool
- -| Tool | 功能 | 示例调用 |
|---|---|---|
search_news | 语义检索新闻 | search_news("美联储利率决议") |
search_by_stock | 美股代码检索 | search_by_stock("AAPL") |
search_by_sentiment | 情绪过滤检索 | search_by_sentiment("加息", sentiment="negative") |
get_today_events | 当日重要事件 | get_today_events(importance_min=4) |
get_stats | 系统统计 | get_stats() |
Claude Code MCP 配置
-{
- "mcpServers": {
- "intl-news": {
- "command": "uv",
- "args": ["run", "en-news", "mcp-server"],
- "cwd": "/home/pi/intlnews"
- }
- }
-}
-
-
-13. 数据目录结构
- -data/
-├── raw/ # M1: 原始抓取
-│ └── {source_id}/{YYYYMMDD}/
-├── processed/ # M2: 正文提取
-│ └── {source_id}/{YYYYMMDD}/
-├── dedup/ # M3: 指纹库 + 去重结果
-│ ├── fingerprints.sqlite3
-│ └── {YYYYMMDD}/uniques/
-├── events/ # M4: 翻译+事件
-│ └── {YYYYMMDD}/
-├── embeddings/ # M5: 向量
-│ └── {YYYYMMDD}/
-├── qdrant_storage/ # M6: Qdrant 本地存储
-└── reports/ # M7: 日报
- └── intl_news_daily_{YYYYMMDD}.html
-
-
-14. 定时任务
- -时间线
- -| 时间 | 服务器 | 动作 |
|---|---|---|
| 05:55 | 海外 | 打包 data/raw/ |
| 06:30 | 国内 | 拉取 → M2→M6 管道 → 📰 日报 |
| 11:55 | 海外 | 打包 |
| 12:00 | 国内 | 拉取 → 管道 |
| 17:55 | 海外 | 打包 |
| 18:00 | 国内 | 拉取 → 管道 |
| 21:55 | 海外 | 打包 |
| 22:00 | 国内 | 拉取 → 管道 → 📰 日报 |
新闻日定义
-切分点 day_cutoff_hour: 6。当天 06:00 至次日 05:59 属于同一个新闻日。
15. 常见问题
- -Q: 如何新增新闻源?
-编辑 configs/sources.yaml:
- id: "new_source"
- name: "New Source Name"
- enabled: true
- homepage: "https://example.com/finance/"
- article_url_pattern: "/news/[^/]+/"
- js_render: false
- max_articles_per_run: 30
-
-Q: 翻译质量不好怎么办?
--
-
- 调整
configs/system.yaml中llm.temperature(降低更保守)
- - 编辑
prompts/translation_and_extraction.md优化 Prompt
- - 切换 Provider:
llm.provider: "qwen"
-
Q: Qdrant 检索太慢?
-本地文件模式 17 条 < 0.01s,足够快。数据量 > 10 万条时切换到 Docker 模式。
- -Q: 如何查看日志?
-tail -f logs/sync.log
-tail -f logs/crawler.log # 海外
-
-Q: 数据如何备份?
-tar czf intlnews_backup_$(date +%Y%m%d).tar.gz data/
-
-
-附录:技术栈
- -| 组件 | 技术 |
|---|---|
| 语言 | Python 3.11 |
| 包管理 | uv + pyproject.toml |
| 抓取 | Crawl4AI + Playwright |
| 正文提取 | trafilatura |
| 去重 | SimHash + SQLite |
| LLM | DeepSeek v4-flash(OpenAI SDK) |
| Embedding | DashScope text-embedding-v3 |
| 向量库 | Qdrant(本地文件模式) |
| MCP | FastMCP |
| CLI | Typer |
| 配置 | YAML + .env |
| 数据模型 | Pydantic v2 |