Skip to content
For teams: coding agents on the self-hosted models you're allowed to run - see early access →

What's new

The short version of each release, written for people who use Polyglot rather than read its source. The full changelog on GitHub has every entry, including internal fixes.

polyglot updates itself in the background when autoUpdate is on; otherwise npm install -g @usepolyglot/cli (or your package manager’s equivalent) pulls the latest.


Models see every rule their tool calls must follow. When tools are described to a model in the prompt (the default for local models), each tool’s parameters are now written out in full: the allowed values of a parameter with a fixed list, what a list holds, the keys of a nested object and which are required, and patterns, formats and limits. Before, a fixed list of values read as plain text and a nested object as just “object”, so a model could be refused for breaking rules it was never shown. This matters most for MCP tools, whose parameters are often richer than Polyglot’s own. See The tool-call protocol.

A model that says what it will do, then stops, is asked to do it. Some local models end a turn on “Let me start by reading the file.” without making the call, which used to end the task there. Polyglot now asks the model to make the call, the way it already did after an empty reply. See When a model stops short.

Replies cut off by the output length limit are handled. A model can reach the server’s output limit in the middle of an answer, in the middle of a tool call, or, with reasoning models, before writing anything visible. A tool call cut off this way is no longer run: its arguments are incomplete, and running it could write half a file. The model is told and makes the call again in smaller pieces. An answer cut off before any call, or an empty reply, gets a request to continue.

Longer replies from Claude. With Claude, a reply may now be up to 16,384 tokens instead of 4,096, so writing a large file in one call no longer runs into the limit. Claude 3 and 3.5 models keep their own lower maximum.

Fixes:

  • A tool parameter called name (or tool, or function) is no longer dropped from the call.
  • A nested object or list in a call whose JSON needed repair is kept as an object or list instead of becoming text.

Your team’s HQ. The self-hosted dashboard Polyglot can report to is now called HQ, and its settings are POLYGLOT_HQ_URL, POLYGLOT_HQ_TOKEN and POLYGLOT_HQ_INCLUDE_RAW_CALLS. The old POLYGLOT_CONTROL_PLANE_* names still work: Polyglot says once which to rename. As before, it asks before sending anything, and nothing is sent without those settings.

Dependency updates, including security fixes in libraries Polyglot installs.


A warning when the model server cuts off your prompt. A local server with a small context window doesn’t refuse a long prompt: it quietly drops the start of it, which for an agent is its instructions and tool descriptions, and the model carries on without knowing how to call tools. Ollama does this at its default window, whatever the model supports. Polyglot now compares the prompt it sent with what the server says it read, and when the server read clearly less, says so once, with how to raise the window. See Context window. --probe also reads Ollama’s real window from its own API now, since its OpenAI-compatible endpoint doesn’t report it.


Reliability reports. polyglot report generate builds a digest of how tool calls went over a period, from your local audit log: how many needed repair, which repairs were used, how many never resolved. Counts only by default; including raw samples of broken calls means reviewing each one on screen, with secrets already redacted, before it goes in. polyglot report submit sends a report only after showing it and asking.

Reporting to a team’s control plane. With POLYGLOT_CONTROL_PLANE_URL and POLYGLOT_CONTROL_PLANE_TOKEN set, Polyglot can report tool calls and repairs to your team’s self-hosted control plane. It asks once before sending anything, and nothing is asked or sent without those settings.

Since then (v0.13.1, v0.13.2):

  • Many more of the tool-call forms current local models actually write are recognized: native tool calls from OpenAI-compatible servers (gpt-oss on Ollama), Devstral’s and Qwen’s own formats, a tool name used as the tag, a call glued to the end of a sentence, and others. A call with a broken or missing close tag no longer swallows the model’s next turn into its arguments, which had written junk into files.
  • An empty reply in the middle of a task gets a nudge instead of ending the turn.
  • A call closed with </tool_result> instead of </tool_call> no longer hides the calls after it.
  • Security hardening: a crafted glob pattern can no longer hang the CLI, self-update runs the package manager without a shell, and the web tools strip scripts more strictly.

Opt-in usage telemetry, kept on your machine. With telemetry: true, Polyglot records which provider, model and server host you use, and whether tool calls needed repair or failed: no prompts, file contents, tool arguments or model output. You’re asked once in the interactive UI. It’s written under ~/.polyglot/telemetry and nothing is sent anywhere. /status shows the setting.

Also (v0.11.1): grep given a single file now searches it, instead of finding nothing; a path that doesn’t exist says so instead of “No matches”; and a path pointing at a secret-looking file is refused.


