Text Generation
Safetensors
GGUF
English
Chinese
qwen2
reasoning-compression
cjk
chain-of-thought
distillation
qwen2.5
conversational
Instructions to use ZelligeAI/tessera-compressor with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- llama-cpp-python
How to use ZelligeAI/tessera-compressor with llama-cpp-python:
# !pip install llama-cpp-python from llama_cpp import Llama llm = Llama.from_pretrained( repo_id="ZelligeAI/tessera-compressor", filename="gguf/compressor-v31-q8_0.gguf", )
llm.create_chat_completion( messages = [ { "role": "user", "content": "What is the capital of France?" } ] ) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- llama.cpp
How to use ZelligeAI/tessera-compressor with llama.cpp:
Install (macOS, Linux)
curl -LsSf https://llama.app/install.sh | sh # Start a local OpenAI-compatible server with a web UI: llama serve -hf ZelligeAI/tessera-compressor:Q8_0 # Run inference directly in the terminal: llama cli -hf ZelligeAI/tessera-compressor:Q8_0
Install from WinGet (Windows)
winget install llama.cpp # Start a local OpenAI-compatible server with a web UI: llama serve -hf ZelligeAI/tessera-compressor:Q8_0 # Run inference directly in the terminal: llama cli -hf ZelligeAI/tessera-compressor:Q8_0
Use pre-built binary
# Download pre-built binary from: # https://github.com/ggerganov/llama.cpp/releases # Start a local OpenAI-compatible server with a web UI: ./llama-server -hf ZelligeAI/tessera-compressor:Q8_0 # Run inference directly in the terminal: ./llama-cli -hf ZelligeAI/tessera-compressor:Q8_0
Build from source code
git clone https://github.com/ggerganov/llama.cpp.git cd llama.cpp cmake -B build cmake --build build -j --target llama-server llama-cli # Start a local OpenAI-compatible server with a web UI: ./build/bin/llama-server -hf ZelligeAI/tessera-compressor:Q8_0 # Run inference directly in the terminal: ./build/bin/llama-cli -hf ZelligeAI/tessera-compressor:Q8_0
Use Docker
docker model run hf.co/ZelligeAI/tessera-compressor:Q8_0
- LM Studio
- Jan
- vLLM
How to use ZelligeAI/tessera-compressor with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "ZelligeAI/tessera-compressor" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "ZelligeAI/tessera-compressor", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/ZelligeAI/tessera-compressor:Q8_0
- Ollama
How to use ZelligeAI/tessera-compressor with Ollama:
ollama run hf.co/ZelligeAI/tessera-compressor:Q8_0
- Unsloth Studio
How to use ZelligeAI/tessera-compressor with Unsloth Studio:
Install Unsloth Studio (macOS, Linux, WSL)
curl -fsSL https://unsloth.ai/install.sh | sh # Run unsloth studio unsloth studio -H 0.0.0.0 -p 8888 # Then open http://localhost:8888 in your browser # Search for ZelligeAI/tessera-compressor to start chatting
Install Unsloth Studio (Windows)
irm https://unsloth.ai/install.ps1 | iex # Run unsloth studio unsloth studio -H 0.0.0.0 -p 8888 # Then open http://localhost:8888 in your browser # Search for ZelligeAI/tessera-compressor to start chatting
Using HuggingFace Spaces for Unsloth
# No setup required # Open https://huggingface.co/spaces/unsloth/studio in your browser # Search for ZelligeAI/tessera-compressor to start chatting
- Pi
How to use ZelligeAI/tessera-compressor with Pi:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf ZelligeAI/tessera-compressor:Q8_0
Configure the model in Pi
# Install Pi: npm install -g @mariozechner/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "llama-cpp": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "ZelligeAI/tessera-compressor:Q8_0" } ] } } }Run Pi
# Start Pi in your project directory: pi
- Hermes Agent new
How to use ZelligeAI/tessera-compressor with Hermes Agent:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf ZelligeAI/tessera-compressor:Q8_0
Configure Hermes
# Install Hermes: curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash hermes setup # Point Hermes at the local server: hermes config set model.provider custom hermes config set model.base_url http://127.0.0.1:8080/v1 hermes config set model.default ZelligeAI/tessera-compressor:Q8_0
Run Hermes
hermes
- Atomic Chat new
- OpenClaw new
How to use ZelligeAI/tessera-compressor with OpenClaw:
Start the llama.cpp server
# Install llama.cpp: brew install llama.cpp # Start a local OpenAI-compatible server: llama serve -hf ZelligeAI/tessera-compressor:Q8_0
Configure OpenClaw
# Install OpenClaw: npm install -g openclaw@latest # Register the local server and set it as the default model: openclaw onboard --non-interactive --mode local \ --auth-choice custom-api-key \ --custom-base-url http://127.0.0.1:8080/v1 \ --custom-model-id "ZelligeAI/tessera-compressor:Q8_0" \ --custom-provider-id llama-cpp \ --custom-compatibility openai \ --custom-text-input \ --accept-risk \ --skip-health
Run OpenClaw
openclaw agent --local --agent main --message "Hello from Hugging Face"
- Docker Model Runner
How to use ZelligeAI/tessera-compressor with Docker Model Runner:
docker model run hf.co/ZelligeAI/tessera-compressor:Q8_0
- Lemonade
How to use ZelligeAI/tessera-compressor with Lemonade:
Pull the model
# Download Lemonade from https://lemonade-server.ai/ lemonade pull ZelligeAI/tessera-compressor:Q8_0
Run and chat with the model
lemonade run user.tessera-compressor-Q8_0
List all available models
lemonade list
Review fixes: novel-facts gate parity with acceptance harness, CLI defaults, framing scoped to validation
Browse files- README.md +3 -3
- scripts/compress.py +2 -2
- scripts/requirements.txt +1 -0
- scripts/segmenting.py +11 -4
- scripts/tokenmax.py +2 -2
README.md
CHANGED
|
@@ -17,7 +17,7 @@ tags:
|
|
| 17 |
|
| 18 |
# tessera-compressor
|
| 19 |
|
| 20 |
-
A 1.5B model that compresses English reasoning text into a telegraphic CJK/symbol register under deterministic fidelity gates. It minted the training data for [Tessera-Preview-9B](https://huggingface.co/ZelligeAI/tessera-preview-9b) and replaces the frontier-model teacher that originally produced the register:
|
| 21 |
|
| 22 |
Example (real training pair, 85 to 49 tokens):
|
| 23 |
|
|
@@ -30,7 +30,7 @@ CJK: Integer(line32),Boolean(line262),BitString(line341),OctetString(line693).
|
|
| 30 |
|
| 31 |
## How it works
|
| 32 |
|
| 33 |
-
The compressor operates on passages, not whole blocks. A reasoning block is segmented (code fences stay atomic), sentences are grouped into step-sized passages, each passage is classified as fact-dense or narrative, and the model compresses it against the tail of the chain built so far. Every model output then passes a deterministic gate: the
|
| 34 |
|
| 35 |
## Acceptance record
|
| 36 |
|
|
@@ -38,7 +38,7 @@ Measured on 103 held-out reasoning blocks the model never trained on, under crit
|
|
| 38 |
|
| 39 |
| Criterion | Result |
|
| 40 |
| --- | --- |
|
| 41 |
-
| Per-passage fidelity gate (numbers
|
| 42 |
| Median per-passage compression ratio (output/input tokens) | 0.716 |
|
| 43 |
| CJK adoption | 98.9% of compressed passages |
|
| 44 |
| Judged semantic equivalence | 103/103 blocks (teacher references on the same blocks: 97.1%) |
|
|
|
|
| 17 |
|
| 18 |
# tessera-compressor
|
| 19 |
|
| 20 |
+
A 1.5B model that compresses English reasoning text into a telegraphic CJK/symbol register under deterministic fidelity gates. It minted the training data for [Tessera-Preview-9B](https://huggingface.co/ZelligeAI/tessera-preview-9b) and replaces the frontier-model teacher that originally produced the register: English reasoning text becomes compressed-register training data at local-inference cost, with no API key and no external dependency. Validation covered code-centric reasoning (103 held-out mixed blocks); behavior on distant domains is unmeasured.
|
| 21 |
|
| 22 |
Example (real training pair, 85 to 49 tokens):
|
| 23 |
|
|
|
|
| 30 |
|
| 31 |
## How it works
|
| 32 |
|
| 33 |
+
The compressor operates on passages, not whole blocks. A reasoning block is segmented (code fences stay atomic), sentences are grouped into step-sized passages, each passage is classified as fact-dense or narrative, and the model compresses it against the tail of the chain built so far. Every model output then passes a deterministic gate: the passage's novel numbers and identifiers must survive as substrings, the output must not blow up in length, and it must not exceed a rules-only compression of the same passage in token count. A passage that fails any check falls back to the rules-only version, so a bad generation costs savings rather than gated content. The gate is lexical, not semantic: it prevents the loss of numbers and identifiers, and a judged semantic-equivalence check backed it at acceptance (below), but it does not by itself guarantee semantic preservation on arbitrary input.
|
| 34 |
|
| 35 |
## Acceptance record
|
| 36 |
|
|
|
|
| 38 |
|
| 39 |
| Criterion | Result |
|
| 40 |
| --- | --- |
|
| 41 |
+
| Per-passage fidelity gate (numbers and identifiers survive) | 99.0% |
|
| 42 |
| Median per-passage compression ratio (output/input tokens) | 0.716 |
|
| 43 |
| CJK adoption | 98.9% of compressed passages |
|
| 44 |
| Judged semantic equivalence | 103/103 blocks (teacher references on the same blocks: 97.1%) |
|
scripts/compress.py
CHANGED
|
@@ -13,7 +13,7 @@ model output costs savings, never content.
|
|
| 13 |
Serve the model first, e.g.:
|
| 14 |
vllm serve ZelligeAI/tessera-compressor --port 8001
|
| 15 |
or with the GGUF:
|
| 16 |
-
llama-server -m compressor-v31-q8_0.gguf --port 8001
|
| 17 |
|
| 18 |
Then:
|
| 19 |
# one block from a text file
|
|
@@ -84,7 +84,7 @@ def compress_block(text, client, model, ntok):
|
|
| 84 |
stats["narr_skipped"] += 1
|
| 85 |
seen |= facts(s)
|
| 86 |
continue
|
| 87 |
-
if gate(s, rules_s, out, ntok) is None:
|
| 88 |
chain.append(out)
|
| 89 |
stats["model_ok"] += 1
|
| 90 |
else:
|
|
|
|
| 13 |
Serve the model first, e.g.:
|
| 14 |
vllm serve ZelligeAI/tessera-compressor --port 8001
|
| 15 |
or with the GGUF:
|
| 16 |
+
llama-server -m gguf/compressor-v31-q8_0.gguf --port 8001 # from the repo root
|
| 17 |
|
| 18 |
Then:
|
| 19 |
# one block from a text file
|
|
|
|
| 84 |
stats["narr_skipped"] += 1
|
| 85 |
seen |= facts(s)
|
| 86 |
continue
|
| 87 |
+
if gate(s, rules_s, out, ntok, novel=novel) is None:
|
| 88 |
chain.append(out)
|
| 89 |
stats["model_ok"] += 1
|
| 90 |
else:
|
scripts/requirements.txt
CHANGED
|
@@ -1,2 +1,3 @@
|
|
| 1 |
openai>=1.0
|
| 2 |
tokenizers>=0.15
|
|
|
|
|
|
| 1 |
openai>=1.0
|
| 2 |
tokenizers>=0.15
|
| 3 |
+
transformers>=4.40 # tokenmax.py standalone CLI only
|
scripts/segmenting.py
CHANGED
|
@@ -97,18 +97,25 @@ def classify_passage(seg, seen_facts, ntok):
|
|
| 97 |
return 'narr'
|
| 98 |
|
| 99 |
|
| 100 |
-
def gate(src_seg, rules_seg, out, ntok):
|
| 101 |
"""Deterministic per-passage fidelity gate.
|
| 102 |
Returns None if the model output is admissible, else a short fail-reason
|
| 103 |
-
string; on failure the caller uses rules_seg instead.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 104 |
if not out or not out.strip():
|
| 105 |
return "empty"
|
| 106 |
if '```' in out:
|
| 107 |
return "fence"
|
| 108 |
if len(out) > 2 * len(src_seg) + 40: # explanation/blow-up guard
|
| 109 |
return "blowup"
|
| 110 |
-
|
|
|
|
|
|
|
| 111 |
return "facts"
|
| 112 |
-
if ntok(out) > ntok(rules_seg): # must
|
| 113 |
return "tokens"
|
| 114 |
return None
|
|
|
|
| 97 |
return 'narr'
|
| 98 |
|
| 99 |
|
| 100 |
+
def gate(src_seg, rules_seg, out, ntok, novel=None):
|
| 101 |
"""Deterministic per-passage fidelity gate.
|
| 102 |
Returns None if the model output is admissible, else a short fail-reason
|
| 103 |
+
string; on failure the caller uses rules_seg instead.
|
| 104 |
+
|
| 105 |
+
novel: the passage's facts that are NOT already in the accumulated chain.
|
| 106 |
+
The prompt tells the model never to restate chain content, so only novel
|
| 107 |
+
facts are required to survive (matching the acceptance harness). Pass None
|
| 108 |
+
to require every fact of the passage (stricter, for chainless use)."""
|
| 109 |
if not out or not out.strip():
|
| 110 |
return "empty"
|
| 111 |
if '```' in out:
|
| 112 |
return "fence"
|
| 113 |
if len(out) > 2 * len(src_seg) + 40: # explanation/blow-up guard
|
| 114 |
return "blowup"
|
| 115 |
+
required = facts(src_seg) if novel is None else novel
|
| 116 |
+
out_n = out.replace(',', '')
|
| 117 |
+
if any(f.replace(',', '') not in out_n for f in required):
|
| 118 |
return "facts"
|
| 119 |
+
if ntok(out) > ntok(rules_seg): # must not exceed the rules-only version
|
| 120 |
return "tokens"
|
| 121 |
return None
|
scripts/tokenmax.py
CHANGED
|
@@ -363,8 +363,8 @@ if __name__ == '__main__':
|
|
| 363 |
parser = argparse.ArgumentParser(description='Token-max post-processor for think blocks')
|
| 364 |
parser.add_argument('--input', required=True, help='Input JSONL (messages format)')
|
| 365 |
parser.add_argument('--output', help='Output JSONL (default: dry run, stats only)')
|
| 366 |
-
parser.add_argument('--tokenizer', default='
|
| 367 |
-
help='
|
| 368 |
parser.add_argument('--force-cjk', action='store_true',
|
| 369 |
help='Force CJK substitutions even if total tokens increase. '
|
| 370 |
'Prioritizes CJK adoption over token savings.')
|
|
|
|
| 363 |
parser = argparse.ArgumentParser(description='Token-max post-processor for think blocks')
|
| 364 |
parser.add_argument('--input', required=True, help='Input JSONL (messages format)')
|
| 365 |
parser.add_argument('--output', help='Output JSONL (default: dry run, stats only)')
|
| 366 |
+
parser.add_argument('--tokenizer', default='ZelligeAI/tessera-compressor',
|
| 367 |
+
help='HF repo id or local path of the tokenizer to count savings under')
|
| 368 |
parser.add_argument('--force-cjk', action='store_true',
|
| 369 |
help='Force CJK substitutions even if total tokens increase. '
|
| 370 |
'Prioritizes CJK adoption over token savings.')
|