Skip to main content

Automatic compensation middleware for LangChain agents with dependency-aware rollback

Project description

LangChain Compensation

Automatic compensation middleware for LangChain agents with LIFO (Last-In-First-Out) rollback capabilities. Inspired by the Saga pattern, this package provides automatic rollback of completed actions when a failure occurs in a multi-step agent workflow.

Features

  • 🔄 Automatic Rollback: Automatically compensates completed actions when failures occur
  • 📚 LIFO Order: Rolls back actions in reverse chronological order (like a transaction stack)
  • 🎯 Simple API: Easy-to-use agent factory with compensation mapping
  • 🔧 Flexible: Support for custom state mappers to extract compensation parameters
  • 🧵 Thread-Safe: Built with thread safety in mind
  • 📦 Zero Config: Works out of the box with sensible defaults

Installation

pip install langchain-compensation

Quick Start

from langchain_compensation import create_comp_agent
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.tools import tool

# Define your tools
@tool
def book_flight(destination: str) -> str:
    """Books a flight to the destination."""
    return f"flight_id_for_{destination}"

@tool
def cancel_flight(booking_id: str) -> str:
    """Cancels a flight booking."""
    return "Cancellation successful"

@tool
def book_hotel(location: str) -> str:
    """Books a hotel at the location."""
    if "fail" in location.lower():
        return "Error: Hotel booking failed!"
    return f"hotel_id_for_{location}"

@tool
def cancel_hotel(booking_id: str) -> str:
    """Cancels a hotel booking."""
    return "Cancellation successful"

# Create agent with compensation
model = ChatGoogleGenerativeAI(model="gemini-2.0-flash-exp")
agent = create_comp_agent(
    model=model,
    tools=[book_flight, cancel_flight, book_hotel, cancel_hotel],
    compensation_mapping={
        "book_flight": "cancel_flight",
        "book_hotel": "cancel_hotel"
    }
)

# Run the agent
result = agent.invoke({
    "messages": [("user", "Book a flight to London and a hotel in FailCity")]
})
# When hotel booking fails, the flight booking is automatically cancelled!

How It Works

  1. Track Actions: Compensatable actions are tracked in the agent's state
  2. Detect Failures: When a tool returns an error, the middleware detects it
  3. Automatic Rollback: All completed compensatable actions are rolled back in LIFO order
  4. Continue: The agent continues with the rolled-back state

Advanced Usage

Custom State Mappers

Sometimes you need custom logic to extract compensation parameters from the original result:

def extract_flight_id(result, original_params):
    """Extract booking ID from the result."""
    return {"booking_id": result["id"]}

agent = create_comp_agent(
    model=model,
    tools=tools,
    compensation_mapping={"book_flight": "cancel_flight"},
    state_mappers={"book_flight": extract_flight_id}
)

With Checkpointer

Use with LangGraph's checkpointing for persistent compensation logs:

from langgraph.checkpoint.memory import MemorySaver

memory = MemorySaver()
agent = create_comp_agent(
    model=model,
    tools=tools,
    compensation_mapping={"book_flight": "cancel_flight"},
    checkpointer=memory
)

API Reference

create_comp_agent

Creates a LangChain agent with automatic compensation capabilities.

Parameters:

  • model (BaseChatModel | str | None): The LLM to use for the agent
  • tools (Sequence[BaseTool | Callable]): List of tools available to the agent
  • compensation_mapping (dict[str, str]): Maps tool names to their compensation tools
  • state_mappers (dict[str, Callable] | None): Custom parameter extraction functions
  • system_prompt (str | None): Additional system prompt for the agent
  • checkpointer (Checkpointer | None): Optional checkpointer for state persistence
  • Other standard LangChain agent parameters

Returns: CompiledStateGraph - A configured agent with compensation middleware

CompensationMiddleware

The core middleware that handles compensation logic.

Parameters:

  • compensation_mapping (dict[str, str]): Maps tool names to compensation tools
  • tools (list | None): Tools to cache for compensation execution
  • state_mappers (dict[str, Callable] | None): Custom state mappers

Use Cases

  • Travel Booking Systems: Cancel flights/hotels if any part of the trip fails
  • E-commerce: Reverse inventory reservations if payment fails
  • Multi-step Workflows: Undo completed steps when later steps fail
  • Database Operations: Rollback related operations in distributed systems
  • API Integrations: Clean up created resources when workflows fail

Requirements

  • Python 3.9+
  • langchain >= 0.3.0
  • langchain-core >= 0.3.0
  • langgraph >= 0.2.0

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

MIT License - see LICENSE file for details

Credits

Inspired by the Saga pattern and built on top of LangChain's middleware system.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

langchain_compensation-0.2.0.tar.gz (11.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

langchain_compensation-0.2.0-py3-none-any.whl (9.7 kB view details)

Uploaded Python 3

File details

Details for the file langchain_compensation-0.2.0.tar.gz.

File metadata

  • Download URL: langchain_compensation-0.2.0.tar.gz
  • Upload date:
  • Size: 11.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for langchain_compensation-0.2.0.tar.gz
Algorithm Hash digest
SHA256 0bc3f4127fafc92fda1b9c6739658d0cbccd25265734dd4d32db18d450665f0f
MD5 118121311748f3794f3393076176bcb9
BLAKE2b-256 efcc80bb440f46043131eaf3e35d8142f07ad1d42ba7d6e363c1c8a84ef49244

See more details on using hashes here.

File details

Details for the file langchain_compensation-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for langchain_compensation-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7a23ce43bf83d04d172f83c919c9dedbcddea7f345a9f5aaa5da28dfecb197e8
MD5 26f89a6fb71ab4562f8452c3bf272661
BLAKE2b-256 161a58e195b8622d9811ba4ea08fd16cc380be654f2b17caaf348600ff4d0fd7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page