v2.4.5: Bring Any OpenRouter Model, Delete Keys for Good, and Deploys That Heal Themselves

Share
v2.4.5: Bring Any OpenRouter Model, Delete Keys for Good, and Deploys That Heal Themselves

v2.4.5 is a release about choice and resilience. You can now bring any model on OpenRouter to your employees in a couple of clicks, clean up the keys you no longer need, and the app quietly recovers from the one annoying error that used to greet you right after we shipped an update. Here is everything that changed.

OpenRouter, connected properly

Until now, running a model that we did not natively support meant copying endpoints and tokens around by hand. v2.4.5 makes OpenRouter a first-class integration, so the entire catalogue is a few clicks away.

Head to Configuration > API Keys and you will find a new OpenRouter API Key section. Paste your key and we validate it on save, the same way we already do for Gemini, then store it encrypted with AES-256-GCM. Once a key is in place, a new Add from OpenRouter button appears under LLM Providers. It opens a searchable picker listing every model on OpenRouter, most recent first, each one showing its input, output, and cache pricing per million tokens, plus a vision badge where it applies.

Find the model you want, click it once, and it joins your custom LLM list. Your stored key is reused server-side for every call and is never sent back to the browser. If you have not added a key yet, the button stays hidden, so the interface only shows you options you can actually use.

Remove a key, not just overwrite it

A small gap we wanted to close: until now you could replace a stored API key but not actually delete one. The OpenRouter, FAL, and Inworld key sections now each have a remove button, shown only when a key is configured, with a confirmation step so you do not wipe one by accident. If you rotate a key out or stop using a provider, you can now leave nothing behind.

The "error reload the page" message is gone

If you used the app right after we deployed a new version, you may have hit a jarring "error reload the page" message, with a Failed to fetch dynamically imported module line in the console. It was not random. When we rebuild the frontend, the build tool regenerates hashed filenames for each asset and removes the old ones. A tab still running the previous build then tries to lazy-load a piece of the app that no longer exists at that address, and the page falls over.

We added a small utility that recognises this exact situation and reloads the page once on its own, guarded by a ten-second timestamp so it can never get stuck in a reload loop. If something does block the automatic recovery, you now see a clean "New version available" card instead of a crash. In practice, the error you used to see by hand now resolves itself before you notice it.

No more lingering "partial" replies

One more rough edge, smoothed. While your employee was answering, you would see a live preview of the text streaming in. Occasionally that preview stuck around after the final reply had already rendered, sometimes scrambled, and only cleared when you refreshed the page. The cause was a late chunk of data arriving over the connection after the turn had already finished, repopulating the preview that should have been empty.

The live text preview is now tied to whether the agent is still working, exactly like the live "thinking" preview already was. The moment a turn ends, only the finished message is shown, and no stray fragment can hang around underneath it.

Nothing to install

As always with these patches, everything is on our side. Reload once and v2.4.5 is live. The headline is OpenRouter, but the quieter wins, a self-healing deploy and a cleaner chat, are the kind of thing you should never have to think about again. That is the goal.

Read more