Getting started
Before submitting large new features or refactors, please first discuss your ideas in the forum. This ensures alignment with project goals and prevents duplicate work.This does not apply to bugfixes or small improvements, which you can contribute directly via pull requests. See the quickstart guide below.
Quick fix: submit a bugfix
For simple bugfixes, you can get started immediately:1
Reproduce the issue
Create a minimal test case that demonstrates the bug. Maintainers and other contributors should be able to run this test and see the failure without additional setup or modification
3
Clone and setup
4
Create a branch
Create a new branch for your fix. This helps keep your changes organized and makes it easier to submit a pull request later.
5
Write failing tests
Add unit tests that will fail without your fix. This allows us to verify the bug is resolved and prevents regressions
6
Make your changes
Fix the bug while following our code quality standards. Make the minimal change necessary to resolve the issue
7
Verify the fix
Ensure that tests pass and no regressions are introduced. Ensure all tests pass locally before submitting your PR
8
Document the change
Update docstrings if behavior changes, add comments for complex logic
9
Submit a pull request
Follow the PR template provided. If applicable, reference the issue youβre fixing using a closing keyword (e.g.
Fixes #ISSUE_NUMBER) so that the issue is automatically closed when your PR is merged.Full development setup
For ongoing development or larger contributions:- Review our contribution guidelines for features, bugfixes, and integrations
- Set up your environment following our setup guide below
- Understand the repository structure and package organization
- Learn our development workflow including testing and linting
Contribution guidelines
Before you start contributing to LangChain, take a moment to think about why you want to. If your only goal is to add a βfirst contributionβ to your resume (or if youβre just looking for a quick win) you might be better off doing a boot-camp or an online tutorial. Contributing to open source projects takes time and effort, but it can also help you become a better developer and learn new skills. However, itβs important to know that it might be harder and slower than following a training course. That said, contributing to open source is worth it if youβre willing to take the time to do things well.Backwards compatibility
Maintain compatibility via:Stable interfaces
Stable interfaces
Always preserve:
- Function signatures and parameter names
- Class interfaces and method names
- Return value structure and types
- Import paths for public APIs
Safe changes
Safe changes
Acceptable modifications:
- Adding new optional parameters
- Adding new methods to classes
- Improving performance without changing behavior
- Adding new modules or functions
Before making changes
Before making changes
- Would this break existing user code?
- Check if your target is public
-
If needed, is it exported in
__init__.py? - Are there existing usage patterns in tests?
New features
We aim to keep the bar high for new features. We generally donβt accept new core abstractions from outside contributors without an existing issue that demonstrates an acute need for them. This also applies to changes to infra and dependencies. In general, feature contribution requirements include:1
Design discussion
Open an issue describing:
- The problem youβre solving
- Proposed API design
- Expected usage patterns
2
Implementation
- Follow existing code patterns
- Include comprehensive tests and documentation
- Consider security implications
3
Integration considerations
- How does this interact with existing features?
- Are there performance implications?
- Does this introduce new dependencies?
Security guidelines
Security checklist:Input validation
Input validation
- Validate and sanitize all user inputs
- Properly escape data in templates and queries
- Never use
eval(),exec(), orpickleon user data, as this can lead to arbitrary code execution vulnerabilities
Error handling
Error handling
- Use specific exception types
- Donβt expose sensitive information in error messages
- Implement proper resource cleanup
Dependencies
Dependencies
- Avoid adding hard dependencies
- Keep optional dependencies minimal
- Review third-party packages for security issues
Development environment
Once youβve reviewed the contribution guidelines, set up a development environment for the package(s) youβre working on.- LangChain
- LangGraph
Core abstractions
Core abstractions
For changes to
langchain-core:Main package
Main package
For changes to
langchain:Partner packages
Partner packages
For changes to partner integrations:
Community packages
Community packages
For changes to community integrations (located in a separate repo):
Repository structure
- LangChain
- LangGraph
LangChain is organized as a monorepo with multiple packages:
Core packages
Core packages
langchain(located inlibs/langchain/): Main package with chains, agents, and retrieval logiclangchain-core(located inlibs/core/): Base interfaces and core abstractions
Partner packages
Partner packages
Located in
libs/partners/, these are independently versioned packages for specific integrations. For example:langchain-openai: OpenAI integrationslangchain-anthropic: Anthropic integrationslangchain-google-genai: Google Generative AI integrations
Supporting packages
Supporting packages
langchain-text-splitters: Text splitting utilitieslangchain-standard-tests: Standard test suites for integrationslangchain-cli: Command line interfacelangchain-community: Community maintained integrations (located in a separate repo)
Development workflow
Testing requirements
Directories are relative to the package youβre working in.
Unit tests
Location:tests/unit_tests/
Requirements:
- No network calls allowed
- Test all code paths including edge cases
- Use mocks for external dependencies
Integration tests
Location:tests/integration_tests/
Integration tests require access to external services/ provider APIs (which can cost money) and therefore are not run by default.
Not every code change will require an integration test, but keep in mind that weβll require/ run integration tests separately as apart of our review process.
Requirements:
- Test real integrations with external services
- Use environment variables for API keys
- Skip gracefully if credentials unavailable
Code quality standards
Contributions must adhere to the following quality requirements:- Type hints
- Documentation
- Code style
Required: Complete type annotations for all functions
Testing and validation
Running tests locally
Before submitting your PR, ensure you have completed the following steps. Note that the requirements differ slightly between LangChain and LangGraph.- LangChain
- LangGraph
1
Unit tests
2
Integration tests
3
Formatting
4
Type checking
5
PR submission
Push your branch and open a pull request. Follow the provided form template. Note related issues using a closing keyword. After submitting, wait, and check to ensure the CI checks pass. If any checks fail, address the issues promptly - maintainers may close PRs that do not pass CI within a reasonable timeframe.
Test writing guidelines
In order to write effective tests, thereβs a few good practices to follow:- Use natural language to describe the test in docstrings
- Use descriptive variable names
- Be exhaustive with assertions
- Unit tests
- Integration tests
- Mock usage
Getting help
Our goal is to have the most accessible developer setup possible. Should you experience any difficulty getting setup, please ask in the community slack or open a forum post.Youβre now ready to contribute high-quality code to LangChain!