0ef5fcb1c5
Security / Dependency audit (pip-audit) (push) Has been cancelled
Security / CodeQL (javascript-typescript) (push) Has been cancelled
Security / CodeQL (python) (push) Has been cancelled
Security / Secret scan (gitleaks) (push) Has been cancelled
rust / test (ubuntu) (push) Has been cancelled
rust / simulator e2e (macos-latest) (push) Has been cancelled
rust / simulator e2e (ubuntu-latest) (push) Has been cancelled
rust / simulator e2e (windows-latest) (push) Has been cancelled
rust / wheels (aarch64-apple-darwin) (push) Has been cancelled
rust / wheels (x86_64-unknown-linux-gnu) (push) Has been cancelled
rust / wheels (x86_64-apple-darwin) (push) Has been cancelled
rust / audit (push) Has been cancelled
rust / parity (nightly, allowed to fail during Phase 0) (push) Has been cancelled
CI / commitlint (push) Has been skipped
Dev Containers / validate (.devcontainer/devcontainer.json, default) (push) Failing after 0s
Dev Containers / validate (.devcontainer/memory-stack/devcontainer.json, memory-stack) (push) Failing after 0s
Dev Containers / validate-worktree (push) Failing after 0s
CI / changes (push) Failing after 4s
Deploy Documentation / validate (push) Has been skipped
Deploy Documentation / deploy (push) Failing after 1s
Init Native E2E / init-native (ubuntu-latest, claude) (push) Failing after 1s
Init Native E2E / init-native (ubuntu-latest, codex) (push) Failing after 1s
Install Native E2E / install-native (ubuntu-latest) (push) Failing after 1s
OpenCode Plugin / typecheck + build + test (push) Failing after 1s
Init Native E2E / init-native (ubuntu-latest, copilot) (push) Failing after 1s
Release Please / release-please (push) Failing after 1s
Wrap E2E / docker-wrap-e2e (push) Failing after 1s
Wrap Native E2E / wrap-native (ubuntu-latest) (push) Failing after 1s
Init E2E / docker-init-e2e (push) Failing after 4s
Merge Conflicts / merge-conflicts (push) Failing after 4s
CI / lint (push) Has been cancelled
CI / build-wheel (push) Has been cancelled
CI / build-wheel-windows (push) Has been cancelled
CI / prefetch-model (push) Has been cancelled
CI / test-dashboard-ui (push) Has been cancelled
CI / test (1) (push) Has been cancelled
CI / test (2) (push) Has been cancelled
CI / test (3) (push) Has been cancelled
CI / test (4) (push) Has been cancelled
CI / test-extras (push) Has been cancelled
CI / test-agno (push) Has been cancelled
CI / build (push) Has been cancelled
CI / workflow-validation (push) Has been cancelled
CI / docker-native-e2e (push) Has been cancelled
CI / windows-native-wrapper (push) Has been cancelled
CI / macos-native-wrapper (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code-nonroot name:code-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code-slim name:code-slim]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code-slim-nonroot name:code-slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-nonroot name:nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-slim name:slim]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-slim-nonroot name:slim-nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime name:]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code name:code]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code-nonroot name:code-nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code-slim name:code-slim]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-code-slim-nonroot name:code-slim-nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-nonroot name:nonroot]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-slim name:slim]) (push) Has been cancelled
Docker / docker-manifest (map[bake_target:runtime-slim-nonroot name:slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime name:]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code name:code]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code-nonroot name:code-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code-slim name:code-slim]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-code-slim-nonroot name:code-slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-nonroot name:nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-slim name:slim]) (push) Has been cancelled
Docker / docker-build (map[name:amd64 platform:linux/amd64 runs_on:ubuntu-24.04], map[bake_target:runtime-slim-nonroot name:slim-nonroot]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime name:]) (push) Has been cancelled
Docker / docker-build (map[name:arm64 platform:linux/arm64 runs_on:ubuntu-24.04-arm], map[bake_target:runtime-code name:code]) (push) Has been cancelled
Docker / promote-latest (push) Has been cancelled
Init Native E2E / init-native (macos-latest, claude) (push) Has been cancelled
Init Native E2E / init-native (macos-latest, codex) (push) Has been cancelled
Init Native E2E / init-native (macos-latest, copilot) (push) Has been cancelled
Install Native E2E / install-native (macos-latest) (push) Has been cancelled
Wrap Native E2E / wrap-native (macos-latest) (push) Has been cancelled
174 lines
5.5 KiB
Plaintext
174 lines
5.5 KiB
Plaintext
---
|
|
title: Code Compression
|
|
description: AST-aware compression that preserves imports, signatures, and types while compressing function bodies. Powered by tree-sitter.
|
|
---
|
|
|
|
Headroom's CodeAwareCompressor uses tree-sitter to parse source code into an AST, then selectively compresses function bodies while preserving the structural elements that LLMs need -- imports, signatures, type annotations, and error handlers.
|
|
|
|
## Why AST-Aware Compression?
|
|
|
|
Naive truncation breaks code. Cutting a function in half leaves invalid syntax that confuses the LLM. CodeAwareCompressor guarantees:
|
|
|
|
- **Syntax validity** -- output always parses correctly
|
|
- **Structural preservation** -- imports, signatures, types, decorators are kept intact
|
|
- **Lightweight** -- ~50MB (tree-sitter) vs ~1GB for LLMLingua
|
|
|
|
## Supported Languages
|
|
|
|
| Tier | Languages | Support Level |
|
|
|---|---|---|
|
|
| Tier 1 | Python, JavaScript, TypeScript | Full AST analysis |
|
|
| Tier 2 | Go, Rust, Java, C, C++ | Function body compression |
|
|
|
|
## What Gets Preserved vs Compressed
|
|
|
|
**Always preserved:**
|
|
- Import statements
|
|
- Function and method signatures
|
|
- Class definitions
|
|
- Type annotations
|
|
- Decorators
|
|
- Error handlers (`try`/`except`, `try`/`catch`)
|
|
|
|
**Compressed:**
|
|
- Function bodies (implementations)
|
|
- Comments (unless configured to preserve)
|
|
- Verbose docstrings (configurable: full, first line, or removed)
|
|
|
|
## Example
|
|
|
|
```python
|
|
from headroom.transforms import CodeAwareCompressor
|
|
|
|
compressor = CodeAwareCompressor()
|
|
|
|
code = '''
|
|
import os
|
|
from typing import List
|
|
|
|
def process_items(items: List[str]) -> List[str]:
|
|
"""Process a list of items."""
|
|
results = []
|
|
for item in items:
|
|
if not item:
|
|
continue
|
|
processed = item.strip().lower()
|
|
results.append(processed)
|
|
return results
|
|
'''
|
|
|
|
result = compressor.compress(code, language="python")
|
|
print(result.compressed)
|
|
# import os
|
|
# from typing import List
|
|
#
|
|
# def process_items(items: List[str]) -> List[str]:
|
|
# """Process a list of items."""
|
|
# results = []
|
|
# for item in items:
|
|
# # ... (5 lines compressed)
|
|
# pass
|
|
|
|
print(f"Compression: {result.compression_ratio:.0%}") # ~55%
|
|
print(f"Syntax valid: {result.syntax_valid}") # True
|
|
```
|
|
|
|
## Configuration
|
|
|
|
```python
|
|
from headroom.transforms import CodeAwareCompressor, CodeCompressorConfig, DocstringMode
|
|
|
|
config = CodeCompressorConfig(
|
|
preserve_imports=True, # Always keep imports
|
|
preserve_signatures=True, # Always keep function signatures
|
|
preserve_type_annotations=True, # Keep type hints
|
|
preserve_error_handlers=True, # Keep try/except blocks
|
|
preserve_decorators=True, # Keep decorators
|
|
docstring_mode=DocstringMode.FIRST_LINE, # FULL, FIRST_LINE, REMOVE
|
|
target_compression_rate=0.2, # Keep 20% of tokens
|
|
max_body_lines=5, # Lines to keep per function body
|
|
min_tokens_for_compression=100, # Skip small content
|
|
language_hint=None, # Auto-detect if None
|
|
fallback_to_kompress=True, # Use Kompress for unknown langs
|
|
)
|
|
|
|
compressor = CodeAwareCompressor(config)
|
|
result = compressor.compress(code)
|
|
```
|
|
|
|
### Configuration Options
|
|
|
|
| Option | Default | Description |
|
|
|---|---|---|
|
|
| `preserve_imports` | `True` | Keep all import statements |
|
|
| `preserve_signatures` | `True` | Keep function/method signatures |
|
|
| `preserve_type_annotations` | `True` | Keep type hints |
|
|
| `preserve_error_handlers` | `True` | Keep try/except blocks |
|
|
| `preserve_decorators` | `True` | Keep decorators |
|
|
| `docstring_mode` | `FIRST_LINE` | How to handle docstrings: `FULL`, `FIRST_LINE`, `REMOVE` |
|
|
| `target_compression_rate` | `0.2` | Fraction of tokens to keep (0.2 = keep 20%) |
|
|
| `max_body_lines` | `5` | Max lines to keep per function body |
|
|
| `min_tokens_for_compression` | `100` | Skip files smaller than this |
|
|
| `language_hint` | `None` | Override language detection |
|
|
| `fallback_to_kompress` | `True` | Use Kompress for unsupported languages |
|
|
|
|
## Before and After
|
|
|
|
```python
|
|
# Before (full source file)
|
|
def process_data(items: List[str]) -> Dict[str, int]:
|
|
"""Process items and count occurrences."""
|
|
result = {}
|
|
for item in items:
|
|
item = item.strip().lower()
|
|
if item in result:
|
|
result[item] += 1
|
|
else:
|
|
result[item] = 1
|
|
return result
|
|
|
|
# After (signature preserved, body compressed)
|
|
def process_data(items: List[str]) -> Dict[str, int]:
|
|
"""Process items and count occurrences."""
|
|
result = {}
|
|
for item in items:
|
|
# ... (5 lines compressed)
|
|
pass
|
|
```
|
|
|
|
The LLM sees the function's purpose, its input/output types, and the general approach -- enough to reason about the code without needing every implementation line.
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
# Install tree-sitter language pack
|
|
pip install "headroom-ai[code]"
|
|
```
|
|
|
|
## Memory Management
|
|
|
|
Tree-sitter parsers are lazy-loaded and cached. You can free memory when done:
|
|
|
|
```python
|
|
from headroom.transforms import is_tree_sitter_available, unload_tree_sitter
|
|
|
|
# Check if tree-sitter is installed
|
|
print(is_tree_sitter_available()) # True
|
|
|
|
# Free memory when done
|
|
unload_tree_sitter()
|
|
```
|
|
|
|
## Performance
|
|
|
|
| Metric | Value |
|
|
|---|---|
|
|
| Compression | 40-70% token reduction |
|
|
| Speed | ~10-50ms per file |
|
|
| Memory | ~50MB (tree-sitter parsers) |
|
|
| Syntax validity | Guaranteed |
|
|
|
|
<Callout type="info" title="Automatic routing">
|
|
When you use the Headroom proxy or call `compress()`, source code is automatically detected and routed to CodeAwareCompressor. Direct usage gives you control over compression settings per language.
|
|
</Callout>
|