入门指南
如果你在寻找可以着手的工作,请查看我们仓库中标记为 “help wanted” 的问题: :::pythonLangChain
标签
LangGraph
标签
Deep Agents
标签
LangChain
标签
LangGraph
标签
Deep Agents
标签
在提交大型 新功能或重构 之前,请先打开一个问题或发布到 论坛 进行讨论。这确保了与项目目标的保持一致,并防止重复工作。
快速修复:提交 Bug 修复
对于简单的 Bug 修复,你可以立即开始:1
Reproduce the issue
在克隆仓库之前,请确保你能可靠地复现 Bug。这有助于确认问题并提供修复的起点。维护者和其他贡献者应该能够根据你的描述复现问题,而无需额外的设置或修改。
2
Fork the repository
:::python
将 LangChain、LangGraph 或 Deep Agents 仓库 fork 到你的
:::
:::js
将 LangChain、LangGraph 或 Deep Agents 仓库 fork 到你的
:::
4
Create a branch
为你的修复创建一个新的分支。这有助于组织你的更改,并使后续提交拉取请求变得更容易。
5
Write failing tests
添加 单元测试,这些测试在没有你的修复的情况下会失败。这允许我们验证 Bug 是否已解决,并防止回归
6
Make your changes
在遵循我们 代码质量标准 的情况下修复 Bug。进行 最小必要的更改 以解决问题。我们强烈建议贡献者在开始编码之前在问题下评论。例如:
“我想处理这个问题。我的预期方法是 […简短描述…]。这符合维护者的期望吗?”*一句 30 秒的评论通常可以防止如果你最初的方案是错误的情况下浪费精力。
7
Run build
运行构建命令以确保包仍然可以正常构建
8
Verify the fix
确保测试通过且没有引入回归。在提交 PR 之前,请确保本地所有测试都通过:::python:::
:::js:::
9
Document the change
如果行为发生变化,请更新 docstrings 和/或行内注释
10
Submit a pull request
遵循提供的 PR 模板。如果适用,使用 关闭关键词(例如
Fixes #ISSUE_NUMBER)引用你正在修复的问题,以便在 PR 合并时自动关闭该问题。完整开发环境设置
对于持续开发或更大的贡献:贡献指南
在为LangChain项目贡献之前,请花时间思考你贡献的目的。如果你的唯一目标只是为简历添加一个”首次贡献”(或只是寻找快速胜利),你可能更适合参加训练营或在线教程。 为开源项目做贡献需要时间和精力,但也能帮助你成为更好的开发者并学习新技能。不过需要知道,这可能会比参加培训课程更难更慢。但只要愿意投入时间做好每件事,贡献开源项目就值得!向后兼容性
通过以下方式保持兼容性:Stable interfaces
Stable interfaces
必须始终保留:
- 函数签名和参数名称
- 类接口和方法名称
- 返回值结构和类型
- 公共API的导入路径
Safe changes
Safe changes
可接受修改::::python
- 添加新的可选参数 ::: :::js
- 添加新的可选参数/类型参数 :::
- 为类添加新方法
- 不改变行为的前提下优化性能
- 添加新模块或函数
Before making changes
Before making changes
- 这会破坏现有用户代码吗?
- 检查目标是否为公共的 :::python
- 如果需要,是否在
__init__.py中导出? ::: - 是否存在测试中的现有使用模式?
新功能
我们致力于保持新功能的准入门槛。通常不接受外部贡献者提出的核心抽象类新功能,除非已有明确需求的问题报告。此规则同样适用于基础设施和依赖项变更。 功能贡献要求包括:1
Design discussion
在问题报告中描述:
- 解决的问题
- 建议的API设计
- 预期使用模式
2
Implementation
- 遵循现有代码模式
- 提供完整测试和文档
- 考虑安全影响
3
Integration considerations
- 与现有功能如何交互?
- 是否有性能影响?
- 是否引入新依赖?
安全指南
安全检查清单:Input validation
Input validation
- 验证并净化所有用户输入
- 正确转义模板和查询中的数据 :::python
- 用户数据中永不使用
eval()、exec()或pickle,这可能导致任意代码执行漏洞 ::: :::js - 用户数据中永不使用
eval(),这可能导致任意代码执行漏洞 :::
Error handling
Error handling
- 使用特定异常类型
- 错误信息中不暴露敏感信息
- 实现正确的资源清理
Dependencies
Dependencies
- 避免添加硬依赖
- 保持可选依赖最小化
- 审查第三方包的安全问题
开发环境
:::python 我们的Python项目使用uv进行依赖管理。请确保已安装最新版本。
我们致力于保持Python包的配置一致性。从包目录运行:
我们致力于保持JS/TS包的配置一致性。从仓库根目录运行:
仓库结构
- LangChain
- LangGraph
- Deep Agents
LangChain采用单仓库多包组织方式:
Core packages
Core packages
:::python
langchain(位于libs/langchain/):主包包含链、智能体和检索逻辑langchain-core(位于libs/core/):基础接口和核心抽象 ::: :::jslangchain(位于libs/langchain/):主包包含链、智能体和检索逻辑@langchain/core(位于libs/langchain-core/):基础接口和核心抽象 :::
Partner packages
Partner packages
位于
libs/partners/的独立版本包用于特定集成。例如:langchain-openai:OpenAI集成langchain-anthropic:Anthropic集成langchain-google-genai:Google Generative AI集成
libs/providers/ 的包为特定集成提供独立版本控制。例如:@langchain/openai: OpenAI 集成@langchain/anthropic: Anthropic 集成@langchain/google: Google 集成 :::
Supporting packages
Supporting packages
:::python
langchain-text-splitters: 文本分割工具langchain-standard-tests: 集成标准测试套件 ::: :::js@langchain/textsplitters: 文本分割工具@langchain/standard-tests: 集成标准测试套件@langchain/community: 社区维护的集成(独立仓库) :::
开发流程
预提交钩子
:::python LangChain 和 Deep Agents 仓库包含 pre-commit 钩子,在每次提交前自动运行格式化、代码检查和验证。从仓库根目录安装:- 禁止直接向受保护分支提交
- YAML和TOML语法验证
- 添加末尾空格和文件末尾修复
- 智能引号和非标准空格规范化
- 按包类型
make format和make lint:::
运行测试
测试目录相对于您工作的包位置
单元测试
:::python 位置:tests/unit_tests/
:::
:::js
位置: src/tests/FILENAME_BEING_TESTED.test.ts
:::
单元测试覆盖不依赖外部API的模块逻辑。新增逻辑需补充单元测试,并在测试中验证预处理/后处理和模拟外部依赖。
要求:
- 禁止网络调用
- 覆盖所有代码路径(含边界情况)
- 使用依赖模拟
集成测试
:::python 位置:tests/integration_tests/
:::
:::js
位置: src/tests/FILENAME_BEING_TESTED.int.test.ts
:::
集成测试覆盖依赖外部API的逻辑(通常涉及与其他服务集成)。
集成测试需要访问外部服务/API(可能产生费用),因此默认不运行。并非所有代码变更都需要集成测试,但需注意我们会在审核时单独运行集成测试。
要求:
- 验证真实外部服务集成
- 使用环境变量存储API密钥
- 密钥缺失时优雅降级
代码质量标准
贡献需符合以下要求:- Type hints
- Documentation
- Code style
:::python
强制要求: 所有函数需完整类型注解:::
:::js
强制要求: 所有函数需完整类型定义:::
依赖项
LangChain包通过强依赖和可选依赖区分,以保持包轻量并减少用户安装开销。- Optional dependencies
- Hard dependencies
大部分新依赖都应设置为可选。在以下情况使用可选依赖:
- 依赖仅用于特定集成或功能
- 用户无需该依赖仍可正常使用包
- 依赖体积较大或包含过多传递依赖
- 未安装该依赖的用户必须能导入代码而无任何副作用(无警告、无错误、无异常)
pyproject.toml和uv.lock未修改
- 将依赖添加到测试依赖文件(如
extended_testing_deps.txt) - 编写至少尝试导入新代码的单元测试。理想情况下,测试使用轻量级假数据验证逻辑
- 对需要依赖的单元测试使用
@pytest.mark.requires("package_name")装饰器
测试编写规范
编写有效测试需遵循以下最佳实践: :::python- 使用自然语言在文档字符串中描述测试
- 使用描述性变量名
- 完整覆盖断言
:::
:::js - 将测试封装在
describe块中(描述测试的组件) - 使用自然语言命名测试
- 完整覆盖断言
- 仅对合理大小的数据对象使用快照
:::
- Unit tests
- Integration tests
- Mock usage
:::python:::js:::
提交 PR
测试通过且代码符合质量标准后:- 推送分支并打开 PR
- 遵循提供的 PR 模板
- 使用 关闭关键词 关联相关议题(如
Fixes #123) - 等待 CI 检查完成
若 PR 包含 AI 生成内容,必须遵守我们的 LLM 可接受用途政策。低质量 AI 生成垃圾 PR 将直接关闭。
获取帮助
我们的目标是实现开发者最友好的环境。若遇到初始化问题,请:现在您已准备好为 LangChain 贡献高质量代码!
官方原文:src/oss/contributing/code.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。