Skip to main content

Lossless, provable, composable LLM context compression

Project description

secondwind

Lossless, provable, composable LLM tool-output compression, in-process.

import secondwind

session = secondwind.Session()
out = session.rewrite(request)          # compress a whole request's tool outputs
print(out["stats"])                     # tokens saved
secondwind.compress(block)              # or compress a single tool-output block

# one-line LiteLLM integration:
import litellm
from secondwind.litellm import SecondwindCallback
litellm.callbacks = [SecondwindCallback()]

# ASGI gateway (Starlette / FastAPI): rewrite request bodies before you forward them upstream
from secondwind.asgi import SecondwindMiddleware
app.add_middleware(SecondwindMiddleware)

# LangChain (LCEL): compress tool outputs before the model call
from secondwind.langchain import compress_tool_outputs
chain = compress_tool_outputs() | model

# LangGraph: compress the tool outputs an agent loop re-sends before each model call
from secondwind.langchain import compress_pre_model_hook
agent = create_react_agent(model, tools, pre_model_hook=compress_pre_model_hook())

# Agno: a lossless drop-in for its LLM-based tool-result compression
from secondwind.agno import SecondwindCompressionManager
agent = Agent(model=..., compress_tool_results=True,
              compression_manager=SecondwindCompressionManager(compress_tool_results=True))

# Strands Agents: compress tool results as they are produced
from secondwind.strands import SecondwindHooks
agent = Agent(model=..., tools=[...], hooks=[SecondwindHooks()])

# Cursor: a postToolUse hook that rewrites MCP tool output the model sees
#   ~/.cursor/hooks.json -> { "version": 1, "hooks": { "postToolUse": [ { "command": "python -m secondwind.cursor" } ] } }
# Bring your own codec: it competes in the best-of-N search, and secondwind proves
# decode(encode(x)) == x for every block, so a wrong codec is dropped, never shipped.
class MyCodec:
    def encode(self, text): ...   # -> str | None
    def decode(self, wire): ...   # -> str | None
session = secondwind.Session(codec=MyCodec())     # reckless is safe: proven per-instance
session = secondwind.Session(proposers=False)     # turn the aggressive search off

# Offload big blocks and recover them on demand, or back the store with Redis / S3 / a database.
session = secondwind.Session(resolver="resolve", offload_dir="~/.secondwind/offload")
session = secondwind.Session(store=MyStore())     # any object with put(id, value) and get(id)

Every result is lossless: an inline wire is independently verifiable with secondwind.verify(wire, hash), and a large block is offloaded to a recoverable marker. The native library is bundled, so there is no build step and no model download.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

secondwind-0.1.1-py3-none-win_amd64.whl (15.9 MB view details)

Uploaded Python 3Windows x86-64

secondwind-0.1.1-py3-none-manylinux_2_34_x86_64.whl (16.1 MB view details)

Uploaded Python 3manylinux: glibc 2.34+ x86-64

secondwind-0.1.1-py3-none-manylinux_2_34_aarch64.whl (16.0 MB view details)

Uploaded Python 3manylinux: glibc 2.34+ ARM64

secondwind-0.1.1-py3-none-macosx_11_0_x86_64.whl (15.9 MB view details)

Uploaded Python 3macOS 11.0+ x86-64

secondwind-0.1.1-py3-none-macosx_11_0_universal2.whl (16.0 MB view details)

Uploaded Python 3macOS 11.0+ universal2 (ARM64, x86-64)

File details

Details for the file secondwind-0.1.1-py3-none-win_amd64.whl.

File metadata

  • Download URL: secondwind-0.1.1-py3-none-win_amd64.whl
  • Upload date:
  • Size: 15.9 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for secondwind-0.1.1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 504f064b7c13a66a127708d01bb11edad3287af6300d844af603075570636590
MD5 2cda9957934f32eeefbca79f8108c812
BLAKE2b-256 106e9836a11720fd0c01e814d8de6d80a759dddf3f8e6ef607f89dc416f53fb2

See more details on using hashes here.

Provenance

The following attestation bundles were made for secondwind-0.1.1-py3-none-win_amd64.whl:

Publisher: wheels.yml on orchetron/secondwind

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file secondwind-0.1.1-py3-none-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for secondwind-0.1.1-py3-none-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 7106df75d358f51ac800af9f91265f4a121826db742f00ff9342c6bcf3291b21
MD5 f4133baee58d061dfed070e0ae6949ff
BLAKE2b-256 eeff3f0c6aa408d867a98514cd835af012af0b85e82541845e2e9d3a112a0f0a

See more details on using hashes here.

Provenance

The following attestation bundles were made for secondwind-0.1.1-py3-none-manylinux_2_34_x86_64.whl:

Publisher: wheels.yml on orchetron/secondwind

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file secondwind-0.1.1-py3-none-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for secondwind-0.1.1-py3-none-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 22e2fa65d9cb12f63fe110eeb8fcf9b616a23fce1ccd3f975f05bab8fd5d4a07
MD5 56117fbb3860b9b9dff20be210eb45d4
BLAKE2b-256 56401fd8ee735dcc15338852a53215b2c475bc0ba33421e281f051b3c0eeaa85

See more details on using hashes here.

Provenance

The following attestation bundles were made for secondwind-0.1.1-py3-none-manylinux_2_34_aarch64.whl:

Publisher: wheels.yml on orchetron/secondwind

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file secondwind-0.1.1-py3-none-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for secondwind-0.1.1-py3-none-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 31d193475500301daa8ba5d3e43c3e809e39d5c44a01ce2f638cf3a9acfc0d8a
MD5 26b5907160cd68452f9103ff7d5489ad
BLAKE2b-256 bffa978ec5a65dd920b9af3e411fd870d0f9ec7814ee5f842ecab8e000fe3902

See more details on using hashes here.

Provenance

The following attestation bundles were made for secondwind-0.1.1-py3-none-macosx_11_0_x86_64.whl:

Publisher: wheels.yml on orchetron/secondwind

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file secondwind-0.1.1-py3-none-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for secondwind-0.1.1-py3-none-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 a7c4ef308de17fd8d9356b916c1ebfc275c59c6d566d365ecb41da62f8bf4e60
MD5 f71fae661831793078217818242cb7bc
BLAKE2b-256 6609588801d259ad751ecc1b7f6a2052fe4ebe859f3d9a9801fe044f590b7efc

See more details on using hashes here.

Provenance

The following attestation bundles were made for secondwind-0.1.1-py3-none-macosx_11_0_universal2.whl:

Publisher: wheels.yml on orchetron/secondwind

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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