Breaking Changes
ModelRegistry.getApiKey(model)has been replaced bygetApiKeyAndHeaders(model)becausemodels.jsonauth and header values can now resolve dynamically on every request. Extensions and SDK integrations that previously fetched only an API key must now fetch request auth per call and forward bothapiKeyandheaders. UsegetApiKeyForProvider(provider)only when you explicitly want provider-level API key lookup without model headers orauthHeaderhandling (#1835)- Removed deprecated direct
minimaxandminimax-cnmodel IDs, keeping onlyMiniMax-M2.7andMiniMax-M2.7-highspeed. Update pinned model IDs to one of those supported direct MiniMax models, or use another provider route that still exposes the older IDs (#2596 by @liyuan97)
Migration Notes
Before:
const apiKey = await ctx.modelRegistry.getApiKey(model);
return streamSimple(model, messages, { apiKey });After:
const auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);
if (!auth.ok) throw new Error(auth.error);
return streamSimple(model, messages, {
apiKey: auth.apiKey,
headers: auth.headers,
});Added
- Added
sessionDirsetting support in global and projectsettings.jsonso session storage can be configured without passing--session-diron every invocation (#2598 by @smcllns) - Added a startup onboarding hint in the interactive header telling users pi can explain its own features and documentation (#2620 by @ferologics)
- Added
edittool multi-edit support so one call can update multiple separate, disjoint regions in the same file while matching all replacements against the original file content - Added support for
PI_TUI_WRITE_LOGdirectory paths, creating a unique log file (tui-<timestamp>-<pid>.log) per instance for easier debugging of multiple pi sessions (#2508 by @mrexodia)
Changed
Fixed
- Fixed file mutation queue ordering so concurrent
editandwriteoperations targeting the same file stay serialized in request order instead of being reordered during queue-key resolution - Fixed
models.jsonshell-command auth and headers to resolve at request time instead of being cached into long-lived model state. pi now leaves TTL, caching, and recovery policy to user-provided wrapper commands because arbitrary shell commands need provider-specific strategies (#1835) - Fixed Google and Vertex cost calculation to subtract cached prompt tokens from billable input tokens instead of double-counting them when providers report
cachedContentTokenCount(#2588 by @sparkleMing) - Added missing
ajvdirect dependency; previously relied on transitive install via@mariozechner/pi-aiwhich broke standalone installs (#2252) - Fixed
/exportHTML backgrounds to honortheme.export.pageBg,cardBg, andinfoBginstead of always deriving them fromuserMessageBg(#2565) - Fixed interactive bash execution collapsed previews to recompute visual line wrapping at render time, so previews respect the current terminal width after resizes and split-pane width changes (#2569)
- Fixed RPC
get_session_statsto exposecontextUsage, so headless clients can read actual current context-window usage instead of deriving it from token totals (#2550) - Fixed
pi updatefor git packages to fetch only the tracked target branch with--no-tags, reducing unrelated branch and tag noise while preserving force-push-safe updates (#2548) - Fixed print and JSON modes to emit
session_shutdownbefore exit, so extensions can release long-lived resources and non-interactive runs terminate cleanly (#2576) - Fixed GitHub Copilot OpenAI Responses requests to omit the
reasoningfield entirely when no reasoning effort is requested, avoiding400errors from Copilotgpt-5-minirejectingreasoning: { effort: "none" }during internal summary calls (#2567) - Fixed blockquote text color breaking after inline links (and other inline elements) due to missing style restoration prefix
- Fixed slash-command Tab completion from immediately chaining into argument autocomplete after completing the command name, restoring flows like
/modelthat submit into a selector dialog (#2577) - Fixed stale content and incorrect viewport tracking after TUI content shrinks or transient components inflate the working area (#2126 by @Perlence)
- Fixed
@autocomplete to debounce editor-triggered searches, cancel in-flightfdlookups cleanly, and keep suggestions visible while results refresh (#1278)