开始指南
如果你正在寻找可以工作的项目,请查看我们仓库中带有 “help wanted” 标签的问题:LangChain
标签
LangGraph
标签
Deep Agents
标签
在提交大型的新功能或重构之前,请先打开一个 issue 或在 论坛 发帖讨论。这可以确保与项目目标保持一致,并避免重复工作。
简单修复:提交 bug 修复
对于简单的 bug 修复,你可以立即开始:进行更改
在遵循我们的 代码质量标准 的前提下修复 bug。只需做出解决问题所需的最小变更。我们强烈建议在开始编码之前就问题发表评论。例如:
“我想解决这个问题。我的计划是 [… 简要描述 …]。这与维护者的期望一致吗?”一个简短的评论通常可以防止如果初始方法错误而导致浪费努力。
提交 pull request
按照提供的 pull request 模板操作。如果适用,请使用 关闭关键字(例如
Fixes #ISSUE_NUMBER)来引用你正在修复的问题,以便在 pull request 合并时自动关闭问题。完整开发环境设置
对于持续开发或更大规模的贡献:贡献指南
在开始为 LangChain 项目贡献代码之前,请花时间思考一下你为什么要这样做。如果你的唯一目标是添加一个“首次贡献”到你的简历(或者只是寻找一个快速胜利),你可能更适合参加培训营或在线教程。 参与开源项目需要时间和努力,但它也可以帮助你成为一个更好的开发者并学习新技能。然而,重要的是要知道这可能比跟随训练课程更难和慢一些。不过,如果你愿意花时间做好事情的话,为开源做出贡献是值得的!向后兼容性
保持兼容性的方式:稳定接口
稳定接口
始终保留:
- 函数签名和参数名称
- 类的接口和方法名称
- 返回值结构和类型
- 公共 API 的导入路径
安全更改
安全更改
可接受的修改:
- 添加新的可选参数
- 为类添加新方法
- 在不改变行为的情况下提高性能
- 添加新模块或函数
在做更改之前
在做更改之前
- 这个更改是否会破坏现有的用户代码?
- 检查你的目标是否是公共的
-
如果需要,它是否导出在
__init__.py中? - 在测试中是否有现有的用法模式?
新功能
我们希望保持新功能的标准很高。通常情况下,除非有现有问题表明它们具有迫切需求,否则我们不会接受来自外部贡献者的新的核心抽象。这同样适用于基础设施和依赖项的更改。 一般而言,新功能贡献的要求包括:安全指南
安全检查清单:输入验证
输入验证
- 验证和清理所有用户输入
- 正确地在模板和查询中转义数据
- 从用户数据中绝不能使用
eval()、exec()或pickle,因为这可能导致任意代码执行漏洞
错误处理
错误处理
- 使用特定的异常类型
- 不要在错误消息中暴露敏感信息
- 实现适当的资源清理
依赖项
依赖项
- 避免添加硬依赖项
- 保持可选依赖项最小化
- 审查第三方包的安全问题
开发环境
我们的 Python 项目使用uv 进行依赖管理。请确保安装了最新版本。
我们力求在所有 Python 包中保持设置的一致性。从包目录运行:
仓库结构
- LangChain
- LangGraph
- Deep Agents
LangChain 是一个包含多个包的单体仓库:
核心包
核心包
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: 社区维护的集成(位于单独的仓库中)
开发工作流
预提交钩子
LangChain 和 Deep Agents 仓库包含预提交钩子,这些钩子在每次提交之前自动运行格式化、检查和验证。从仓库根目录安装它们:- 不直接向受保护分支提交更改
- YAML 和 TOML 语法验证
- 检查尾随空格和文件末尾的修复
- 标点符号和非标准空格的规范化
- 每个包的
make format和make lint
运行测试
目录相对于你工作的包是相对的。
单元测试
位置:tests/unit_tests/
单元测试覆盖不需要调用外部 API 的模块逻辑。如果你添加了新逻辑,你应该添加一个单元测试。在单元测试中检查预处理和后处理,并模拟外部依赖项。
要求:
- 不允许网络请求
- 测试所有代码路径,包括边界情况
- 使用 mock 对外部依赖项进行测试
集成测试
位置:tests/integration_tests/
集成测试覆盖需要调用外部 API 的逻辑(通常与其他服务进行集成)。
集成测试需要访问外部服务提供程序 API(这可能会产生费用),因此默认情况下不会运行它们。
并非每次代码更改都需要集成测试,但请记住,在我们的审查过程中我们将单独要求并运行集成测试。
要求:
- 测试与外部服务的真实集成
- 使用环境变量来存储 API 密钥
- 如果凭据不可用,则优雅地跳过
代码质量标准
贡献必须遵守以下质量要求:- 类型提示
- 文档
- 代码风格
必需: 所有函数的完整类型注解
依赖项
LangChain 包将硬依赖项和可选依赖项区分开来,以保持包轻量级并减少用户的安装开销。- 可选依赖项
- 硬依赖项
几乎所有新的依赖项都应该为可选的。使用可选依赖项的情况包括:
- 该依赖项仅用于特定集成或功能
- 用户可以有意义地不使用此依赖项
- 该依赖项较大,具有许多传递性依赖
- 没有安装依赖项的情况下用户能够导入你的代码而不产生任何副作用(没有警告、错误或异常)
pyproject.toml和uv.lock不会更改
- 将依赖项添加到适当的测试依赖文件中(例如,
extended_testing_deps.txt) - 添加一个至少尝试导入新代码的单元测试。理想情况下,该单元测试使用轻量级固定装置来测试代码逻辑。
- 使用
@pytest.mark.requires("package_name")装饰器为需要依赖项的任何单元测试。
测试编写指南
为了编写有效的测试,有一些好的实践要遵循:- 使用自然语言在文档字符串中描述测试
- 使用描述性的变量名
- 累积断言
- 单元测试
- 集成测试
- 模拟用法
提交 pull request
一旦你的测试通过且代码符合质量标准:- 推送分支并打开一个 pull request
- 按照提供的 pull request 模板操作
- 使用 关闭关键字(例如
Fixes #123)来引用你正在修复的问题,以便在 pull request 合并时自动关闭问题 - 等待 CI 检查完成
如果你的 pull request 包含 AI 生成的内容,请遵循我们的 LLM 的可接受用途 政策。看起来像是低努力、AI 生成的垃圾内容的 pull request 将会无评论地关闭。
获取帮助
我们的目标是使开发者的设置尽可能易于访问。如果你遇到任何难以设置的问题,请在 社区 Slack 或打开一个 论坛帖子。你现在可以为 LangChain 贡献高质量的代码了!
通过 MCP 将这些文档连接到 Claude、VSCode 和更多工具,以获得实时答案。

