Install
openclaw skills install @whit3rabbit/rabbit-rewritesRewrite the prose the engine flagged using a small local model over an OpenAI-compatible endpoint, instead of spending a frontier model on it. Use when the user wants to de-slop or humanize a draft offline, on a Raspberry Pi, in CI, or in a pre-commit hook, mentions llama.cpp, llama-server, Ollama, LM Studio, vLLM, or OpenRouter for writing work, asks which local model is good enough to clean up their writing, wants rewriting that costs no API tokens, or asks to benchmark or compare models on a rewriting task. Covers endpoint setup, planning what would be sent, applying gated rewrites in place, and measuring a model's pass rate.
openclaw skills install @whit3rabbit/rabbit-rewritesDetection in this plugin needs no model. scan.py is pure Python and runs on a Pi today. Rewriting is the part that needs one, and this is the path that uses a small local model for it rather than a frontier model.
Paths. {baseDir} below expands to this skill's own directory, the one holding this file. On a host that leaves the placeholder literal, resolve each path relative to that directory.
The design rests on three core principles: targeted chunking, persistent settings reuse, and gated execution.
Rather than sending entire documents (which exceed small model context windows and cause hallucinated edits), the engine chunks flagged prose into focused, contextual units:
uniformity, tier2-cluster, tier3-density) are chunked at the full paragraph level, sized against the endpoint's input budget.A 10,000-word draft with 40 findings becomes 40 focused 150- to 350-token requests, keeping token budgets tight while giving the model enough context to preserve flow.
Always look for existing settings before prompting or reconfiguring. The engine checks configuration sources in this order:
.rabbit-model in the directory beside the document or the current working directory..rabbit-model at the repository root.$RABBIT_MODEL_BASE_URL, $RABBIT_MODEL_NAME, $RABBIT_MODEL_API_KEY.Save user configuration to .rabbit-model so settings persist and are automatically reused on every run:
{
"base_url": "http://127.0.0.1:8080/v1",
"model": "qwen2.5-3b-instruct",
"context_tokens": 4096,
"max_output_tokens": 640,
"temperature": 0.2,
"disable_thinking": true
}
For hosted endpoints (e.g. OpenRouter), specify the environment variable holding the key (api_key_env) rather than committing raw keys:
{
"base_url": "https://openrouter.ai/api/v1",
"model": "qwen/qwen3-4b-instruct",
"api_key_env": "OPENROUTER_API_KEY"
}
Small local models (1.5B to 8B parameters) perform reliably when guided by strict prompts and the verification gate. Detailed download sources, commands, and quantization notes live in references/models.md.
| Model Family | Recommended Sizes | Primary Download Source | Ollama Tag |
|---|---|---|---|
| Qwen 2.5 / 3 | 1.5B, 3B, 7B | Hugging Face (Qwen/Qwen2.5-3B-Instruct-GGUF) | qwen2.5:1.5b, qwen2.5:3b, qwen2.5:7b |
| Gemma 2 / 4 | 2B, 9B, 26B (MLX) | Hugging Face (google/gemma-2-2b-it-GGUF) | gemma2:2b, gemma2:9b, gemma4:26b-mlx |
| Llama 3.2 / 3.1 | 3B, 8B | Hugging Face (meta-llama/Llama-3.2-3B-Instruct-GGUF) | llama3.2:3b, llama3.1:8b |
./models/~/.cache/llama.cpp/ or ~/.local/share/models/~/.cache/lm-studio/models/ or ~/.ollama/models/# llama-server
llama-server -m ./models/qwen2.5-3b-instruct-q4_k_m.gguf --port 8080 -c 4096 --flash-attn
# Ollama (endpoint at http://127.0.0.1:11434/v1)
ollama serve
The rewriting system prompt blends plain-language simplification with targeted de-slopping:
You are a copy editor. You rewrite one short passage at a time into clear, natural, and plain language.
Remove these machine-writing characteristics:
- Weird subject and verb combinations, and roundabout pseudo-epiphanies.
- Objects performing action verbs (keep actions for humans, groups, or agents; avoid phrases like "this file carries..." or "the module names...").
- Self-praise, AI hedges, and conversational padding.
- Distracting beats and unnecessary complexity.
Absolute rules:
- Keep every number, date, name, file path, URL, and quoted phrase exactly as written.
- Keep all markdown unchanged: code spans, links, list markers, headings, and emphasis.
- Leave fenced code blocks completely unchanged.
- Never use an em dash (—).
- Do not add facts, opinions, examples, or a closing summary sentence.
- Do not change the meaning. Say the same thing in plainer, everyday words.
- Reply ONLY with the rewritten passage and nothing else: no preamble, no commentary, no labels, no surrounding quotes, no code fence.
Thinking / reasoning tokens: Disabled by default ("disable_thinking": true, sending reasoning_effort: "none" and enable_thinking: false). Reasoning blocks consume the output token budget before the model emits the rewrite.
A small model is never trusted blindly:
verify.py validation (numbers, dates, paths, code spans, quotes, and links must match exactly).Deterministic fixes first:
python3 {baseDir}/scripts/scan.py draft.md --apply-safe --write
Dry run / plan what would be sent:
python3 {baseDir}/scripts/scan.py draft.md --apply-model --model-plan
Apply model rewrites:
python3 {baseDir}/scripts/scan.py draft.md --apply-model
python3 {baseDir}/scripts/scan.py draft.md --apply-model --write
python3 {baseDir}/scripts/scan.py draft.md --apply-model --stdout | diff draft.md -
--model-limit N stops after N passages. --model-attempts N controls retry attempts per passage.
Measure actual pass rates using the fixed 12-passage test battery:
python3 {baseDir}/scripts/bench.py --model-endpoint http://127.0.0.1:8080/v1 --model-name qwen2.5-3b
python3 {baseDir}/scripts/bench.py --repeat 3 --json > qwen2.5-3b.json
rabbit-writes for voice conversion.| Path | What it holds |
|---|---|
{baseDir}/scripts/rwlib/endpoint.py | endpoint configuration, resolution, and security checks |
{baseDir}/scripts/rwlib/rewrite.py | unit planning, prompt templates, gate validation, retry loop |
{baseDir}/references/models.md | recommended models, download sources, and endpoint setup |
{baseDir}/scripts/bench.py | the model benchmarking runner |
{baseDir}/scripts/battery.json | the twelve passages scored in the benchmark |