CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/pypi-langchain-cli

CLI for interacting with LangChain templates and applications

Pending
Overview
Eval results
Files

code-migration.mddocs/

Code Migration

Migrate LangChain code to newer versions using Grit pattern matching with interactive and diff modes for safe code transformation. This functionality helps developers update their codebases to work with newer LangChain versions.

Capabilities

Migrate Code

Run automated code migration using Grit pattern matching to update imports, function calls, and API usage patterns.

langchain migrate [grit-args] [options]

Options:
  --diff               Show changes without applying them (dry-run mode)
  --interactive        Prompt for confirmation before making each change
  
Additional Arguments:
  Any additional arguments are passed directly to the Grit CLI

Usage Examples:

# Run migration with preview (recommended first step)
langchain migrate --diff

# Run migration interactively
langchain migrate --interactive

# Run migration with both diff and interactive modes
langchain migrate --diff --interactive

# Run migration and apply changes
langchain migrate

# Pass additional Grit arguments
langchain migrate --disable some_pattern --interactive

Migration Process:

The migration system uses Grit pattern matching to:

  1. Identify Patterns: Scan code for outdated LangChain usage patterns
  2. Transform Code: Apply systematic transformations to update imports and API calls
  3. Validate Changes: Ensure transformations maintain code functionality
  4. Report Results: Provide detailed feedback on applied changes

Migration Strategy

Two-Pass Migration Required:

The migration process requires running twice for complete migration:

  1. First Pass: Moves imports from langchain to community packages
  2. Second Pass: Migrates from community packages to partner packages when available

Example migration flow:

langchain.llms.openai → langchain_community.llms.openai → langchain_openai.llms

Targeted Migration Areas:

  • Import Statements: Update module import paths
  • Class References: Update class names and initialization
  • Function Calls: Update deprecated function signatures
  • Configuration: Update configuration patterns and parameter names

Programmatic API

Migration Functions

def migrate(
    ctx: typer.Context,
    diff: bool = False,
    interactive: bool = False,
) -> None:
    """Migrate langchain to the most recent version."""

def get_gritdir_path() -> Path:
    """Get the path to the grit directory."""

Migration Generation Functions

Advanced utilities for generating migration patterns and analyzing code imports.

def generate_raw_migrations(
    from_package: str, 
    to_package: str, 
    filter_by_all: bool = False
) -> list[tuple[str, str]]:
    """
    Generate raw migration patterns between packages.
    
    Args:
        from_package: Source package name
        to_package: Target package name  
        filter_by_all: Whether to filter by __all__ exports only
        
    Returns:
        List of (from_import, to_import) tuples
    """

def generate_simplified_migrations(
    from_package: str,
    to_package: str, 
    filter_by_all: bool = True
) -> list[tuple[str, str]]:
    """
    Generate simplified migration patterns with duplicate removal.
    
    Args:
        from_package: Source package name
        to_package: Target package name
        filter_by_all: Whether to filter by __all__ exports only
        
    Returns:
        List of unique (from_import, to_import) tuples
    """

def generate_top_level_imports(pkg: str) -> list[tuple[str, str]]:
    """
    Generate migration patterns for top-level package imports.
    
    Args:
        pkg: Package name to analyze
        
    Returns:
        List of (old_import, new_import) tuples for top-level imports
    """

class ImportExtractor(ast.NodeVisitor):
    """
    AST visitor for extracting import statements from Python code.
    
    Attributes:
        imports: List of discovered import statements
        from_imports: List of discovered from-import statements
    """
    
    def __init__(self) -> None:
        """Initialize the import extractor."""
        
    def visit_Import(self, node: ast.Import) -> None:
        """Visit import statements."""
        
    def visit_ImportFrom(self, node: ast.ImportFrom) -> None:
        """Visit from-import statements."""

Usage Examples:

from langchain_cli.namespaces.migrate.generate.utils import generate_raw_migrations, generate_simplified_migrations, ImportExtractor

# Generate migration patterns
raw_migrations = generate_raw_migrations("langchain.llms", "langchain_community.llms")
print(f"Raw migrations: {raw_migrations}")

simplified_migrations = generate_simplified_migrations("langchain.embeddings", "langchain_openai")
print(f"Simplified migrations: {simplified_migrations}")

