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.2-py3-none-win_amd64.whl (15.9 MB view details)

Uploaded Python 3Windows x86-64

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

Uploaded Python 3manylinux: glibc 2.34+ x86-64

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

Uploaded Python 3manylinux: glibc 2.34+ ARM64

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

Uploaded Python 3macOS 11.0+ x86-64

secondwind-0.1.2-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.2-py3-none-win_amd64.whl.

File metadata

  • Download URL: secondwind-0.1.2-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.2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 a6e07f78bee6504670a52a94e013b63f91a085cd0df207838d1d3097609fef27
MD5 8e3f41c8e2072f4ec35134b8b8b215e7
BLAKE2b-256 b47d1acca7e23a5270d8e8d2d2f6f89032864d8b727c4c26699f9e6b947ada44

See more details on using hashes here.

Provenance

The following attestation bundles were made for secondwind-0.1.2-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.2-py3-none-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for secondwind-0.1.2-py3-none-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 cf34093b7697253a3aa46836e9f25a460c0e5ff0dd55cc786d495783abe1ab6b
MD5 f608b11d00cd4e2bbeff4aac085c3664
BLAKE2b-256 a3d75141d1c263cfc146476a2d2c31a96b6e5d6709f1f0fc5e61734d3eefef97

See more details on using hashes here.

Provenance

The following attestation bundles were made for secondwind-0.1.2-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.2-py3-none-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for secondwind-0.1.2-py3-none-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 820dfa4d7a17bd7bde79179fd28370bd80d9afbeffb1379665afc90261f92a6a
MD5 886d33f5ddf6de43e140ba12ae4c9a1a
BLAKE2b-256 3102ff4aaea5ba192b7c735112e375c74451defcb641ee3885b579b3ec3016aa

See more details on using hashes here.

Provenance

The following attestation bundles were made for secondwind-0.1.2-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.2-py3-none-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for secondwind-0.1.2-py3-none-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 790f2196b480ee83649ac46d0f881b3180c3ddbf44ae14c8c672b1615ce85ee6
MD5 fd6ab243b0860842d091d3076e609938
BLAKE2b-256 aab47b006e4e37a7b16f72f8a330a010cfc196f682a045f4c041e1a6bdd0fffc

See more details on using hashes here.

Provenance

The following attestation bundles were made for secondwind-0.1.2-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.2-py3-none-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for secondwind-0.1.2-py3-none-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 bbcb4544b253ba3c56602778a0216f1373f7e989351ec511fc4f2fd6fe120e0a
MD5 25bf21f859d2fb3f41f6f4a57ac15f60
BLAKE2b-256 5f95af1f22e1015e022c10d8fe4b80b09b15b289430b48f02607805eb02d235d

See more details on using hashes here.

Provenance

The following attestation bundles were made for secondwind-0.1.2-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