Releases: devjasha/raunen
Release list
v0.4.0
Full Changelog: v0.3.1...v0.4.0
v0.3.1
v0.3.0
v0.2.1
Fixes for turns dying on a free tier, all found from one report.
Install
curl -fsSL https://raw.githubusercontent.com/devjasha/raunen/main/install.sh | shFixes
-
Transient failures are retried. A
500or a dropped connection was not retried at all, so a turn could die after a long run of successful tool calls. It is usually the endpoint having a moment rather than anything wrong with the request, so it is sent again twice with a short backoff before the ladder is involved. -
"No credits" is no longer reported as "rate limited". A
402was classified as a rate limit and given a 30-second cooldown, which can never clear it. It is now its own class and a lockout, and OpenRouter's message — which says exactly what is short and by how much — is shown instead of a paraphrase. -
A refusal no longer needs a roomier model to escalate to. Insisting on a larger window left a whole ladder unused: a model declaring 1,048,576 tokens outranked every free rung at 1,000,000, so a turn failed with somewhere perfectly good to go. Size only matters when the problem is room.
-
A shared allowance rests the whole provider. A free tier's per-day cap belongs to the account, not to one model, so when it runs out every free model behind that provider refuses too. Eight doomed requests are now one.
-
The endpoint's message is no longer mangled. It was extracted by splitting on the last
": ", but the body contains": "itself, so a fragment of the middle of the JSON surfaced. -
A model is only remembered once it answers. Escalating away from a model that refused updates the saved default, but only after the replacement completes a turn — otherwise the default churned through a ladder of models that were failing too.
Full Changelog: v0.2.0...v0.2.1
v0.2.0
Free models, resilience, and a dragon that grows.
Install
curl -fsSL https://raw.githubusercontent.com/devjasha/raunen/main/install.sh | shFree models everywhere
- OpenRouter's free models are found automatically from its own pricing, so the list stays current rather than being maintained by hand.
- Groq, Cerebras and NVIDIA NIM ship in the default config. None of them publish pricing, so a provider can be declared free with
"free": true. - Ollama Cloud is configured out of the box.
- Local models count as free too, and join the ladder without needing a pricing field to say so.
"free_fallback": truebuilds a ladder from everything free, roomiest first.
Context windows, discovered rather than declared
- OpenRouter reports
context_length, so its models no longer need windows written down. - Ollama's native API reports
num_ctx— the window it actually serves, not the model's maximum. qwen3.5 advertises 262144 and is served 4096; using the larger number would make a ladder escalate downward. - Windows are per model now. A provider-level
contextis only a default, because one endpoint serves many models with very different limits.
Growing beats dropping
Escalation now happens before trimming. Dropping earlier tool results makes the model forget what it found and investigate the same thing again — so every rung of the ladder is tried before anything is discarded, and trimming says plainly when it had nowhere left to climb.
Resilience
Three layers, because failures differ in what they imply:
| Failure | Response |
|---|---|
429/402 rate limit |
cool that model down — 30s, doubling to 15 min |
refused connection, 5xx |
after 3 in a row, the whole endpoint rests 2 min |
400/404 rejected |
lock that model out for the session |
A success clears the cooldown and the failure count. Sub-agents share the tracker with their caller, so neither learns the same thing twice.
New in the interface
/status— model, window, mode, context, ladder, and every endpoint with whether it answered and what it still needs./companion— the mascot levels up on context, across every session and provider. Ten levels from Hush to Thunder, and the dragon grows through three stages as you go.- Click a reply to answer it, the way a messaging app does. The whole message is quoted, not the line under the pointer. The mouse wheel scrolls the transcript.
- A searchable model list. Terms are space-separated and all must match, and each matches as a substring or a subsequence, so
nemlightfindsnemotron-3.5-lightning. - An API key prompt when a provider needs one, masked, rather than a
401several seconds later. Providers whose catalogue cannot be listed without a key offer to take one. - The model you choose is remembered between sessions, and a resumed session reopens on the model it was held with.
Fixes worth naming
- The config is written
0600now that it can hold API keys — and explicitlychmoded, becauseWriteFileonly applies its mode when creating a file, so an existing0644config would have left a key world-readable. - Pasted text goes where you are looking. Bracketed paste arrives as its own message rather than as key presses, so it bypassed the key handler and a pasted API key was typed into the conversation.
- Models that cannot hold a conversation are filtered out — 61
:batchvariants, image and music models. A model counts as usable only if everything it outputs is text; a music model declarestext+audioand slipped through a looser test. - A truncated response is no longer mistaken for an empty one.
bufio.Scannerends cleanly at EOF, so a dropped connection looked exactly like a model choosing to say nothing. - Token estimates include the tool schemas, which are not in the message list but are very much in the prompt — they were understating a small model's usage by around 560 tokens and skewing both trimming and escalation.
Full Changelog: v0.1.0...v0.2.0
v0.1.0
First release.
A small terminal agent for local LLMs — one Go binary, no runtime, no server.
Install:
curl -fsSL https://raw.githubusercontent.com/devjasha/raunen/main/install.sh | shWorks with anything speaking the OpenAI /v1/chat/completions format: Ollama (local and cloud), LM Studio, llama.cpp, vLLM, OpenRouter.
Full Changelog: https://github.com/devjasha/raunen/commits/v0.1.0