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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3manylinux: glibc 2.34+ x86-64

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

Uploaded Python 3manylinux: glibc 2.34+ ARM64

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

Uploaded Python 3macOS 11.0+ x86-64

secondwind-0.3.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.3.0-py3-none-win_amd64.whl.

File metadata

  • Download URL: secondwind-0.3.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/7.0.0 CPython/3.13.14

File hashes

Hashes for secondwind-0.3.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 0d0fa5a250e374681e7c3240ca3226abed99de27cc9649cd700dea89b14d9f34
MD5 bc8dc9ab1166a24400665790bbd69144
BLAKE2b-256 075c0ee30253fc4efd5384094a4183185f165e417f1f70fa94dc85ee4039165f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for secondwind-0.3.0-py3-none-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 903114ccd17c0abc5764c639afa668775da8e09e329820f9fc6b2f30da757a60
MD5 d4901b8e4c26fafc3f2230a5b549b1c0
BLAKE2b-256 df1bb806f1b895d62218d845cd4a2926f8d59746378257c3cde978d9b0923ad6

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for secondwind-0.3.0-py3-none-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 17321b4bf91114fb508e4d26764245ef7264f6c9150beef1e40d01d18c2080dc
MD5 53e62377e1114df35649950334a02ca3
BLAKE2b-256 62dc27f273d2b6b2db033f0060e65c6ebd4b682da2e1e6b79d45bcf5fb603e75

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for secondwind-0.3.0-py3-none-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 f70ebc6d23567e348b53a90d19df9155a022382ff0495ebd8bc2141d146e56e4
MD5 f784e2b238065ed5c527f5bc096bc889
BLAKE2b-256 e1ef4e807b8d4e6067884d382052571990a96d23c1efa3e56bab49d99ffdeedf

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for secondwind-0.3.0-py3-none-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 7f0b066660341e4d4d1350ddb255d2b7bc35eb7f669179bda552cf5bc61b5d5c
MD5 926f04663558835fa73cc89a4d039b17
BLAKE2b-256 a6c5e8b0319f8cb2bfc73a7c172d4be6fc2d1bb976e7279a3f961ebd9788e308

See more details on using hashes here.

Provenance

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

This release

0.3.0 This release

5 files

0.2.2

5 files

0.2.1

5 files

0.2.0

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