Skip to main content

Context window management utilities for LLM-based applications

Project description

harnessutils

Python library for managing LLM context windows in long-running conversations. Enables indefinite conversation length while staying within token limits.

Installation

uv add harness-utils

Features

  • Three-tier context management - Truncation, pruning, and LLM-powered summarization
  • Turn processing - Stream event handling with hooks and doom loop detection
  • Pluggable storage - Filesystem and in-memory backends
  • Zero dependencies - No external runtime requirements
  • Type-safe - Full Python 3.12+ type hints

Quick Start

from harnessutils import ConversationManager, Message, TextPart, generate_id

manager = ConversationManager()
conv = manager.create_conversation()

# Add message
msg = Message(id=generate_id("msg"), role="user")
msg.add_part(TextPart(text="Help me debug"))
manager.add_message(conv.id, msg)

# Prune old outputs
manager.prune_before_turn(conv.id)

# Get messages for LLM
model_messages = manager.to_model_format(conv.id)

Context Management

Three tiers handle context overflow:

1. Truncation - Limits tool output size (instant, free)

output = manager.truncate_tool_output(large_output, "tool_name")

2. Pruning - Removes old tool outputs (fast, ~50ms)

result = manager.prune_before_turn(conv.id)
# Keeps recent 40K tokens, removes older outputs

3. Summarization - LLM compression when needed (slow, ~3-5s)

if manager.needs_compaction(conv.id, usage):
    manager.compact(conv.id, llm_client, parent_msg_id)

Turn Processing

Process streaming LLM responses with hooks:

from harnessutils import TurnProcessor, TurnHooks

hooks = TurnHooks(
    on_tool_call=execute_tool,
    on_doom_loop=handle_loop,
)

processor = TurnProcessor(message, hooks)
for event in llm_stream:
    processor.process_stream_event(event)

Includes:

  • Tool state machine
  • Doom loop detection (3 identical calls)
  • Snapshot tracking

Configuration

from harnessutils import HarnessConfig

config = HarnessConfig()
config.truncation.max_lines = 2000
config.pruning.prune_protect = 40_000  # Keep recent 40K tokens
config.model_limits.default_context_limit = 200_000

Storage

from harnessutils import FilesystemStorage, MemoryStorage

# Filesystem (production)
storage = FilesystemStorage(config.storage)

# In-memory (testing)
storage = MemoryStorage()

# Custom (implement StorageBackend protocol)
# See examples/custom_storage_example.py
storage = YourCustomStorage()

Examples

  • basic_usage.py - Simple conversation
  • ollama_example.py - Ollama integration
  • ollama_with_summarization.py - Full three-tier demo
  • turn_processing_example.py - Stream processing
  • custom_storage_example.py - Custom storage adapter (SQLite)

Development

uv sync              # Install deps
uv run pytest        # Run tests
uv run mypy src/     # Type check

License

MIT License - see LICENSE for details.

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

harness_utils-0.1.1.tar.gz (210.1 kB view details)

Uploaded Source

Built Distribution

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

harness_utils-0.1.1-py3-none-any.whl (28.2 kB view details)

Uploaded Python 3

File details

Details for the file harness_utils-0.1.1.tar.gz.

File metadata

  • Download URL: harness_utils-0.1.1.tar.gz
  • Upload date:
  • Size: 210.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.17

File hashes

Hashes for harness_utils-0.1.1.tar.gz
Algorithm Hash digest
SHA256 ebc131b491c9837dea2a0238075e9d8984556785f1e57a3c9c6dde85ed0f4f00
MD5 2fbc8f13b0e028991dbd661e8f9d850d
BLAKE2b-256 3d4f044b2059c2190d133e9150eb8173310d3cf521e72b2c21815ccc077d3ba8

See more details on using hashes here.

File details

Details for the file harness_utils-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for harness_utils-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 b4023c3d9e475b3e9cbc1aeecb8ecea1805a7773a99bcfbdeef732b2db88e9b6
MD5 090133886ac6c87543c7dd8729d167dc
BLAKE2b-256 92cf5a84e201c037b5d0d54c72f5b745148001f018e532cb79b6c3529e3720ab

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