Skip to main content
Glama
README.md
# Context Diamond v0.7.0

> Stop pasting the same messy context into every LLM. Turn chats, logs, issues,
> agent state, and docs into small, auditable context capsules.

[![CI](https://github.com/RainCherb/context-diamond/actions/workflows/ci.yml/badge.svg)](https://github.com/RainCherb/context-diamond/actions/workflows/ci.yml)
[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
[![Python](https://img.shields.io/badge/Python-3.10%2B-blue.svg)](pyproject.toml)
[![No API Keys](https://img.shields.io/badge/API%20keys-not%20required-brightgreen.svg)](docs/architecture.md)
[![OpenCode MCP](https://img.shields.io/badge/OpenCode-MCP%20ready-purple.svg)](docs/opencode.md)

Context Diamond v0.7.0 is a deterministic context compression and handoff toolkit for
LLM agents.
It extracts the things models keep losing in long conversations:

- goals and success criteria
- hard constraints
- decisions already made
- current working state
- open questions and risks
- files, symbols, entities, and anchors

It is built for developers who switch between coding agents, OpenCode, chat UIs,
RAG pipelines, issue threads, and local notes. The default engine is offline,
zero-dependency, inspectable, and safe to run before any text is sent to an LLM.

## Why People Click This

Most LLM context tools promise "memory". Context Diamond gives you a portable
handoff artifact you can read, diff, benchmark, paste, store, or feed to another
agent.

Use it when you want to:

- recover signal from noisy agent sessions
- reduce repeated prompt/context cost
- preserve constraints before handing work to another model
- keep decisions visible instead of buried in a paragraph summary
- audit what got dropped with a loss report
- expose compression as an OpenCode MCP tool

## 60-Second Demo

Install from GitHub:

```bash
pip install git+https://github.com/RainCherb/context-diamond.git
```

Compress a long handoff:

```bash
context-diamond examples/long_handoff.md --budget 320 --title "Sprint Handoff"
```

Get JSON with an audit trail:

```bash
context-diamond examples/long_handoff.md --format json --loss-report
```

Benchmark it against dumb head/tail clipping:

```bash
context-diamond-bench examples/long_handoff.md --budget 320
```

Inspect why shards were selected:

```bash
ctxd explain examples/long_handoff.md
```

Build a capsule from a repository:

```bash
ctxd repo . --budget 1200
```

Compare or merge capsules as the handoff evolves:

```bash
ctxd diff old_capsule.json new_capsule.json
ctxd merge chat.json repo.json issue.json --budget 900
```

Batch-process multiple files:

```bash
ctxd batch notes/*.md --output-dir capsules/ --budget 400 --template coding
```

Use a domain-specific template:

```bash
context-diamond incident_report.md --template incident --budget 500
```

Stream capsules incrementally:

```python
from context_diamond import StreamingCompressor

streamer = StreamingCompressor()
streamer.add_message("Goal: build a login form.")
streamer.add_message("Decision: use JWT tokens.")
capsule = streamer.current_capsule
```

Example benchmark output:

```text
535 source tokens -> 387 rendered capsule tokens
1.38x ratio
constraints:1.00 decisions:1.00 risks:1.00 code:1.00
```

## Direct Token Savings

Context Diamond can automatically adapt compression to your target LLM's context
window, apply multi-level cascade compression, or transparently intercept
messages before they reach an API.

### Adaptive Compression

Compress only when text exceeds the model's usable context:

```bash
context-diamond long_handoff.md --model gpt-4o
```

Recognised models: `gpt-4o`, `gpt-4o-mini`, `claude-3-opus`, `claude-3-sonnet`,
`claude-3-haiku`, `gemini-1.5-pro`, `gemini-1.5-flash`, `llama-3-70b`,
`llama-3-8b`.

```python
from context_diamond import AdaptiveCompressor

adaptive = AdaptiveCompressor()
result = adaptive.compress(long_text, model_name="claude-3-opus")
# result.was_compressed   -> True/False
# result.original_tokens  -> 45000
# result.final_tokens     -> 1800
# result.text             -> capsule markdown or original
```

### Cascade Compression

Multi-level aggressive squeeze (800 -> 400 -> 200 tokens):

```bash
context-diamond very_long_doc.md --cascade --cascade-levels 3
```

```python
from context_diamond import CascadeCompressor

cascade = CascadeCompressor()
capsule = cascade.compress(extremely_long_text)
```

### Middleware (Transparent API Savings)

Auto-compress messages before sending to an LLM:

```python
from context_diamond import AutoCompressMiddleware

middleware = AutoCompressMiddleware(threshold_tokens=1200)
compressed = middleware.compress_messages(messages, model_name="gpt-4o")
# compressed messages have _compressed metadata
print(middleware.savings_report())
# {'tokens_saved': 42000, 'savings_percentage': 87.5}
```

## The Pitch

Generic summaries are cheap, but they often flatten the one thing you needed to
keep. Context Diamond keeps the handoff structured:

| Problem | Context Diamond answer |
| --- | --- |
| "The model forgot the rules." | Rules live in their own section. |
| "We reopened an old decision." | Decisions are extracted separately. |
| "The transcript is mostly noise." | Noise is scored down and shown in loss reports. |
| "I need this in OpenCode." | Run it as a local MCP server. |
| "I do not want another API bill." | No runtime API calls by default. |

## OpenCode MCP

Add Context Diamond to OpenCode as a local MCP server:

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "context_diamond": {
      "type": "local",
      "command": ["context-diamond-mcp"],
      "enabled": true,
      "timeout": 30000
    }
  }
}
```

OpenCode tools (prefixed with `context_diamond_`):

- **Compression**: `compress_text`, `compress_file`, `batch_compress`
- **Explainability**: `explain_text`
- **Repository**: `repo_capsule`
- **Benchmark**: `benchmark_file`
- **Streaming**: `streaming_add`, `streaming_get`, `streaming_reset`
- **Discovery**: `list_templates`, `list_tokenizers`, `get_template_info`

See [docs/opencode.md](docs/opencode.md).

## CLI

```bash
# Markdown capsule
context-diamond notes.md --budget 500 --output capsule.md

# JSON capsule for automation
context-diamond notes.md --format json --loss-report --output capsule.json

# Explain shard scoring
ctxd explain notes.md

# Repository capsule
ctxd repo . --budget 1200

# Capsule evolution
ctxd diff old.json new.json
ctxd merge chat.json repo.json --output merged.md

# Stdin
type notes.md | context-diamond - --budget 350

# Precise tokenizers (optional extras)
context-diamond notes.md --tokenizer tiktoken --budget 500
```

Use a JSON message list:

```bash
context-diamond conversation.json --messages-json --format json
```

```json
[
  {"role": "user", "content": "Build a local context compressor."},
  {"role": "assistant", "content": "Decision: use deterministic extraction first."}
]
```

## Python API

```python
from context_diamond import CompressionConfig, ContextDiamondCompressor

text = """
Goal: reduce token waste in LLM handoffs.
The tool must run locally and avoid API keys by default.
Decision: emit markdown and JSON capsules.
"""

compressor = ContextDiamondCompressor(CompressionConfig(token_budget=220))
capsule = compressor.compress(text)

print(capsule.to_markdown())
```

Integration helpers:

```python
from context_diamond import compress_documents, compress_messages, compress_tool_payload
```

See [docs/integrations.md](docs/integrations.md).

## What The Capsule Looks Like

```markdown
# Context Diamond Capsule

- Strategy: `diamond-v1`
- Source tokens: `535`
- Capsule tokens: `315`
- Compression ratio: `1.7x`

## Diamond Pulse
- The strongest signals from the source.

## Rules And Constraints
- Requirements that should not be violated.

## Decisions Already Made
- Choices that should not be reopened accidentally.

## Open Questions And Risks
- Unresolved items that need attention.
```

## Why This Over X

Context Diamond is not trying to replace every prompt compressor, RAG compressor,
or memory store. It is best at one job:

> create auditable context capsules for LLM and coding-agent handoffs.

Read the honest comparison in [docs/why-context-diamond.md](docs/why-context-diamond.md).

## Features

- **Offline by default**: no hidden network calls.
- **Zero runtime dependencies**: install it into boring environments.
- **OpenCode-ready**: ships a local stdio MCP server.
- **Benchmarkable**: compare against deterministic clipping baselines.
- **Auditable**: optional loss report shows omitted shards.
- **Explainable**: `ctxd explain` shows shard facets, scores, tokens, and reasons.
- **Repo-aware**: `ctxd repo` captures branch, git state, and selected files.
- **Composable capsules**: `ctxd diff` and `ctxd merge` support handoff evolution.
- **Structured**: goals, rules, decisions, facts, state, risks, anchors.
- **Composable**: CLI, Python API, JSON output, adapters, MCP.
- **Precise tokenizers**: optional `tiktoken`, `anthropic`, and `transformers` adapters.
- **Templates**: domain-specific presets (`coding`, `support`, `research`, `incident`).
- **Streaming**: `StreamingCompressor` for incremental capsule updates.
- **Batch processing**: `ctxd batch` for multiple files.

## Docs

- [OpenCode integration](docs/opencode.md)
- [Benchmarks](docs/benchmarks.md)
- [Integrations](docs/integrations.md)
- [Algorithm](docs/algorithm.md)
- [Architecture](docs/architecture.md)
- [Use cases](docs/use-cases.md)

## Local Development

```bash
git clone https://github.com/RainCherb/context-diamond.git
cd context-diamond
python -m venv .venv
.\.venv\Scripts\activate
pip install -e ".[dev]"
python -m pytest
python -m ruff check .
```

On macOS or Linux, activate with `source .venv/bin/activate`.

## Roadmap

- Larger public benchmark corpus with task-level answer quality checks.
- Domain-adapted embedding reranker profiles.
- More first-class agent adapters: GitHub issues, Linear, Slack, Markdown logs.
- Extended plugin hooks for custom facet detection and scoring.
- PyPI release after the public API stabilizes.

## Star This If

- you lose context when switching between LLM tools
- you want OpenCode agents to compress handoffs before continuing
- you prefer inspectable local tools over another black-box summarizer
- you like boring, deterministic software that saves expensive tokens

MIT licensed. Built to be small, honest, and useful.

TDQS

B3.2/5.0

Scored across 3 tools

Disambiguation4/5

benchmark_file is clearly distinct from the two compression tools. compress_file and compress_text overlap in purpose (both compress into a capsule) but are differentiated by input type (file vs raw text), reducing ambiguity.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern with underscores, all lowercase. No mixing of conventions.

Tool Count5/5

With only 3 tools, the server is tightly scoped to its purpose of compressing and benchmarking, which is appropriate for a specialized server.

Completeness4/5

The tools cover the core functions of compression and benchmarking, but the absence of decompression or extraction tools may be a minor gap depending on use cases.

Maintenance

ActivityInactive
ResponsivenessNo issues