Install
openclaw skills install tampSet up Tamp token compression proxy for OpenClaw to reduce Anthropic API input token costs. Use when the user asks to save tokens, reduce API costs, set up tamp, or optimize OpenClaw spending. Also use when asked about token compression or cost reduction for Claude models.
openclaw skills install tampSave 3-50% on input tokens by routing API requests through Tamp — a local HTTP proxy that compresses tool_result blocks before they reach Anthropic.
ANTHROPIC_API_KEY must be set in your OpenClaw config. Tamp itself does not store or read this key — it forwards the x-api-key header from incoming requests unchanged.# Install a pinned version (recommended)
npm i -g @sliday/tamp@0.3.8
# Or run without installing
npx @sliday/tamp@0.3.8 -y
Start with default stages:
TAMP_STAGES=minify,toon,strip-lines,whitespace,dedup,diff,prune tamp -y
Verify:
curl http://localhost:7778/health
# {"status":"ok","version":"0.3.8","stages":["minify","toon",...]}
Tamp is open source (MIT). Audit the source, build from git, or run from a local clone:
git clone https://github.com/sliday/tamp && cd tamp && npm install && node bin/tamp.js -y
Create ~/.config/systemd/user/tamp.service:
[Unit]
Description=Tamp token compression proxy
After=network.target
[Service]
# Adjust path: node -e "console.log(require('child_process').execFileSync('which', ['tamp']).toString().trim())"
ExecStart=/usr/local/bin/tamp
Restart=always
RestartSec=5
Environment=TAMP_PORT=7778
Environment=TAMP_STAGES=minify,toon,strip-lines,whitespace,dedup,diff,prune
Environment=TAMP_LOG=true
[Install]
WantedBy=default.target
systemctl --user daemon-reload
systemctl --user enable --now tamp.service
journalctl --user -u tamp -f # live compression logs
Add a provider in your OpenClaw config:
{
models: {
providers: {
"anthropic-tamp": {
baseUrl: "http://localhost:7778",
apiKey: "${ANTHROPIC_API_KEY}", // Forwarded to upstream, not stored by Tamp
api: "anthropic-messages",
models: [
{ id: "claude-opus-4-6", name: "Claude Opus 4.6 (compressed)" },
{ id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6 (compressed)" }
]
}
}
}
}
Set as primary model:
{
agents: {
defaults: {
model: { primary: "anthropic-tamp/claude-opus-4-6" }
}
}
}
Restart the gateway. All requests now flow through Tamp.
OpenClaw → POST /v1/messages → Tamp (localhost:7778) → compresses JSON body → Anthropic API
← streams response back unchanged
Tamp intercepts the request body, finds tool_result blocks in messages[], and compresses their content. Headers (including x-api-key) are forwarded unchanged. The response streams back untouched.
| Stage | What it does | Lossy? |
|---|---|---|
| minify | Strip JSON whitespace | No |
| toon | Columnar encoding for arrays (file listings, deps, routes) | No |
| strip-lines | Remove line-number prefixes from Read tool output | No |
| whitespace | Collapse blank lines, trim trailing spaces | No |
| dedup | Deduplicate identical tool_results across turns | No |
| diff | Delta-encode similar re-reads as unified diffs | No |
| prune | Strip lockfile hashes, registry URLs, npm metadata | Metadata only* |
* Prune removes fields like integrity, resolved, shasum, _id, _from, _nodeVersion from JSON — npm registry metadata not needed by the LLM. To keep full provenance, remove prune from TAMP_STAGES.
| Scenario | Savings |
|---|---|
| Chat sessions (short turns) | 3-5% |
| Coding sessions (file reads, JSON) | 30-50% |
| Lockfiles | up to 81% |
| Subagent tasks | 20-40% |
x-api-key / Authorization header from the incoming request to upstream. It does not store, log, or read API keys.