核心理念
所有代码贡献都应遵循以下核心原则:向后兼容
保持稳定的公共接口,避免破坏性变更
测试优先
每次变更必须包含全面的测试,以验证正确性并防止回归
代码质量
遵循一致的风格、文档和架构模式
安全为重
优先考虑安全编码实践和漏洞预防
开始贡献
快速修复:提交错误修复
对于简单的错误修复,您可以立即开始:克隆与设置
进行修改
在修复错误时,请遵循我们的代码质量标准
添加测试
包含在没有您的修复时会失败的单元测试。这使我们能够验证错误已解决并防止回归
提交拉取请求
遵循提供的PR模板。如果适用,请使用关闭关键词(例如
Fixes #123)引用您正在修复的问题。完整开发设置
对于持续开发或较大的贡献:开发环境
为您正在处理的包设置开发环境。- LangChain
- LangGraph
仓库结构
- LangChain
- LangGraph
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-cli:命令行界面langchain-community:社区维护的集成(位于单独的仓库中)
开发工作流
测试要求
目录路径是相对于您正在处理的包而言的。
集成测试
集成测试需要访问外部服务/提供商 API(可能需要费用),因此默认不运行。并非每次代码变更都需要集成测试,但请注意,我们将在审查过程中单独要求/运行集成测试。位置:
tests/integration_tests/要求:- 测试与外部服务的真实集成
- 使用环境变量存储 API 密钥
- 在凭据不可用时优雅地跳过
代码质量标准
质量要求:- 类型提示
- 文档
- 代码风格
必需:所有函数都需要完整的类型注解
手动格式化和代码检查
代码格式化和代码检查通过 CI/CD 强制执行。在提交前运行这些命令,以确保您的代码通过检查。
贡献指南
向后兼容性
保持兼容性:稳定接口
稳定接口
始终保留:
- 函数签名和参数名称
- 类接口和方法名称
- 返回值结构和类型
- 公共 API 的导入路径
安全变更
安全变更
可接受的修改:
- 添加新的可选参数
- 向类添加新方法
- 在不改变行为的情况下提升性能
- 添加新模块或函数
进行更改前
进行更改前
- 这会破坏现有的用户代码吗?
- 检查您的目标是否为公共的
-
如果需要,它是否在
__init__.py中导出? - 测试中是否存在现有的使用模式?
错误修复
对于错误修复贡献:新功能
我们对新功能的准入门槛较高。通常,如果没有一个现有问题证明外部贡献者提出的新核心抽象、基础设施变更、依赖项变更或新代理/链存在迫切需求,我们不会接受这些贡献。 通常,功能贡献要求包括:安全指南
安全检查清单:输入验证
输入验证
- 验证和清理所有用户输入
- 在模板和查询中正确转义数据
- 切勿对用户数据使用
eval()、exec()或pickle,因为这可能导致任意代码执行漏洞
错误处理
错误处理
- 使用特定的异常类型
- 不要在错误消息中暴露敏感信息
- 实现适当的资源清理
依赖项
依赖项
- 避免添加硬依赖
- 保持可选依赖最少
- 审查第三方包的安全问题
测试与验证
本地运行测试
在提交PR之前,请确保您已完成以下步骤。请注意,LangChain 和 LangGraph 的要求略有不同。- LangChain
- LangGraph
PR 提交
推送您的分支并打开一个拉取请求。遵循提供的表单模板。使用关闭关键词注明相关问题。提交后,请等待并检查以确保 CI 检查通过。如果有任何检查失败,请及时解决问题 - 维护者可能会在合理时间内关闭未通过 CI 的 PR。
测试编写指南
为了编写有效的测试,有几个良好实践需要遵循:- 在文档字符串中使用自然语言描述测试
- 使用描述性的变量名
- 断言要详尽
- 单元测试
- 集成测试
- 模拟使用
获取帮助
我们的目标是提供尽可能易于使用的开发者设置。如果您在设置过程中遇到任何困难,请在社区 Slack 中提问或打开论坛帖子。您现在已准备好为 LangChain 贡献高质量的代码了!