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. Be sure to link any relevant issues in your PR description. Use to automatically close issues when the PR is merged.New integrations should follow the integration guidelines.
Philosophy
Aim to follow these core principles for all code contributions:Backwards compatibility
Maintain stable public interfaces and avoid breaking changes
Testing first
Every change must include comprehensive tests to verify correctness and prevent regressions
Code quality
Follow consistent style, documentation, and architecture patterns
Security focused
Prioritize secure coding practices and vulnerability prevention
Getting started
Quick fix: submit a bugfix
For simple bugfixes, you can get started immediately:Clone and setup
Make your changes
Fix the bug while following our code quality standards
Add tests
Include unit tests that fail without your fix. This allows us to verify the bug is resolved and prevents regressions
Submit a pull request
Follow the PR template provided. If applicable, reference the issue you’re fixing using a closing keyword (e.g.
Fixes #123).Full development setup
For ongoing development or larger contributions:Development environment
Set up your environment following our setup guide below
Repository structure
Understand the repository structure and package organization
Development workflow
Learn our development workflow including testing and linting
Contribution guidelines
Review our contribution guidelines for features, bugfixes, and integrations
Development environment
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
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.Location:
tests/integration_tests/Requirements:- Test real integrations with external services
- Use environment variables for API keys
- Skip gracefully if credentials unavailable
Code quality standards
Quality requirements:- Type hints
- Documentation
- Code style
Required: Complete type annotations for all functions
Manual formatting and linting
Code formatting and linting are enforced via CI/CD. Run these commands before committing to ensure your code passes checks.
Contribution guidelines
Backwards compatibility
Maintain compatibility: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?
Bugfixes
For bugfix contributions: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
New features
We aim to keep the bar high for new features. We generally don’t accept new core abstractions, changes to infra, changes to dependencies, or new agents/chains from outside contributors without an existing issue that demonstrates an acute need for them. In general, feature contribution requirements include:Design discussion
Open an issue describing:
- The problem you’re solving
- Proposed API design
- Expected usage patterns
Implementation
- Follow existing code patterns
- Include comprehensive tests and documentation
- Consider security implications
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
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
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!