Skip to main content

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.

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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3manylinux: glibc 2.34+ x86-64

secondwind-0.2.0-py3-none-manylinux_2_34_aarch64.whl (16.1 MB view details)

Uploaded Python 3manylinux: glibc 2.34+ ARM64

secondwind-0.2.0-py3-none-macosx_11_0_x86_64.whl (16.0 MB view details)

Uploaded Python 3macOS 11.0+ x86-64

secondwind-0.2.0-py3-none-macosx_11_0_universal2.whl (16.1 MB view details)

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

File details

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

File metadata

  • Download URL: secondwind-0.2.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 16.0 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.2.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 a4e594df050f42523c61b07d04e72393eba44e4ab801e1f0eff27135139a3e11
MD5 0660018a7693f3c243db5ebd53871560
BLAKE2b-256 9162c6cb380cb1c90ac953e672f638222879b7b2f84c3aad22e9208c9a99dc15

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for secondwind-0.2.0-py3-none-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 f58e072203f3df778bfcacc4b459e899518c51179d048df801335bf02574d606
MD5 1bbe942a62211b56082f76b6d3c72b8a
BLAKE2b-256 c409507d3d5195c9efb606739b00b0f1476308011c95ca1cce8e579c0692d8d4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for secondwind-0.2.0-py3-none-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 18d61dbd399254335265c5d2fc9e887a741f86b324dd4ec5f4ee62941aeed380
MD5 128ad85b44a16503d9ccdb31bf154418
BLAKE2b-256 2e5526bf66c6ce2b73df90b90aa850337d8bdabd60f872895f1fa6d6ecb209c0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for secondwind-0.2.0-py3-none-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 725e013eb568c46399739a9e24e5a6fb6023b342a5cf8a40587b64977d68b3d8
MD5 5774a3a7dd68b36e1a5ac59649dd8662
BLAKE2b-256 5432452fe073021f68aa13f0f98b723d7d13f2a9ce565ebd58ee51c1dd02ee60

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for secondwind-0.2.0-py3-none-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 6bf4535772cc766b9184a9eab264a981c6a0ae433679b1b1ed1d9fc74aeeda44
MD5 05abd2a0db4575912568b1e52b80971b
BLAKE2b-256 c2868e6e9668be133b8a1310c4488f1c74be99ede25ebeb06b6555377ee614c6

See more details on using hashes here.

Provenance

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

Release history Release notifications | RSS feed

0.3.2

5 files

0.3.1

5 files

0.3.0

5 files

0.2.2

5 files

0.2.1

5 files

This release

0.2.0 This release

5 files

0.1.3

5 files

0.1.2

5 files

0.1.1

5 files

0.1.0

5 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page