New in hexiel 0.4.1 · free
A small model reads.
Your big model thinks.
Reading a 600-line file or a long web page doesn’t need your strongest model. Map
read, grep and web_fetch to a small, fast one and hexiel condenses big
outputs for your current request before the main model ever sees them — keeping its context
clean and its queue free.
Less context, same answers
The main model gets a short summary that keeps the identifiers, paths, line numbers and errors it needs. Ask for the raw text any time with full: true.
Safe to try
Small outputs, errors and images are never touched. A helper that is slow, down, or sent something too big is skipped and you get the raw output.
Authoring stays on your best model
write, edit and bash are never delegated: the main model writes its own changes. For planning, use the planner model (/delegate).
How it works
- The main model calls a tool, say
read big_file.py. The tool runs as usual. - If the tool is mapped to a helper model and its output is longer than
min_chars(default 3,000), hexiel sends the output and your request to the helper with an instruction to keep exact identifiers, paths, line numbers and errors. - The main model receives the summary, labelled with who wrote it and how big the original was. It can call the tool again with
full: trueto get the raw text. - The same output for the same request is only summarised once; repeats come from a cache.
- If the helper doesn’t answer within
timeoutor errors, the next model in your list is tried (a helper that just failed is skipped for two minutes); after the last one, or if the output is bigger thanmax_input, you get the raw output. Nothing is ever lost or hidden.
Set it up
Add a profile for the small model, then map tools to it in config.toml (see the
config reference).
[models.pi]
provider = "openai"
base_url = "http://192.168.4.2:11434/v1"
model = "qwen3-1.7b-pi"
context_window = 4096
max_output_tokens = 600
extra_body = { reasoning_effort = "none" } # no thinking: it would triple the wait
[tool_models]
read = { models = ["pi"], min_chars = 3000, max_input = 6500, timeout = 100, max_tokens = 220 }
grep = { models = ["pi"], min_chars = 3000, max_input = 6500, timeout = 100, max_tokens = 220 }
web_fetch = "pi"
search = ["minipc"] # alias for web_search; a list tries models in order, preferring one that isn't busy
A value can be a profile name, a list, or a table with limits for that tool: min_chars (smaller outputs
aren’t touched), max_input (bigger ones aren’t sent), timeout (seconds to wait),
max_tokens (how long the digest may be — shorter is much faster on a slow helper).
Check it
/toolmodelslists each tool’s models, whether they’re ready or busy, and the limits./toolmodels testsends a one-word request to each and times it./usageadds how many outputs were condensed and roughly how many tokens that kept out of the main model’s context.
Example: a Raspberry Pi 5 as the helper
We put this on the Pi that already runs our home DNS, and measured it. Numbers below are from a Pi 5 with 8 GB, three cores, no GPU, reading a ~1,400-token chunk of real hexiel code and asked to answer four questions about it (did the summary keep the facts that answer the question?).
Models we tried
- qwen3:1.7b — reads ~46 tokens/s, writes ~6/s, kept 4 of 4 facts. The one we kept.
- qwen2.5:1.5b — reads ~53/s, writes ~10/s, kept 3 of 4.
- qwen2.5:3b — reads ~25/s, writes ~5/s, kept 3 of 4, twice as slow.
- qwen3:4b — reads ~15/s, writes ~1.3/s. Too slow to be useful.
What it feels like
A 3,700-character file condenses in about 33 seconds; the same file again, 0 seconds (cache). It is slower than a mini-PC GPU would be — the win is that big outputs stay out of your main model’s context and queue, and that a second hexiel window doesn’t wait behind the first one’s reading. Keep inputs modest (about 1,500 tokens) and digests short.
Keep the Pi healthy
- Pin Ollama to some cores (
CPUAffinity=1 2 3) and leave one free. Don’t useCPUQuota: the model’s threads spin-wait, and a quota made it about 2.5× slower. - One request at a time, one model loaded, unloaded after ten idle minutes, a memory cap, and
OOMScoreAdjustso the OOM killer picks Ollama before anything important. - Bind it to the LAN address only and allow just your own network in the firewall. Use
num_thread 3and a 4k context for the model. - Pi 5s throttle when hot; a fan or heatsink matters. Keep the model files off a nearly-full SD card.
“Another window is using this model”
A local model serves one request at a time, so with several hexiel windows or background runs sharing it, requests queue silently and hexiel looks hung. Now hexiel tells you:
⏳ minipc is busy with 1 other request from another hexiel window or background run — this one may wait its turn
It works across processes and applies to models served from your machine or network (including Tailscale addresses). Cloud models, including Ollama Cloud models, serve everyone at once and aren’t tracked.
Questions
Does a helper model change what the main model can do?
No. It only shortens what a tool returns. The main model decides, edits and runs commands. If a summary isn’t enough it calls the tool again with full: true.
Can I use a cloud model as the helper?
Yes — any profile works, local or cloud. A fast cheap cloud model is often the quickest option; a small local one costs nothing.
Why can’t write or edit use a small model?
Because the main model has to author its own changes; handing that to a weaker model would trade quality for speed in the one place it shows. Use the planner model (/delegate) when you want a stronger model for the thinking.
What if the helper is slow?
It gets timeout seconds (default 90). After that you get the raw output and a note saying so. Lower max_tokens and max_input for slow helpers.
Which hexiel version?
Tool models, /toolmodels and the busy notice arrive in hexiel 0.4.1. /update installs it when it’s out.