Skip to main content

Static, deterministic LLM prompt/payload compression that cuts input tokens 30-90% with zero extra model calls.

Project description

llmtrim-uniffi

UniFFI bindings over llmtrim-core: one Rust definition, idiomatic in-process bindings for Python, Ruby, Swift and Kotlin. The compression runs natively in the caller's process (no server, no async).

API

A deliberately flat surface over the engine:

fn compress(
    input: String,                 // a provider-shaped request body (JSON)
    provider: Option<Provider>,    // OpenAi | Anthropic | Google, or None to auto-detect
    preset: Option<String>,        // "aggressive" | "agent" | "code" | "rag" | "safe" | …
                                   // None = config from the environment / config file
) -> Result<CompressOutput, LlmtrimError>

CompressOutput carries the compressed request_json, the resolved provider/model, the tokenizer label/exactness, and the before/after/frozen input-token counts. Embedders that need the full rehydration plan or per-stage reports should depend on llmtrim-core directly in Rust.

In-process vs. the proxy

llmtrim has two integration routes:

  • The proxy (HTTPS_PROXY=127.0.0.1:8788 llmtrim) intercepts your existing traffic and compresses it in flight. Nothing in your code changes, but the client has to route through the proxy and trust its CA.
  • These bindings compress in your process. You call compress() on the request body, then send the result with your own HTTP client. No proxy, no CA, no env-var setup.

Use the in-process path when the proxy can't run:

  • Sandboxed / serverless functions where you can't set a process-wide HTTPS_PROXY or run a side process.
  • Certificate-pinned clients that reject a MITM CA, so the proxy's interception fails.
  • Anywhere you'd rather not add a network hop or an extra moving part.

It replaces a per-framework adapter: instead of wiring a hook into each SDK, you compress the body once and POST it yourself. Runnable end-to-end examples (compress, then send with your own client) are in examples/.

Python

# Build a self-contained wheel (cdylib + generated glue):
crates/llmtrim-uniffi/scripts/build-wheel.sh --release
pip install target/wheels/llmtrim-*.whl
import llmtrim, json

req = json.dumps({"model": "gpt-4o",
                  "messages": [{"role": "user", "content": "…"}]})
out = llmtrim.compress(req, llmtrim.Provider.OPEN_AI, "aggressive")
print(out.input_tokens_before, "->", out.input_tokens_after)
# send out.request_json to the provider

Why build-wheel.sh and not plain maturin build: maturin's bindings = "uniffi" auto-packaging is sensitive to the maturin↔uniffi version pair. With maturin 1.14 + uniffi 0.31 it builds the native library into the wheel but omits the generated Python glue (empty package __init__.py). The script runs maturin, then injects the freshly generated bindings and repacks the wheel with valid RECORD hashes. Remove it once the auto path packages cleanly.

Ruby / Swift / Kotlin

All targets generate from the same built library, no extra Rust. The generated glue is a build artifact (its checksums are pinned to the library ABI), so it is regenerated per release rather than committed:

crates/llmtrim-uniffi/scripts/generate-bindings.sh out/   # python, ruby, swift, kotlin

Generation needs an unstripped library. Library-mode uniffi-bindgen reads metadata symbols from the cdylib, but the workspace release profile sets strip = true. The script therefore generates from the (unstripped) debug build; the native library you ship can be a stripped cargo build --release -p llmtrim-uniffi cdylib; the glue loads it by name.

Ruby (verified). This is the raw generated binding (module LlmtrimFfi), for a source build with libllmtrim_ffi.so on the load path. The published gem aliases it to Llmtrim (require "llmtrim" then Llmtrim.compress(...)); see packaging/ruby.

require_relative "llmtrim_ffi"
require "json"
out = LlmtrimFfi.compress(
  JSON.generate({model: "gpt-4o", messages: [{role: "user", content: "…"}]}),
  LlmtrimFfi::Provider::OPEN_AI, "aggressive")
puts "#{out.input_tokens_before} -> #{out.input_tokens_after}"

Swift emits llmtrim_ffi.swift + an FFI header and modulemap; Kotlin emits uniffi/.../llmtrim_ffi.kt (which loads the cdylib via JNA). CI compiles and runs a smoke for both: Swift on macOS (swiftc against the modulemap), Kotlin on a JVM (kotlinc + JNA), so a binding break is caught in all four languages (see tests/swift, tests/kotlin and the bindings* jobs in .github/workflows/ci.yml).

