Langchain-Chatchat 仓库结构详解:monorepo 组织方式与 chatchat-server、python-sdk 包布局
本篇基于官方贡献文档 repo_structure.md 展开,系统梳理 Langchain-Chatchat 的 monorepo 仓库组织方式:根目录工程配置、libs/chatchat-server 后端包的双 Python 包布局(chatchat 运行时 + langchain_chatchat SDK)、libs/python-sdk 客户端包,以及贯穿各包的测试与 lint 体系。读完后,你可以在贡献代码前准确定位目标模块、理解包边界约束(例如 SDK 层禁止 import chatchat),并知道如何用 Makefile 运行单元测试、集成测试与代码检查。
一、monorepo 总体布局:一个仓库、多个包
官方文档明确指出:chatchat 沿用了 monorepo 的组织方式,项目的代码库包含了多个包。文档给出的树形结构为:
.
├── docker
├── docs # 文档
├── frontend # 前端
├── libs
│ ├── chatchat-server # 服务端
│ │ └── tests
│ │ ├── integration_tests # 集成测试 (每个包都有,为了简洁没有展示)
│ │ └── unit_tests # 单元测试 (每个包都有,为了简洁没有展示)
文档的核心论点是:每个包都自带 tests/ 目录(集成测试 + 单元测试),因此贡献者改哪个包,就去哪个包的 tests/ 下找对应测试。对照当前仓库根目录的实际布局,这一结构完整保留:
| 目录/文件 | 职责 |
|---|---|
| docker/ | 容器化部署,含 Dockerfile 与数据卷 |
| docs/ | 文档,含 contributing/ 贡献指南(code、api、agent、settings、README_dev 等章节) |
| libs/ | 各独立 Python 包:chatchat-server(服务端)与 python-sdk(API 客户端) |
| markdown_docs/ | 按模块整理的代码说明文档(document_loaders、kb_service、db、webui_pages 等) |
| tools/ | 运维辅助脚本:AutoDL 启动脚本、model_loaders/xinference_manager.py |
关于文档中提到的
frontend目录:文档称其“包含 chatchat 前端代码”,但当前仓库根目录并没有独立的frontend/目录。从源码结构看,Web 界面已经以 Streamlit 页面形式内嵌在服务端包中,即 libs/chatchat-server/chatchat/webui_pages/ 下的kb_chat.py、dialogue/(对话页)、knowledge_base/(知识库管理页)、model_config/(模型配置页)。可以推断,前端目录的说明来自早期版本,当前版本的前端实现随服务端一起分发。
文档同时说明,根目录还包含 pyproject.toml(用于构建文档和文档 linting 的依赖项)与 Makefile(构建、linting 的快捷方式文件)。对照当前仓库,根目录的实际文件为:pyproject.toml、poetry.toml、release.py、LICENSE 与中英文 README。需要注意的是,当前仓库根目录并未包含 Makefile,实际的 Makefile 位于后端包内:libs/chatchat-server/Makefile,其作用与文档描述一致(测试、lint、format 的快捷入口),这一点在贡献代码时以实际路径为准。
二、根目录工程配置:pyproject.toml 与 poetry.toml
根目录 pyproject.toml 是“仓库级”的 Poetry 配置,与服务端包的 pyproject 职责不同。关键配置如下:
[tool.poetry]
name = "Chatchat"
version = "0.3.0"
description = "Langchain-Chatchat"
license = "MIT"
package-mode = false # 根目录不是可安装包,仅承载仓库级工具配置
几个值得贡献者关注的点:
package-mode = false:根目录自身不构建任何 Python 包,它只是聚合了文档/notebook 的 lint 规则(这正对应文档中“用于构建文档和文档 linting 的依赖项”的说法)。- Python 版本基线:
python = ">=3.8.1,<3.12,!=3.9.7",为兼容文档 notebook 保留了较宽的版本区间;而真正可安装的服务端包要求更严格(见下文>=3.10,<3.12)。 - ruff 的 notebook 规则:
[tool.ruff]中extend-include = ["*.ipynb"],说明仓库会用 ruff 一并检查 notebook;对cookbook、docs目录则放开E402、F401、F811、F841等规则,因为示例代码允许导入后不用、变量不读等写法。 - 镜像源配置:
[[tool.poetry.source]]将tsinghua(清华 PyPI 镜像)设为primary源,配合根目录 poetry.toml 中的in-project = true(虚拟环境创建在项目内)与pypi_mirror插件,保证国内网络环境下依赖安装可用。
三、libs/chatchat-server:服务端包的双包结构
libs/chatchat-server 是整个项目的核心,也是 README.md 所述的主程序所在。它内部实际上包含两个可打包的 Python 包,由包级 pyproject.toml 声明:
packages = [
{include = "chatchat"},
{include = "langchain_chatchat"}
]
3.1 chatchat 包:应用运行时(服务端 + WebUI)
chatchat/ 是真正跑起来的服务端应用,顶层文件各司其职:
| 文件 | 职责 |
|---|---|
| cli.py | 命令行入口,Poetry 将其注册为 chatchat 命令(chatchat = 'chatchat.cli:main',见 pyproject.toml#L12-L13) |
| settings.py | 基于 pydantic_settings 的全局配置(模型、知识库、RAG 参数等,另有 pydantic_settings_file.py 处理 YAML 配置加载) |
| startup.py | 启动编排,对应 markdown_docs/startup.md 的说明 |
| webui.py | Streamlit 界面启动入口,页面位于 webui_pages/ |
| init_database.py | SQLAlchemy 元数据初始化 |
| data/ | 内置示例知识库(samples 下的 PDF、CSV、Markdown 样例)与 NLTK 分词数据 |
chatchat/server/ 是业务核心,按能力切分为清晰的子模块,与 markdown_docs/server/ 的文档目录一一对应:
- server/api_server/:FastAPI 应用与路由,含 chat_routes.py(对话)、kb_routes.py(知识库)、mcp_routes.py、openai_routes.py(OpenAI 兼容接口)等,静态资源(swagger UI、favicon)也放在其
static/下; - server/chat/:多种对话编排——
chat.py(普通对话)、kb_chat.py(知识库 RAG 对话)、file_chat.py(临时文件对话)、completion.py、feedback.py与消息事件 human_message_event.py,与 markdown_docs/server/chat/ 文档对应; - server/knowledge_base/:知识库 API(
kb_api.py、kb_doc_api.py、kb_summary_api.py)与多后端服务实现(kb_service/ 下的 default/faiss/chromadb/milvus/es/pg 等服务)、kb_cache/faiss_cache.py 缓存与migrate.py迁移工具; - server/file_rag/:RAG 三件套——document_loaders/(PDF/Word/PPT/图片/CSV 加载器与 OCR)、text_splitter/(中文分句与递归切分)、retrievers/(向量/BM25 混合检索);
- server/agent/:Agent 与工具工厂,tools_factory/ 下聚集了知识库检索、联网搜索、shell、weather、text2sql 等可注册工具;
- server/db/:基于 SQLAlchemy 2.0 的数据访问层,
models/(conversation、message、knowledge_base 等模型)与repository/(对应仓储类)严格分层; - 其他支撑模块:server/reranker/reranker.py(重排序)、server/types/(请求/响应 schema)、server/agents_registry/(Agent 注册)。
3.2 langchain_chatchat 包:可复用的 SDK 层
langchain_chatchat/ 是面向第三方集成的 LangChain 生态 SDK,包含:
- agents/:平台 Agent 构造,含
react/(create_prompt_template.py)、structured_chat/(Qwen/ChatGLM3 等结构化调用 Agent)、output_parsers/(工具输出解析器); - agent_toolkits/:工具包(
all_tools/、mcp_kit/); - chat_models/ 与 embeddings/:聊天模型抽象与模型厂商 embedding 实现;
- callbacks/ 与 utils/:回调协议与历史消息工具。
3.3 包边界约束:两条 lint 硬规则
两个包之间不是随意 import 的关系,仓库用脚本强制约束了方向:
- scripts/lint_imports.sh:用
git grep '^from chatchat\.'检查并禁止出现从chatchat运行时包导入的代码。也就是说,langchain_chatchatSDK 层不得依赖应用运行时chatchat,保证 SDK 可独立复用; - scripts/check_pydantic.sh:检查所有以
import pydantic/from pydantic开头的行,要求改用langchain_core.pydantic_v1(或其对应的pydantic_v1.py/pydantic_v2.py兼容层,见 server/pydantic_v1.py),以兼容 LangChain 0.1.x 的 pydantic v1/v2 双轨; - 配套的 scripts/check_imports.py 提供导入检查的 Python 实现。
这两条规则由 Makefile 的 lint 目标统一执行(见第五节),是贡献代码时必须遵守的架构约束。
3.4 包级 pyproject.toml:版本、依赖与可选扩展
libs/chatchat-server/pyproject.toml 声明了 langchain-chatchat 包(当前版本 0.3.1.3),关键信息:
- Python 要求:
>=3.10,<3.12,!=3.9.7,比根目录仓库级配置更严格; - 核心依赖基线:
langchain = 0.1.17、langchain-community = 0.0.36、fastapi ~0.109.2、streamlit = 1.34.0、SQLAlchemy ~2.0.25、faiss-cpu ~1.7.4、mcp >=1.4.1,<1.5、pydantic ~2.11.1等,锁定得比较精确,升级依赖时需要同步评估兼容性; - 可选 extras:
xinference、zhipuai、ollama为可选模型接入扩展([tool.poetry.extras]),另有extended_testingextra 用于扩展测试依赖; - WebUI 依赖成组声明(streamlit 系列组件),说明前端界面属于该包的一部分;
- 测试与 lint 工具组:
[tool.poetry.group.test]声明 pytest、pytest-socket、syrupy 等(optional),[tool.poetry.group.lint]声明 ruff,codespell组用于拼写检查; - pytest 配置(pyproject.toml#L221-L239):
addopts启用--strict-markers --strict-config -svv,注册了requires、scheduled、compile三个自定义 marker,并设asyncio_mode = "auto"——这与 Makefile 中scheduled_tests的-m scheduled用法相呼应。
四、libs/python-sdk:面向使用者的 API 客户端
libs/python-sdk/ 是与服务端配套的第二包,提供 open_chatcaht 客户端库,按能力拆分为:
- api/chat/chat_client.py:对话、文件对话、知识库对话客户端;
- api/knowledge_base/knowledge_base_client.py:知识库与文档管理客户端;
- api/standard_openai/standard_openai_client.py:OpenAI 兼容接口客户端(含语音、图片、embedding 输入模型);
- api/tools/tool_client.py 与 api/server/server_client.py:工具调用与服务端状态客户端;
- types/:按 chat / knowledge_base(doc、summary 子域)/ standard_openai / tools 组织的请求与响应类型;
- extra/langchain/ 与 extra/llmaindex/:让知识库检索直接以 LangChain / LlamaIndex 组件形式被集成;
- 包内 tests/ 覆盖 chat、kb、server、standard_openai、tools 各客户端,遵循文档“每个包都有 tests”的约定。
五、测试体系与 Makefile 工作流
文档强调“每个包都有 integration_tests 与 unit_tests”,在 libs/chatchat-server 中体现得最完整。libs/chatchat-server/tests/ 目录布局:
| 目录 | 内容 |
|---|---|
| tests/api/ | 服务端 API 测试:流式对话(含线程并发用例)、OpenAI 兼容接口、KB API、工具调用 |
| tests/integration_tests/ | SDK 集成测试,含 platform_tools/、mcp_platform_tools/(带 MCP 测试服务端 math_server.py) |
| tests/unit_tests/ | 单元测试(如 MCP prompt 解析) |
| tests/kb_vector_db/ | 向量库后端测试:faiss、milvus、pg、relyt |
| tests/document_loader/、tests/custom_splitter/ | 文档加载器与切分器专项测试 |
| tests/data/、tests/samples/ | 迁移与 OCR 测试用的样例知识库与文件 |
Makefile 把测试与 lint 封装为快捷命令(需先 poetry install 进入包环境):
test: # 单元测试(默认路径 tests/unit_tests/,可 TEST_FILE=... 覆盖)
poetry run pytest --disable-socket --allow-unix-socket $(TEST_FILE)
coverage: # 带覆盖率的单元测试
poetry run pytest --cov --cov-config=.coveragerc --cov-report xml \
--cov-report term-missing:skip-covered $(TEST_FILE)
integration_tests:
poetry run pytest tests/integration_tests
scheduled_tests:
poetry run pytest -m scheduled tests/integration_tests
值得注意的工程细节:
- 单元测试默认
--disable-socket(pytest-socket 插件禁用外网访问),保证测试可离线复现,只有 unix socket 被放行; TEST_FILE ?= tests/unit_tests/允许make test TEST_FILE=tests/api/test_stream_chat_api.py精确到文件;scheduled_tests配合 pyproject 中注册的scheduledmarker,用于挑选需要定时运行的集成测试;test_watch目标用ptw(pytest-watcher)实现改码即测,提升贡献者的反馈速度;- lint 目标(Makefile#L53-L59)串联了前述全部检查:先跑
check_pydantic.sh与lint_imports.sh两条架构约束脚本,再执行poetry run ruff .,并支持lint_package(仅检查chatchat)、lint_tests(仅检查tests并附加 mypy)、lint_diff(仅检查git diff变更文件)三种粒度; - 另有
format、format_diff(ruff format + isort 修正)、spell_check/spell_fix(codespell 拼写检查,skip 规则见 pyproject.toml#L242-L249)。
六、辅助目录:tools 与 docker
- tools/autodl_start_script/:面向 AutoDL 环境的启动脚本集,包括模型下载(download_model.sh)、模型注册(model_registrations.sh)、启动 chatchat 与 Xinference(start_xinference.sh)等,适合参考“服务端 + 模型服务”的部署组合方式;
- tools/model_loaders/xinference_manager.py:Xinference 模型加载管理器;
- docker/Dockerfile:容器构建入口,配合 docs/install/README_docker.md 使用。
七、贡献者速查:按结构定位文件
结合上述结构,贡献代码时的路径速查表如下:
| 你要改的东西 | 去哪里找 | 对应测试 |
|---|---|---|
| API 路由/接口 | chatchat/server/api_server/ | tests/api/ |
| 对话/记忆/反馈逻辑 | chatchat/server/chat/ | tests/api/test_stream_chat_api.py |
| 知识库后端(faiss/milvus/pg…) | chatchat/server/knowledge_base/kb_service/ | tests/kb_vector_db/ |
| 文档加载/切分/OCR | chatchat/server/file_rag/ | tests/document_loader/、tests/custom_splitter/ |
| 文档站点的模块说明 | 同步更新 markdown_docs/ 下对应模块的 md | — |
| SDK(agents/工具包/模型抽象) | langchain_chatchat/(不得 import chatchat 运行时包) |
tests/integration_tests/ |
| 客户端 SDK | libs/python-sdk/open_chatcaht/ | libs/python-sdk/tests/ |
最后重申两条硬性约束,提交前可先自查:不要出现 from chatchat. 的导入(lint_imports.sh),不要把 from pydantic import ... 直接写进代码而应走 langchain_core.pydantic_v1 兼容层(check_pydantic.sh)。在 libs/chatchat-server 目录下执行 make lint 与 make test,即可在本地复现 CI 级别的基本检查。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00