Metadata-Version: 2.4
Name: langchain-collapse
Version: 0.1.0
Summary: Collapse consecutive read/search tool calls to reduce agent context size
Project-URL: Repository, https://github.com/johanity/langchain-collapse
Project-URL: Issues, https://github.com/johanity/langchain-collapse/issues
Author: Johan
License: MIT
License-File: LICENSE
Keywords: agent,compression,context,langchain,middleware,tool-calls
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Typing :: Typed
Requires-Python: <4.0.0,>=3.10.0
Requires-Dist: langchain-core<2.0.0,>=1.2.21
Requires-Dist: langchain<2.0.0,>=1.2
Provides-Extra: lint
Requires-Dist: ruff<0.16.0,>=0.15.0; extra == 'lint'
Provides-Extra: test
Requires-Dist: hypothesis<7,>=6.100; extra == 'test'
Requires-Dist: pytest-asyncio<1,>=0.24; extra == 'test'
Requires-Dist: pytest<9,>=8; extra == 'test'
Provides-Extra: typing
Requires-Dist: mypy<2.0.0,>=1.10.0; extra == 'typing'
Description-Content-Type: text/markdown

# langchain-collapse

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
[![Tests](https://github.com/johanity/langchain-collapse/actions/workflows/ci.yml/badge.svg)](https://github.com/johanity/langchain-collapse/actions)

Collapse consecutive read/search tool-call groups to save context.

## Quick Install

```bash
pip install langchain-collapse
```

## 🤔 What is this?

Most context management is reactive — it compresses after the context window is already full. This middleware is preventive. It collapses consecutive read/search tool-call groups into a short placeholder before they accumulate, so expensive LLM-based summarization triggers less often.

No LLM calls. No hallucination risk. Stateless.

```
langchain-collapse benchmark
==================================================
                               Before    After
                    Messages       37        9
               Approx tokens     2531      197
             Token reduction               92%

SummarizationMiddleware trigger point (at 85% of 200K):
  Without CollapseMiddleware:  ~1214 tool calls
  With CollapseMiddleware:     ~5151 tool calls
  Ratio:                       4.2x more work before summarization
```

## Usage

```python
from langchain.agents import create_agent
from langchain_collapse import CollapseMiddleware

agent = create_agent(
    model="anthropic:claude-sonnet-4-6",
    tools=[...],
    middleware=[CollapseMiddleware()],
)
```

Place before `SummarizationMiddleware` so it reduces message count first:

```python
from langchain.agents.middleware import SummarizationMiddleware

middleware = [
    CollapseMiddleware(),
    SummarizationMiddleware(
        model="anthropic:claude-haiku-4-5-20251001",
        trigger=("fraction", 0.85),
    ),
]
```

## How it works

Five consecutive `read_file` calls (10 messages) become 3:

```
Before:
  AIMessage(read_file "auth.py")     ─┐
  ToolMessage(content)                │  collapsed
  AIMessage(read_file "users.py")     │
  ToolMessage(content)                │
  AIMessage(read_file "db.py")        │
  ToolMessage(content)                │
  AIMessage(read_file "routes.py")   ─┘
  ToolMessage(content)
  AIMessage(read_file "config.py")   ─── kept (most recent)
  ToolMessage(content)               ─── kept

After:
  HumanMessage("[4 tool results omitted — most recent result preserved below]")
  AIMessage(read_file "config.py")
  ToolMessage(content)
```

## Configuration

```python
CollapseMiddleware(
    collapse_tools=frozenset({"read_file", "grep", "glob", "web_search"}),  # default
    min_group_size=2,  # minimum consecutive pairs to collapse
)
```

## 📖 Development

```bash
git clone https://github.com/johanity/langchain-collapse.git
cd langchain-collapse
pip install -e ".[test]"
pytest
```

## 📕 License

MIT
