@earendil-works/pi-ai
1.4.0 · 21 Oct 2026MIT4.7M / weekRepositoryHomepagenpmAtom feed
61 stable releases, newest first, by release line. Notes are quoted as the maintainers published them.
- 1.x · latest line
1.4.0
21 Oct 2026Image input for classifiers: codemode
models.classify()acceptsimagesfor TypeSafe's Jev and Cloudflare's Clef models ontypesafe,cloudflare-workers-ai, and OpenRouter. See Use classifier models and Codemode.Models Configuration reference: every provider, model, model override, and compatibility field of
models.json, generated from its schema. See Models Configuration.Summaries without a fixed output cap: compaction and branch summaries use the model's output limit, so long reasoning no longer makes them fail. See Compaction.
New Features
Image input for classifiers: codemode
models.classify()acceptsimagesfor TypeSafe's Jev and Cloudflare's Clef models ontypesafe,cloudflare-workers-ai, and OpenRouter. See Use classifier models and Codemode.Models Configuration reference: every provider, model, model override, and compatibility field of
models.json, generated from its schema. See Models Configuration.Summaries without a fixed output cap: compaction and branch summaries use the model's output limit, so long reasoning no longer makes them fail. See Compaction.
Codemode waits for a free worker: parallel scripts and in-process subagents queue instead of failing, and
PI_CODEMODE_MAX_WORKERSraises the limit. See Codemode limits.Rex terminal support: OSC 8 hyperlinks, truecolor, and inline images.
Added
Added a Models Configuration reference generated from the
models.jsonschema, listing all provider, model, model override, and compatibility fieldsCodemode
models.classify()now acceptsimagesfor TypeSafe's Jev and Cloudflare's Clef models ontypesafe,cloudflare-workers-ai, and OpenRouter, and lists Clef Omni and Jev 1.14 on Workers AI.Provider-level
compatinmodels.jsonnow also applies to classifier models, with the System One fieldsimageInputandsendImageOptInHeaderfor proxies that serve another service's classifiers. Extension classifier models acceptcompattoo.Added
MiniMax-M3.1-Flashto theminimaxandminimax-cnproviders, with thinking levels low through maxAdded support for the Rex terminal: OSC 8 hyperlinks, truecolor, and inline images (#11131, #11150
Changed
Provider attribution headers now come from pi-ai's client identity. Extensions'
before_provider_headershandlers no longer see the OpenRouter, NVIDIA NIM, and OpenCode attribution headers; returningnullfor one still removes it. Cloudflare requests send pi's detailedUser-Agentinstead ofpi-coding-agent, as do GitHub release checks for tool downloads, and OpenCode requests sendx-opencode-clientwhenever attribution is enabled, not only with a session.generateSummary()andgenerateSummaryWithUsage()now ignore theirreserveTokensparameter. Summary requests use the model's output limit instead.Changed the default GitHub Copilot model from
gpt-5.4, which Copilot retired, togpt-6.1-sol.Changed the default NVIDIA model to
nvidia/nemotron-3.5-super-vl-120b-a12bChanged the default Xiaomi model to
mimo-v2.6-profor thexiaomiand Xiaomi Token Plan providers, sincemimo-v2.5-proleft the catalog.Grok 4.3 and Grok 4.5 on the
xaiprovider now offer thexhighthinking level.Sign in with ChatGPT: ChatGPT Business workspace usage-limit errors are not retried and tell the user to ask their workspace admin to increase the limit.
Fixed
Fixed compaction and branch summaries failing with "generation hit the token cap" when reasoning used most of the fixed summary output limit. Summaries now use the model's output limit, and
compaction.reserveTokensonly controls when compaction starts (#9512, #9075).Fixed
models.schema.jsonmissing descriptions for provider and model fields, so editors showed no hints for themFixed
pi updatefailing with "Managed install marker is missing or invalid" whenmanaged-install.jsonstarts with a UTF-8 BOM, which Windows PowerShell 5.1 adds when it rewrites the file.Fixed HTML export showing literal asterisks for Markdown bold and italic next to CJK punctuation (#3353, #10154)
Fixed the terminal staying in mouse-tracking, focus-reporting, Kitty keyboard, and alternate-screen modes when pi exits without its normal terminal teardown, which flooded the shell prompt with escape sequences
Fixed concurrent extension
select/confirm/input/editordialogs and inlinecustom()components in interactive mode: a second dialog replaced the first and the first promise never settled; closing the visible dialog now shows the previous one again (#11166, #9909)Fixed pasting in the shell hanging after copying text in pi and suspending it with Ctrl+Z on Linux: the background
wl-copy/xclip/xselprocess that keeps serving the clipboard was suspended along with piFixed codemode scripts failing immediately when both codemode workers are busy, for example with parallel codemode calls or in-process subagents. Scripts now wait up to 60 seconds for a free worker, and
PI_CODEMODE_MAX_WORKERSraises the limit of two workersFixed extensions failing to load when importing
@earendil-works/pi-ai/models(e.g. forclampThinkingLevel) by exposing the subpath through the extension loader aliases and virtual modulesFixed
mcp.jsonfiles that start with a UTF-8 BOM failing to parse, which skipped all their MCP servers and madepi mcp add/pi mcp removefailFixed
/compact <instructions>ignoring the instructions when summarizing the start of a turn that compaction splits. When the split turn was the only new content since the last compaction, the instructions were ignored entirelyFixed resumed sessions and
/treenavigation leaving extension tools inactive when the branch recorded its tools before they were registered, such as tools from extensions installed after the session started. Extension tools the branch never added or removed are now active unless they are registered withdefaultActive: false(#11062, #11075)Fixed sessions breaking after recovery from a response cut off at the output limit: the truncated tool call was omitted but its tool results were kept, so providers rejected every later request (#11227, #11233
Fixed the
greptool followingRIPGREP_CONFIG_PATH, where options such as--fixed-stringssilently changed regex searches into literal ones. The tool now runsrg --no-config(#11203, #11230Fixed Windows shell detection rejecting runnable Microsoft Store shell aliases
Fixed Windows shell detection missing PowerShell outside
PATHand the legacy WSLbash.exelauncher when Windows is not installed inC:\Windows. pi now checks%ProgramFiles%\PowerShell\7,%SystemRoot%\System32\WindowsPowerShell\v1.0, and%SystemRoot%Fixed GitHub Copilot sessions with large request bodies, such as many images, failing with HTTP 413
failed to parse requestinstead of compacting and retryingFixed the
openai-codexprovider offeringgpt-5.5andgpt-5.3-codex-spark, which always fail for ChatGPT accountsFixed whitespace-only tool output (for example a bare
\r\nfrom bash) making OpenAI Completions, OpenAI Responses, and Google requests fail with a 400Fixed automatic retry not triggering for more gateway upstream failures,
stream disconnected before completionerrors relayed by Codex CLI proxies, and transient Google Vertex OAuth token refresh failures, and retrying errors because of digits inside request ids or byte counts (#10920, #11057, #10996)Fixed OpenAI Responses models losing the prompt cache on every deferred tool load after a tool was removed
Fixed Cloudflare Workers AI classifier pricing: Clef Flash costs $0.038 and Jev $0.042 per million input tokens instead of Jev being listed as free.
Fixed an unclosed
$$display-math block swallowing or corrupting every Markdown table after itFixed Markdown bold and italic not rendering next to CJK punctuation
Fixed
@file autocomplete returning no results for queries containing regex metacharacters such as[or(
1.3.0
15 Oct 2026Choose where
/shareuploads:sessionShareDestinationselectsauto,gist, orradius. See Sessions and context and Export or share a session.Cache-preserving thinking level changes on OpenAI GPT-6: changing the thinking level mid-session with an API key keeps the prompt cache.
Kimi Code over Chat Completions: tools added mid-conversation no longer invalidate the prompt cache.
models.jsonbase URL overrides must now include/v1. See Providers.
New Features
Choose where
/shareuploads:sessionShareDestinationselectsauto,gist, orradius. See Sessions and context and Export or share a session.Cache-preserving thinking level changes on OpenAI GPT-6: changing the thinking level mid-session with an API key keeps the prompt cache.
Kimi Code over Chat Completions: tools added mid-conversation no longer invalidate the prompt cache.
models.jsonbase URL overrides must now include/v1. See Providers.Clean model switching: thinking from a previous model is dropped instead of being shown to the new model as text.
Resumed sessions keep their active tools:
--tools +name/-nameapplies on top of them. See Tools.
Added
Changing the thinking level mid-session on OpenAI GPT-6 models (API key) now keeps the prompt cache
Added the
sessionShareDestinationsetting to choose automatic, GitHub gist, or Radius uploads for/share
Changed
Changed the
kimi-codingprovider to use OpenAI Chat Completions athttps://api.kimi.com/coding/v1, the protocol used by the official Kimi Code client. K3, K3-256K, and Kimi For Coding now accept tools added mid-conversation without invalidating the prompt cache.models.jsonoverrides of thekimi-codingbase URL must now include/v1Changed model switching to drop thinking blocks from earlier assistant messages produced by a different model, instead of sending them as plain text. The new model previously saw the old model's reasoning as part of its replies and could start writing its own reasoning into the visible answer
Fixed
Pinned internal Pi dependencies to exact release versions to prevent fresh installs from mixing incompatible packages
Fixed resumed sessions dropping tools activated during the session. Resume now restores the session's active tools, with
--tools +name/-nameentries applied to them, unless--toolswith tool names,--no-tools, or--no-builtin-toolsselects tools explicitlyFixed stopping a codemode script or reaching its deadline waiting for a non-interruptible built-in to return on Bun
Fixed repeated codemode timeouts or aborts accumulating surviving workers; admission now limits live workers to two across sessions, counting cancelled workers until actual exit
Fixed
--modelchoosing a provider by catalog order when several providers offer the match; Pi now prefers the provider with credentials and otherwise reports the ambiguity.--modelsandenabledModelsadd a model for each provider that offers it and warn about the ambiguityFixed
readline-range labels for numeric-string or null arguments in the TUI, session tree, HTML exports, and examplesFixed the Nix flake build failing when a provider switched APIs: the model catalog pin is now refreshed from the newest published catalog when its model API groups differ, and releases pin the newest catalog and build with it before tagging
Fixed the Nix package putting its Node.js first on
PATH, which made bash tool shells use Pi's Node instead of the user'snode/npm. Pi's Node is now only a fallbackFixed prompt templates dropping empty quoted arguments (
""or''), which shifted later positional arguments and prevented positional defaults from applyingFixed the Nix package build failing in its install check because it still expected chord and esbuild, which Pi no longer depends on
Fixed tool-call argument parsing dropping fields when a string contains an invalid
\uescape such as\usepackageFixed Anthropic and Bedrock Claude requests failing with a 400 when an error tool result contains images; the images are now sent after the tool results of the turn, so the model still sees them
Fixed OpenCode Go Gemini models failing with a 404 by moving OpenCode Zen and OpenCode Go to the
opencode.ai/inferenceendpoints, and added Google Generative AI support to the OpenCode Go providerFixed OpenCode Go MiniMax M2.7 failing with "Model does not support this protocol" by using the Anthropic Messages API
Fixed automatic retry not triggering for gateway
Unable to forward upstream streamerrorsFixed automatic retry not triggering for
The service is temporarily unavailableerrors, which also made compaction fail on the first attemptFixed OpenAI-compatible responses showing thinking after the answer when a proxy such as LiteLLM sends reasoning and content in the same stream chunk
Fixed Gemini 4 Argon requests on Google Vertex failing with "Thinking budget is not supported", and its thinking level being ignored on the Gemini API
Fixed Xiaomi MiMo models failing with a 400 at the
minimalthinking level; they now expose only theoffandhighlevelsFixed
openai-codex/gpt-6.1-solusing a 272K context window instead of the 500K window Codex now providesFixed tool calls whose final arguments are malformed JSON silently running with only the fields parsed before the error; they now fail validation and show the model the raw arguments it sent
Fixed Claude Haiku 5.5 and Claude Opus 5 not supporting the
offthinking levelFixed
done()of an extension'sctx.ui.custom({ overlay: true })closing the topmost overlay instead of its own, which left the finished overlay on screen and another extension's dialog unresolved (#10648, #10999
1.2.0
12 Oct 2026- breaking
Published generated configuration schemas for models, settings, keybindings, and themes at
https://pi.dev/schemas/*.schema.json. The theme schema moved tohttps://pi.dev/schemas/theme.schema.json; themes loaded during startup now receive the same schema validation as later reloads. Update theme$schemareferences, define reusable colors undervars, and remove unsupported metadata (#9880, #10751 - breaking
Changed
before_agent_startto also fire for runs started bypi.sendMessage(..., { triggerTurn: true })while idle.BeforeAgentStartEventis now a union onmessageType:"user"events carrypromptandimages, and"custom"events carry the startingmessageand noprompt. Messages returned by handlers are added to both kinds of run, and pendingdeliverAs: "nextTurn"messages are delivered with the custom-message run. Handlers that should act only on user prompts must checkevent.messageType === "user"(#10267, #5581, #10739 - breaking
Changed the session to count as busy while a run starts, including during
before_agent_starthandlers:ctx.isIdle()is false,pi.sendMessage()queues into the starting run instead of starting a second run that failed with "Agent is already processing",pi.sendUserMessage()requiresdeliverAs, and an abort requested meanwhile aborts the run once it starts
New Features
Per-key OpenRouter model lists: with an OpenRouter key, Pi lists only the models that key may use, with the key's context size, max output, and prices, including regional endpoints set in
models.json. See OpenRouter.Published configuration schemas: add
$schematosettings.json,models.json, keybindings, and themes for editor validation and completion. See Settings, Models, Keybindings, and Themes.Clipboard copies over remote sessions:
PI_CLIPBOARD_OSC52=1sends copied text to a remote client's clipboard when Pi cannot detect the remote session, such as a multiplexer attached from another machine. See Pi Process Configuration.Codemode improvements: tool declarations show input constraints such as integer, minimum/maximum, and default, and codemode rows show elapsed and total time. See Codemode.
before_agent_startfor extension-triggered runs: runs started bypi.sendMessage(..., { triggerTurn: true })go through the same setup as prompts. See Events and concurrency.
Breaking Changes
- breaking
Published generated configuration schemas for models, settings, keybindings, and themes at
https://pi.dev/schemas/*.schema.json. The theme schema moved tohttps://pi.dev/schemas/theme.schema.json; themes loaded during startup now receive the same schema validation as later reloads. Update theme$schemareferences, define reusable colors undervars, and remove unsupported metadata (#9880, #10751 - breaking
Changed
before_agent_startto also fire for runs started bypi.sendMessage(..., { triggerTurn: true })while idle.BeforeAgentStartEventis now a union onmessageType:"user"events carrypromptandimages, and"custom"events carry the startingmessageand noprompt. Messages returned by handlers are added to both kinds of run, and pendingdeliverAs: "nextTurn"messages are delivered with the custom-message run. Handlers that should act only on user prompts must checkevent.messageType === "user"(#10267, #5581, #10739 - breaking
Changed the session to count as busy while a run starts, including during
before_agent_starthandlers:ctx.isIdle()is false,pi.sendMessage()queues into the starting run instead of starting a second run that failed with "Agent is already processing",pi.sendUserMessage()requiresdeliverAs, and an abort requested meanwhile aborts the run once it starts - breaking
Changed
pi mcp list --jsonto reportresources: truefor servers that offer resources instead ofresourcesandresourceTemplatescounts; Pi no longer lists resources when connecting
Added
Added
reachesToolsto tool definitions, so tools that reach other tools (such ascodemodeandtool_search) declare which tools a call may reach; the MCP extension uses it to wait for the servers a call needs and to decide whether a replacementcodemodeortool_searchtool can reach MCP toolsAdded
aliasesto tool namespaces; codemode'sdescribeNamespace()and thenamespaceoption ofsearchTools()match them, and MCP namespaces use the server nameAdded per-key OpenRouter model lists: with an OpenRouter key, Pi lists only the chat models that key may use, with the key's context size, max output, and prices, including guardrails and regional endpoints set as the base URL in
models.json. The list is saved and used offline (#10353, #10672Added
PI_CLIPBOARD_OSC52=1to send copied text to the terminal with OSC 52 after the local clipboard write, so copies reach a remote client's clipboard when Pi cannot detect the remote session, such as multiplexer attaches from another machine or remote IDE daemons (#10826, #10835, #10114)Added elapsed time while a codemode script runs and its total time once finished to the codemode tool row, like bash rows
Changed
Changed the
showHardwareCursorsetting to use only the terminal cursor instead of also drawing Pi's reverse-video cursorChanged codemode tool declarations to show input constraints such as integer, minimum/maximum, length, pattern, and default as
@tags on property comments, so scripts see them without the tool repeating them in descriptionsChanged codemode declarations of MCP tools to spell out the result type (
content,structuredContent,isError) instead of referring toCallToolResult<T>, whichdescribeTool(),searchTools(), andALL_TOOLSshowed without defining it; the codemode description no longer includes the shared MCP typesChanged
serializeConversation()(compaction, branch summaries, bug reports) to omit thinking blocks; replayed thinking is often not in the live context, so including it could make a summarization request larger than the context it summarizes and fail
Fixed
Fixed codemode ignoring a
// @options:line that is not the first line of the script, which ran the script without the requestedtimeout_ms; the call now fails with an error before the script runsFixed Mistral streams being aborted mid-generation (e.g. during long thinking) after the request timeout; the timeout now applies only to waiting for response headers
Fixed a symlinked
AGENTS.mdin a git worktree nested inside its main repo causing no project context file to loadFixed the code mode tool description claiming every failed tool call rejects; a tool that declares an output schema resolves with its value on failure too (e.g.
bashwith a nonzero exit)Fixed runs started by
pi.sendMessage(..., { triggerTurn: true })removing system prompt sections added inbefore_agent_startafter their first tool call, which changed the prompt mid-run and broke the provider prompt cache twice per run (#10267, #10739Fixed codemode blocking the process for seconds to minutes after scripts with many
text()calls; joining the output items was quadraticFixed print mode (
-p) exiting 0 without a warning when the final response was cut off at the model's output token limit; it now prints the partial text, writes a warning to stderr, and exits 1Fixed
pi mcp login --helpand the CLI docs describing--timeoutas only the wait for the browser; it limits the whole sign-inFixed
~not being expanded in!pattern,+path, and-pathentries of theextensions,skills,prompts, andthemessettings, so entries like!~/skills/pdfmatched nothingFixed MCP servers with resources registering no tools until every resource was listed; Pi no longer lists resources when connecting, so
/mcpandpi mcp listshow that a server offers resources instead of counting themFixed MCP tool calls failing when the server returns structured content that is not an object (an array,
null, or a primitive, as MCP 2026-07-28 allows); codemode declarations of MCP tools without an output schema now typestructuredContentasunknowninstead of an objectFixed reading or writing
auth.jsonon Windows failing withEPERMwhen the previous lock folder was still being deleted; Pi now retries briefly before reporting the errorFixed OpenRouter router models such as
openrouter/autoshowing a cost of -$1,000,000 per 1M tokens; OpenRouter's negative placeholder prices are now 0Fixed Anthropic requests failing when the provider rejects the strict tool set for grammar size, tool count, or union limits; Pi now retries once with preferred tools non-strict
Fixed "The upstream provider returned an error" not being retried as a transient provider error
Fixed focused fullscreen overlays blocking mouse-wheel scrolling of the transcript
Fixed fragmented terminal color replies leaking hex values into the prompt and opening the external editor (related reports: #10256, #10657)
Fixed inline images not rendering in Herdr since 1.1.0
Fixed key bindings that name a shifted symbol, such as
+orctrl++, not matching under the Kitty keyboard protocol or modifyOtherKeysFixed the compaction status indicator embedded in a custom editor using the default muted colors instead of the editor border or thinking-level color, as the working indicator does (#10809, #10810
Fixed MCP tool calls that were cancelled or timed out while waiting for an OAuth refresh still being sent to the server once the refresh finished
Fixed MCP OAuth sign-in accepting an authorization response with an
issparameter that could not be checked because no authorization server metadata was discovered; sign-in now fails with an issuer mismatch. ReportedFixed codemode failing with a broken bridge error when Pi runs under
node --watchon Node 24 or 26
Removed
- breaking
Removed the unreleased experimental server, client, and plugin stack (
src/experimental,src/cli/experimental) and its source-only./clientand./experimental/pluginexports; none of it was part of the published package. The@earendil-works/pi-client,@earendil-works/pi-protocol, and@earendil-works/pi-serverpackages it used are removed and no longer released - breaking
Removed the dependency on
@earendil-works/chord
1.1.0
7 Oct 2026Program status reporting: terminals and agent dashboards that support OSC 7501 see whether Pi is working, blocked on a dialog or login, done, or failed. See Program status.
Claude Haiku 5.5:
anthropic/claude-haiku-5-5, with adaptive thinking up toxhigh/maxeffort.Adjust default tools with
+name/-name:--toolsentries likepi -t +codemode,-writechange the default selection instead of replacing it. See Tools.
New Features
Program status reporting: terminals and agent dashboards that support OSC 7501 see whether Pi is working, blocked on a dialog or login, done, or failed. See Program status.
Claude Haiku 5.5:
anthropic/claude-haiku-5-5, with adaptive thinking up toxhigh/maxeffort.Adjust default tools with
+name/-name:--toolsentries likepi -t +codemode,-writechange the default selection instead of replacing it. See Tools.GPT-6 Luna and image classification: OpenAI's GPT-6 Luna is available as a classifier model through the Decisions API, and codemode's
models.classify()accepts images for classifiers that support them. See Use classifier models.Native llama.cpp decision models: Julia-1, Laya, Kev, lev, and OpenJev served by llama.cpp 0.6.0 or later run natively as classifiers through
/v1/systemone. See Classification.
Added
Added
+nameand-nameentries to--tools, which change the default tool selection instead of replacing it, for examplepi -t +codemodeAdded
durationMsto the tool render context and totool_execution_endextension events: the recorded execution time of a final tool resultAdded
outputPadto the tool render contextAdded OpenAI's GPT-6 Luna as a classifier model through the Decisions API, available with
OPENAI_API_KEY(see Use classifier models)Added
imagesto codemode'smodels.classify()context, so classifiers that accept images, such as GPT-6 Luna, can judge themAdded program status reporting with OSC 7501: terminals and agent dashboards that support it see whether Pi is working, blocked on a dialog or login, done, or failed.
PI_PROGRAM_STATUS=1|0overrides detection (see Terminal setup)Added
abortedtoagent_settledsession, extension, and JSON events, so integrations can tell a cancelled run from a finished oneAdded Claude Haiku 5.5 (
anthropic/claude-haiku-5-5), with adaptive thinking up toxhigh/maxeffort and prompt caching on BedrockAdded native llama.cpp decision models: Julia-1, Laya, Kev, lev, and OpenJev served by llama.cpp 0.6.0 or later are listed only as classifiers through
/v1/systemoneinstead of as chat models (see Classification)
Changed
Changed
outputPadto also apply to!command output, tool output, and summary blocks (#9946, #10557Changed
pi mcp login --timeoutto limit the whole sign-in, including requests to the authorization server, instead of only the wait for the browser
Fixed
Fixed bash and PowerShell results losing
Tookafter reloading a session, and the liveTookincluding wall-clock steps; both now show the recorded execution timeFixed managed installs keeping every old release;
pi updatenow keeps only the new release and the one it updated from (#10392, #10511Fixed standalone binaries loading
.env,.env.local, and.env.developmentfrom the launch directory into Pi's environmentFixed
!!command headers losing their dim color once output arrivesFixed the codemode description not marking
searchTools(),describeTool(), anddescribeNamespace()as async, which led models to serialize the unawaited promise as{}Fixed codemode output items running together, so models could not tell where one
text()orconsole.log()output ended and the next began. With several text items, each now starts with a==> text N/M <==line, andconsolecalls follow the other output in one<console_output>block with one line per callFixed
/mcpwaiting for all servers to connect before opening; the manager now updates live and remains usable while enabling, reconnecting, or disabling serversFixed images being dropped as "could not be resized" when running under
node --watchon Node 24.19+ and 26.x, where Node posts its own messages on the image resize worker channelFixed clipboard paste doing nothing in Termux, and failed copies there omitting the Termux:API install hint
Fixed
!and RPCbashoutput keeping fragments of color codes, such as a straym, when a code was split across output chunksFixed MCP OAuth sign-ins that could not be cancelled while waiting on the authorization server and kept running after the session ended. The sign-in screen now cancels with Esc at every step, session shutdown aborts a running sign-in, and each request to the authorization server times out after 15 seconds
Fixed shutdown waiting up to 15 seconds to refresh an MCP OAuth token that was about to expire, only to close the server's session
Fixed the fullscreen text selection surviving session switches and other transcript rebuilds, which highlighted unrelated text in the new transcript (#9311, #10567
Fixed OpenAI models on Bedrock ignoring the thinking level and always running at Bedrock's default reasoning effort (#9331, #10142
Fixed model
headersinmodels.jsonnot overriding theoriginatorandUser-Agentheaders of Codex requestsFixed
server_busyandservers are currently busyprovider errors ending the turn instead of being retriedFixed Mistral responses that end with
finish_reason: "error"not being retriedReduced context-limit request failures by estimating input at 3.5 characters per token instead of 4 when calculating output limits
Fixed Radius models disabled by an organization owner still being listed
Fixed Anthropic browser login failing with "localhost refused to connect" when port 53692 is reserved or in use, for example by Hyper-V/WSL port exclusions on Windows: login now falls back to a free loopback port
Fixed session costs undercounting long prompts on models with prompt-length pricing tiers, such as Claude Haiku 5.5, Gemini 3.1 Pro, and GPT-5.4, through OpenCode, OpenCode Go, OpenRouter, Vercel AI Gateway, Google, MiniMax, and other providers
Fixed Markdown links not being clickable in Herdr
1.0.4
5 Oct 2026Codemode persists images:
tools.read()on an image file now gives back an image block thatimage()can show. See Call tools.Added
*patterns to--toolsand--exclude-tools, for example--tools read,codemode,'mcp__radius__*'
New Features
Tool patterns and
--no-mcp:--toolsand--exclude-toolsaccept*patterns, for example--tools read,codemode,'mcp__radius__*'keeps only one MCP server's tools.--toolsnow keeps MCP tools unless an entry starts withmcp__, and--no-mcpturns off MCP for one run. See Tools and MCP tools.Codemode persists images:
tools.read()on an image file now gives back an image block thatimage()can show. See Call tools.
Added
Added
*patterns to--toolsand--exclude-tools, for example--tools read,codemode,'mcp__radius__*'Added
--no-mcpto disable the built-in MCP support for one run
Fixed
Fixed syntax highlighting losing colors after the first line of multiline strings and comments in fenced code blocks
Fixed codemode scripts not receiving images from
read:tools.read()now resolves to an image block for image files, whichimage()showsFixed MCP OAuth sign-in failing with
invalid_redirect_urion servers with OpenID Connect client registration, such asmcp.modem.dev: pi now registers as a native clientFixed
--toolsremoving MCP tools, which leftpi --tools codemodewithout any MCP servers.--toolsnow keeps MCP tools unless an entry starts withmcp__Fixed MCP session shutdown returning while a server was still connecting, leaving its transport open until the server answered or timed out
Fixed system prompt rules and the skills hint naming tools hidden by
prepareLoadout. Hidden tools are left out of the rules, the skills hint names no tool when the file reader is hidden, andcodemodeshows each tool's prompt guidelines with its declaration;ToolLoadoutgainsgetPromptGuidelines()Fixed Bedrock requests that fail with
The pending stream has been canceledafter a stalled HTTP/2 connection not being retried automaticallyFixed codemode scripts that patch built-ins (for example
Array.prototype.toJSON = ...) crashing pi and leaving the tool call unsettled. Built-ins are now frozen before the script runs, so such patches have no effect
1.0.3
5 Oct 2026- breaking
Renamed the Azure provider from
azure-openai-responsestoazure. Rename the provider key inauth.json(or run/loginagain), inmodels.json, and insettings.json(defaultProvider,enabledModelspatterns, andmodelThinkingLevelskeys). Sessions that used the old provider fall back to another model when resumed, and their prompt cache is not reused. TheAZURE_OPENAI_*environment variables are unchanged Azure Foundry Chat Completions — The
azureprovider (renamed fromazure-openai-responses) now also serves Foundry Chat Completions deployments, starting withazure/deepseek-v4-pro. See Azure OpenAI.Codemode images saved to files —
image()also writes each image to a temp file and names the path in the result, so later turns can copy or move generated images. See Generate images.
New Features
Azure Foundry Chat Completions — The
azureprovider (renamed fromazure-openai-responses) now also serves Foundry Chat Completions deployments, starting withazure/deepseek-v4-pro. See Azure OpenAI.Codemode images saved to files —
image()also writes each image to a temp file and names the path in the result, so later turns can copy or move generated images. See Generate images.
Breaking Changes
- breaking
Renamed the Azure provider from
azure-openai-responsestoazure. Rename the provider key inauth.json(or run/loginagain), inmodels.json, and insettings.json(defaultProvider,enabledModelspatterns, andmodelThinkingLevelskeys). Sessions that used the old provider fall back to another model when resumed, and their prompt cache is not reused. TheAZURE_OPENAI_*environment variables are unchanged
Added
Changed
Codemode
image()now also saves each image to a temp file and names the path in the result, so later turns can copy or move generated imagesOutput files (full text of truncated tool output, binary MCP resources, codemode images) are now readable only by the user
Home/Endnow always move the editor cursor to the line start/end; fullscreen transcript top/bottom moved toCtrl+Home/Ctrl+End, which no longer move the editor cursor
Fixed
Fixed subscription logins such as Sign in with ChatGPT failing with
refresh_token_invalidatedafter a request was cancelled during an OAuth token refreshFixed codemode failing for the rest of a session after a pnpm global update removed the running install, and added a restart hint when errors occur after pi was updated or removed on disk
Fixed interactive sessions reporting a
read EIOorsetRawMode EIOcrash (and asking to run /bug) when the terminal went away, e.g. after closing the window or resuming a suspended pi in a closed terminal
1.0.2
4 Oct 2026Sampling by thinking level —
samplingParamsByThinkingLevelinmodels.jsonsets sampling parameters such astemperatureandtop_pfor each thinking level on OpenAI-compatible APIs. See Configure sampling by thinking level.Added
samplingParamsByThinkingLeveltomodels.jsonfor per-thinking-level sampling parameter overrides on OpenAI-compatible APIs. See Configure sampling by thinking level
1.0.1
3 Oct 2026- security
Fixed installations resolving vulnerable
brace-expansion5.0.9 by pinningbrace-expansion5.0.12 as a direct dependency (GHSA-q2hr-2g5m-vwhr, GHSA-qhr7-859c-m2p7, GHSA-6j4f-fj2g-mc7p) - breaking
Removed
npm-shrinkwrap.jsonfrom the published package. npm installations no longer pin transitive dependencies, and library consumers can now override them. Use the pi.dev installer for pinned installations Nix flake —
nix run github:earendil-works/pi/stableruns the latest release, andnix profile add github:earendil-works/pi/stableinstalls it. See Install pi.
New Features
Nix flake —
nix run github:earendil-works/pi/stableruns the latest release, andnix profile add github:earendil-works/pi/stableinstalls it. See Install pi.Project overrides for MCP servers —
.pi/mcp.jsonand/mcpcan enable, disable, or change the exposure of a user-level server for one project. See Configure servers.MCP Client ID Metadata Documents —
oauth.clientRegistration: "cimd"lets authorization servers allow pi by its document URL instead of dynamic registration. See Authenticate with OAuth.Tool renderers for any tool —
pi.registerToolRenderer()draws calls to tools that are not registered yet, such as MCP tools in resumed sessions. See Tool rendering.Cloudflare Clef classifiers —
@cf/cloudflare/clefand@cf/cloudflare/clef-flashare usable from codemode scripts and extensions. See Use classifier models.
Added
Added a copy key (
app.message.copy, defaultctrl+x) to OAuth sign-in screens in/login,/mcp, and/mcp login, which copies the sign-in URL when the browser cannot be opened or the wrapped link cannot be selected.Added
oauth.clientRegistration: "cimd"for MCP servers, which identifies pi with its Client ID Metadata Document on pi.dev instead of dynamic client registration, so authorization servers can allow pi by URLAdded project overrides for user-level MCP servers: a
.pi/mcp.jsonentry withoutcommandorurlsets onlyenabled,exposure, andtoolExposureof the user-level server, and/mcpcan enable or disable a server for the current projectAdded Cloudflare's Clef and Clef Flash classifier models to
cloudflare-workers-ai, usable from codemode scripts and extensionsAdded
pi.registerToolRenderer(), which chooses how calls to a tool are drawn, including tools that are not registeredAdded a Nix flake for macOS and Linux:
nix run github:earendil-works/pi/stableruns the latest release, andnix profile add github:earendil-works/pi/stableinstalls it. See Install pi
Changed
pi updateon global npm installations now recommends migrating to the managed installation from the pi.dev installer, which pins all dependencies.Anthropic tools added or redefined mid-conversation are now defined inline in the conversation, so redefining a tool under the same name keeps the prompt cache instead of resending the full tool list.
Fixed
- security
Fixed installations resolving vulnerable
brace-expansion5.0.9 by pinningbrace-expansion5.0.12 as a direct dependency (GHSA-q2hr-2g5m-vwhr, GHSA-qhr7-859c-m2p7, GHSA-6j4f-fj2g-mc7p) Fixed a trailing comma in
--modelsadding an extra model to the model cycleFixed a
codemodescript that prints in a loop crashing pi by running out of memory: a script fails once its output passes 16 Mi characters or 100000 itemsFixed JPEG, GIF, and WebP images rendered by extensions through
Imagenot appearing in Kitty, Ghostty, WezTerm, and WarpFixed MCP tool calls in resumed sessions and HTML exports rendering fully expanded until their server connected, or for good if it never did
Fixed fullscreen Kitty images collapsing to a one-row strip after scrolling in WezTerm
Fixed "Selected model is at capacity" provider errors ending the turn instead of being retried
Fixed Cloudflare AI Gateway Claude models failing with a 404 by using dashed model IDs (
claude-opus-5-5instead ofclaude-opus-5.5)Fixed Sign in with ChatGPT continuing when its callback port is taken by another login, which made the browser show "OAuth state mismatch"; it now fails with a port-in-use error
Fixed Amazon Bedrock OpenAI models costing requests above 272k input tokens at the short-context rate; Bedrock models now include the pricing tiers listed on models.dev
Fixed Amazon Bedrock Claude requests failing with "Invalid
signatureinthinkingblock" after the system prompt or tools changedFixed Together DeepSeek V4 Pro losing its thinking level controls after Together renamed it to
deepseek-ai/DeepSeek-V4-Pro-0813Fixed the default NVIDIA model pointing at
nvidia/nemotron-3-super-120b-a12b, which NVIDIA no longer serves; the default is nownvidia/nemotron-3-ultra-550b-a55b
Removed
- breaking
Removed
npm-shrinkwrap.jsonfrom the published package. npm installations no longer pin transitive dependencies, and library consumers can now override them. Use the pi.dev installer for pinned installations
1.0.0
1 Oct 2026Fullscreen by default — The TUI now runs fullscreen. Set
tuiModeto"regular"to keep the terminal's normal scrollback. See Terminal and display.Leaner codemode — About 40% fewer prompt tokens, and errors that tell the model how to recover. See Codemode.
Image generation in codemode — Scripts call
models.generateImages()with the session's credentials. See Generate images and Use image models.
New Features
Fullscreen by default — The TUI now runs fullscreen. Set
tuiModeto"regular"to keep the terminal's normal scrollback. See Terminal and display.Leaner codemode — About 40% fewer prompt tokens, and errors that tell the model how to recover. See Codemode.
Image generation in codemode — Scripts call
models.generateImages()with the session's credentials. See Generate images and Use image models.Radius in
/login— Sign in with Radius and set up its MCP server in one step. See Radius.Anthropic copy code login — Sign in when the browser runs on another machine. See Authenticate interactively.
MCP OAuth hardening —
oauth.authServerMetadataUrl, RFC 9207isschecks, credentials per server, and step-up sign-in that keeps granted scopes. See Authenticate with OAuth.Header-only quiet startup —
quietStartup: "header"keeps the version and key hints and hides the rest. See Terminal and display.
Added
Added an
oauth.authServerMetadataUrlsetting for MCP servers that advertise a wrong OAuth authorization server or none. Pi uses the configured metadata document instead of discovery (#10172).Added
quietStartup: "header", which keeps the startup header with version and key hints but hides the model scope line and loaded-resource listing.Added
models.generateImages()to codemode scripts. It runs image models such as OpenRouter's with the session's credentials and returns base64 image blocks thatimage()attaches to the result; usage counts toward the session cost likemodels.classify(). Extensions can callctx.modelRegistry.generateImages(). See Use image models.Added a copy code login method to Anthropic
/loginfor headless setups where the browser runs on another machine
Changed
Changed the default TUI mode to fullscreen. Set
tuiModeto"regular"or pass--tui-mode regularto keep the terminal's normal scrollback./loginnow offers "Sign in with Radius" at the top level, as the last option, with its status. After a Radius sign-in,/loginoffers to configure the Radius MCP server in the globalmcp.jsonwith"auth": { "provider": "radius" }and reloads. Cancelling a login returns to the menu it was started from.The provider docs page is renamed to Providers, its "Cloud Providers" section is now "Provider Specific Config", and it documents Radius first.
MCP OAuth credentials are now stored per server name and URL, so MCP servers with the same URL can sign in with different accounts. Credentials stored by URL alone move to the first server that uses them (#10252).
Codemode costs far fewer prompt tokens: with the default tools and codemode active, a GPT-5.6 request shrinks from about 5,300 to 3,300 tokens. The
codemodedescription lists the script globals in one line each and points to the new Codemode reference for themodelsAPI, which the model reads when it needs it. Declared tools say in one line how scripts call them and what the call resolves to, instead of repeating their full declaration, and the system prompt's codemode guidance and MCP server section are shorter.Codemode errors now say how to recover: reading a tool or
modelsmember that does not exist names the close matches (tools.Bashsuggeststools.bash),models.classify()andmodels.generateImages()reject malformed arguments with the expected shape, an unknown model points tomodels.getAvailableOfType(), an oversizedstore()value explains what the store is for, and a script that generates images without showing them gets a note. Scripts that probed for a tool withtypeof tools.namemust use"name" in tools./loginand/logoutnow label providers without credentials as "not configured" instead of "unconfigured".OAuth browser pages now show the color Pi logo.
Fixed
Fixed MCP OAuth sign-in accepting an authorization response whose
issparameter names another authorization server; the code is now rejected before it is exchanged (RFC 9207).Fixed MCP OAuth sign-in failing with
Invalid scopewhen the token response contains"scope": "", and similar failures for other empty ornulloptional OAuth fields (#10266).Fixed the sign-in URL printed by
/mcp loginnot being clickable when it wraps (#10186).Fixed
--providerwithout--modelbeing silently ignored and running the default model from another provider; it now fails with an error (#10236).Fixed MCP servers that ask for more scope (
insufficient_scope) requesting sign-in over and over. The new sign-in requested only the missing scopes, so the new token lost access the previous one had; it now keeps the granted scopes.Fixed user messages in the transcript keeping two full-width copies of every rendered line; they keep one, with identical output.
Fixed
/loginand/logoutlabeling every OAuth sign-in, including Radius, as a subscription; only subscription-backed providers say "subscription", other OAuth sign-ins say "account".Fixed the startup header logo rendering with gaps in Apple Terminal; it now shows a colored "Pi" with the version instead.
Fixed deferred MCP tools that
tool_searchloaded being dropped on resume and/reloadeven when their server reconnected before the next prompt, because the session restored its tools before the MCP servers reconnected.Fixed the system theme making pastel palettes such as Catppuccin Frappe much more vivid; palette colors now keep their chroma (#10255, #10293
Fixed slash command autocompletion not triggering when the input starts with whitespace
Fixed color bleeding past mouse selections and search highlights in fullscreen mode when a styled token ends at the highlight boundary (#10169).
Fixed memory retained per rendered message in the transcript; a long assistant message keeps about a fifth of the heap it kept before.
- 0.99.x
0.99.2
30 Sep 2026MCP servers stay out of the way: servers with the default
codemodeexposure are no longer listed in thecodemodedescription and no longer block the first prompt. They appear in a short system prompt section, and scripts find their tools withsearchTools()anddescribeNamespace(). See Control tool exposure.More MCP authentication options:
oauth.clientNamefor servers that only accept known OAuth clients, and"auth": { "provider": "<provider>" }to authenticate HTTP servers with a provider's/logintoken. See Authenticate with OAuth.Anthropic workload identity federation from the Anthropic SDK environment variables. See Use an API key from the environment.
New Features
MCP servers stay out of the way: servers with the default
codemodeexposure are no longer listed in thecodemodedescription and no longer block the first prompt. They appear in a short system prompt section, and scripts find their tools withsearchTools()anddescribeNamespace(). See Control tool exposure.More MCP authentication options:
oauth.clientNamefor servers that only accept known OAuth clients, and"auth": { "provider": "<provider>" }to authenticate HTTP servers with a provider's/logintoken. See Authenticate with OAuth.Anthropic workload identity federation from the Anthropic SDK environment variables. See Use an API key from the environment.
/reloadenables tools newly added to thedefaultToolssetting. See Tools.
Added
Added a
descriptionfield for MCP servers (pi mcp add --description), shown with the server in the system prompt and used to rank its tools in tool search, and adescribeNamespace(name)codemode helper that returns a namespace's instructions and tool names.describeNamespace()andsearchTools()accept a namespace asmcp__dev-radius,mcp__dev_radius,dev-radius, ordev_radius.Added an
oauth.clientNamesetting for MCP servers (pi mcp add --oauth-client-name) to change the client name sent during OAuth client registration, for servers that only accept known clients (#10226).Added
"auth": { "provider": "<provider>" }for HTTP MCP servers to send a provider's current/logintoken as the bearer token instead of using MCP OAuth. The token is read on every request, so provider refreshes apply. Only allowed in the globalmcp.jsonand from extensions, and requires https except on loopback hosts.Added Anthropic workload identity federation from the
ANTHROPIC_FEDERATION_RULE_ID,ANTHROPIC_ORGANIZATION_ID, andANTHROPIC_IDENTITY_TOKEN_FILEenvironment variables (see Providers) (#10177, #10242/reloadnow enables tools newly added to thedefaultToolssetting. Tools removed from it stay enabled, tools turned off during the session stay off unless newly added, and--tools,--no-tools, and--no-builtin-toolsstill override the setting (#10245).
Changed
MCP servers with the default
codemodeexposure no longer appear in thecodemodedescription; scripts find them withsearchTools().codemode-deferredis now an alias forcodemode. Usedirectexposure for tools the model should see without searching (#10212).The
codemodedescription no longer includes deferred tools, tool counts, or MCP server instructions, so it no longer changes when MCP servers connect or change their tools. Thetool_searchdescription no longer lists the servers whose tools it can load, for the same reason. Servers are listed instead in anmcp_serverssystem prompt section with a one-line summary, updated at the start of each prompt; a changed section is appended to the conversation. Scripts read server instructions withdescribeNamespace()(#10212).The first prompt no longer waits for MCP servers without
directtools. They connect in the background and are waited for when a codemode script names them, a script searches tools, ortool_searchruns (#10212).
Fixed
Fixed new sessions intermittently ignoring the saved default model, or warning that no models are available, when it belongs to an extension-registered native provider with a stored credential (#9962, #10190
Fixed the
/mcpsign-in URL not being clickable when it wraps across lines, by emitting it as a terminal hyperlink with aCmd/Ctrl+click to openline like/login(#10186).Fixed codemode
image()accepting malformed base64 data or unsupported image types, which persisted an invalid image block that made every later provider request fail with HTTP 400 (#10215).Fixed codemode failing to start its script worker from the standalone Windows executable (#10204).
Fixed prompt submission slowing down with session length, because resolving the session's model selection looked up the model catalog once per assistant message (#10198).
Fixed model lookups slowing down for providers with a refreshed pi.dev catalog, because merging remote catalog models took quadratic time.
Fixed the
built-in-tool-renderer.tsandminimal-mode.tsextension examples removing the built-in tools' summaries and guidelines from the system prompt (#10072, #10193Fixed context overflow detection for Z.AI CN endpoint
Prompt exceeds max lengtherrors (#10208).Fixed Anthropic requests failing when a tool schema uses keywords Anthropic strict tool use rejects, such as
minimum/maximum; such tools are now sent non-strict (#9953).Fixed provider retries firing immediately when a
Retry-Afterheader contains an unparseable date; they now use exponential backoff (#9571).Fixed extension commands registered without a string name or handler crashing pi when typing
/; the extension now fails to load with an error instead (#10054).Fixed collapsed
codemodeand MCP tool results filling the screen when the output is one long line, such as minified JSON. Like bash output, the preview is now limited to wrapped lines instead of logical lines.Fixed
codemode.mode: "only"listingread,bash,edit, andwritein the system prompt's tool list although requests only declarecodemode(#10192).Fixed codemode scripts calling the wrong MCP tool when two tool names differ only in
-and_, such asread-fileandread_file. Like in Codex, MCP tool and namespace names now replace-with_(mcp__my-server__xis nowmcp__my_server__x), colliding tools of a server all get a hash suffix, and server names that differ only in-and_are rejected (#10239).
0.99.1
29 Sep 2026GPT-6.1 Sol — Available on OpenAI, Azure OpenAI, and OpenAI Codex, and now the default OpenAI Codex model. See Select a model.
Added GPT-6.1 Sol (
gpt-6.1-sol) to the OpenAI, Azure OpenAI Responses, and OpenAI Codex providers.Changed the default OpenAI Codex model to GPT-6.1 Sol (
gpt-6.1-sol).
New Features
GPT-6.1 Sol — Available on OpenAI, Azure OpenAI, and OpenAI Codex, and now the default OpenAI Codex model. See Select a model.
Added
Added GPT-6.1 Sol (
gpt-6.1-sol) to the OpenAI, Azure OpenAI Responses, and OpenAI Codex providers.
Changed
Changed the default OpenAI Codex model to GPT-6.1 Sol (
gpt-6.1-sol).
Fixed
Fixed
/loginwith OpenAI failing in the bundled release with a missingopenai-chatgpt.jsmodule error.
0.99.0
29 Sep 2026Codemode and MCP — Connect MCP servers and let models run JavaScript that calls tools in parallel. See MCP Servers and Enable codemode.
System theme — Pi's colors now come from your terminal's own palette by default. See Use your terminal's colors.
Sign in with ChatGPT — Use a ChatGPT subscription with the OpenAI provider through
/login openai. See Authenticate interactively.
New Features
Codemode and MCP — Connect MCP servers and let models run JavaScript that calls tools in parallel. See MCP Servers and Enable codemode.
System theme — Pi's colors now come from your terminal's own palette by default. See Use your terminal's colors.
Sign in with ChatGPT — Use a ChatGPT subscription with the OpenAI provider through
/login openai. See Authenticate interactively.Virtual models — Extensions can route each request to a different physical model. See Virtual Models.
Classifier models — Run Jev classifiers from codemode scripts, or use any llama.cpp model as a classifier. See How codemode works and Classification.
Added
Added codemode, tool search, and MCP support as built-in extensions. The
codemodetool runs model-written JavaScript in a QuickJS sandbox that calls pi's tools; enable it withdefaultToolsor--toolsand configure it withcodemode.modeandcodemode.inlineBudget.tool_searchfinds tools that are not declared to the model and declares them. MCP servers over stdio or streamable HTTP, with OAuth, come frommcp.json(global, or per project once trusted) orpi.registerMcpServer()and are managed with/mcpandpi mcp add|remove|list|login|logout. See MCP Servers and Enable codemode (#10040).Added extension tool APIs for orchestrating tools:
exposure(direct,model-only,codemode,deferred, orhidden),namespace,annotations,outputSchemawithstructuredContent,isErrorresults,prepareLoadout(), andctx.executeTool()for nested tool calls, which emit events withparentToolCallIdand are recorded as boundednestedCallson the calling tool's result. See Tool exposure.Added a warning when an extension that registers the same tool, command, or flag replaces a built-in extension
Added experimental virtual models: extensions register them with
pi.registerVirtualModel()and pick a physical model and thinking level for each request. The footer shows the routed model,/sessionlists cost per physical model, andexamples/extensions/jev-router.tsroutes with the Jev classifier. See Virtual Models.Added Sign in with ChatGPT to the OpenAI provider in
/login, which uses a ChatGPT subscription with the OpenAI API. Pi stores a stabledeviceIdin the global settings for this login and omits it from bug reports.Added the
systemtheme, now the default, which derives pi's colors from the terminal's reported foreground, background, and ANSI palette and rebuilds them when the terminal switches between light and dark. See Use your terminal's colors.Added
#rgb,oklch(), andokhsl()colors and an optionalappearancefield to theme files, andtheme.style(),theme.colors, andtheme.appearancefor extensions. See Themes and TUI.Added a classifier model for every llama.cpp chat model, answered from next-token label probabilities. See Classification.
Added inherited Jev classifier models on OpenRouter, Cloudflare Workers AI, Vercel AI Gateway, and OpenCode Zen.
Added the
fullscreenWheelScrollLinessetting and/settingsentry for fullscreen mouse-wheel scrolling. The default"auto"accelerates fast wheel spins outside local macOS terminals (#9758).Added per-input disposition to successful RPC
prompt,steer, andfollow_upresponses,AgentSession.steer()/followUp(), andRpcClient.prompt()/steer()/followUp();RpcClient.prompt()also acceptsstreamingBehavior(#9098, #9803).Added image generation to
ModelRuntime:generateImages()with runtime-resolved auth (stored credentials, OAuth, runtime API keys,models.jsonheaders), plusgetModelsOfType(),getModelOfType(),getAvailableOfType(),getAllModels(), andgetAllAvailable(). OpenRouter image models are listed under theopenrouterprovider and share its credential; an upstream ID can have separate chat and image entries.models.jsonproviders and extension registrations without a model list keep built-in image generation. Extension model lists can include discriminated chat, image, and classifier entries with operation implementations; when supplied, they replace the provider catalog across every operation. Chat-facing reads (getModels(),getAvailableSnapshot(), the model picker) are unchanged.Added classifier support to
ModelRuntime, includingclassify(), classifier model accessors, runtime-resolved authentication, and the built-in TypeSafejev-latestmodel.Added
types=chat,image,classifierto pi.dev model catalog requests so remote refreshes overlay every supported model type; entries of unknown model types are ignored.Added the
provider_stream_eventextension event for observing parsed provider events before normalization, with an opt-in/debug-providerexample viewer (#9784, #9901Added a show/hide toggle (
H) in HTML exports for custom messages markeddisplay: false. Messages remain hidden by default and can also be revealed from the sidebar (#8896, #10020Added inherited Claude Sonnet 5.5 support for Anthropic with adaptive thinking and a 1M context window.
Added a Built-in section in
pi configto disable the built-inmcp,llama.cpp,codemode, andtool-searchextensions globally or per project, stored as-builtin:<name>in theextensionssetting. SDK inline extensions opt in withbuiltin: true.Added
+nameand-nameentries to thedefaultToolssetting to add or remove tools without repeating the defaults, for example"defaultTools": ["+codemode"]. Project entries of this form apply on top of the user setting. Documented how to enablecodemodewithout MCP and how to use classifier models such as Jev from codemode scripts.Added the token usage and cost of codemode
models.classify()calls to the codemode tool result, so they count toward the session cost; the codemode result shows each call's cost.
Changed
Switched the build from the TypeScript native preview to TypeScript 7.0 with an ES2024 target, and replaced
tsxwith Node's built-in type stripping for running from source (#9965).Removed the
[Themes]section from the startup banner. Custom themes remain available in/settings, and theme conflicts are still reported.Changed the startup header to show the pi logo with the version instead of the app name.
Changed the built-in
darkandlightthemes to the revised pi colors, written in OKHSL.Changed light/dark terminal detection to use the reported background color first, then the terminal's light/dark report, then
COLORFGBG. The first-time setup no longer shows the detected appearance.Renamed the inherited OpenAI Codex provider to "OpenAI Codex (legacy)"; Sign in with ChatGPT on the OpenAI provider supersedes it.
Changed inherited terminal detection to treat
TERM=*-directas truecolor.Built-in extensions and tools are named
builtin:<name>(for examplebuiltin:mcpandbuiltin:read) in errors, diagnostics, RPC source info, and bug reports, instead of<inline:name>and<builtin:name>. Their slash commands no longer carry a[t]autocomplete tag.--no-extensionsalso disables the built-in extensions, including the llama.cpp provider. Load one explicitly with-e builtin:<name>, for examplepi -ne -e builtin:mcp.Tool calls without a custom call renderer, including direct MCP tool calls, now show their arguments: as
key=valuepairs on the title line when collapsed and onekey: valueline per argument when expanded. MCP calls are titledserver/tooland their results collapse to 5 lines.bashandpowershellstructured results, which codemode scripts receive, now hold up to 1 MiB of output instead of the model-facing 2000 lines or 50KB, and addtruncatedandfull_output_path. Longer output keeps its first and last 512 KiB. Empty output is""instead of(no output).
Fixed
Fixed X11 clipboard text being misidentified as an image when the clipboard owner accepts unadvertised image targets (#9786).
Prevented managed git packages from automatically installing Pi peer dependencies and added warnings for extension packages that list host-provided modules in
dependencies(#9863).Fixed pinned git extensions loaded with
-econtinuing to use the first downloaded commit after the ref changes (#9982).Fixed
RpcClientskipping the next event listener when a listener unsubscribes while handling an event, which could makewaitForIdle()time out aftercollectEvents()(#9990).Fixed full-file
readcalls rendering as:1when models sendnullfor omittedoffsetandlimit(#9996).Fixed new sessions being lost when pi exits before the first assistant response. The session file is now created when the first user message is sent (#10000).
Fixed unloaded llama.cpp autoload presets overwriting a cached runtime context window with the GGUF training context (#10077, #10158
Fixed custom themes ignoring
terminal.trueColorand other terminal capability overrides and rendering with 256 colors (#9973, #10039Fixed pasting files copied in Finder inserting the file icon image instead of the file paths; paths are quoted in bash mode (#9999, #10136
Fixed the startup header, loaded resources, and chat notices keeping their old colors after a theme change.
Fixed the Fireworks default model pointing at the removed Kimi K2.6 model; it now defaults to Kimi K3.
Fixed the OpenCode Go default model pointing at the removed Kimi K2.6 model; it now defaults to Kimi K3.
Fixed the Together default model pointing at the removed Kimi K2.6 model; it now defaults to Kimi K3.
Reduced CPU use while streaming in long sessions and when previewing themes: the footer caches session usage totals, collapsed bash results cache their preview, and
sanitizeBinaryOutput()no longer splits output into per-character arrays.Fixed the usage of tools called through
ctx.executeTool(), for example from codemode scripts, being dropped from the session cost; it is now added to the calling tool's result usage.Fixed inherited
/skillautocomplete appearing empty when loaded skill names did not contain the letters inskill(#9944).Fixed inherited path and
@autocomplete not working after opening wrappers such as(,[,{,<, or a backtick.Fixed inherited image stretching in terminals that use the Kitty graphics protocol (#8938, #9957
Fixed inherited shell cursor staying hidden after exit when an extension closed an overlay during shutdown (#10026).
Fixed inherited keyboard input being lost after a mouse click in a
/settingssubmenu closed it.Fixed inherited 1-hour Anthropic cache writes through Vercel AI Gateway being priced at the 5-minute rate (#9210).
Fixed inherited model-level
samplingParamsbeing dropped by directstream()/complete()calls on OpenAI-compatible APIs (#9506).Fixed inherited Mistral GLM requests failing with "Expected at most one leading ThinkChunk" after empty content deltas (#9674).
Fixed inherited OpenAI Fast mode requests being priced at the standard rate (#10034).
Fixed inherited Mistral reasoning models ignoring the requested thinking level (#9678).
Fixed inherited OpenCode Zen and OpenCode Go
qwen3.8-flashthinking being replayed as plain text on later turns (#10047).Fixed inherited OpenAI Responses streams from servers that omit
output_index, such as llama.cpp, running mixed-up tool calls; such streams now end with an error (#9974).Fixed inherited Anthropic and OpenAI Codex browser sign-in waiting indefinitely after the provider redirected with an authorization error, and Anthropic sign-in failing when its callback port is in use.
Fixed inherited GitHub Copilot Claude Opus 5.5 offering unsupported thinking levels when upstream model metadata is incomplete.
- 0.87.x
0.87.1
22 Sep 2026Latest frontier models — Use Claude Opus 5.5, GPT-6 Sol, and GPT-6 Luna through supported providers, including GitHub Copilot. See Choose a Model.
Grok 4.7 by default for xAI — New xAI sessions now default to Grok 4.7. See Provider Authentication.
Added inherited Claude Opus 5.5, GPT-6 Sol, and GPT-6 Luna support for GitHub Copilot.
New Features
Latest frontier models — Use Claude Opus 5.5, GPT-6 Sol, and GPT-6 Luna through supported providers, including GitHub Copilot. See Choose a Model.
Grok 4.7 by default for xAI — New xAI sessions now default to Grok 4.7. See Provider Authentication.
Added
Added inherited Claude Opus 5.5, GPT-6 Sol, and GPT-6 Luna support for GitHub Copilot.
Added inherited GPT-6 Sol and GPT-6 Luna support for OpenAI API keys and OpenAI Codex subscriptions.
Added inherited Claude Opus 5.5 support for Anthropic with adaptive thinking and a 1M context window.
Changed
Changed the default xAI model to Grok 4.7.
Fixed
Fixed split-turn compaction summaries being refused by Claude Fable 5.1 by clearly separating the conversation and using continuation-oriented instructions
Fixed missing or invalid
--modevalues being silently ignored instead of reporting an error and exiting with a nonzero status (#9045).Fixed inherited image-only user messages being rejected by some OpenAI-compatible providers because they included an empty text part (#9797).
Fixed inherited Anthropic OAuth requests reporting an outdated Claude Code version.
0.87.0
21 Sep 2026- breaking
Removed the inherited
shouldStopAfterTurnagent option. UsefinishTurnand return{ action: "end" }instead.finishTurnruns beforeturn_endbut applies the decision afterward, and it also receives error and aborted responses; migrate normal-response predicates by returningundefinedfor those hard exits. See the@earendil-works/pi-agent-corechangelog for a complete before-and-after example. - breaking
Added
ContextEditEntryto the exportedSessionEntryunion. TypeScript consumers with exhaustive entry switches must handlecontext_edit; usereplacement: nullfor omission and a content replacement otherwise. - breaking
Made
SessionManagercanonical forAgentSessionprovider context. Assigningsession.agent.state.messagesno longer replaces future request history; restore withSessionManager.inMemory(cwd, { id }, entries), navigate withsession.navigateTree(), or append throughsession.sessionManagerand callsession.refreshContext().
New Features
Canonical session context and extension boundaries — Edit model context without rewriting history and add actionable lifecycle hooks. See ContextEditEntry and extension events.
Full-transcript context extensions — Use
context_with_systemfor per-request system-message transformations. Seecontext_with_system.Per-model image input limits — Configure cache-safe image resizing per model for attachments,
read, and tool-result images. See Image Input Limits.
Breaking Changes
- breaking
Removed the inherited
shouldStopAfterTurnagent option. UsefinishTurnand return{ action: "end" }instead.finishTurnruns beforeturn_endbut applies the decision afterward, and it also receives error and aborted responses; migrate normal-response predicates by returningundefinedfor those hard exits. See the@earendil-works/pi-agent-corechangelog for a complete before-and-after example. - breaking
Added
ContextEditEntryto the exportedSessionEntryunion. TypeScript consumers with exhaustive entry switches must handlecontext_edit; usereplacement: nullfor omission and a content replacement otherwise. - breaking
Made
SessionManagercanonical forAgentSessionprovider context. Assigningsession.agent.state.messagesno longer replaces future request history; restore withSessionManager.inMemory(cwd, { id }, entries), navigate withsession.navigateTree(), or append throughsession.sessionManagerand callsession.refreshContext(). - breaking
Expanded
TurnEndEventwith required boundary fields and addedAgentBeforeSettleEventto the exportedExtensionEventunion. Consumers constructing events or exhaustively switching onExtensionEventmust handle the new shapes.ExtensionRunner.emit()no longer acceptsturn_end; host integrations dispatch actionable boundaries withemitBoundary(baseEvent, buildContext). - breaking
Deferred runs requested from
agent_settledhandlers until all settled handlers finish. Handlers still observectx.isIdle() === true, but no longer see a reentrantagent_startduring the same notification dispatch.
Added
Added append-only model-context edits. For example,
sessionManager.appendContextEdit(entryId, null)omits one message from future provider context without changing raw history, usage, or UI history.Added actionable
turn_endandagent_before_settleextension boundaries. Return{ entries: [...event.entries, draft], continue: true }to persist structural entries in order and ensure one next provider request without changing steering or follow-up scheduling.Added retain-none compaction input:
sessionManager.appendCompaction(summary, null, tokensBefore)stores the compaction's own ID as its kept boundary.Added the
context_with_systemextension event, which runs aftercontexthandlers on the full transcript including system messages and sends its result verbatim. Seecontext_with_system.Added per-model image resize profiles through
inputLimits.images.resizeinmodels.json, applied to file attachments, image reads, and tool-result images (#9631).
Fixed
Fixed string context-edit replacements producing invalid assistant and tool-result message content instead of text blocks.
Fixed context-invisible boundary metadata and replacement edits causing newly appended or replaced input to be summarized before its first provider request.
Fixed edited-context accounting both discarding valid assistant usage captured after the latest context edit and reusing that usage after a later compaction made it stale.
Fixed selected error retries and final length/overflow recovery retaining abandoned model attempts in future provider context; post-run recovery omissions are now persisted without hiding raw transcript history or changing queue scheduling.
Fixed
contexthandlers that filter or slice messages dropping the prompt and tool declarations, which after extension-driven compaction left requests without built-in tools or made Codex emit raw tool-call text. Handlers no longer see system messages; Pi restores the prompt and tool state after they run. Seecontext(#9789, #9822).Fixed
/bugallowing uploads in offline mode while preserving local zip exportsFixed idle prompt-cache warming rebuilding expired caches when its timer or an extension decision is delayed.
Improved crash diagnostics with hints identifying loaded extensions that appear in the stack trace.
Fixed text files beginning with
GIFbeing misclassified as images and omitted fromreadand CLI@fileinput (#9755).Fixed malformed prompt template frontmatter being silently ignored instead of reported as a resource warning
Fixed inherited unknown OpenAI-compatible Chat Completions endpoints receiving strict tool schemas unless they explicitly advertise support (#9816).
- 0.86.x
0.86.1
20 Sep 2026Meta Muse provider — Sign in with Meta using
/login metaor useMETA_API_KEYto access Muse Spark models. See Meta (Muse subscription).Added Meta (Muse subscription) login via
/login metawith automatic Model API key refresh, plusMETA_API_KEYsupportEnabled Node's persistent compile cache before loading the bundled CLI runtime, reducing repeat launch time.
New Features
Meta Muse provider — Sign in with Meta using
/login metaor useMETA_API_KEYto access Muse Spark models. See Meta (Muse subscription).
Added
Added Meta (Muse subscription) login via
/login metawith automatic Model API key refresh, plusMETA_API_KEYsupport
Changed
Enabled Node's persistent compile cache before loading the bundled CLI runtime, reducing repeat launch time.
Fixed
Fixed
/bugdescriptions dropping line breaks from pasted diagnostics.Fixed
/bughints appearing for user cancellations and retryable provider failures such as service unavailability.Fixed clipboard copy failing in containers and WSL without WSLg by restoring the OSC 52 fallback when no display is available, and added a verified Windows clipboard backend for WSL (#9688).
Fixed inherited z.ai
Prompt too longerrors not being recognized as context overflow (#9805).Fixed inherited Cerebras models advertising unsupported strict tool schemas, which caused HTTP 400 errors when strict and non-strict tools were mixed
0.86.0
19 Sep 2026- breaking
Changed inherited pi-ai provider stream inputs from
Contextto normalizedTranscriptContextvalues. Custom providers must read system prompts and tool declarations fromcontext.messageswithgetCurrentSystemPrompt()andgetCurrentTools(). See Custom Streaming API. - breaking
Restricted inherited
ToolCall.argumentsandToolResultMessage.detailsto JSON-compatible values, changedToolResultMessageinto a conditional type, and madeJsonValuearrays readonly. - breaking
user_bashnow fails closed: errors or invalid defined results abort the command without invoking later handlers or executing locally. Returnundefinedto continue propagation; otherwise return{ operations }or{ result }(#9068).
New Features
Prompt cache warming — Keep valuable prompt caches alive during long tool runs and optionally while idle using cost-aware refreshes. See Cache Warming.
Bug reporting — Report problems with
/bugusing redacted diagnostics, optional transcripts, or exported ZIP archives. See Reporting Bugs.Transcript-aware prompt and tool updates — Preserve instruction and tool changes across resume and branch navigation while retaining cached prefixes. See
before_agent_start.Offline Radius model catalog — Select Radius models immediately, with cached and live catalogs overlaid when available. See Radius.
Per-model compaction budgets — Configure reserved and recent-token budgets by model. See Per-model overrides.
Breaking Changes
- breaking
Changed inherited pi-ai provider stream inputs from
Contextto normalizedTranscriptContextvalues. Custom providers must read system prompts and tool declarations fromcontext.messageswithgetCurrentSystemPrompt()andgetCurrentTools(). See Custom Streaming API. - breaking
Restricted inherited
ToolCall.argumentsandToolResultMessage.detailsto JSON-compatible values, changedToolResultMessageinto a conditional type, and madeJsonValuearrays readonly. - breaking
user_bashnow fails closed: errors or invalid defined results abort the command without invoking later handlers or executing locally. Returnundefinedto continue propagation; otherwise return{ operations }or{ result }(#9068).
Added
Added transcript-backed mid-conversation system prompt and tool changes so instruction and tool updates survive resume and branch navigation while preserving cached prefixes on supported models. See
before_agent_startand Entry Types (#9548).Added inherited native deferred tool loading for Fireworks Messages models. Use
ToolSearchortool_searchas the loader name for prompt-prefix deferral (#9323).Added click toggling for branch summaries, compaction summaries, and skill invocation entries.
Added the public Radius model catalog for immediate and offline model selection, with cached and live gateway catalogs overlaid when available.
Added
ctx.modelRegistry.stream()andstreamSimple()for extension model calls through configured providers with resolved authentication (#8964).Added per-model
reserveTokensandkeepRecentTokenssettings throughcompaction.modelOverrides, with ordinary compaction settings as fallback (#8133).Added
compat.allowedFallbackModelsconfiguration for overriding or disabling Anthropic server-side fallback models (#9294).Added an unsubscribe function from
pi.on()so extensions can drop event handlers. Handlers added or removed during a dispatch apply to later dispatches, not the current one (#8967).Exported extension hook event and result types that were previously omitted from the package entry points (#9642).
Added
/bug [description]to report a bug to the Pi developers. The report bundles environment, model, provider, extension, and settings metadata (secrets redacted), assistant message diagnostics from the session, optionally the session transcript, or a model-written summary of what went wrong instead. It is uploaded to Radius (no login required; attributed when logged in) or exported as a zip archive, and the report id is recorded in the session as api.bug-reportentry. Crashes are recorded in~/.pi/agent/crashes.json, announced once on the next start, and attached to the next report; unexplained errors and exhausted retries point at/bugonce per session.Added cost-aware prompt-cache warming during long tool runs and optionally while idle, with configurable modes, model cache-lifetime metadata,
/sessiondiagnostics, transcript notices, and thecache_warming_decisionextension event. See Cache Warming (#9668).
Changed
Made
--resumesession results appear progressively, using file modification times to prioritize all-folder loading and cancelling outstanding transcript reads after selection.Reduced
--continuestartup time by checking candidate session headers in modification-time order and stopping after the newest matching session.Replaced the external native clipboard dependency with bundled asynchronous macOS, Windows, and X11 helpers while preserving platform command and OSC 52 fallbacks (#9163).
Reduced inherited fuzzy search latency for long texts by using native substring search instead of scanning each character in JavaScript (#9267).
Moved compaction, branch summarization, and retry spinners into the editor border alongside the working indicator. Custom editors use the same embedding opt-in for all status spinners.
Enabled strict-prefer JSON-schema sampling by default for built-in
read,bash,powershell,edit, andwritetools, without requiringPI_EXPERIMENTAL. Extensions can re-register tool definitions withconstrainedSampling: false.Formatted Bash and PowerShell tool durations of at least one minute as minutes and seconds, with hours when needed (#9628).
Deferred the extension compiler and bundled virtual modules until a filesystem extension is loaded, reducing the baseline SDK import cost (#9540).
Fixed
Fixed GitHub Copilot GPT models, including GPT-6 Astra, using the Chat Completions adapter instead of the required Responses adapter
Fixed inherited DeepSeek V4.1 thinking levels on OpenRouter and OpenCode Go preserving provider effort metadata (#9485).
Fixed inherited bodyless HTTP 400/413 errors from non-Cerebras providers being misclassified as context overflow (#9482).
Fixed inherited Vercel AI Gateway replaying unsigned thinking as assistant text (#9676).
Fixed inherited Google Generative AI and Vertex AI using unsupported thinking levels when reasoning is omitted or when model capabilities differ within a Gemini family (#9455).
Fixed inherited Anthropic-compatible relays breaking signed thinking replay when they report a different response model, while preserving fallback pricing (#9188).
Fixed inherited Amazon Bedrock one-hour cache writes being priced at the five-minute rate (#9457).
Fixed inherited quadratic CPU usage when draining buffered
EventStreamevents (#9055).Fixed inherited Mistral Medium reasoning requests to use
reasoning_effortfor all reasoning-capablemistral-medium-*model IDs instead of the unsupportedprompt_mode(#8700).Fixed inherited OpenCode and OpenCode Go requests to send
x-opencode-sessionfromsessionIdacross all supported API adapters (#9326).Fixed inherited OpenAI Codex requests to send the model's Off reasoning effort instead of omitting it, while respecting unsupported Off mappings (#9191).
Fixed inherited Fireworks unsigned thinking replay and reasoning effort selection using catalog metadata, with verified DeepSeek V4 and Qwen3.8 fallbacks and removal of redundant GLM 5.2 and Kimi K3 effort aliases (#9323).
Fixed inherited OpenRouter requests to send
x-session-idfromsessionIdfor Chat Completions and Anthropic Messages models when prompt caching is enabled (#9102).Fixed the inherited DeepSeek catalog to advertise
deepseek-flashfor DeepSeek V4.1 Flash instead of retired Flash aliases, and refreshed DeepSeek pricing metadata (#9423).Fixed inherited Mistral-hosted GLM-5.2 reasoning requests to use
reasoning_effortinstead of the ignoredprompt_mode(#9375).Fixed inherited OpenAI-compatible Responses errors to identify the actual provider instead of always labeling them as OpenAI errors (#9298).
Fixed inherited Baseten requests to send session-affinity headers from
sessionIdfor automatic prompt-cache routing (#9629).Fixed inherited retry classification for Cloudflare 520 responses (#9627).
Fixed inherited retry classification for transient Azure peak-load capacity errors (#9669).
Fixed session tree navigation racing with active compaction and replacing its progress UI
Fixed exact session ID lookup scanning complete transcript bodies instead of reading session headers
Fixed repeated Anthropic thinking-drop notices being shown for the same dropped blocks, and shortened notices while retaining details in the session (#9391).
Fixed mid-run threshold compaction silently skipping oversized trailing tool results (#9740).
Fixed signal-terminated local shell commands being reported as successful with partial output
Fixed local clipboard failures reporting success when the terminal ignored the fallback OSC 52 write, and added platform-specific setup guidance when no clipboard backend works (#9618).
Capped agent-level retry backoff at
retry.maxAgentDelayMs(60s by default) so long retry runs stay responsive during prolonged transient outages (#8826).Fixed direct RPC
steerandfollow_upcommands bypassing extensioninputhandlers (#8718).Fixed premature missing-model errors after login by waiting for catalog discovery. Radius now defaults to
balanced, falling back to the first available Radius model when needed.Fixed fullscreen mode reserving a blank row for custom footers that render zero rows (#8919).
Fixed extension tools without parameter schemas to be rejected during registration instead of breaking provider requests (#9300).
Fixed
before_agent_starthandlers returningsystemPrompt(andforceSystemPrompt) on models with mid-conversation system messages: the forced prompt is now sent as the provider's leading system prompt instead of being appended as a section patch after the original prompt.Fixed loaded llama.cpp models with
enable_thinkingchat templates ignoring Pi's thinking level (#9528).Fixed cancellation races that could start automatic compaction, leave stale retry state, or miss cancellation while waiting for summarization authentication (#9340, #9777).
Fixed asynchronous Kitty image conversion replacing newer partial tool output images
Fixed inherited skill slash-command autocomplete ranking the
skill:prefix instead of the bare skill nameFixed inherited file autocomplete boundaries and path quoting around CJK punctuation
Fixed inherited LaTeX legacy font switches falling back to raw source, centered
caseslayouts around surrounding equations, and vertically laid out unsupported and nested display scripts (#8827, #9564, #7929).Fixed inherited fullscreen Kitty images being erased by later row clears in WezTerm (#9169).
Removed
- breaking
Removed unavailable inherited GPT-5.4 and GPT-5.4 mini models from OpenAI Codex selection (#9394).
- 0.85.x
0.85.1
5 Sep 2026GPT-6 Astra — Available through OpenAI API keys and OpenAI Codex subscriptions. See API Keys and OpenAI Codex.
Added GPT-6 Astra for OpenAI API keys and OpenAI Codex subscriptions.
Added five-times-faster mouse wheel scrolling while holding Alt in fullscreen mode
New Features
GPT-6 Astra — Available through OpenAI API keys and OpenAI Codex subscriptions. See API Keys and OpenAI Codex.
Added
Added GPT-6 Astra for OpenAI API keys and OpenAI Codex subscriptions.
Added five-times-faster mouse wheel scrolling while holding Alt in fullscreen mode
Fixed
Fixed configurable save keybindings in the model and thinking selectors
Fixed SDK import failures caused by unintentionally publishing internal experimental code and dependencies in 0.85.0. The experimental
clientandexperimental/pluginsubpaths and server/client commands are now source-only throughpi-test.sh; the supported local SDK and stdio RPC API are unchanged (#9132).Fixed mouse hover changing selection and recentering autocomplete and settings lists, causing clicks to target a different item.
Fixed long prompt-cache requests for GPT-5.6+ Responses models to use
prompt_cache_options.ttl: "30m"instead ofprompt_cache_retention: "24h".
0.85.0
4 Sep 2026Persistent Claude thinking effort — Supported Anthropic transports preserve per-turn effort and recover safely from signed-thinking mismatches. See Model Configuration.
Fullscreen transcript controls — Jump to the latest message from a scrolled transcript and use the embedded working indicator. See TUI Fullscreen Viewport.
Restorable in-memory sessions — Resume externally stored session entries through the SDK. See Session Management.
New Features
Persistent Claude thinking effort — Supported Anthropic transports preserve per-turn effort and recover safely from signed-thinking mismatches. See Model Configuration.
Fullscreen transcript controls — Jump to the latest message from a scrolled transcript and use the embedded working indicator. See TUI Fullscreen Viewport.
Restorable in-memory sessions — Resume externally stored session entries through the SDK. See Session Management.
Added
Added
SessionManager.inMemory()support for restoring externally managed session entriesAdded inherited OpenAI-compatible
vllmPriorityandsupportsMaxOutputTokensmodel settings for vLLM scheduler priority and OpenAI Responses output-token limitsAdded inherited LaTeX rendering for relational algebra join symbols
Added a clickable "Jump to latest message" label with the
tui.altScreen.bottomshortcut to the fullscreen transcript while it is scrolled up
Changed
Moved the streaming working indicator into the default editor border and matched its default spinner and label to the thinking-level border color. Custom editors retain the standalone indicator unless they opt in to embedding it
Reduced inherited fullscreen transcript search latency on large transcripts by caching unchanged search results, indexing ASCII runs, and limiting highlight work to visible matches
Fixed
Fixed managed
fdand ripgrep downloads on Linux musl systemsRemoved the unavailable inherited Grok Build 0.1 model from
/modelFixed inherited provider streams emitting incompatible event sequences and custom tool-call deltas.
Restored the
@earendil-works/pi-coding-agent/clientcompatibility entry point.Fixed the inherited Qwen Token Plan Individual catalog to include Qwen3.8 Flash (#9021).
Fixed inherited OpenAI Codex SSE parsing to process terminal events that are not followed by a blank line (#9047).
Fixed inherited GitHub Copilot Claude Fable 5 requests so selected reasoning levels are sent (#8961).
Fixed inherited Baseten GLM-5.2 models incorrectly advertising image input support
Fixed skills being unavailable when Bash is the only enabled tool
Fixed concurrent session shares overwriting one another
Fixed image orientation detection skipping EXIF data after non-EXIF APP1 segments
Fixed imported sessions overwriting an existing session with the same filename
Fixed session forks losing their compaction boundary
Fixed in-memory session forks before an active turn settled
Fixed inherited Fireworks GLM models using the wrong API adapter.
Fixed inherited
NO_PROXYmatching for root domains and subdomainsFixed
bash,edit,find,grep,ls,read, andwritetools ignoringctx.cwdFixed inherited terminal startup under restricted seccomp policies that reject the
SIGWINCHself-signalFixed inherited Zed terminal image capability detection
Fixed drag selection continuing over the fullscreen editor.
Fixed managed
fdand ripgrep downloads requiring the GitHub Releases APIFixed branch summaries failing when reasoning consumes the previous 2048-token output cap (#8845).
Fixed the write tool reporting UTF-16 code-unit counts as byte counts by removing the misleading count (#8979).
Fixed proxied plain-HTTP provider requests hanging after a tool call by tunneling them with CONNECT (#8134).
Fixed RPC
abortreporting success without cancelling an in-progress manual compaction (#8920).
- 0.84.x
0.84.4
28 Aug 2026Terminal capability overrides — Override detected terminal hyperlink, image, and truecolor support. See Capability Overrides.
Extension UI prompt events — Integrations can distinguish active agent work from time spent waiting for
ctx.uiprompts. See Extension UI prompt events.RPC queue clearing — Retrieve and clear queued steering and follow-up messages with
clear_queue. See RPCclear_queue.
New Features
Terminal capability overrides — Override detected terminal hyperlink, image, and truecolor support. See Capability Overrides.
Extension UI prompt events — Integrations can distinguish active agent work from time spent waiting for
ctx.uiprompts. See Extension UI prompt events.RPC queue clearing — Retrieve and clear queued steering and follow-up messages with
clear_queue. See RPCclear_queue.Fullscreen selection copy controls — Disable automatic selection copying in fullscreen mode and use Ctrl+X to copy the active selection. See UI & Display.
DeepSeek V4 Flash Vision (experimental) — Use the vision-capable model through the built-in DeepSeek provider. See API Keys.
Added
Added
ui_prompt_startandui_prompt_endextension events so host integrations can distinguish active agent work from waiting on user-facingctx.uipromptsAdded
detectSupportedImageMimeTypeFromFile()to the public library exportsAdded inherited experimental vision-capable
deepseek-v4-flash-vision-expmodel support.Added transcript usage notices for compaction and branch summaries when cache miss notices are enabled.
Added RPC
clear_queueto retrieve and remove queued steering and follow-up messages (#8432).Added environment variables and advanced settings for overriding auto-detected terminal hyperlink, image, and truecolor capabilities (#8665).
Added
fullscreenCopyOnSelectto disable automatic fullscreen selection copy; when disabled,Ctrl+Xcopies the active text selection before falling back to the last assistant message, while/treestill copies the selected message (#7720).
Fixed
Fixed toggling thinking visibility clearing partial output from running Bash tools (#8611).
Fixed Windows shell aborts crashing Pi when
taskkill.exeis unavailable onPATH(#6596).Fixed resumed sessions corrupting the next appended entry when their JSONL file lacks a trailing newline (#8345).
Fixed extension messages sent with
triggerTurn: falsewhile the agent is running being inserted between a tool call and its result, which made providers that validate message order reject the replayed history. They are now appended once the turn's tool results are in (#8537).Fixed compaction and branch summaries forcing
toolChoice: "none"(#8649, #8638).Fixed large tool results crossing the auto-compaction threshold being sent to the provider before compaction. Pi now compacts between tool execution and the next assistant response in the same run, and restores interactive progress when that run resumes (#6879).
Fixed Google Vertex requests failing with
HttpsProxyAgent is not a constructorwhen the bundled Node.js runtime uses an HTTP(S) proxy (#8610).Fixed saving a default model from a non-empty model scope so it remains available in that scope.
Fixed inherited
@file autocomplete ranking to prefer direct and shallower matches over similarly ranked nested paths (#8669).Fixed inherited OpenAI-compatible streams serializing thinking signatures repeatedly during streaming (#8671).
Fixed inherited main-screen rendering crashing when image-heavy output exceeded V8's string length limit (#8028).
Fixed inherited fullscreen double-click word selection splitting paths and kebab-case tokens on
/and-(#8676).Fixed inherited Cloudflare AI Gateway catalogs omitting supported
workers-ai/*passthrough models.Fixed inherited OpenAI-compatible reasoning replay to merge consecutive streamed text and summary
reasoning_detailsdeltas.Fixed inherited OpenRouter reasoning controls so reasoning-mandatory models do not receive
effort: "none"Fixed inherited OpenAI-compatible Chat Completions ignoring an explicitly requested
toolChoicewhen no tools are defined.Fixed inherited fragmented Mistral tool calls splitting when continuation chunks omit the tool-call ID (#8387).
0.84.3
24 Aug 2026- breaking
Renamed the inherited
GoogleThinkingLeveltype toGoogleApiThinkingLeveland addedResolvedGoogleThinkingLevelfor normalized adapter levels. PowerShell tool — Use optional native PowerShell command execution on Windows. See PowerShell Tool.
Safer managed updates — Stage, verify, and atomically activate updates for installer-managed installations. See Install and Manage.
New Features
PowerShell tool — Use optional native PowerShell command execution on Windows. See PowerShell Tool.
Safer managed updates — Stage, verify, and atomically activate updates for installer-managed installations. See Install and Manage.
Model and thinking controls — Select thinking levels with
/thinking, search defaults, keep selections session-scoped, and persist them explicitly with Ctrl+S. See Models and Thinking.
Breaking Changes
- breaking
Renamed the inherited
GoogleThinkingLeveltype toGoogleApiThinkingLeveland addedResolvedGoogleThinkingLevelfor normalized adapter levels.
Added
Added an optional
powershelltool for Windows, configurable throughdefaultToolsand the SDK. See PowerShell Tool.Added a
/thinkingselector and searchable default choices to the model and thinking selectors; Ctrl+S saves the selected model as the global default. See Models and Thinking.Added optional routing session IDs to exported compaction summary helpers so callers can preserve provider routing without enabling prompt cache writes.
Added transcript usage notices for compaction and branch summaries when cache miss notices are enabled.
Added
session_compact_failedextension events so compaction failures and aborts expose their reason, retry state, source, and error message to handlers (#8175).Added inherited provider-neutral
toolChoicesupport to simple stream requests.Added inherited automatic Anthropic server-side refusal fallback for supported first-party models, including returned-model usage pricing (#8017).
Added inherited configurable OpenAI-compatible thinking-token budget fields for vLLM, Qwen/SGLang, and llama.cpp servers. See OpenAI Compatibility
Added inherited China-specific ZAI Coding Plan models, including GLM-4.6V vision support and API-equivalent usage cost estimates (#8220).
Added inherited
deepseek-v4-pro-0813support to the Qwen Token Plan Individual catalog (#8194).
Changed
Changed experimental installer-managed installations so
pi updatestages, verifies, and atomically activates the selected release in place. See Install and Manage.Changed inherited built-in xAI models to use the Responses API with encrypted reasoning replay and made Grok 4.6 the default xAI model
Changed inherited Anthropic, Azure OpenAI, Google, Mistral, and OpenAI adapters to send Pi's default
User-Agentunless overridden (#8305).Changed Windows and WSL keybinding defaults to avoid terminal-reserved shortcuts for image paste, model cycling, editor undo, fullscreen transcript navigation and search, and message queueing (#8372).
Changed Bun release archives to ship the native clipboard binary only inside the wrapper package, removing a duplicate platform package from each archive.
Changed package resource glob expansion to use Node.js's built-in implementation with deterministic visible-path matching, reducing the installed runtime dependency tree.
Changed the bundled Node.js runtime to load jiti only when importing an extension and Babel only when uncached source needs transformation, reducing CLI startup time and bundle size.
Changed syntax highlighting to initialize only twenty common languages eagerly and defer the remaining grammars until after the initial TUI render, reducing CLI startup time.
Changed the Node.js CLI and RPC entrypoints to load a bundled runtime, reducing startup filesystem reads while keeping the public library and legacy module paths on the modular runtime for normal dependency identity.
Changed session sharing to render clickable terminal links, display only the canonical Radius artifact URL, and include the current system prompt and active tool definitions in Radius session shares.
Fixed
Fixed failed extension factories leaving event subscriptions, provider registrations, and default flag state active
Fixed
models.jsontypings omitting the documented OpenAI-compatiblecompat.supportsFinishReasonprovider and model overrideFixed
/modeland/thinkingselections being persisted globally unless explicitly saved with Ctrl+S (#5263).Fixed JSON and RPC
toolcall_startevents omitting the tool call id and nameFixed extensions failing to load when the Node.js CLI runs as a single-executable application (#8237).
Fixed nested Markdown skills inside
.agents/skills/grouping directories not being discovered.Fixed compaction and branch summarization requests exposing tools to providers.
Fixed single-object
edittool inputs failing validation by accepting them as one-edit arrays in both coding-agent and harness edit tools (#7835).Fixed root Markdown files such as
README.mdandAGENTS.mdin skill directories being reported as broken skills unless they declare valid skill frontmatter (#7805).Fixed the default Cerebras model referencing an unavailable Z.AI model.
Fixed inherited OpenAI-compatible Chat Completions reasoning replay to preserve and resend assistant-level
reasoning_detailsverbatim and in order (#7994).Fixed inherited Anthropic server-side fallback responses being priced with the requested model instead of the returned fallback model (#8285).
Fixed inherited GitHub Copilot login triggering model-policy rate limits by limiting policy updates, retrying model discovery once, and honoring server retry delays (#7850).
Fixed inherited Amazon Bedrock dropping and failing to replay opaque redacted reasoning from non-Anthropic models
Fixed inherited Z.AI Coding Plan models deriving incomplete reasoning-effort metadata, including missing GLM-5.3 low, high, and max levels (#8336).
Fixed inherited DeepSeek V4 Flash on OpenCode and OpenCode Go omitting its supported low thinking level
Fixed inherited Azure OpenAI Responses ignoring
toolChoicein provider-specific stream requests.Fixed inherited Amazon Bedrock response hooks receiving only a synthesized request id instead of the raw response headers (#8234).
Fixed inherited Kimi usage reporting so top-level
cached_tokenscount as cache reads instead of normal input tokens (#8075).Fixed inherited Google custom models ignoring
thinkingLevelMap, which dropped extended thinking controls (#8135).Fixed writes to
auth.jsonandmodels-store.jsonoverriding administrator-managed file permissions and ACLs (#7779).Fixed UTF-8 BOM markers preventing frontmatter and user configuration files from loading (#8337).
Fixed invalid settings files being easy to miss during interactive startup by rendering warnings with the file path inside the TUI (#7829).
Fixed the subagent example repeatedly prompting before running project-local agents in trusted repositories (#8261).
Fixed npm package update checks treating older registry versions as available updates, preventing
pi updatefrom downgrading already-newer installed packages (#8226).Fixed built-in llama.cpp models disappearing from
/modelwhen/llamarefreshed a configured server underPI_OFFLINE, and included idle-sleptsleepingrouter models in the selectable catalog (#8167).Fixed
pi.registerFlag()accepting default values that do not match the declared flag type (#8064).Fixed Z.AI Coding Plan defaults referencing the removed GLM-5.1 model (#8096).
Fixed repeated ambiguous truncated-response recovery being mislabeled as context overflow (#8130).
Fixed duplicate fullscreen right-click paste in VS Code-based terminals on Windows (#8186).
Fixed inherited padded text exceeding narrow terminal widths (#8252).
Fixed inherited wrapped Markdown table links leaking color into borders and neighboring cells, including tables inside blockquotes (#8335).
Fixed llama.cpp login guidance to direct users to
/llamabefore/modelwhen no local models are loaded (#8203).Fixed hung pi.dev model catalog requests consuming the entire refresh deadline without retrying (#8198).
Fixed inherited Xiaomi model catalogs listing shut-down MiMo V2 models in
/modeland--list-models(#8187).Fixed branch summary entries recording the navigation destination in
fromIdinstead of the pre-navigation source leaf.Fixed threshold auto-compaction being skipped when providers omit streaming usage data (#8328).
Fixed dash-prefixed prompts being parsed as options by supporting
--as an end-of-options delimiter (#7269).
0.84.2
14 Aug 2026- security
Updated the transitive
nanoiddevelopment dependency to address a denial-of-service vulnerability. Fullscreen transcript search — Search and navigate matches in fullscreen mode. See TUI Fullscreen Viewport.
Configurable default tools — Choose startup built-in tools globally or per project. See Tools.
New Features
Fullscreen transcript search — Search and navigate matches in fullscreen mode. See TUI Fullscreen Viewport.
Configurable default tools — Choose startup built-in tools globally or per project. See Tools.
Configurable fullscreen exit output — Print the transcript or only a resume hint on exit. See Interactive Mode.
Added
Added fullscreen transcript search with
Ctrl+Shift+F, incremental match highlighting, configurable search match theme colors, and next/previous navigation withEnter/Ctrl+GandShift+Enter/Ctrl+Shift+G.Added experimental strict JSON-schema constrained sampling for the default
read,bash,edit, andwritetools underPI_EXPERIMENTAL=1.Added a fullscreen exit output setting to choose between printing the final transcript and only a session resume hint.
Added the
defaultToolssetting for configuring the initial built-in tool selection globally or per project.Added
--use-theme <name[/name]>to choose an initial per-run interactive theme without changing saved settingsAdded
expandPromptTemplatesto extensionpi.sendUserMessage()options for explicitly dispatching commands and expanding skills and prompt templates. Seepi.sendUserMessage()Added inherited
createGatewayBindingFetch()for routing Cloudflare AI Gateway requests through a Workers AI binding without an API tokenAdded inherited
AssistantMessage.endTurnto preserve OpenAI Codex's terminalend_turnsignal for diagnostics (#7766).Added inherited unbound single-line transcript scrolling actions for fullscreen mode. See TUI Fullscreen Viewport
Changed
Changed inherited Kimi Coding requests to use pi's runtime
User-Agentheader.Replaced the inherited Mistral SDK transport with a native Chat Completions HTTP stream, eliminating its generated client and schema runtime overhead.
Documented the generic
AI_AGENT=piprocess marker and how it differs fromPI_CODING_AGENT=true(#7747).Changed inherited OpenAI Responses deferred tool loading to prefer message-anchored
additional_toolswhere supported while retaining tool-search and top-level fallbacks (#7709).Reduced inherited fullscreen rendering allocation churn by painting full-width layout rows directly instead of recompositing them on every frame.
Fixed
Fixed managed-tool downloads delaying TUI startup and hiding diagnostics in fullscreen mode by mounting the TUI first and showing download progress and warnings inside it.
Fixed opening a model selector immediately after startup cancelling and restarting the in-progress model catalog refresh.
Fixed inherited GitHub Copilot login triggering API rate limits while enabling model policies by limiting concurrent policy updates (#6187).
Fixed fullscreen transcript search snapping back to the current match during manual scrolling and fragmented mouse input leaking into the search query.
Fixed inherited required LaTeX arguments starting on a new line being parsed as empty (#7760).
- security
Updated the transitive
nanoiddevelopment dependency to address a denial-of-service vulnerability. Fixed fallback rendering for extension tool results to collapse long output and honor tool expansion (#7979).
Fixed JSON and RPC
message_updateevents dropping cumulative usage during streaming. See JSON Event Mode and RPCmessage_updateFixed
pi.sendMessage(..., { triggerTurn: false })steering an active run instead of only recording the custom messageFixed the
defaultToolssetting dropping extension and SDK custom tools when selecting built-in defaults.Fixed the subagent example rejecting YAML array syntax for the
toolsfrontmatter fieldFixed the subagent example dropping parent session model, thinking, and tool configuration
Fixed custom system prompts concatenating the current working directory with later appended prompt content
Fixed inherited OpenAI Responses function and custom tool calls losing namespaces during streaming, proxying, and replay (#7709).
Fixed inherited upstream request buffer failures not triggering automatic assistant retries.
Fixed inherited built-in and custom DeepSeek API models sending output limits through an unsupported field.
Fixed inherited Amazon Bedrock replay rejecting tool arguments that contain empty object keys while preserving all valid nested values
Fixed inherited DeepSeek compatibility detection for base URLs whose hostname contains uppercase letters
Fixed inherited Google Generative AI and Vertex AI responses with tool calls incorrectly treating output-limit or provider-error stops as normal tool use (#8059).
Fixed inherited fullscreen mouse drag selection and OSC 8 link activation in terminals that report generic SGR mouse release button codes (#7963).
Fixed inherited focused fullscreen overlays not receiving mouse wheel or viewport scroll keys such as PageUp and PageDown (#7894).
Fixed inherited LaTeX control spaces split across line endings causing complete expressions to fall back to raw source.
Fixed split
Alt+Enterinput over SSH being misread as Escape, addedPI_TUI_ESC_TIMEOUTfor high-latency terminals, and limited that timeout to lone Escape inputFixed inherited idle fullscreen sessions repainting and clearing text selection when the terminal loses focus
Fixed fullscreen selection copy to use the host clipboard and report failure instead of claiming success when OSC 52 is unsupported
0.84.1
7 Aug 2026Qwen Token Plan Individual — Use the built-in provider for models documented for Individual subscriptions. See API Keys.
Authentication readiness checks — Use
pi auth checkto verify provider or model credentials, optionally emitting the resolved credential.Improved fullscreen interaction — Select words and paragraphs with multiple clicks and configure half-page transcript scrolling. See TUI Fullscreen Viewport.
New Features
Qwen Token Plan Individual — Use the built-in provider for models documented for Individual subscriptions. See API Keys.
Authentication readiness checks — Use
pi auth checkto verify provider or model credentials, optionally emitting the resolved credential.Improved fullscreen interaction — Select words and paragraphs with multiple clicks and configure half-page transcript scrolling. See TUI Fullscreen Viewport.
Terminating blocked tool calls — Extension
tool_callhandlers can stop all-terminating batches without another model call. See Tool Events.
Added
Added Qwen Token Plan Individual as a built-in provider with its documented subscription model catalog and the shared international
QWEN_TOKEN_PLAN_API_KEY. See API KeysAdded
pi auth checkprovider/model auth preflight with optional credential output (#7152).Added
terminatesupport to blocked extensiontool_callevents so all-terminating batches can skip the automatic follow-up model call. See Tool EventsAdded inherited double-click word and whitespace selection, granularity-aware drag selection, and triple-click paragraph selection in fullscreen mode (#7725, #7733
Added inherited unbound half-page transcript scrolling actions for fullscreen mode. See TUI Fullscreen Viewport (#7735).
Changed
Softened the bash tool's
PI_*environment guideline in an attempt to reduce unnecessary inspection commands (#7128).Reduced worst-case automatic terminal theme detection delay from 200 ms to 100 ms by probing color-scheme and background support concurrently.
Fixed
Fixed Bun standalone binaries crashing on startup when the cwd contains a
bunfig.tomlwithpreloadby compiling with--no-compile-autoload-bunfigFixed extension TUI method wrappers recursing indefinitely when delegating to the original method (#7731).
Fixed right-click not pasting clipboard text in fullscreen mode on Windows.
Fixed inherited
Agent.reset()clearing transcript and runtime state during active runs; it now rejects until the agent is idleFixed inherited LaTeX relation, multiplication, and named-operator spacing, and matrix composition with stacked fractions, operator limits, and adjacent matrices.
Reduced inherited fullscreen mouse event volume under tmux, Zellij, and GNU Screen by using button-motion tracking instead of all-motion tracking.
0.84.0
6 Aug 2026- breaking
Renamed the inherited pi-ai
ModelsStreamTransformsinterface toModelsRequestTransformsbecause its header transformation now applies to all authenticated provider requests. - breaking
Changed JSON and RPC
message_updateevents to emit onlyassistantMessageEventdeltas, removing the cumulativemessageandassistantMessageEvent.partialfields that caused quadratic output growth. Clients that need partial messages must assemble deltas betweenmessage_startandmessage_end; the latter remains authoritative (#7290). - breaking
ModelRegistry.getApiKeyAndHeaders()now returnsProviderHeaderswithstring | nullvalues and preservesnullheader-deletion markers. Extensions that inspect returned headers must handlenull; extensions forwarding them to pi-ai streams should pass them through unchanged. This prevents placeholder OpenAI credentials from being sent through Cloudflare AI Gateway (#7030).
New Features
Fullscreen TUI mode — Switch between regular and fullscreen modes at runtime, with a sticky editor and footer, independently scrollable transcript, and draggable scrollbars. See UI & Display.
Mermaid and LaTeX rendering — Render Mermaid diagrams and terminal-friendly Unicode math in interactive transcripts. See Markdown settings and TUI Markdown.
Per-directory context overrides — Use
AGENTS.override.mdto replace context files for a specific directory. See Context Files.Advanced custom model sampling — Configure arbitrary OpenAI-compatible
samplingParamsand opt-in vLLMthinking_token_budgetvalues. See Sampling Parameters.Baseten provider — Use built-in Baseten authentication and model support. See API Keys.
Breaking Changes
- breaking
Renamed the inherited pi-ai
ModelsStreamTransformsinterface toModelsRequestTransformsbecause its header transformation now applies to all authenticated provider requests. - breaking
Changed JSON and RPC
message_updateevents to emit onlyassistantMessageEventdeltas, removing the cumulativemessageandassistantMessageEvent.partialfields that caused quadratic output growth. Clients that need partial messages must assemble deltas betweenmessage_startandmessage_end; the latter remains authoritative (#7290). - breaking
ModelRegistry.getApiKeyAndHeaders()now returnsProviderHeaderswithstring | nullvalues and preservesnullheader-deletion markers. Extensions that inspect returned headers must handlenull; extensions forwarding them to pi-ai streams should pass them through unchanged. This prevents placeholder OpenAI credentials from being sent through Cloudflare AI Gateway (#7030). - breaking
Changed
ModelRegistry.refresh()to acceptModelsRefreshOptionsand returnModelsRefreshResultinstead of discarding cancellation and provider errors. - breaking
Changed
ModelRuntime.setRuntimeApiKey()to accept auth cancellation options rather than catalog refresh options. Callrefresh({ providers: [providerId], signal })separately when remote freshness is required. - breaking
Required config-form extension OAuth
refreshToken(credentials, signal)callbacks to accept and honor a concrete abort signal. - breaking
Replaced dynamic provider refresh context store access with the read-only
context.storedsnapshot and generation-checkedcontext.publish()transaction.Providers built with
createProvider({ fetchModels }): no catalog-publication migration is required. Before and after, return the fetched models and register the resulting provider;createProvider()owns restoration, persistence, and in-memory publication.// Before const beforeProvider = createProvider({ // ... fetchModels: async ({ signal }) => { const response = await fetch(catalogUrl, { signal }); return parseModels(await response.json()); }, }); pi.registerProvider(beforeProvider); // After: unchanged const afterProvider = createProvider({ // ... fetchModels: async ({ signal }) => { const response = await fetch(catalogUrl, { signal }); return parseModels(await response.json()); }, }); pi.registerProvider(afterProvider);Handwritten native
Provider.refreshModels(): replace direct store access and pre-publication mutation with generation-guarded publications.// Before refreshModels: async (context) => { const stored = await context.store.read(); if (stored) currentModels = stored.models; if (!context.allowNetwork) return; const refreshed = await fetchModels(context.signal); currentModels = refreshed; await context.store.write({ models: refreshed, checkedAt: Date.now() }); }, // After refreshModels: async (context) => { if (context.stored) { const restored = context.stored.models; if (!(await context.publish({ update: () => { currentModels = restored; }, }))) return; } if (!context.allowNetwork) return; const refreshed = await fetchModels(context.signal); if (context.signal.aborted) return; await context.publish({ persist: { models: refreshed, checkedAt: Date.now() }, update: () => { currentModels = refreshed; }, }); },For the config-form
pi.registerProvider(name, { refreshModels }), callbacks that only return models remain unchanged; pi publishes the returned list. If such a callback previously usedcontext.storefor custom persistence, readcontext.storedand callcontext.publish({ persist: entry }). Inpublish(), omitpersistto leave storage unchanged, pass aModelsStoreEntryto write it, or passpersist: nullto delete it. - breaking
Replaced the inherited pi-agent-core harness session model with the v4 lane-based
Session,SessionStorage, andSessionRepoAPIs, including durable operation records, global facts, shared sequence numbers, and tree-scoped lane views. - breaking
Promoted the inherited v2 session and
AgentHarnessAPI from pi-agent-core's experimental entrypoint to its default export and removed the experimental subpaths. - breaking
Removed the inherited legacy JSONL and in-memory repository APIs. Use pi-agent-core's v4
JsonlSessionRepoorInMemorySessionRepo, both implementing the newSessionRepocontract. - breaking
Added the inherited required pi-agent-core
FileSystem.renameFile()operation for atomic JSONL publication; custom harness file-system implementations must provide same-filesystem replacement semantics - breaking
Replaced experimental remote-session list summaries with durable
SessionMetadata;RemoteSession.sessionsno longer exposes runtime phase, model, thinking, attachment, or lock state, which remains available from acquiredSessionSnapshotvalues (#7708).
Added
Added built-in Baseten provider support with
BASETEN_API_KEYauthentication andzai-org/GLM-5.2as the default model.Added experimental remote-session client APIs: the transport-neutral
PiClient, CBOR protocol, Unix-socket transport, and@earendil-works/pi-coding-agent/clientRemoteSessioncontroller with transcript reducers. See Pi Client and Remote Protocol (#7344, #7348, #7371, #7409).Added
CredentialSynchronizationErrorfor credential changes that commit successfully but fail to synchronize local model state.Added chainable
pi.registerMarkdownTransformer()hooks for display-only transformation of user and assistant Markdown. Seepi.registerMarkdownTransformer()Added an experimental fullscreen TUI mode, selectable through
--tui-mode fullscreenor/settings(#7304).Added runtime switching between regular and fullscreen TUI modes through
/settings.Added a sticky editor, status, widget, and footer dock to fullscreen mode while keeping the transcript independently scrollable.
Added a draggable transcript scrollbar to fullscreen mode with configurable
auto,always, andhiddenmodes through/settings;alwaysreserves the rightmost column.Added page scrolling and marked-message navigation shortcuts to fullscreen mode.
Added an optional
scrollbarThumbtheme color for fullscreen scrollbar thumbs, falling back toselectedBg.Added configurable themed Unicode rendering for supported Mermaid diagrams in interactive messages, including optional rendering while streaming. See Markdown settings
Added opt-in
Ctrl+P/Ctrl+Nprompt history navigation, with explicit history bindings taking precedence over application shortcuts while the editor is focused.Added per-directory
AGENTS.override.mdcontext files, which replaceAGENTS.mdorCLAUDE.mdin the same directory while preserving context from other directories. See Context FilesAdded
AI_AGENT=pito CLI and RPC child-process environments for generic agent attribution. See Environment VariablesAdded inherited terminal-friendly Unicode rendering for LaTeX expressions in Markdown. See TUI Markdown.
Added stacked transient notifications in fullscreen mode.
Added arbitrary OpenAI-compatible model sampling parameters through
samplingParamsinmodels.json, model overrides, extension providers, and stream options. See Sampling ParametersAdded inherited opt-in vLLM
thinking_token_budgetsupport for OpenAI-compatible models, reserving output tokens for the final answerAdded inherited support for OpenAI-compatible streams that omit
finish_reason, usingcompat.supportsFinishReasonto infer normal and tool-use stops when the stream ends. See OpenAI Compatibility.Added inherited deferred provider request contracts, durable response handles, authenticated fetch/cancel dispatch, and faux-provider support for pending, ready, failed, and cancelled responses
Added inherited vendor-neutral telemetry contracts plus agent-owned typed AI-request and harness schemas, composed span starters, and callback helpers. See the agent telemetry schema reference.
Added inherited structured Amazon Bedrock failure diagnostics with HTTP status, modeled error code, and AWS request id when available
Added inherited
AgentOptions.shouldStopAfterTurnfor gracefully stopping after a completed turn before queued messages or another model call are processed. See Agent OptionsAdded inherited v4
JsonlSessionReposupport for append-only JSONL harness sessionsAdded inherited bounded branch-entry and indexed open-operation recovery queries to the v4 session API (#7448, #7646).
Added the inherited compile-complete
AgentHarnessv2 scaffold; unfinished operation paths reject withHarnessNotImplementedwhile durable execution is implemented.
Changed
Added inherited optional cancellation to pi-ai
ModelsStorereads, writes, and deletions; catalog orchestration binds these waits to the provider refresh signal.Reduced the inherited default fullscreen mouse wheel step from three lines to one for finer scrolling.
Fixed
Fixed the footer showing
(sub)for generic OAuth/OpenID sign-ins without a known subscription; extension OAuth providers can opt in withisSubscription.Fixed inherited OAuth token refreshes so stalled requests release the credential-store lock (#7508).
Fixed inherited tool argument validation to preserve values that already match an
anyOf/oneOfunion arm before coercion, avoiding nullable unions convertingnullto another primitive value (#7328).Fixed inherited Fireworks GLM 5.2 requests sending the unsupported
prompt_cache_retentionfield when long cache retention is enabled, and enabled session affinity for automatic prompt caching (#7676).Fixed inherited
JsonlSessionRepoenforcing session IDs globally across working directories; IDs are now unique within each working directory.Fixed inherited JSONL session forks and torn-tail repairs to publish atomically, avoiding partially written or corrupted sessions after interrupted writes
Fixed path-containing
findglobs returning no results on Windows (#6817).Fixed messages queued during manual
/compactfailing instead of being sent after compaction completes.Fixed Git Bash, MSYS, Cygwin, and WSL drive paths passed to built-in file tools resolving against the current Windows drive instead of their native drive (#7064, #7547).
Fixed project-level nested provider retry settings replacing unmodified global provider retry settings (#7572).
Fixed inherited GitHub Copilot Grok 4.5 requests to use the supported Responses API (#7560).
Fixed fullscreen shutdown leaking terminal capability-query replies into the parent shell prompt.
Fixed bare exact
--modelIDs shared by multiple providers choosing the first catalog entry instead of the sole authenticated provider or a clear ambiguity error (#7327).Fixed standalone x64 binaries requiring Haswell-era AVX2/BMI2 instructions by compiling release executables against Bun's baseline runtime
Fixed
Ctrl+Xcopy confirmations in fullscreen mode adding a transcript status line instead of showing the transientCopied!marker.Fixed Kitty image previews in fullscreen mode overlapping the sticky editor and footer dock while scrolling.
Fixed image-heavy fullscreen sessions lagging when layout changes retransmitted visible Kitty image payloads and rendered the transcript twice per frame.
Fixed spaces in
/settingssearches toggling the highlighted setting while typing multi-word queries such as TUI mode or Quiet startup.Fixed custom editors not inheriting the default editor's autocomplete dropdown item limit (#7333).
Fixed malformed resource arrays in package manifests crashing session startup (#7187).
Fixed the DOOM overlay example downloading its shareware WAD from a dead URL.
Fixed
setToolsExpanded(false)to be a no-op when tool output is already collapsed, avoiding redundantTool output: collapsedstartup notices from extensions (#7292).Fixed extension-driven model calls in custom compaction, handoff, and Q&A examples to dispatch through the coding-agent model runtime so custom providers and resolved auth options are preserved (#7325).
Fixed long-running sessions using stale credentials after another process updates
auth.jsonwithout serializing concurrent credential reads and delaying startup (#7319).Fixed concurrent
models-store.jsonreads forming a file-lock convoy and delaying startup.- security
Updated the packaged
brace-expansiondependency to 5.0.8 to address GHSA-mh99-v99m-4gvg (#7316). Fixed forced model availability refreshes remaining blocked behind a stalled earlier refresh (#7301, #7421
Fixed
/modelcatalog refresh failures to identify every catalog that failed.Fixed provider login remaining stuck after saving credentials when a model catalog refresh stalls by separating local credential consistency from bounded background freshness (#7027, #7113, #7418).
Fixed
/scoped-modelswaiting for remote catalogs before rendering instead of showing cached models and cancelling refresh on close (#7153).Fixed
/model <name>waiting for catalog refresh before checking cached model matches (#7443).Fixed stale availability snapshots and errors publishing after a newer availability pass.
Fixed stale pi.dev, Radius, llama.cpp, and extension catalog refreshes publishing after a newer provider refresh.
Fixed cancellation while waiting for file-backed credential or model-catalog locks, preventing cancelled mutations from running or committing later.
Fixed concurrent in-memory credential mutations losing unrelated provider updates by serializing their read-modify-write sections.
- security
Updated
undicito 8.9.0 and the packagedbrace-expansionto 5.0.9 to address GHSA-8xcm-r25x-g524, GHSA-4cwx-7wf7-3272, GHSA-m8rv-5g2x-5cg5, GHSA-jr45-8vmc-qm54, GHSA-v3r7-h72x-cjcm, and GHSA-rgw5-rvv9-x895. Fixed GitHub Copilot compaction and branch summaries using the Individual endpoint instead of the credential-resolved Business or Enterprise endpoint (#6768).
Fixed extension model calls dropping credential-resolved endpoints when forwarding request authentication, including custom compaction with GitHub Copilot Business and Enterprise accounts (#7579).
Fixed fullscreen transcript navigation leaving no editor-accessible
Home,End,PageUp, orPageDownvariants by adding Ctrl-modified editor bindings (#7574).Fixed extension event-bus listeners surviving session reloads and disposal
Fixed
/copyfailing to read clipboard text on Wayland when no X11 clipboard is available (#7387).Fixed slow connections failing during the initial connection attempt by increasing the connect timeout
Fixed oversized images returned by extension and built-in tools bypassing automatic image resizing. See Image settings
Fixed session discovery missing sessions stored through symlinked directories
Fixed manual compaction racing with threshold auto-compaction
Fixed responses truncated below their intended output limit ending the run instead of compacting and retrying once
Fixed Git package updates leaving dependencies missing when
git cleancannot remove an ignored dependency directoryFixed
findresults from POSIX and Windows filesystem roots losing the first path segment or gaining duplicate trailing separatorsFixed transient version-check, catalog, managed-tool, and package-management HTTP failures not being retried
Fixed interactive errors ignoring the configured output padding.
Fixed the inherited OpenCode Go provider display name.
Fixed inherited provider error normalization treating arrays and class instances as structured response bodies instead of preserving their original errors
Fixed inherited Anthropic streams dropping text or thinking included in the initial content-block event
Fixed inherited Google history conversion dropping signed empty text and thinking blocks required for replay
Fixed inherited OpenAI Codex cached WebSocket sessions being shared across different account credentials (#7364).
Fixed inherited transient Google Generative AI and Vertex AI provider errors bypassing automatic retries
Fixed inherited Gemini 3 tool call ids being discarded during history conversion, breaking signed multi-turn replay
Restored inherited GitHub Copilot models returned through account-specific policy responses
Replaced the inherited retired Qwen Token Plan
qwen3.8-max-previewmodel withqwen3.8-maxFixed inherited terminal width accounting for Indic conjunct grapheme clusters
Fixed inherited nested fullscreen stack layouts ignoring child minimum sizes.
Fixed inherited batched terminal color-scheme reports being parsed as one malformed response (#7550).
Fixed inherited terminal progress clearing to emit the complete OSC 9;4 sequence (#7581).
Fixed inherited iTerm2 image payloads omitting the size metadata required by the xterm.js image addon (#7612).
Fixed inherited width truncation leaving OSC 8 hyperlinks unterminated
Updated inherited GPT-5.6 Terra and Luna pricing across OpenAI and passthrough model catalogs.
Fixed inherited Fireworks Kimi K3 models to use the OpenAI-compatible API with native reasoning-effort levels and deferred tools (#7199, #7230
Updated the inherited Groq Qwen reasoning override for the replacement
qwen/qwen3.6-27bmodel.Fixed inherited Windows Shift+Enter detection by reading modifier state from the native Win32 helper.
Fixed the inherited pi-tui npm package omitting the source and build scripts needed to rebuild its Windows and Darwin native addons.
Fixed inherited Windows console truecolor detection when Windows Terminal does not provide
WT_SESSIONto child shells.Fixed inherited phantom fullscreen text selection from unmatched mouse events when changing terminal pane focus.
Fixed inherited keyboard input rendering latency on Windows by letting input preempt the throttled render timer.
Fixed inherited agent harness path handling on Windows for file basenames, recursive skill loading, and prompt template names.
- 0.83.x
0.83.0
29 Jul 2026- breaking
Upgraded bundled TypeBox aliases to 1.3.7, removing deprecated APIs including
Type.Base,Type.Awaited,Type.Promise,Type.AsyncIterator,Type.Iterator,Type.Options, andValue.Mutate, while fixing compiled validation of nullable array tool arguments. Extensions using removed APIs must migrate to supported TypeBox APIs. See Package Dependencies Credential export for external clients —
pi auth print-api-keyandpi auth print-bearer-tokenexport configured credentials with automatic OAuth refresh and minimum-validity enforcement.Headless OpenRouter sign-in — Complete
/loginover SSH by pasting the redirect URL or authorization code when the loopback callback is unavailable. See OpenRouter.
New Features
Credential export for external clients —
pi auth print-api-keyandpi auth print-bearer-tokenexport configured credentials with automatic OAuth refresh and minimum-validity enforcement.Headless OpenRouter sign-in — Complete
/loginover SSH by pasting the redirect URL or authorization code when the loopback callback is unavailable. See OpenRouter.Claude Opus 5 on GitHub Copilot — Use Claude Opus 5 through GitHub Copilot with adaptive thinking and a 1M context window. See GitHub Copilot.
Breaking Changes
- breaking
Upgraded bundled TypeBox aliases to 1.3.7, removing deprecated APIs including
Type.Base,Type.Awaited,Type.Promise,Type.AsyncIterator,Type.Iterator,Type.Options, andValue.Mutate, while fixing compiled validation of nullable array tool arguments. Extensions using removed APIs must migrate to supported TypeBox APIs. See Package Dependencies
Added
Added
pi auth print-api-keyandpi auth print-bearer-tokencommands for exporting configured credentials to external clients, including automatic OAuth refresh and configurable minimum token validity (#7168).Exposed the session's resolved model scope as
ctx.scopedModelsto extensions. See Extension ContextAdded inherited per-request
fetchinjection for supported text and image provider transports.Added the inherited
"pending"stop reason for partial streaming messages. See Custom Provider Stream PatternAdded inherited raw provider stop reasons across Google, Anthropic, Amazon Bedrock, Mistral, and OpenAI streams; unmapped terminal reasons now surface as provider errors instead of successful stops (#7272).
Added manual redirect URL and authorization-code entry to OpenRouter login for remote and headless environments. See OpenRouter
Added inherited Claude Opus 5 support for GitHub Copilot with adaptive thinking and a 1M context window. See GitHub Copilot
Changed
Changed inherited OAuth credential resolution to refresh tokens with less than five minutes of validity remaining instead of waiting until expiration (#7168).
Fixed
Added a status line when the tool output expansion is toggled (#7180).
Fixed file-backed
SYSTEM.mdandAPPEND_SYSTEM.mdprompts being omitted from the interactive startup context listing. See System Prompt Files (#7096).Fixed context files loading twice when a linked Git worktree is nested under its main repository. See Context Files
Fixed llama.cpp streamed responses reporting zero token usage and leaving session context accounting empty. See llama.cpp
Fixed session replacement and committed tree navigation during an active response to abort and persist the outgoing turn instead of leaving dangling tool calls. See Sessions
Fixed failed Git package installs leaving partial directories that blocked clean retries. See Install and Manage
Fixed the
/modelselector retaining a stale selection while filtering instead of highlighting the top matchFixed direct RPC bash commands bypassing extension
user_bashhandlers. See User Bash Events (#7214).Fixed skills, prompts, and themes losing package source metadata after extensions reload resources. See Resource Events (#6968).
Fixed cancellation of concurrently running user bash commands so every active command is aborted
Fixed duplicate messages appearing when extensions switch sessions during interactive startup
Fixed inherited Qwen Token Plan reasoning models to send their service-specific thinking controls and supported reasoning-effort levels (#6951, #6998).
Fixed inherited Z.AI output limits being sent through an unsupported parameter. See Providers
Fixed explicitly configured Amazon Bedrock profiles being overridden by ambient AWS access keys. See Amazon Bedrock
Fixed inherited image fallback paths overflowing narrow terminals, shortened home-directory paths, and made absolute paths clickable when terminal hyperlinks are available (#7262).
Fixed inherited OpenAI-compatible tool calls losing their function arguments when malformed deltas also contain an empty
customobject
- 0.82.x
0.82.1
25 Jul 2026Claude Opus 5 — Available on Anthropic and Amazon Bedrock with adaptive thinking (including
xhigh), inference profiles, and prompt caching. See Providers.Anthropic gateway bearer auth —
ANTHROPIC_AUTH_TOKENauthenticates against Anthropic-compatible gateways that requireAuthorization: Bearer, including compaction and branch summaries. See Environment Variables or Auth File.Faster, more resilient model catalogs — pi.dev catalogs revalidate with
If-None-Matchso unchanged providers answer with an empty304, and llama.cpp models stay listed across restarts. See llama.cpp.
New Features
Claude Opus 5 — Available on Anthropic and Amazon Bedrock with adaptive thinking (including
xhigh), inference profiles, and prompt caching. See Providers.Anthropic gateway bearer auth —
ANTHROPIC_AUTH_TOKENauthenticates against Anthropic-compatible gateways that requireAuthorization: Bearer, including compaction and branch summaries. See Environment Variables or Auth File.Faster, more resilient model catalogs — pi.dev catalogs revalidate with
If-None-Matchso unchanged providers answer with an empty304, and llama.cpp models stay listed across restarts. See llama.cpp.
Added
Exposed the
outputPadsetting to custom message renderers. See ExtensionsAdded inherited
ANTHROPIC_AUTH_TOKENbearer authentication for Anthropic-compatible gateways. See Providers (#5871).Added inherited Claude Opus 5 support for Anthropic and Amazon Bedrock with adaptive thinking, inference profiles, prompt caching, and preserved AWS validation messages
Changed
Changed pi.dev model catalog refreshes to revalidate with
If-None-Match, so unchanged provider catalogs answer with an empty304instead of a full download.Changed inherited Radius OAuth device authorization, token exchange, and refresh requests to use the configured gateway directly.
Changed inherited model loading errors to append the underlying cause, so auth failures such as
OAuth refresh failed for openai-codexreport the provider response instead of a bare wrapper message.
Fixed
Fixed compaction and branch summaries for providers whose authentication resolves entirely to request headers
Fixed unavailable scoped models being hidden from
/models, allowing them to be removed without editing settings manually (#6949, #7032Fixed startup context file discovery to skip directories that match context file names such as
AGENTS.md, which producedEISDIRwarningsFixed the llama.cpp extension to persist its model catalog, so llama.cpp models stay listed before the first successful refresh. See llama.cpp
0.82.0
24 Jul 2026Reading the note…
- 0.81.x
0.81.1
21 Jul 2026Reading the note…
0.81.0
21 Jul 2026Reading the note…
- 0.80.x
0.80.10
16 Jul 2026Reading the note…
0.80.9
16 Jul 2026Reading the note…
0.80.8
16 Jul 2026Reading the note…
0.80.7
14 Jul 2026Reading the note…
0.80.6
9 Jul 2026Reading the note…
0.80.5
9 Jul 2026Reading the note…
0.80.3
30 Jun 2026Reading the note…
0.80.2
23 Jun 2026Reading the note…
0.80.1
23 Jun 2026Reading the note…
- 0.79.x
0.79.10
22 Jun 2026Reading the note…
0.79.9
20 Jun 2026Reading the note…
0.79.8
19 Jun 2026Reading the note…
0.79.7
18 Jun 2026Reading the note…
0.79.6
16 Jun 2026Reading the note…
0.79.5
16 Jun 2026Reading the note…
0.79.4
15 Jun 2026Reading the note…
0.79.3
13 Jun 2026Reading the note…
0.79.2
12 Jun 2026Reading the note…
0.79.1
9 Jun 2026Reading the note…
0.79.0
8 Jun 2026Reading the note…
- 0.78.x
0.78.1
4 Jun 2026Reading the note…
0.78.0
29 May 2026Reading the note…