2026-01-10 14:51:08 -08:00
|
|
|
# Quickstart Guide
|
|
|
|
|
|
|
|
|
|
Get Headroom running in 5 minutes with these copy-paste examples.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Installation
|
|
|
|
|
|
Clarify uv tool install path on macOS (#1196)
## Description
Clarifies the recommended install path for the Headroom CLI on macOS
Apple Silicon and Linux. The docs now prefer `uv tool install --python
3.13 "headroom-ai[all]"` for host-level CLI use, keep `pip install`
scoped to Python project environments, and call out absolute executable
paths for MCP clients that do not inherit interactive shell `PATH`.
## Type of Change
- [ ] Bug fix (non-breaking change that fixes an issue)
- [ ] New feature (non-breaking change that adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to change)
- [x] Documentation update
- [ ] Performance improvement
- [ ] Code refactoring (no functional changes)
## Changes Made
- Added `uv tool install --python 3.13` guidance to the README, docs
install page, quickstarts, and wiki install pages.
- Documented `uv tool update-shell` for shells that cannot find the
installed `headroom` command.
- Clarified absolute MCP server command paths for clients that do not
inherit the interactive shell `PATH`.
- Pointed Intel macOS users at the Docker-native install path until
native wheel support lands.
## Testing
Describe the tests you ran to verify your changes:
- [ ] Unit tests pass (`pytest`) - not run; docs-only change.
- [ ] Linting passes (`ruff check .`) - not run; docs-only change.
- [ ] Type checking passes (`mypy headroom`) - not run; docs-only
change.
- [ ] New tests added for new functionality - not applicable.
- [x] Manual testing performed
- [x] `git diff --check upstream/main...HEAD`
## Real Behavior Proof
```bash
$ git diff --check upstream/main...HEAD
# exits 0; no whitespace errors
```
`npm --prefix docs run types:check` was also attempted. It regenerated
MDX and route types successfully, then failed in existing docs app code
because `@/lib/...` imports cannot resolve from files such as
`app/(home)/layout.tsx`, `app/api/search/route.ts`, and
`components/button.tsx`. This PR only changes `README.md`,
`docs/content/docs/installation.mdx`,
`docs/content/docs/quickstart.mdx`, and `wiki/*.md` files.
## Review Readiness
- [x] Draft PR; docs wording and install-path accuracy are ready for
review.
- [x] No code or runtime files changed.
- [x] Known docs type-check blocker is documented above.
## Test Output
```bash
$ git diff --check upstream/main...HEAD
# no output
```
```text
$ npm --prefix docs run types:check
[MDX] generated files
✓ Types generated successfully
app/(home)/layout.tsx(2,29): error TS2307: Cannot find module @/lib/layout.shared or its corresponding type declarations.
...
components/button.tsx(4,20): error TS2307: Cannot find module @/lib/cn or its corresponding type declarations.
```
## Checklist
- [x] My code follows the project's style guidelines
- [x] I have performed a self-review of my code
- [ ] I have commented my code, particularly in hard-to-understand areas
- not applicable; docs-only change.
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works - not applicable; docs-only change.
- [ ] New and existing unit tests pass locally with my changes - not
run; docs-only change.
- [ ] I have updated the CHANGELOG.md if applicable - not applicable.
## Screenshots (if applicable)
Not applicable.
## Additional Notes
The PR remains a draft while docs verification is limited by the
existing docs app `@/lib/*` resolution issue.
---------
Co-authored-by: JerrettDavis <mxjerrett@gmail.com>
2026-07-15 23:06:30 +02:00
|
|
|
**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:**
|
2026-03-26 15:41:56 -07:00
|
|
|
|
2026-01-10 14:51:08 -08:00
|
|
|
```bash
|
|
|
|
|
# Core only (minimal dependencies)
|
2026-03-02 10:11:16 -06:00
|
|
|
pip install headroom-ai
|
2026-01-10 14:51:08 -08:00
|
|
|
|
|
|
|
|
# With proxy server
|
2026-03-02 10:11:16 -06:00
|
|
|
pip install "headroom-ai[proxy]"
|
2026-01-10 14:51:08 -08:00
|
|
|
|
|
|
|
|
# Everything
|
2026-03-02 10:11:16 -06:00
|
|
|
pip install "headroom-ai[all]"
|
2026-01-10 14:51:08 -08:00
|
|
|
```
|
|
|
|
|
|
2026-03-26 15:41:56 -07:00
|
|
|
**TypeScript / Node.js:**
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
npm install headroom-ai
|
|
|
|
|
```
|
|
|
|
|
|
2026-04-10 23:27:24 -05:00
|
|
|
**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.
|
|
|
|
|
|
2026-04-11 13:47:05 -05:00
|
|
|
**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`.
|
|
|
|
|
|
2026-01-10 14:51:08 -08:00
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 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
|
2026-04-11 01:20:17 -05:00
|
|
|
# Expected: {"status":"healthy","ready":true,"config":{"backend":"anthropic",...},...}
|
2026-01-10 14:51:08 -08:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Step 3: Point Your Client
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# Claude Code
|
|
|
|
|
ANTHROPIC_BASE_URL=http://localhost:8787 claude
|
|
|
|
|
|
2026-04-11 01:20:17 -05:00
|
|
|
# GitHub Copilot CLI (default Anthropic-style proxy route)
|
|
|
|
|
headroom wrap copilot -- --model claude-sonnet-4-20250514
|
|
|
|
|
|
2026-01-10 14:51:08 -08:00
|
|
|
# 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
|
|
|
|
|
|
fix(cli): harden all CLI surfaces + fix docs accuracy (#1491)
## Summary
Full CLI audit + documentation accuracy pass. All 5 commits on this
branch:
### CLI Hardening (4 commits)
- **Clean errors instead of tracebacks**: corrupt manifests, missing
Docker, malformed JSONL, bad `--profile`, invalid env-var values all now
raise `click.ClickException` with helpful messages
- **Range validation**: ~25 numeric flags across 10 files now use
`click.IntRange`/`FloatRange` — `--port 0`, `--hours -1`, `--limit 0`
etc. produce clean usage errors instead of silent wrong behavior
- **Flag combination warnings**: conflicting combos (`--no-rate-limit` +
`--rpm`, `--no-optimize` + `--target-ratio`, `--telemetry` +
`--no-telemetry`) emit yellow warnings on stderr
- **`memory --db-path` default fixed**: was resolving to
`headroom_memory.db` (wrong bare file); now uses project store
`./.headroom/memory.db` if present, else `~/.headroom/memory.db`
- **`memory list --search` + filters**: `--scope`/`--session`/`--since`
were silently ignored when `--search` was also set; now filters are
applied to search results
- **`learn --verbosity --apply` now works**: the output shaper is off by
default (`HEADROOM_OUTPUT_SHAPER`); `--apply` now hot-enables it via
`POST /admin/runtime-env` on a running proxy, or prints explicit `export
HEADROOM_OUTPUT_SHAPER=1` instructions when no proxy is running
- **`perf --hours` overflow**: `1e9` hours no longer raises
`OverflowError`; treated as "all data"
- **`evals memory --categories` invalid input**: `abc,1,2` now raises
`BadParameter` instead of a raw `ValueError` traceback
### Documentation (1 commit, 20 files)
Corrected factual errors found by 3 parallel audit agents across root
docs, wiki, and the published Fumadocs site:
**Critical (caused runtime errors or wrong behavior if followed):**
- `simulation.mdx`: `plan.transforms_applied` -> `plan.transforms`;
`plan.savings_percent` -> computed from available fields (both raised
`AttributeError`)
- `shared-context.mdx`: `import { SharedContext } from "headroom"` ->
`"headroom-ai"` (5x `ImportError`)
- `claude-code-azure-foundry.mdx`: `pip install headroom` -> `pip
install headroom-ai`
- `api-reference.mdx` + `configuration.mdx`: `from headroom import
GoogleProvider` -> `from headroom.providers import GoogleProvider`
- `ccr.mdx`: CCR TTL default 300s -> 1800s (30 min)
**Fabricated flags removed:**
- `wiki/proxy.md` + `wiki/cli.md`: `--no-intelligent-context`,
`--no-intelligent-scoring`, `--no-compress-first` (none exist); replaced
with real CCR flags
- `wiki/configuration.md`: `--no-ccr-responses`, `--no-ccr-expansion`
(none exist); replaced with real flags
- `wiki/troubleshooting.md`, `wiki/metrics.md`,
`docs/troubleshooting.mdx`: `headroom proxy --log-level debug` (flag
doesn't exist)
**Stale content corrected:**
- `llms.txt`: telemetry stated as enabled-by-default (it's opt-in); wrap
list had 5 tools (now 11)
- `README.md`: compatibility matrix added 5 missing `wrap` targets;
`unwrap`, `doctor`, `init`/`install`, savings-analytics now mentioned
- `SECURITY.md`: supported version table showed 0.2.x (current: 0.27.x)
- `wiki/learn.md`: 5 missing flags added; verbosity shaper-off behavior
documented
- `wiki/quickstart.md`: "Configuration Reference" linked to `api.md`
(wrong) -> `configuration.md`
- `CacheAlignerConfig.enabled` default corrected: `True` -> `False`
- `opencode.mdx`: `--port` default wrong ("random") -> 8787; `openai`
backend removed
- `CONTRIBUTING.md`: broken Markdown table cell fixed
- `docs/meta.json`: `claude-code-azure-foundry` added to nav (was
unreachable orphan page)
- `configuration.mdx`: SDK modes vs proxy `--mode` now clearly
distinguished
## Test plan
- [x] `python -m pytest tests/ -x -q` — 857 passed, 0 failures
- [x] 41-combination CLI smoke test (all flag combos across 8 commands)
— 0 tracebacks
- [x] `ruff check` on all modified Python files — clean
- [x] Docs changes are removals/corrections of fabricated or stale
content; no new claims introduced
2026-06-27 14:48:43 -07:00
|
|
|
- **[Configuration Reference](configuration.md)** - All configuration options
|
2026-01-10 14:51:08 -08:00
|
|
|
- **[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.
|