首页
/ Langchain-Chatchat 仓库结构详解:monorepo 组织方式与 chatchat-server、python-sdk 包布局

Langchain-Chatchat 仓库结构详解:monorepo 组织方式与 chatchat-server、python-sdk 包布局

2026-09-05 17:09:46作者:尤辰城Agatha

本篇基于官方贡献文档 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.pydialogue/(对话页)、knowledge_base/(知识库管理页)、model_config/(模型配置页)。可以推断,前端目录的说明来自早期版本,当前版本的前端实现随服务端一起分发。

文档同时说明,根目录还包含 pyproject.toml(用于构建文档和文档 linting 的依赖项)与 Makefile(构建、linting 的快捷方式文件)。对照当前仓库,根目录的实际文件为:pyproject.tomlpoetry.tomlrelease.pyLICENSE 与中英文 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        # 根目录不是可安装包,仅承载仓库级工具配置

几个值得贡献者关注的点:

  1. package-mode = false:根目录自身不构建任何 Python 包,它只是聚合了文档/notebook 的 lint 规则(这正对应文档中“用于构建文档和文档 linting 的依赖项”的说法)。
  2. Python 版本基线python = ">=3.8.1,<3.12,!=3.9.7",为兼容文档 notebook 保留了较宽的版本区间;而真正可安装的服务端包要求更严格(见下文 >=3.10,<3.12)。
  3. ruff 的 notebook 规则[tool.ruff]extend-include = ["*.ipynb"],说明仓库会用 ruff 一并检查 notebook;对 cookbookdocs 目录则放开 E402F401F811F841 等规则,因为示例代码允许导入后不用、变量不读等写法。
  4. 镜像源配置[[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/ 的文档目录一一对应:

3.2 langchain_chatchat 包:可复用的 SDK 层

langchain_chatchat/ 是面向第三方集成的 LangChain 生态 SDK,包含:

3.3 包边界约束:两条 lint 硬规则

两个包之间不是随意 import 的关系,仓库用脚本强制约束了方向:

  1. scripts/lint_imports.sh:用 git grep '^from chatchat\.' 检查并禁止出现从 chatchat 运行时包导入的代码。也就是说,langchain_chatchat SDK 层不得依赖应用运行时 chatchat,保证 SDK 可独立复用;
  2. 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 双轨;
  3. 配套的 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.17langchain-community = 0.0.36fastapi ~0.109.2streamlit = 1.34.0SQLAlchemy ~2.0.25faiss-cpu ~1.7.4mcp >=1.4.1,<1.5pydantic ~2.11.1 等,锁定得比较精确,升级依赖时需要同步评估兼容性;
  • 可选 extrasxinferencezhipuaiollama 为可选模型接入扩展([tool.poetry.extras]),另有 extended_testing extra 用于扩展测试依赖;
  • 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,注册了 requiresscheduledcompile 三个自定义 marker,并设 asyncio_mode = "auto"——这与 Makefile 中 scheduled_tests-m scheduled 用法相呼应。

四、libs/python-sdk:面向使用者的 API 客户端

libs/python-sdk/ 是与服务端配套的第二包,提供 open_chatcaht 客户端库,按能力拆分为:

五、测试体系与 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 中注册的 scheduled marker,用于挑选需要定时运行的集成测试;
  • test_watch 目标用 ptw(pytest-watcher)实现改码即测,提升贡献者的反馈速度;
  • lint 目标Makefile#L53-L59)串联了前述全部检查:先跑 check_pydantic.shlint_imports.sh 两条架构约束脚本,再执行 poetry run ruff .,并支持 lint_package(仅检查 chatchat)、lint_tests(仅检查 tests 并附加 mypy)、lint_diff(仅检查 git diff 变更文件)三种粒度;
  • 另有 formatformat_diff(ruff format + isort 修正)、spell_check/spell_fix(codespell 拼写检查,skip 规则见 pyproject.toml#L242-L249)。

六、辅助目录:tools 与 docker

七、贡献者速查:按结构定位文件

结合上述结构,贡献代码时的路径速查表如下:

你要改的东西 去哪里找 对应测试
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 lintmake test,即可在本地复现 CI 级别的基本检查。

登录后查看全文
热门项目推荐
相关项目推荐