Files
wehub-resource-sync 26382a7ac6
CodeQL / Analyze (javascript-typescript) (push) Waiting to run
JetBrains Plugin / Actionlint (push) Waiting to run
CodeQL / Analyze (actions) (push) Waiting to run
CodeQL / Analyze (rust) (push) Waiting to run
JetBrains Plugin / Validation (push) Waiting to run
JetBrains Plugin / Build (push) Waiting to run
JetBrains Plugin / Test (push) Blocked by required conditions
Security Check / Security Scan (push) Waiting to run
CI / Clippy (push) Failing after 15m13s
CI / Test (ubuntu-latest) (push) Failing after 16m1s
CI / Test (macos-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Build (no embeddings / no ORT) (push) Has been cancelled
CI / Format (push) Has been cancelled
CI / Cookbook (Node) (push) Has been cancelled
CI / Pi Extension (Node) (push) Has been cancelled
CI / Rust SDK (lean-ctx-client) (push) Has been cancelled
CI / Embed SDK (lean-ctx-sdk) (push) Has been cancelled
CI / Python SDK (leanctx) (push) Has been cancelled
CI / Hermes Plugin (Python) (push) Has been cancelled
CI / SDK Conformance Matrix (push) Has been cancelled
CI / Coverage (push) Has been cancelled
CI / cargo-deny (push) Has been cancelled
CI / Adversarial Safety (push) Has been cancelled
CI / Benchmarks (push) Has been cancelled
CI / Output-Quality Gate (eval A/B) (push) Has been cancelled
CI / Documentation (push) Has been cancelled
CI / CI Green (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:35:30 +08:00
..

lean-ctx (Node SDK)

Context compression for AI agents — a thin, dependency-free client for the local lean-ctx daemon.

npm install lean-ctx-sdk

Drop-in compress(messages, { model })

Compress a chat-style messages array before sending it to any model. Only text payloads are rewritten through lean-ctx's deterministic funnel; images, tool-call blocks and ids pass through untouched, and the output is byte-stable so it stays friendly to provider prompt caching.

import { compress } from "lean-ctx-sdk";

let messages = [
  { role: "system", content: "You are a helpful assistant." },
  { role: "user", content: largeLogOrFileDump },
];

messages = await compress(messages, { model: "claude-sonnet-4" });
// → send `messages` to your provider as usual

Works with both OpenAI-style (content: "string") and Anthropic-style (content: [{ type: "text", … }, { type: "tool_result", … }]) messages.

Token-savings stats

import { ProxyClient } from "lean-ctx-sdk";

const result = await new ProxyClient().compress(messages, "gpt-4o");
console.log(result.stats.saved_tokens, result.stats.saved_pct);
messages = result.messages;

Configuration

The endpoint and session token are auto-discovered from the running daemon. Every step is overridable:

Setting Env var Default
Proxy URL LEAN_CTX_PROXY_URL http://127.0.0.1:<port>
Proxy port LEAN_CTX_PROXY_PORT config.toml proxy_port, else UID-derived
Session token LEAN_CTX_PROXY_TOKEN <data_dir>/session_token

Or pass them explicitly (useful in CI / against a remote proxy):

await compress(messages, { baseUrl: "http://127.0.0.1:4444", token: "…" });

If the daemon is not running, compress() rejects with LeanCtxConnectionError; an unauthenticated request rejects with LeanCtxAuthError. Both extend LeanCtxError.

Vercel AI SDK

Compress every prompt automatically with language-model middleware:

import { wrapLanguageModel } from "ai";
import { openai } from "@ai-sdk/openai";
import { leanCtxMiddleware } from "lean-ctx-sdk";

const model = wrapLanguageModel({
  model: openai("gpt-4o"),
  middleware: leanCtxMiddleware({ model: "gpt-4o" }),
});
// every generateText / streamText call now sends a compressed prompt

withLeanCtx(openai("gpt-4o")) is a one-liner shortcut (needs the optional ai peer dependency). A compaction failure never breaks a generation — the original, uncompressed prompt is sent instead.

Other helpers

LeanCtxClient wraps the lean-ctx binary for read / search / shell / gain / benchmark, and createLeanCtxTool exposes a Vercel AI SDK search tool.

Learn more

License

MIT