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
157 lines
3.8 KiB
Markdown
157 lines
3.8 KiB
Markdown
# SharedContext — Compressed Inter-Agent Context Sharing
|
|
|
|
When agents hand off to each other, context gets replayed in full. SharedContext compresses what moves between agents using Headroom's compression pipeline.
|
|
|
|
## Quick Start
|
|
|
|
```python
|
|
from headroom import SharedContext
|
|
|
|
ctx = SharedContext()
|
|
|
|
# Agent A stores large output
|
|
ctx.put("research", big_research_output, agent="researcher")
|
|
|
|
# Agent B gets compressed version (~80% smaller)
|
|
summary = ctx.get("research")
|
|
|
|
# Agent B needs full details
|
|
full = ctx.get("research", full=True)
|
|
```
|
|
|
|
## API
|
|
|
|
### `put(key, content, *, agent=None)`
|
|
|
|
Store content under a key. Compresses automatically using Headroom's full pipeline (SmartCrusher for JSON, CodeCompressor for code, Kompress for text).
|
|
|
|
```python
|
|
entry = ctx.put("findings", big_json_output, agent="researcher")
|
|
|
|
entry.original_tokens # 20,000
|
|
entry.compressed_tokens # 4,000
|
|
entry.savings_percent # 80.0
|
|
entry.transforms # ["router:json:0.20"]
|
|
```
|
|
|
|
### `get(key, *, full=False)`
|
|
|
|
Retrieve content. Returns compressed version by default, original with `full=True`.
|
|
|
|
```python
|
|
compressed = ctx.get("findings") # 4K tokens
|
|
original = ctx.get("findings", full=True) # 20K tokens
|
|
missing = ctx.get("nonexistent") # None
|
|
```
|
|
|
|
### `get_entry(key)`
|
|
|
|
Get the full `ContextEntry` with metadata.
|
|
|
|
```python
|
|
entry = ctx.get_entry("findings")
|
|
entry.key # "findings"
|
|
entry.agent # "researcher"
|
|
entry.original_tokens # 20000
|
|
entry.compressed_tokens # 4000
|
|
entry.savings_percent # 80.0
|
|
entry.timestamp # 1710000000.0
|
|
entry.transforms # ["router:json:0.20"]
|
|
```
|
|
|
|
### `keys()`
|
|
|
|
List all non-expired keys.
|
|
|
|
### `stats()`
|
|
|
|
Aggregated stats across all entries.
|
|
|
|
```python
|
|
stats = ctx.stats()
|
|
stats.entries # 3
|
|
stats.total_original_tokens # 60000
|
|
stats.total_compressed_tokens # 12000
|
|
stats.total_tokens_saved # 48000
|
|
stats.savings_percent # 80.0
|
|
```
|
|
|
|
### `clear()`
|
|
|
|
Remove all entries.
|
|
|
|
## Configuration
|
|
|
|
```python
|
|
ctx = SharedContext(
|
|
model="claude-sonnet-4-5-20250929", # For token counting
|
|
ttl=3600, # 1 hour (default)
|
|
max_entries=100, # Evicts oldest when full
|
|
)
|
|
```
|
|
|
|
## Framework Examples
|
|
|
|
### CrewAI
|
|
|
|
```python
|
|
from headroom import SharedContext
|
|
|
|
ctx = SharedContext()
|
|
|
|
# After researcher task
|
|
ctx.put("findings", researcher_task.output.raw)
|
|
|
|
# Coder task gets compressed context
|
|
coder_context = ctx.get("findings")
|
|
```
|
|
|
|
### LangGraph
|
|
|
|
```python
|
|
from headroom import SharedContext
|
|
|
|
ctx = SharedContext()
|
|
|
|
def researcher_node(state):
|
|
result = do_research()
|
|
ctx.put("research", result)
|
|
return {"research_summary": ctx.get("research")}
|
|
|
|
def coder_node(state):
|
|
# Compressed summary in state, full details on demand
|
|
full = ctx.get("research", full=True)
|
|
return {"code": write_code(full)}
|
|
```
|
|
|
|
### OpenAI Agents SDK
|
|
|
|
```python
|
|
from headroom import SharedContext
|
|
|
|
ctx = SharedContext()
|
|
|
|
def compress_handoff(messages):
|
|
for msg in messages:
|
|
if len(msg.content) > 1000:
|
|
ctx.put(msg.id, msg.content)
|
|
msg.content = ctx.get(msg.id)
|
|
return messages
|
|
|
|
handoff(agent=coder, input_filter=compress_handoff)
|
|
```
|
|
|
|
### Any Framework
|
|
|
|
SharedContext is framework-agnostic. It's just `put()` and `get()`. Use it wherever context moves between agents.
|
|
|
|
## How It Works
|
|
|
|
Under the hood, `put()` calls `headroom.compress()` (the same pipeline used by the proxy) and stores the original in memory. `get()` returns the compressed version. `get(full=True)` returns the original.
|
|
|
|
- JSON arrays → SmartCrusher (70-95% compression)
|
|
- Code → CodeCompressor (AST-aware, with `[code]` extra)
|
|
- Text → Kompress (ModernBERT, with `[ml]` extra) or passthrough
|
|
- Entries expire after TTL (default 1 hour)
|
|
- Oldest entries evicted when max_entries reached
|