Spaces:
Build error
Build error
| # 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 | |