mirror of
https://github.com/headroomlabs-ai/headroom.git
synced 2026-08-27 14:17:10 -04:00
Bumps the pip-minor-patch group with 1 update in the / directory: [ruff](https://github.com/astral-sh/ruff). Updates `ruff` from 0.15.22 to 0.16.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/ruff/releases">ruff's releases</a>.</em></p> <blockquote> <h2>0.16.2</h2> <h2>Release Notes</h2> <p>Released on 2026-08-06.</p> <h3>Bug fixes</h3> <ul> <li>[<code>flake8-pyi</code>] Avoid false positives on <code>singledispatch</code> functions (<code>PYI041</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/27335">#27335</a>)</li> </ul> <h3>Server</h3> <ul> <li>Register formatting capabilities dynamically to exclude TOML files (<a href="https://redirect.github.com/astral-sh/ruff/pull/27332">#27332</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/MeGaGiGaGon"><code>@MeGaGiGaGon</code></a></li> <li><a href="https://github.com/charliermarsh"><code>@charliermarsh</code></a></li> <li><a href="https://github.com/epage"><code>@epage</code></a></li> <li><a href="https://github.com/sharkdp"><code>@sharkdp</code></a></li> <li><a href="https://github.com/ntBre"><code>@ntBre</code></a></li> </ul> <h2>Install ruff 0.16.2</h2> <h3>Install prebuilt binaries via shell script</h3> <pre lang="sh"><code>curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-installer.sh | sh </code></pre> <h3>Install prebuilt binaries via powershell script</h3> <pre lang="sh"><code>powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-installer.ps1 | iex" </code></pre> <h2>Download ruff 0.16.2</h2> <table> <thead> <tr> <th>File</th> <th>Platform</th> <th>Checksum</th> </tr> </thead> <tbody> <tr> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-aarch64-apple-darwin.tar.gz">ruff-aarch64-apple-darwin.tar.gz</a></td> <td>Apple Silicon macOS</td> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-aarch64-apple-darwin.tar.gz.sha256">checksum</a></td> </tr> <tr> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-x86_64-apple-darwin.tar.gz">ruff-x86_64-apple-darwin.tar.gz</a></td> <td>Intel macOS</td> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-x86_64-apple-darwin.tar.gz.sha256">checksum</a></td> </tr> <tr> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-aarch64-pc-windows-msvc.zip">ruff-aarch64-pc-windows-msvc.zip</a></td> <td>ARM64 Windows</td> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-aarch64-pc-windows-msvc.zip.sha256">checksum</a></td> </tr> <tr> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-i686-pc-windows-msvc.zip">ruff-i686-pc-windows-msvc.zip</a></td> <td>x86 Windows</td> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-i686-pc-windows-msvc.zip.sha256">checksum</a></td> </tr> <tr> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-x86_64-pc-windows-msvc.zip">ruff-x86_64-pc-windows-msvc.zip</a></td> <td>x64 Windows</td> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-x86_64-pc-windows-msvc.zip.sha256">checksum</a></td> </tr> <tr> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-aarch64-unknown-linux-gnu.tar.gz">ruff-aarch64-unknown-linux-gnu.tar.gz</a></td> <td>ARM64 Linux</td> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td> </tr> <tr> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-i686-unknown-linux-gnu.tar.gz">ruff-i686-unknown-linux-gnu.tar.gz</a></td> <td>x86 Linux</td> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-i686-unknown-linux-gnu.tar.gz.sha256">checksum</a></td> </tr> <tr> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-powerpc64-unknown-linux-gnu.tar.gz">ruff-powerpc64-unknown-linux-gnu.tar.gz</a></td> <td>PPC64 Linux</td> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td> </tr> <tr> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-powerpc64le-unknown-linux-gnu.tar.gz">ruff-powerpc64le-unknown-linux-gnu.tar.gz</a></td> <td>PPC64LE Linux</td> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256">checksum</a></td> </tr> <tr> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-riscv64gc-unknown-linux-gnu.tar.gz">ruff-riscv64gc-unknown-linux-gnu.tar.gz</a></td> <td>RISCV Linux</td> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-riscv64gc-unknown-linux-gnu.tar.gz.sha256">checksum</a></td> </tr> <tr> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-s390x-unknown-linux-gnu.tar.gz">ruff-s390x-unknown-linux-gnu.tar.gz</a></td> <td>S390x Linux</td> <td><a href="https://releases.astral.sh/github/ruff/releases/download/0.16.2/ruff-s390x-unknown-linux-gnu.tar.gz.sha256">checksum</a></td> </tr> </tbody> </table> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's changelog</a>.</em></p> <blockquote> <h2>0.16.2</h2> <p>Released on 2026-08-06.</p> <h3>Bug fixes</h3> <ul> <li>[<code>flake8-pyi</code>] Avoid false positives on <code>singledispatch</code> functions (<code>PYI041</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/27335">#27335</a>)</li> </ul> <h3>Server</h3> <ul> <li>Register formatting capabilities dynamically to exclude TOML files (<a href="https://redirect.github.com/astral-sh/ruff/pull/27332">#27332</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/MeGaGiGaGon"><code>@MeGaGiGaGon</code></a></li> <li><a href="https://github.com/charliermarsh"><code>@charliermarsh</code></a></li> <li><a href="https://github.com/epage"><code>@epage</code></a></li> <li><a href="https://github.com/sharkdp"><code>@sharkdp</code></a></li> <li><a href="https://github.com/ntBre"><code>@ntBre</code></a></li> </ul> <h2>0.16.1</h2> <p>Released on 2026-07-30.</p> <h3>Preview features</h3> <ul> <li>Add an option to opt out of human-readable names (<a href="https://redirect.github.com/astral-sh/ruff/pull/27160">#27160</a>)</li> <li>[<code>flake8-pytest-style</code>] Make fixes safe by default and unsafe only when comments are present (<code>PT018</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/27201">#27201</a>)</li> <li>[<code>pyupgrade</code>] Skip fix when a defaulted <code>TypeVar</code> precedes a non-defaulted one (<code>UP040</code>, <code>UP046</code>, <code>UP047</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/27133">#27133</a>)</li> <li>[<code>ruff</code>] Fix false positive with unpacked arguments (<code>RUF065</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/26959">#26959</a>)</li> </ul> <h3>Bug fixes</h3> <ul> <li>Bump <code>gen-lsp-types</code> to gracefully handle unknown enumeration values in LSP messages (<a href="https://redirect.github.com/astral-sh/ruff/pull/27230">#27230</a>)</li> <li>[<code>flake8-bugbear</code>] Mark <code>range</code> as immutable (<code>B008</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/27247">#27247</a>)</li> <li>[<code>flake8-comprehensions</code>] NFKC-normalize keyword names in <code>C408</code> fix (<a href="https://redirect.github.com/astral-sh/ruff/pull/26813">#26813</a>)</li> <li>[<code>flake8-return</code>] Fix false positive when variable is read in <code>finally</code> clause (<code>RET504</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25441">#25441</a>)</li> <li>[<code>pydocstyle</code>] Skip section detection inside RST directive bodies (<code>D214</code>, <code>D405</code>, <code>D413</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/23635">#23635</a>)</li> <li>[<code>refurb</code>] Parenthesize <code>yield</code> arguments in the <code>FURB192</code> fix (<a href="https://redirect.github.com/astral-sh/ruff/pull/27192">#27192</a>)</li> </ul> <h3>Rule changes</h3> <ul> <li>[<code>flake8-pytest-style</code>] Mark <code>PT022</code> fixes as unsafe (<a href="https://redirect.github.com/astral-sh/ruff/pull/26440">#26440</a>)</li> <li>[<code>refurb</code>] Mark fixes that remove unknown separators as unsafe (<code>FURB105</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/27200">#27200</a>)</li> </ul> <h3>Server</h3> <ul> <li>Fix indexing of excluded nested Ruff workspaces (<a href="https://redirect.github.com/astral-sh/ruff/pull/27303">#27303</a>)</li> <li>Lint TOML files in the LSP (<a href="https://redirect.github.com/astral-sh/ruff/pull/26862">#26862</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="5b48a04097"><code>5b48a04</code></a> Bump 0.16.2 (<a href="https://redirect.github.com/astral-sh/ruff/issues/27555">#27555</a>)</li> <li><a href="1b9e5fc483"><code>1b9e5fc</code></a> Update Swatinem/rust-cache action to v2.9.2 (<a href="https://redirect.github.com/astral-sh/ruff/issues/27568">#27568</a>)</li> <li><a href="c4e86fc039"><code>c4e86fc</code></a> [ty] Add helper extension methods for half-range and equality constraints (<a href="https://redirect.github.com/astral-sh/ruff/issues/2">#2</a>...</li> <li><a href="17a00de2e2"><code>17a00de</code></a> [ty] Reuse primer commands in memory reports (<a href="https://redirect.github.com/astral-sh/ruff/issues/27553">#27553</a>)</li> <li><a href="6ea296b969"><code>6ea296b</code></a> [ty] Normalize type labels in structured docstrings (<a href="https://redirect.github.com/astral-sh/ruff/issues/26923">#26923</a>)</li> <li><a href="2fc445f005"><code>2fc445f</code></a> [ty] Diagnose invalid <strong>getattr</strong> calls (<a href="https://redirect.github.com/astral-sh/ruff/issues/27502">#27502</a>)</li> <li><a href="22c7823c4e"><code>22c7823</code></a> [ty] Enable (but downrank) auto-import completion suggestions from stub-only ...</li> <li><a href="05160d507f"><code>05160d5</code></a> [ty] Diagnose invalid descriptor <code>__get__</code> calls (<a href="https://redirect.github.com/astral-sh/ruff/issues/27400">#27400</a>)</li> <li><a href="baea3d0dce"><code>baea3d0</code></a> [ty] Expose strict analysis options in the playground (<a href="https://redirect.github.com/astral-sh/ruff/issues/27543">#27543</a>)</li> <li><a href="c88946ebeb"><code>c88946e</code></a> [ty] Bump ecosystem-analyzer for strict project settings (<a href="https://redirect.github.com/astral-sh/ruff/issues/27542">#27542</a>)</li> <li>Additional commits viewable in <a href="https://github.com/astral-sh/ruff/compare/0.15.22...0.16.2">compare view</a></li> </ul> </details> <br /> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: JerrettDavis <mxjerrett@gmail.com>
373 lines
8.3 KiB
Markdown
373 lines
8.3 KiB
Markdown
# Quickstart Guide
|
|
|
|
Get Headroom running in 5 minutes with these copy-paste examples.
|
|
|
|
---
|
|
|
|
## Installation
|
|
|
|
**CLI on macOS Apple Silicon/Linux with uv:**
|
|
|
|
```bash
|
|
uv tool install --python 3.13 "headroom-ai[all]"
|
|
headroom --version
|
|
```
|
|
|
|
Use `uv tool update-shell` if the install succeeds but `headroom` is not on
|
|
`PATH`.
|
|
|
|
**Python project / virtualenv:**
|
|
|
|
```bash
|
|
# Core only (minimal dependencies)
|
|
pip install headroom-ai
|
|
|
|
# With proxy server
|
|
pip install "headroom-ai[proxy]"
|
|
|
|
# Everything
|
|
pip install "headroom-ai[all]"
|
|
```
|
|
|
|
**TypeScript / Node.js:**
|
|
|
|
```bash
|
|
npm install headroom-ai
|
|
```
|
|
|
|
**Docker-native:**
|
|
|
|
```bash
|
|
curl -fsSL https://raw.githubusercontent.com/chopratejas/headroom/main/scripts/install.sh | bash
|
|
```
|
|
|
|
See [Docker-native install](docker-install.md) if you want Docker to provide the Headroom runtime while your agent CLIs stay on the host.
|
|
|
|
**Persistent background runtime:**
|
|
|
|
```bash
|
|
headroom install apply --preset persistent-service --providers auto
|
|
```
|
|
|
|
See [Persistent Installs](persistent-installs.md) if you want Headroom to stay up in the background and be reused by `wrap`.
|
|
|
|
---
|
|
|
|
## Option 1: Proxy Server (Zero Code Changes)
|
|
|
|
The fastest way to start saving tokens. Works with any OpenAI-compatible client.
|
|
|
|
### Step 1: Start the Proxy
|
|
|
|
```bash
|
|
headroom proxy --port 8787
|
|
```
|
|
|
|
### Step 2: Verify It's Running
|
|
|
|
```bash
|
|
curl http://localhost:8787/health
|
|
# Expected: {"status":"healthy","ready":true,"config":{"backend":"anthropic",...},...}
|
|
```
|
|
|
|
### Step 3: Point Your Client
|
|
|
|
```bash
|
|
# Claude Code
|
|
ANTHROPIC_BASE_URL=http://localhost:8787 claude
|
|
|
|
# GitHub Copilot CLI (default Anthropic-style proxy route)
|
|
headroom wrap copilot -- --model claude-sonnet-4-20250514
|
|
|
|
# Cursor / Continue / any OpenAI client
|
|
OPENAI_BASE_URL=http://localhost:8787/v1 your-app
|
|
|
|
# Python
|
|
export OPENAI_BASE_URL=http://localhost:8787/v1
|
|
python your_script.py
|
|
```
|
|
|
|
### Step 4: Check Savings
|
|
|
|
```bash
|
|
curl http://localhost:8787/stats
|
|
# {"requests_total": 42, "tokens_saved_total": 125000, ...}
|
|
```
|
|
|
|
---
|
|
|
|
## Option 2: Python SDK
|
|
|
|
Wrap your existing client for fine-grained control.
|
|
|
|
### Basic Example
|
|
|
|
```python
|
|
from headroom import HeadroomClient, OpenAIProvider
|
|
from openai import OpenAI
|
|
|
|
# Create wrapped client
|
|
client = HeadroomClient(
|
|
original_client=OpenAI(),
|
|
provider=OpenAIProvider(),
|
|
default_mode="optimize",
|
|
)
|
|
|
|
# Use exactly like OpenAI client
|
|
response = client.chat.completions.create(
|
|
model="gpt-4o",
|
|
messages=[
|
|
{"role": "system", "content": "You are a helpful assistant."},
|
|
{"role": "user", "content": "Hello!"},
|
|
],
|
|
)
|
|
|
|
print(response.choices[0].message.content)
|
|
|
|
# Check what happened
|
|
stats = client.get_stats()
|
|
print(f"Tokens saved: {stats['session']['tokens_saved_total']}")
|
|
```
|
|
|
|
### With Tool Outputs (Where Savings Happen)
|
|
|
|
```python
|
|
from headroom import HeadroomClient, OpenAIProvider
|
|
from openai import OpenAI
|
|
import json
|
|
|
|
client = HeadroomClient(
|
|
original_client=OpenAI(),
|
|
provider=OpenAIProvider(),
|
|
default_mode="optimize",
|
|
)
|
|
|
|
# Simulate a conversation with large tool outputs
|
|
messages = [
|
|
{"role": "system", "content": "You analyze search results."},
|
|
{"role": "user", "content": "Search for Python tutorials."},
|
|
{
|
|
"role": "assistant",
|
|
"content": None,
|
|
"tool_calls": [
|
|
{
|
|
"id": "call_1",
|
|
"type": "function",
|
|
"function": {"name": "search", "arguments": '{"q": "python"}'},
|
|
}
|
|
],
|
|
},
|
|
{
|
|
"role": "tool",
|
|
"tool_call_id": "call_1",
|
|
# This is where Headroom shines - compressing large outputs
|
|
"content": json.dumps(
|
|
{"results": [{"title": f"Result {i}", "score": 100 - i} for i in range(500)]}
|
|
),
|
|
},
|
|
{"role": "user", "content": "What are the top 3 results?"},
|
|
]
|
|
|
|
# Headroom compresses the 500 results to ~20, keeping the most relevant
|
|
response = client.chat.completions.create(
|
|
model="gpt-4o",
|
|
messages=messages,
|
|
)
|
|
|
|
print(response.choices[0].message.content)
|
|
```
|
|
|
|
### Simulate Before Sending
|
|
|
|
Preview optimizations without making an API call:
|
|
|
|
```python
|
|
# See what would happen without calling the API
|
|
plan = client.chat.completions.simulate(
|
|
model="gpt-4o",
|
|
messages=messages,
|
|
)
|
|
|
|
print(f"Tokens before: {plan.tokens_before}")
|
|
print(f"Tokens after: {plan.tokens_after}")
|
|
print(
|
|
f"Would save: {plan.tokens_saved} tokens ({plan.tokens_saved / plan.tokens_before * 100:.0f}%)"
|
|
)
|
|
print(f"Transforms: {plan.transforms}")
|
|
print(f"Estimated savings: {plan.estimated_savings}")
|
|
```
|
|
|
|
---
|
|
|
|
## Option 3: Anthropic SDK
|
|
|
|
```python
|
|
from headroom import HeadroomClient, AnthropicProvider
|
|
from anthropic import Anthropic
|
|
|
|
client = HeadroomClient(
|
|
original_client=Anthropic(),
|
|
provider=AnthropicProvider(),
|
|
default_mode="optimize",
|
|
)
|
|
|
|
# Use Anthropic-style API
|
|
response = client.messages.create(
|
|
model="claude-sonnet-4-20250514",
|
|
max_tokens=1024,
|
|
messages=[
|
|
{"role": "user", "content": "Hello, Claude!"},
|
|
],
|
|
)
|
|
|
|
print(response.content[0].text)
|
|
```
|
|
|
|
---
|
|
|
|
## Verify It's Working
|
|
|
|
### Method 1: Enable Logging
|
|
|
|
```python
|
|
import logging
|
|
|
|
logging.basicConfig(level=logging.INFO)
|
|
|
|
# Now you'll see:
|
|
# INFO:headroom.transforms.pipeline:Pipeline complete: 45000 -> 4500 tokens (saved 40500, 90.0% reduction)
|
|
# INFO:headroom.transforms.smart_crusher:SmartCrusher: keeping 15 of 500 items
|
|
```
|
|
|
|
### Method 2: Check Session Stats
|
|
|
|
```python
|
|
stats = client.get_stats()
|
|
print(stats)
|
|
# {
|
|
# "session": {"requests_total": 10, "tokens_saved_total": 5000, ...},
|
|
# "config": {"mode": "optimize", "provider": "openai", ...},
|
|
# "transforms": {"smart_crusher_enabled": True, ...}
|
|
# }
|
|
```
|
|
|
|
### Method 3: Validate Setup
|
|
|
|
```python
|
|
result = client.validate_setup()
|
|
if not result["valid"]:
|
|
print("Setup issues:", result)
|
|
else:
|
|
print("Setup OK!")
|
|
print(f"Provider: {result['provider']['name']}")
|
|
print(f"Storage: {result['storage']['url']}")
|
|
```
|
|
|
|
---
|
|
|
|
## Common Configuration
|
|
|
|
### Adjust Compression
|
|
|
|
```python
|
|
from headroom import HeadroomClient, OpenAIProvider, HeadroomConfig
|
|
|
|
config = HeadroomConfig()
|
|
|
|
# Keep more items after compression (default: 15)
|
|
config.smart_crusher.max_items_after_crush = 30
|
|
|
|
# Only compress if tool output has > 500 tokens (default: 200)
|
|
config.smart_crusher.min_tokens_to_crush = 500
|
|
|
|
client = HeadroomClient(
|
|
original_client=OpenAI(),
|
|
provider=OpenAIProvider(),
|
|
config=config, # Pass custom config
|
|
default_mode="optimize",
|
|
)
|
|
```
|
|
|
|
### Skip Compression for Specific Tools
|
|
|
|
```python
|
|
response = client.chat.completions.create(
|
|
model="gpt-4o",
|
|
messages=messages,
|
|
headroom_tool_profiles={
|
|
"database_query": {"skip_compression": True}, # Never compress
|
|
"search": {"max_items": 50}, # Keep more items
|
|
},
|
|
)
|
|
```
|
|
|
|
### Audit Mode (Observe Only)
|
|
|
|
```python
|
|
# Start in audit mode - see what WOULD be optimized
|
|
client = HeadroomClient(
|
|
original_client=OpenAI(),
|
|
provider=OpenAIProvider(),
|
|
default_mode="audit", # No modifications, just logging
|
|
)
|
|
|
|
# Override per-request
|
|
response = client.chat.completions.create(
|
|
model="gpt-4o",
|
|
messages=messages,
|
|
headroom_mode="optimize", # Enable for this request only
|
|
)
|
|
```
|
|
|
|
---
|
|
|
|
## What Gets Optimized?
|
|
|
|
| Content Type | What Headroom Does | Typical Savings |
|
|
|--------------|-------------------|-----------------|
|
|
| **Tool outputs with lists** | Keeps errors, anomalies, high-score items | 70-90% |
|
|
| **Repeated search results** | Deduplicates and samples | 60-80% |
|
|
| **Long conversations** | Drops old turns, keeps recent | 40-60% |
|
|
| **System prompts with dates** | Stabilizes for cache hits | Cache savings |
|
|
|
|
---
|
|
|
|
## Next Steps
|
|
|
|
- **[Configuration Reference](configuration.md)** - All configuration options
|
|
- **[Transform Reference](transforms.md)** - How each transform works
|
|
- **[Troubleshooting](troubleshooting.md)** - Common issues and solutions
|
|
- **[Examples](../examples/)** - More complete examples
|
|
|
|
---
|
|
|
|
## Quick Troubleshooting
|
|
|
|
### "No token savings"
|
|
|
|
```python
|
|
# 1. Check mode
|
|
stats = client.get_stats()
|
|
print(stats["config"]["mode"]) # Should be "optimize"
|
|
|
|
# 2. Enable logging to see what's happening
|
|
import logging
|
|
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
```
|
|
|
|
### "High latency"
|
|
|
|
```python
|
|
# Use BM25 instead of embeddings for faster relevance scoring
|
|
config.smart_crusher.relevance.tier = "bm25"
|
|
```
|
|
|
|
### "Compression too aggressive"
|
|
|
|
```python
|
|
# Keep more items
|
|
config.smart_crusher.max_items_after_crush = 50
|
|
```
|
|
|
|
See [Troubleshooting Guide](troubleshooting.md) for more solutions.
|