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

Uploaded Python 3Windows x86-64

llmtrim-0.9.3-py3-none-manylinux_2_34_x86_64.whl (8.5 MB view details)

Uploaded Python 3manylinux: glibc 2.34+ x86-64

llmtrim-0.9.3-py3-none-manylinux_2_34_aarch64.whl (8.4 MB view details)

Uploaded Python 3manylinux: glibc 2.34+ ARM64

llmtrim-0.9.3-py3-none-macosx_11_0_arm64.whl (8.0 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

llmtrim-0.9.3-py3-none-macosx_10_12_x86_64.whl (7.9 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: llmtrim-0.9.3-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.9.3-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 c4f56d93b0cc3ea5c0addb5c99f38f1c0ad4899911134e497938e170913ec47c
MD5 02953fe3699e7e9eaf6f405bed71e795
BLAKE2b-256 58a8dee576ed29c4f1aad9ed430a002cb80a3ca9becdc0455aa3cd6de24fe4ba

See more details on using hashes here.

Provenance

The following attestation bundles were made for llmtrim-0.9.3-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.9.3-py3-none-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for llmtrim-0.9.3-py3-none-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 c9e17f69ae2a65a18cd3fca5a1e70862b922a39558c7a301ba60ff7119d1ddbb
MD5 b0c769f118a55a80f80d9cec08c12194
BLAKE2b-256 e1413a8c1e3a40fa386bc30f35b5b53bd1ad9aadca18227f2fa6373919d2e9df

See more details on using hashes here.

Provenance

The following attestation bundles were made for llmtrim-0.9.3-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.9.3-py3-none-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for llmtrim-0.9.3-py3-none-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 133696d7c7a0f421d972886aeb4737e8c3e9f51c26ed8d7d903dace3a3f689bf
MD5 de9862ab863552d84679518e65cb84fc
BLAKE2b-256 51cd16e36a64a9782c04636da4377a92905d10577d38aac34354d1f6b9e0fac0

See more details on using hashes here.

Provenance

The following attestation bundles were made for llmtrim-0.9.3-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.9.3-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for llmtrim-0.9.3-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 91a57bac292ff4abfa8a84391e9011ff104b4d5d6462097a0de5943acad74e01
MD5 fbd1c843c8c2937d9c9b1c8a547b2adb
BLAKE2b-256 2eeffd7c85bb7d019652ba75dba415f84eea35936dea1c3a01f23c9c19560404

See more details on using hashes here.

Provenance

The following attestation bundles were made for llmtrim-0.9.3-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.9.3-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for llmtrim-0.9.3-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 7c2f1aa6cff4f28a6df6e63f8e8eaabff8bd1fb5d6a6106017abfaaf80074a5f
MD5 f0c5a3b9e1d34fc8eef9e965de75040d
BLAKE2b-256 b71c0d7e6211869bf7d2ec60d5dd0aac44bf9f70724eeb8333e045963d717902

See more details on using hashes here.

Provenance

The following attestation bundles were made for llmtrim-0.9.3-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