Release · Oh My Pi · can1357

Oh My Pi v18.12.0

What's new in Oh My Pi v18.12.0, released Oct 17, 2026 (). Newer: v18.12.6 (Oct 21, 2026)

Release notes

Oh My Pi v18.12.0

@oh-my-pi/pi-agent-core

Fixed
  • Fixed Cursor turns failing with PROVIDER_ERROR when a follow-up (a finished background job, a late diagnostic, a reminder) arrived while the previous turn was still streaming (#15821 by @robfeldmann)

@oh-my-pi/pi-ai

Breaking Changes
  • PI_CODEX_ZSTD is replaced by PI_REQUEST_COMPRESSION; set PI_REQUEST_COMPRESSION=0 to send Codex (and every other) request body uncompressed (#16086 by @H4vC)
Added
  • Added ThinkingContent.narration, set on Anthropic and Bedrock thinking blocks whose signature marks them as between-tool narration, and presentNarrationAsAnswer(message) to show those blocks as reply text while replay keeps them as signed thinking
  • Added keys.peek(provider, { includeExpired: true }) to name the stored account behind an expired OAuth token for reads that never send it, such as keying an offline model-cache lookup (#16061 by @gchai)
  • Added prewarmModelConnection(model) (providers/connection-prewarm), which opens the model's API connection ahead of a request using the same transport and TLS settings so the request reuses it instead of paying the connection handshake (#16086 by @H4vC)
Changed
  • Anthropic requests to the official API now gzip the request body, so long conversations reach the model sooner on slow uplinks; set PI_REQUEST_COMPRESSION=0 to disable it (#16044 by @H4vC)
  • GitHub Copilot requests (chat completions, Responses, and Claude messages) now send zstd-compressed bodies, cutting upload size by roughly 60–75% on long conversations; set PI_REQUEST_COMPRESSION=0 to disable it (#16086 by @H4vC)
  • A rejected request-body encoding now only disables compression for that host, and only after the uncompressed resend succeeds, so a genuine 400 no longer turns compression off (#16086 by @H4vC)
  • Connection warm-up now covers every catalog provider, not only the official Anthropic API: it re-warms the origin a model's requests actually reach (Copilot plan hosts, MOONSHOT_BASE_URL, regional hosts), throttled per host; custom providers, built-in provider ids routed to a gateway, local hosts, and Anthropic gateways are never probed (#16086 by @H4vC)
Fixed
  • Fixed Ollama and Ollama Cloud streaming errors being silently accepted as successful responses (#16039 by @mottopanikeiku)
  • Fixed the hermes in-band scanner exposing a truncated tool name for streaming tool calls: toolStart now waits for the complete JSON name, so a stream that splits or stops mid-name never reports a partial tool name (#16064 by @adi-IL)
  • Fixed keys.peek() rotating through stored accounts on each call; it now returns the first account whose token has not expired, every time, so model discovery keeps reading one account's cached catalog (#16061 by @gchai)
  • Fixed local JSON Schema references with URI-percent-encoded, JSON Pointer-escaped, or empty definition names resolving incorrectly during dereferencing, strict conversion, and value validation (#15926 by @jchanghong023).
  • Fixed network failures showing a generic "Connection error."; offline, connection-refused, and TLS-verification failures now name the host and the cause (#16036 by @jorgoose)
  • Fixed Jev image limits rejecting inputs for unrelated native judges and redundant TypeSafe image judgments when only detail changes (#16002 by @anatoli-tsinovoy).
  • Fixed SIGTERM interrupting an in-flight OAuth token rotation before its replacement refresh token was saved (#15845).
  • Fixed sessions getting stuck on HTTP 400 after replaying tool names unsupported by the target provider, including invented proc://* calls and Google tool names sent to Bedrock (#15839)

@oh-my-pi/pi-catalog

Added
  • Added the request-encodings, request-encoding-rejection, and endpoint-hosts rule axes, resolveRequestCompression(model, url), and isCatalogEndpointUrl(model, url), declaring which providers' own endpoints decode compressed request bodies: official Anthropic API (gzip), Codex backend (zstd), and GitHub Copilot's API hosts (zstd, then gzip); Moonshot's China host counts as its own endpoint (#16086 by @H4vC)
Changed
  • Bundled GPT-5.4 rows on OpenAI, Azure, OpenCode Zen, and Command Code report a 1M context window, the window the coding agent already applied at runtime; GitHub Copilot and Factory Droid keep their own windows (#16094 by @H4vC)
Fixed
  • Fixed custom providers that declare a built-in providerType (Azure, GitHub Copilot, OpenCode, ClinePass, DeepSeek, NVIDIA) missing that provider's wire quirks, such as strict Responses pairing and the ClinePass reasoning field: they now follow the same catalog rules as the built-in provider (#16093 by @H4vC)
  • Fixed OpenCode Zen bringing back its retired bundled models after a failed refresh: the retry-backoff write no longer drops the cached snapshot's retention, so the pruned catalog survives the retry window and offline launches. (#16054 by @adi-IL)
  • Fixed providers.cacheWarming never arming for Claude on Google Antigravity: Claude models there now declare Vertex Anthropic's five-minute prompt-cache lifetime; Gemini models stay unwarmed because Google's implicit cache has no fixed lifetime (#15764, #16025 by @harshaygadekar)
  • Scoped Jev image bounds to the selected models instead of applying them to unrelated native judges (#16002 by @anatoli-tsinovoy)
  • Fixed Bedrock sessions rejecting replayed tool names over 64 characters after a model switch (#15839)

@oh-my-pi/pi-coding-agent

Added
  • Added statusLine.segmentOptions.pi.showProfile: set it to false to hide the profile name next to the π brand, for example when each profile already has its own theme (#16063 by @shgew)
  • Added sharpshooter.minPromptLength (default 16, minimum 2) to control the shortest prompt Sharpshooter extracts decisions from (#16043 by @bigHippoZz)
Changed

…