# Extract imports from code
import ast
code = """
from langchain.llms import OpenAI
from langchain.embeddings import OpenAIEmbeddings
import langchain.vectorstores
"""

tree = ast.parse(code)
extractor = ImportExtractor()
extractor.visit(tree)
print(f"Found imports: {extractor.from_imports}")

Migration Implementation

The migration system:

  1. Pattern Loading: Loads Grit patterns from embedded .grit directory
  2. Code Analysis: Scans target codebase for applicable patterns using ImportExtractor
  3. Pattern Generation: Uses migration generation functions to create transformation rules
  4. Transformation: Applies pattern-based code transformations
  5. Validation: Verifies transformation correctness
  6. Reporting: Provides detailed migration results

Migration Patterns

Import Migrations

Common import pattern transformations:

# Before (LangChain 0.1)
from langchain.llms import OpenAI
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma

# After First Migration (Community)
from langchain_community.llms import OpenAI
from langchain_community.embeddings import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma

# After Second Migration (Partner packages)
from langchain_openai import OpenAI, OpenAIEmbeddings
from langchain_chroma import Chroma

Class Usage Updates

# Before
llm = OpenAI(temperature=0.7)
embeddings = OpenAIEmbeddings()

# After
llm = OpenAI(temperature=0.7)  # Same usage, different import
embeddings = OpenAIEmbeddings()  # Same usage, different import

Configuration Changes

# Before (deprecated patterns)
from langchain.chains import ConversationChain
chain = ConversationChain(llm=llm, memory=memory)

# After (updated patterns)  
from langchain.chains import ConversationChain
chain = ConversationChain(llm=llm, memory=memory)  # Updated internally

Best Practices

Pre-Migration Preparation

  1. Backup Code: Always backup your codebase before migration
  2. Version Control: Commit changes before running migration
  3. Test Suite: Ensure comprehensive test coverage
  4. Dependencies: Review current LangChain dependency versions

Migration Workflow

  1. Preview Changes: Run with --diff to see planned changes

    langchain migrate --diff
  2. Interactive Review: Use interactive mode for careful review

    langchain migrate --interactive
  3. Apply Changes: Run migration to apply transformations

    langchain migrate
  4. Validate Results: Test migrated code thoroughly

    python -m pytest tests/
  5. Update Dependencies: Update requirements.txt or pyproject.toml

    pip install langchain-openai langchain-anthropic

Post-Migration Tasks

  1. Dependency Updates: Add new partner packages to requirements
  2. Import Cleanup: Remove unused imports and consolidate where possible
  3. Testing: Run comprehensive test suite
  4. Documentation: Update any documentation referring to old patterns

Error Handling

Common migration issues and solutions:

  • Parse Errors: Code syntax issues prevent pattern matching
  • Ambiguous Patterns: Multiple transformation options for same code
  • Dependency Conflicts: New packages have version conflicts
  • Import Errors: Missing new dependency packages
  • Test Failures: Functional changes requiring code updates

Migration Validation

After migration, validate:

  • Import Resolution: All imports resolve correctly
  • Functionality: Core application features work as expected
  • Performance: No performance regressions
  • Dependencies: All required packages are installed
  • Tests: Test suite passes completely

Troubleshooting

Common Issues

  1. Incomplete Migration: Run migration twice for full transformation
  2. Missing Dependencies: Install new partner packages manually
  3. Import Conflicts: Resolve duplicate or conflicting imports
  4. Pattern Mismatches: Some code may require manual updates

Manual Updates

Some patterns may require manual intervention:

  • Custom extensions to LangChain classes
  • Complex inheritance hierarchies
  • Dynamic import patterns
  • Configuration-dependent code paths

Recovery

If migration causes issues:

  1. Revert Changes: Use version control to restore previous state
  2. Selective Migration: Use Grit disable flags for problematic patterns
  3. Manual Migration: Apply changes manually for complex cases
  4. Incremental Approach: Migrate smaller code sections individually

Install with Tessl CLI

npx tessl i tessl/pypi-langchain-cli

docs

app-management.md

code-migration.md

index.md

integration-development.md

template-development.md

utilities.md

tile.json