Replay a saved session. polyglot replay <id|path> re-runs a session against the current build and shows where it diverges from what was recorded - which tool calls resolve differently now, which repairs are no longer needed, whether a since-released fix would have helped. By default it just re-resolves the recorded model output (deterministic, no execution); --execute --seed <dir> re-runs the whole agent loop against a snapshot of your files. --output-format json for scripting; --save turns the session into a regression test. Handy when a local model breaks on something and you can’t tell whether it’s the model or Polyglot.


Remote MCP servers. An mcpServers entry can now give a url instead of a command. Polyglot connects over the current Streamable HTTP transport and falls back to legacy HTTP+SSE when a server only speaks that; headers carry auth, with ${VAR} read from the environment so tokens stay out of settings.json. MCP servers also connect in parallel now, each with a 10-second timeout, so a slow or unreachable one no longer holds up startup.

Dependency modernization. zod 4, openai 7, glob 13, ink 7 / react 19, and chalk dropped entirely - no behaviour change, and a few moderate pnpm audit advisories cleared along the way.


Secret & PII scanning. Every tool result - shell output, file reads, web fetches, MCP tools - is now scanned for secret-looking values (API keys, tokens, private keys) before it reaches the model, and flagged in the transcript and the audit log. On by default in warn mode; set redaction.mode: "redact" to strip them, redaction.pii: true to add email/SSN/card detection. This is content-based and complements the existing path-based prompting for secret-named files.

Hooks. A hooks block in settings.json runs your own shell commands at three points: preToolUse (block a tool call), postToolUse (block a result), and userPromptSubmit (block a prompt or add context to it). Exit 2 blocks; optional stdout JSON gives structured control. Hooks in a project’s settings file are off unless the global config sets hooks.allowProjectHooks: true.


File mentions. Type @ in the input for a fuzzy-search list of the project’s files; on send, each @<path> is replaced with the file’s contents inline, so the model has it without a read_file call. The list respects .gitignore; secret files are never inlined. Works in -p mode too.

Agent definitions. Drop a .polyglot/agents/<name>.md - frontmatter for the description, an optional tool allowlist, an optional model; the body is the system prompt - and run it with @name <task> at the start of a message. It runs as a one-shot sub-agent with only its allowed tools and streams its result. The model can also delegate to one on its own through an agent_<name> tool. /agents lists them.

Skills. Put a focused instruction bundle at .polyglot/skills/<name>/SKILL.md and switch it on for the session with @name - its guidance is added to the system prompt until /skill off. Bundled files sit alongside SKILL.md and the model reads them on demand. Same SKILL.md layout as Claude Code, so skills are portable. /skills lists them.


Model failover. Configure a routing.failover list and, when the active model errors out or stops producing valid tool calls mid-turn, the turn continues on the next model instead of stopping. The switch is sticky for the session and shown in the transcript; /model puts you back. Point a local model at a hosted one (or the reverse) and you keep working through an outage on either side.

Dedicated models for compaction and planning. routing.summaryModel runs /compact on a cheaper model; routing.planModel runs plan-mode turns on a model of your choice.

Cheaper sub-agent model. Set subAgentModel and task sub-agents run on it instead of inheriting the parent’s model - delegated grunt work doesn’t need your best model. Sub-agent token cost now shows up in /cost as its own line.

Share a session. polyglot share <id> exports a transcript to Markdown or a standalone HTML file, with secret-looking values scrubbed by default, for pasting into a PR or a bug report. --resume now also accepts a path to a .jsonl session file, so a session can be handed between people.

Per-model reliability. A running tally of how each model is doing at tool calls this session - calls made, repairs needed, parse failures, give-ups - shown in /status, the new /reliability command, and next to each model in the /model picker (“92% clean this session”). The status bar flags trouble once there is any.

Prompt caching (Anthropic). The system prompt is marked cacheable, so from the second turn of a session it’s served from cache at roughly a tenth of the input-token price. /cost reflects the discount automatically - nothing to configure.


First-run setup. Running polyglot with no config now launches an interactive polyglot init wizard instead of exiting with an error.

Project instructions. Polyglot reads AGENTS.md / POLYGLOT.md from your repo (and ~/.polyglot/ for global rules) and prepends them to the system prompt - standing context like build commands and conventions. AGENTS.md is the cross-tool standard, so a repo set up for another agent already works.


Repairs are visible. When Polyglot fixes a malformed tool call from a weak model, the card shows a ↺ repaired marker; Ctrl+R / /raw show the model’s verbatim output; /reliability keeps a per-model tally. A parser fix can no longer quietly mask a model getting worse.


Older releases: see the full changelog.