Release · Oh My Pi · can1357

Oh My Pi v18.20.0

What's new in Oh My Pi v18.20.0, released Nov 12, 2026 (). This is the latest version.

Release notes

Oh My Pi v18.20.0

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

Changed
  • prepareCompaction() runs as the compaction.prepare loop phase, so a ui.loop-blocked stall from a cold token walk over a long branch names compaction instead of "unknown" (#15027, #18867 by @wolfiesch)

@oh-my-pi/pi-ai

Added
  • Added the google-decisions judgment API for Google's Gemini Decisions API (gemini-decision-1), with text and image input (#19060 by @kevcube)
  • Added apiKey to successful OAuthAccessResolution results from oauth.accessById() and oauth.accessAll(): the key normal requests send for that account, which differs from accessToken for providers with structured credentials (#19030 by @Xytronix)
  • Added an optional exemptionAlias to ToolCallLoopGuard so transport calls can match the dispatched tool's name in exemptTools (#18860)
  • Added the liquid-systemone judgment API for Liquid AI's decision models, which rejects image sets over Liquid's 10,000 32×32-patch request cap before sending (#18076, #18100 by @SuperUserA)
  • Added the nace-systemone judgment API for Nace's Drex decision models, which sends images as Drex's top-level images data URLs and replaces the base64 image, audio, video and PDF data URLs that Drex rejects in judged text with a description (#18950 by @alphastorm)
Fixed
  • Fixed a spent Codex account retrying every minute for days when its siblings were only refused the requested model: their short model-policy blocks no longer count as a sibling becoming available, so the usage-limit wait follows the spent account's reset and model fallback can take over (#17637, #19019 by @wolfiesch)
  • Auth-gateway client tokens (serve --clients) can no longer set who a request is from, who pays, or how the gateway reaches the provider: chat routes drop their request headers, userProfileId, initiatorOverride, metadata, serviceTier, cacheRetention and the other gateway-only options, while the gateway token keeps them (#19067 by @alphastorm)
  • Fixed the auth gateway's /v1/pi/stream dropping taskBudget, include and anthropicPrefixMismatchBehavior, which its other chat routes accept (#19067 by @alphastorm)
  • Fixed requests to Vertex AI Mistral partner models (mistral-medium-3, mistral-small-2503, codestral-2) failing because they were sent in Anthropic's request format (#19010, #19022 by @yuzu-octopus)
  • Added Gemini's xhigh thinking level, sent on the Gemini API and Vertex for models whose ladder exposes it (Gemini 4 Hydrogen).
  • Fixed omp failing to start with ENOTDIR: not a directory, stat '~/.aws/credentials' when ~/.aws is a file instead of a directory (#19083 by @iamshatter)

@oh-my-pi/pi-catalog

Added
  • Added the Gemini Decision 1 judge model (google/gemini-decision-1, GEMINI_API_KEY); assign it to the judge role to use it (#19060 by @kevcube)
  • Added Nace (nace) with the drex-max-v1.1, drex-max-finance and drex-v2.0 judge models and /login nace (NACE_API_KEY) (#18950 by @alphastorm)
  • Added Gemini 4 Hydrogen (gemini-4-hydrogen) on Google, Vertex, OpenCode Zen, OpenRouter, Vercel AI Gateway, and Kilo, with low, medium, high, and xhigh thinking levels on the native Google transports.
Changed
  • Factory Droid requests identify as droid 1.7.1 and report the interactive CLI as their surface, and prefix-bound Claude models (Opus, Sonnet and Haiku 5.5, Fable 5.1) on Factory's direct Anthropic route now ask Anthropic to drop stale signed thinking instead of rejecting a turn whose earlier context changed (#18771 by @will-bogusz)
Fixed
  • Fixed alibaba-token-plan/qwen4-max-preview (including its qwen4.0-max-preview alias) showing no context or output limits, image input, or thinking levels (#18986).
  • Fixed Vertex AI Mistral partner models (mistral-medium-3, mistral-small-2503, codestral-2) misrouting to the first-party Gemini endpoint; they now ride the publishers/mistralai raw-predict endpoint with ADC auth and an OpenAI-shaped body (#19010, #19022 by @yuzu-octopus).
  • Added Liquid AI (liquid) with the d1.1 and d1-ultra judge models and /login liquid (LIQUID_API_KEY) (#18076, #18100 by @SuperUserA)

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

Breaking Changes
  • secrets.yml regex rules are now Rust regex patterns run natively, in linear time: lookarounds and backreferences are no longer supported, and a (?P<secret>…) group marks the part to redact (text around it is context that stays); \d, \w and \s are Unicode-aware. A regex rule that does not compile stops startup with an error naming the file and entry instead of being skipped. Migrate (?<=password=)\S+ to password=(?P<secret>\S+); see docs/secrets.md (#18965 by @H4vC)
  • Secret placeholders are now four camelCased words after the friendly name, e.g. GitHubToken_correctHorseStapleBattery, with no $$ delimiters, and the transcript shows the real value wherever the model wrote one. Placeholders in the old $$NAME_HASH:CASE$$ form, in sessions saved before this change, stay literal text, including in tool calls the model copies them into; start a new session to get working placeholders (#19014 by @H4vC)
  • What the model writes from placeholders (replies, thinking, tool calls, summaries) is stored as written and replayed byte-identical, keeping thinking signatures and prompt caches valid; model output that still holds a value (written while redaction was off, or before the secret was configured) is redacted on replay. Values a regex rule finds later no longer rewrite earlier history. A friendlyName

…