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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3manylinux: glibc 2.34+ x86-64

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

Uploaded Python 3manylinux: glibc 2.34+ ARM64

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

Uploaded Python 3macOS 11.0+ x86-64

secondwind-0.1.3-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.3-py3-none-win_amd64.whl.

File metadata

  • Download URL: secondwind-0.1.3-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.3-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 483c52cf113aa37e0a1727728dc758f952cd4718a66445cff23c590136d7c47d
MD5 743680267d12e98925b4f7c5fd7f8778
BLAKE2b-256 313491f6370e60b3314e245f83e599e54ba00449071448c1d5a94448abbe33c9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for secondwind-0.1.3-py3-none-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 72d04e666fd7354e82ed68e4884a90e0babeefe45c7e79ef65ace2b473cdf040
MD5 dafe50ed368544ade670162f15c99629
BLAKE2b-256 88bdc9835fa844e450ca4d443945c06e6a3a9c0a190b1cdfc2a64bd2a50e80fd

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for secondwind-0.1.3-py3-none-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 ca59320808f44bbded6d441bc457f8f1e5c1e9f44513117f17290537636f9bcb
MD5 fe331f5e331d5af92beebb6a075e2c80
BLAKE2b-256 0bf59d8835533d184057ef0bae6f03f814bd5fa64531be50c0523ec3c7a63637

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for secondwind-0.1.3-py3-none-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 a4503de4534bef340de240a84637d2f5191d31c942327084834cab704fcda439
MD5 7c87ddeb8fc2bb88a2780fc7a5b929dc
BLAKE2b-256 d215c4f4427155644a0839dea60ec0a9daeb8ac77ee01f76f1cd12683f1e9e56

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for secondwind-0.1.3-py3-none-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 c4e0752f89ca2773264b2e33c7ab0ca9d9e39a770549eea4cc0c3b06dbd5568e
MD5 d581e9e1d23d2cb61fe08ce64b141c56
BLAKE2b-256 3354668ea9279bddf2d9a704b1b5e979b384522101c1a74fffc46ad2b9362ef2

See more details on using hashes here.

Provenance

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