数据截至 (上游 commit 21b29048d7bc)
Tabby — 这是什么·全景·阅读地图
30 秒导读: Tabby 是一个可以装在自己机器上的 AI 编码助手——把 GitHub Copilot 那套「边写边补全 + 聊代码 + 问答」搬进你自己的服务器,代码和上下文都不出门。它是一整个纯 Rust 工程,跑起来只要一条
tabby serve命令,不需要外接数据库、也不依赖任何云服务,一块消费级显卡就能带动。
本章是这组文档的总入口。它只做两件事:让你零基础也能说清「Tabby 是什么」,再给你一张全景图和一份阅读地图,告诉你后面每一章讲什么、该按什么顺序读。任何子系统的实现细节都留给后续章节,本章不深入代码。
1. 这是什么(零基础也能懂)
一句话定义: Tabby 是一个自托管、开源的 AI 编码助手,是 GitHub Copilot 的私有化替代品。
它的三个卖点,README 开门见山写得很清楚(README.md:18-21):
- 自包含——不需要外部 DBMS,也不需要任何云服务,程序自己就是全部。
- OpenAPI 接口——对外是标准 HTTP API,容易接进你已有的基础设施(比如云端 IDE)。
- 支持消费级 GPU——不用数据中心显卡,家用卡也能跑。
解决谁的什么问题? 假设你在一家对代码保密很在意的公司,既想要 Copilot 那种「边打字边冒出补全」的体验,又不能把源码发给外部服务。Tabby 就是为这种场景生的:模型、索引、数据全部在你自己的机器上,自己起一个服务,IDE 插件连过去即可。
它能做什么(功能)? 主要是三类对外能力:
- 代码补全——在编辑器里根据光标上下文实时补全(
/v1/completions),而且会检索你仓库里的相关代码片段一起喂给模型(RAG,检索增强生成)。 - 代码对话——像 ChatGPT 一样和模型聊代码、让它改代码(
/v1/chat/completions)。 - 答案引擎(Answer Engine)——企业版能力:把团队内部的代码库、文档、issue 索引起来,做成一个「问工程问题就给带引用答案」的内部知识引擎。
用起来什么样? 最小启动就是一条 Docker 命令(README.md:85-90),指定一个补全模型和一个对话模型:
docker run -it \
--gpus all -p 8080:8080 -v $HOME/.tabby:/data \
tabbyml/tabby \
serve --model StarCoder-1B --device cuda --chat-model Qwen2-1.5B-Instruct
跑起来后,8080 端口就是一个带 Swagger UI 的 HTTP 服务;VSCode / IntelliJ / Vim 等插件填上这个地址就能用。
一句话直觉/类比: 把 Tabby 想成**「一台你自己的、开源的 Copilot 服务器」**——它把「一个 HTTP API 服务器」和「一个会读你代码库的补全大脑」打包成了单个 Rust 二进制。
2. 顶层全景(它大概怎么转)
2.1 怎么读这张图
从上到下是「用户请求 → 进程入口 → HTTP 服务器 → 三大能力 → 底层支撑」。左边是补全/对话主链路,右边灰色框是企业版(EE)才启用的部分。底层的「检索」和「推理后端」是所有能力共享的两根柱子。
IDE 插件 / 浏览器 (clients/vscode, intellij, vim, ...)
│ HTTP (OpenAPI)
▼
┌──────────────────────────────────────────────────────────────────┐
│ CLI 入口 crates/tabby —— tabby serve / tabby download │
│ 解析参数 → 加载 config → 下载模型 → 装配 axum Router │
└──────────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ axum HTTP Server (带 Swagger UI / openapi.json) │
└───────┬───────────────────┬───────────────────┬──────────────────┘
│ │ │
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌────────────────────────┐
│ /v1/ │ │ /v1/chat/ │ │ EE Answer Engine │
│ completions │ │ completions │ │ (GraphQL / 后台索引) │
│ 代码补全 │ │ 代码对话 │ │ ee/tabby-webserver ░░░ │
└──────┬────────┘ └──────┬────────┘ └───────────┬────────────┘
│ │ │
▼ │ ▼
┌───────────────┐ │ ┌────────────────────────┐
│ 检索增强 │ │ │ ee/tabby-db (SQLite) │
│ 拼 FIM 提示 │ │ │ 用户/线程/集成 ░░░ │
└──────┬────────┘ │ └────────────────────────┘
│ │
▼ ▼
┌────────────────────┐ ┌──────────────────────────────────────────┐
│ 底层检索 │ │ 可插拔推理后端 tabby-inference (抽象接口) │
│ tabby-index │ │ ├─ 本地: llama-cpp-server (跑 GGUF) │
│ Tantivy 索引 + │ │ └─ 远程: http-api-bindings (OpenAI 兼容) │
│ embedding/BM25 混合 │ └──────────────────────────────────────────┘
└────────────────────┘
(░░░ = 企业版 EE feature 才启用)
2.2 主线走一遍(高层,不进代码)
跟着一次代码补全请求从进程启动到吐出文本,看看它经过哪些部件。装配顺序取自 crates/tabby/src/serve.rs 的 main(serve.rs:117-233)与 api_router(serve.rs:251-360):
- 进程启动。
tabby serve走到serve::main;先load_model按需下载本地模型(serve.rs:235-249),再决定要不要启用嵌入服务和企业版 Webserver。 - 装配依赖。 依次建好:事件日志器
logger、Tantivy 索引读取器IndexReaderProvider、代码检索create_code_search、补全+对话服务create_completion_service_and_chat(serve.rs:147-184)。 - 搭路由。
api_router把每个能力挂到一条 HTTP 路由上——/v1/completions、/v1/chat/completions、/v1/health等,合并成一个 axumRouter,再叠上 Swagger UI(serve.rs:271-359)。 - 收到补全请求。
/v1/completions落到补全服务的generate(services/completion.rs:358);它先build_snippets从索引里检索相关代码片段,再prompt_builder.build拼成 FIM(填空)提示(completion.rs:390-402)。 - 喂给推理后端。
self.engine.generate(&prompt, options)把提示交给推理抽象层(completion.rs:407-408);后端可能是本地llama-cpp-server,也可能是远程 OpenAI 兼容 API,取决于配置(services/model/mod.rs:38-73)。 - 返回并记账。 生成的文本经
logger.log记录后,包成CompletionResponse返回给编辑器(completion.rs:410-438)。
一句话: 一次补全 = 「HTTP 路由 → 检索拼提示 → 推理后端生成 → 返回」,而检索和推理后端这两根柱子被所有能力复用。
3. 部件职责表(crate | 干什么)
Tabby 是一个 Cargo workspace,由多个 crate 组成;下面这张表按「对外能力 → 核心库 → 底层 → 企业版」的层次列出主要成员,数据取自 Cargo.toml:3-24 的 members 和各 crate 的 lib.rs 头部说明。
| crate / 目录 | 层次 | 干什么 |
|---|---|---|
crates/tabby | 入口 | CLI(serve / download 两个子命令)+ axum 服务器装配 + 补全/对话服务编排(main.rs:26-33) |
crates/tabby-common | 基础 | 跨子项目共享的类型与工具:config、api、index schema、路径、注册表(tabby-common/src/lib.rs:1-12) |
crates/tabby-inference | 底层引擎 | 文本生成模型的抽象定义:补全流、对话流、嵌入、解码停止逻辑(tabby-inference/src/lib.rs:1-11) |
crates/tabby-index | 检索 | 后台索引调度:同步仓库、切片、写 Tantivy 索引(tabby-index/src/lib.rs:1-2) |
crates/http-api-bindings | 后端(远程) | 把远程 OpenAI 兼容 API 适配成推理抽象:补全/对话/嵌入(http-api-bindings/src/lib.rs:1-8) |
crates/llama-cpp-server | 后端(本地) | 拉起并托管本地 llama.cpp 进程,跑 GGUF 模型(llama-cpp-server/src/lib.rs:1-17) |
crates/tabby-download / aim-downloader | 支撑 | 从模型注册表下载权重文件 |
crates/tabby-git / tabby-crawler | 支撑 | Git 仓库读取 / 文档抓取,为索引供料 |
ee/tabby-webserver | 企业版 | 企业功能主体:Answer Engine、GraphQL、鉴权、后台任务(tabby-webserver/src/lib.rs:1) |
ee/tabby-db | 企业版 | SQLite 数据访问层:用户、线程、集成等(tabby-db/src/lib.rs) |
ee/tabby-schema | 企业版 | GraphQL schema 与 DAO 定义(tabby-schema/src/lib.rs:1) |
clients/* | 客户端 | IDE / 编辑器插件与共享库:vscode、intellij |