快速入门
如果您正在寻找可以着手的工作,请查看我们仓库中标记为 “help wanted” 的问题:LangChain
Labels
LangGraph
Labels
Deep Agents
Labels
在提交大型新功能或重构之前,请先创建一个 issue 或在论坛发帖讨论。这有助于确保与项目目标保持一致,并避免重复工作。
快速修复:提交错误修复
对于简单的错误修复,您可以立即开始:复刻仓库
将 LangChain、LangGraph 或 Deep Agents 仓库复刻到您的
克隆与设置
编写失败的测试
添加在没有您的修复时会失败的单元测试。这使我们能够验证错误是否已解决,并防止回归。
进行更改
在遵循我们的代码质量标准的同时修复错误。进行解决问题所必需的最小更改。我们强烈建议贡献者在开始编码之前先对 issue 发表评论。例如:
“我想解决这个问题。我打算的方法是 […简要描述…]。这符合维护者的期望吗?”如果您的初始方法是错误的,30 秒的评论通常可以避免浪费精力。
提交拉取请求
遵循提供的 PR 模板。如果适用,请使用关闭关键字(例如
Fixes #ISSUE_NUMBER)引用您正在修复的问题,以便在您的 PR 合并时自动关闭该问题。完整开发设置
对于持续开发或较大的贡献:贡献指南
在开始为 LangChain 项目贡献代码之前,请花点时间思考一下您为什么要这样做。如果您唯一的目标是在简历上增加一个“首次贡献”(或者您只是想快速获胜),那么参加训练营或在线教程可能更适合您。 为开源项目贡献代码需要时间和精力,但它也可以帮助您成为更好的开发者并学习新技能。然而,重要的是要知道,这可能比参加培训课程更难、更慢。话虽如此,如果您愿意花时间把事情做好,为开源做贡献是值得的!向后兼容性
通过以下方式保持兼容性:稳定接口
稳定接口
始终保留:
- 函数签名和参数名称
- 类接口和方法名称
- 返回值结构和类型
- 公共 API 的导入路径
安全更改
安全更改
可接受的修改:
- 添加新的可选参数
- 向类添加新方法
- 在不改变行为的情况下提高性能
- 添加新模块或函数
进行更改之前
进行更改之前
- 这会破坏现有的用户代码吗?
- 检查您的目标是否是公开的
-
如果需要,它是否在
__init__.py中导出? - 测试中是否有现有的使用模式?
新功能
我们旨在对新功能保持高标准。通常,如果没有现有问题表明对核心抽象有迫切需求,我们不接受外部贡献者提供的新核心抽象。这也适用于对基础设施和依赖项的更改。 通常,功能贡献要求包括:安全指南
安全检查表:输入验证
输入验证
- 验证并清理所有用户输入
- 在模板和查询中正确转义数据
- 切勿对用户数据使用
eval()、exec()或pickle,因为这可能导致任意代码执行漏洞
错误处理
错误处理
- 使用特定的异常类型
- 不要在错误消息中暴露敏感信息
- 实现正确的资源清理
依赖项
依赖项
- 避免添加硬依赖项
- 保持可选依赖项最少
- 审查第三方包的安全问题
开发环境
我们的 Python 项目使用uv 进行依赖管理。请确保您安装了最新版本。
我们努力在所有 Python 包中保持设置一致。从包目录中运行:
仓库结构
- LangChain
- LangGraph
- Deep Agents
LangChain 组织为一个包含多个包的 monorepo:
核心包
核心包
langchain(位于libs/langchain/):包含链、代理和检索逻辑的主包langchain-core(位于libs/core/):基础接口和核心抽象
合作伙伴包
合作伙伴包
位于
libs/partners/,这些是独立版本化的特定集成包。例如:langchain-openai:OpenAI 集成langchain-anthropic:Anthropic 集成langchain-google-genai:Google Generative AI 集成
支持包
支持包
langchain-text-splitters:文本分割工具langchain-standard-tests:集成的标准测试套件langchain-community:社区维护的集成(位于单独的仓库中)
开发工作流
Pre-commit 钩子
LangChain 和 Deep Agents 仓库包含 pre-commit 钩子,可在每次提交前自动运行格式化、代码检查和验证检查。从仓库根目录安装它们:- 不直接提交到受保护分支
- YAML 和 TOML 语法验证
- 修复尾随空格和文件结尾
- 智能引号和非标准空格规范化
- 每个包的
make format和make lint
运行测试
目录是相对于您正在处理的包的。
单元测试
位置:tests/unit_tests/
单元测试涵盖不需要调用外部 API 的模块化逻辑。如果您添加了新逻辑,则应该添加一个单元测试。在单元测试中,检查前/后处理并模拟外部依赖项。
要求:
- 不允许网络调用
- 测试所有代码路径,包括边缘情况
- 对外部依赖项使用模拟
集成测试
位置:tests/integration_tests/
集成测试涵盖需要调用外部 API(通常是与其它服务集成)的逻辑。
集成测试需要访问外部服务/提供者 API(可能需要付费),因此默认情况下不会运行。
并非每个代码更改都需要集成测试,但请记住,我们将作为审查过程的一部分单独要求/运行集成测试。
要求:
- 测试与外部服务的真实集成
- 对环境变量使用 API 密钥
- 如果凭据不可用,则优雅跳过
代码质量标准
贡献必须遵守以下质量要求:- 类型提示
- 文档
- 代码风格
必需:所有函数的完整类型注解
依赖项
LangChain 包区分硬依赖项和可选依赖项,以保持包轻量级并最大限度地减少用户的安装开销。- 可选依赖项
- 硬依赖项
几乎所有新依赖项都应该是可选的。在以下情况下使用可选依赖项:
- 依赖项仅用于特定集成或功能
- 用户可以在没有此依赖项的情况下有意义地使用包
- 依赖项很大或有许多传递依赖项
- 未安装依赖项的用户必须能够导入您的代码而没有任何副作用(无警告、无错误、无异常)
pyproject.toml和uv.lock不被修改
- 将依赖项添加到适当的测试依赖项文件中(例如
extended_testing_deps.txt) - 添加一个至少尝试导入新代码的单元测试。理想情况下,单元测试使用轻量级夹具来测试代码的逻辑。
- 对任何需要该依赖项的单元测试使用
@pytest.mark.requires("package_name")装饰器。
测试编写指南
为了编写有效的测试,需要遵循一些好的实践:- 在文档字符串中使用自然语言描述测试
- 使用描述性变量名
- 详尽地使用断言
- 单元测试
- 集成测试
- 模拟使用
提交您的 PR
一旦您的测试通过且代码符合质量标准:- 推送您的分支并打开一个拉取请求
- 遵循提供的 PR 模板
- 使用关闭关键字(例如
Fixes #123)引用相关问题 - 等待 CI 检查完成
如果您的 PR 包含 AI 生成的内容,您必须遵守我们的LLM 可接受使用政策。看起来是低质量、AI 生成的垃圾邮件的 PR 将被关闭,恕不另行评论。
获取帮助
我们的目标是拥有最易访问的开发者设置。如果您在设置过程中遇到任何困难,请在社区 Slack 中提问或在论坛发帖。您现在已准备好为 LangChain 贡献高质量的代码!
Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