Publishable packages

Each ships the compiled engine bundled, so consumers need no Rust toolchain:

Target Build Package Verified
Python (PyPI) scripts/build-wheel.sh wheel locally
Ruby (gem) scripts/build-gem.sh packaging/ruby/ locally
Kotlin/JVM (Maven) scripts/build-maven.sh packaging/kotlin/ locally
Swift (SwiftPM) scripts/build-xcframework.sh packaging/swift/ macOS CI only

Each packaging/<lang>/README.md has the usage + publish details.

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.

llmtrim-0.5.0-py3-none-win_amd64.whl (8.0 MB view details)

Uploaded Python 3Windows x86-64

llmtrim-0.5.0-py3-none-manylinux_2_34_x86_64.whl (7.9 MB view details)

Uploaded Python 3manylinux: glibc 2.34+ x86-64

llmtrim-0.5.0-py3-none-manylinux_2_34_aarch64.whl (7.8 MB view details)

Uploaded Python 3manylinux: glibc 2.34+ ARM64

llmtrim-0.5.0-py3-none-macosx_11_0_arm64.whl (7.9 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

llmtrim-0.5.0-py3-none-macosx_10_12_x86_64.whl (7.8 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file llmtrim-0.5.0-py3-none-win_amd64.whl.

File metadata

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

File hashes

Hashes for llmtrim-0.5.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 8995e3e2bef4f7d59085fc7ad3385bb10375d52b7f758f6538897064fc11eac4
MD5 8dcf4403aa23e53236d6f2760e5775c5
BLAKE2b-256 b69cf4bb97b21674dd3d70105d0f1d649db1323117ddbaf5d82b8b423ff1ba15

See more details on using hashes here.

Provenance

The following attestation bundles were made for llmtrim-0.5.0-py3-none-win_amd64.whl:

Publisher: release-bindings.yml on fkiene/llmtrim

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

File details

Details for the file llmtrim-0.5.0-py3-none-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for llmtrim-0.5.0-py3-none-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 c967da0920152a503ac6336b02399ec426e9d524e0e4dd8e1a1f9d667ffa0075
MD5 26db55f8c56459d65f234b3de9ae63db
BLAKE2b-256 144cc52c50b96e2ff4a8a92c58d9b0a033f78b06b633098fe9591167171a751b

See more details on using hashes here.

Provenance

The following attestation bundles were made for llmtrim-0.5.0-py3-none-manylinux_2_34_x86_64.whl:

Publisher: release-bindings.yml on fkiene/llmtrim

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

File details

Details for the file llmtrim-0.5.0-py3-none-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for llmtrim-0.5.0-py3-none-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 ebf3cacb82a72e8c3838fc2b41bf21a8af8e67ca52a3c56cf4b627da43a82187
MD5 643fe8a2df01d24802f5982ead9c5167
BLAKE2b-256 40b25ac781b4b844f76ab12a8bbb11304679e0dc8dd4462a37744eeb5ee746f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for llmtrim-0.5.0-py3-none-manylinux_2_34_aarch64.whl:

Publisher: release-bindings.yml on fkiene/llmtrim

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

File details

Details for the file llmtrim-0.5.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for llmtrim-0.5.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f7a42b43b7b0a7c7c1bd5d7036c02c381a1bce142abdbad6fe64422bb320b04e
MD5 3f62fe11cdb20a493314a82ddf3f0007
BLAKE2b-256 73f0341c08634b55bf9bf058b345446997d87225718628c7b0751138d6862c61

See more details on using hashes here.

Provenance

The following attestation bundles were made for llmtrim-0.5.0-py3-none-macosx_11_0_arm64.whl:

Publisher: release-bindings.yml on fkiene/llmtrim

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

File details

Details for the file llmtrim-0.5.0-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for llmtrim-0.5.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 77506d0d74f7d4f4c30216484405440b71c41091459e5b91858f04e1fe36116c
MD5 57343a6189bd448af196073ae8a6058d
BLAKE2b-256 df2601089bb6cd24dd70a47666eb72eae73361627af5ec092a6153bbb49cdf65

See more details on using hashes here.

Provenance

The following attestation bundles were made for llmtrim-0.5.0-py3-none-macosx_10_12_x86_64.whl:

Publisher: release-bindings.yml on fkiene/llmtrim

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