数据截至 (上游 commit dc85934f318c)
06 — 出口面
本章讲什么: 前五章讲的是索引本身。这一章讲它怎么被用起来——四种调用面,以及纯向量检索之外的三条旁路。
1. CLI
1.1 子命令一览
全部注册在 LeannCLI.create_parser(cli.py:251),add_subparsers 在 cli.py:290。
| 命令 | 干什么 | 注册行 |
|---|---|---|
build | 建 / 增量更新索引 | cli.py:293 |
search | 语义搜索 | cli.py:511 |
ask | 基于索引问答 | cli.py:644 |
react | 多轮推理检索 | cli.py:732 |
watch | 常驻监听文件变更 | cli.py:456 |
rebuild | 强制重建 | cli.py:498 |
migrate | 迁移 passage ID 方案 | cli.py:478 |
warmup | 预热某索引的嵌入服务 | cli.py:589 |
daemon start/stop/status | 管理常驻嵌入服务 | cli.py:613-643 |
list / remove | 列出 / 删除索引 | cli.py:885 / :893 |
serve | 起 HTTP 服务 | cli.py:904 |
index-browser/email/imessage/wechat/chatgpt/claude/calendar | 各数据源一键建索引 | cli.py:842-884 |
1.2 索引存哪
CLI 把索引放在 <项目>/.leann/indexes/<索引名>/,里面固定叫 documents.leann.*(cli.py:242-249 的路径拼装,以及 _existing_index_artifacts 里写死的文件名 cli.py:83-88)。
leann list 会同时看两种布局:CLI 格式(.leann/indexes/)和 App 格式(散落的 *.leann.meta.json),后者靠深度受限的目录扫描发现(registry.py:25、cli.py:1002)。
1.3 文档加载
load_documents(cli.py:1555)基于 LlamaIndex 的 SimpleDirectoryReader,并做了几件额外的事:
- 跳过 git submodule 目录(
cli.py:1574-1577,判定在_is_git_submodule,:955)。 - 尊重
.gitignore(_build_gitignore_parser,cli.py:920;_should_exclude_file,:943)。 - PDF 走 pymupdf,失败再退 pdfplumber(
extract_pdf_text_with_pymupdf,cli.py:177;..._pdfplumber,:199)。 - 用
suppress_cpp_output屏蔽 C++ 后端刷屏,除非加了-v(cli.py:114,开关在:274-286)。
2. MCP 服务
2.1 形态
MCP(Model Context Protocol) 是让编码 agent 调用外部工具的协议。LEANN 的实现是一个 stdio 上的 JSON-RPC 循环,零依赖:逐行读 stdin、处理、把 JSON 打到 stdout(mcp.py:396-411)。入口是 leann_mcp 命令(packages/leann-core/pyproject.toml 的 [project.scripts])。