Release notes
Oh My Pi v18.20.0
@oh-my-pi/pi-agent-core
Changed
prepareCompaction()runs as thecompaction.prepareloop phase, so aui.loop-blockedstall 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-decisionsjudgment API for Google's Gemini Decisions API (gemini-decision-1), with text and image input (#19060 by @kevcube) - Added
apiKeyto successfulOAuthAccessResolutionresults fromoauth.accessById()andoauth.accessAll(): the key normal requests send for that account, which differs fromaccessTokenfor providers with structured credentials (#19030 by @Xytronix) - Added an optional
exemptionAliastoToolCallLoopGuardso transport calls can match the dispatched tool's name inexemptTools(#18860) - Added the
liquid-systemonejudgment 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-systemonejudgment API for Nace's Drex decision models, which sends images as Drex's top-levelimagesdata 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,cacheRetentionand the other gateway-only options, while the gateway token keeps them (#19067 by @alphastorm) - Fixed the auth gateway's
/v1/pi/streamdroppingtaskBudget,includeandanthropicPrefixMismatchBehavior, 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
xhighthinking 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~/.awsis 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 thejudgerole to use it (#19060 by @kevcube) - Added Nace (
nace) with thedrex-max-v1.1,drex-max-financeanddrex-v2.0judge 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 itsqwen4.0-max-previewalias) 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 thepublishers/mistralairaw-predict endpoint with ADC auth and an OpenAI-shaped body (#19010, #19022 by @yuzu-octopus). - Added Liquid AI (
liquid) with thed1.1andd1-ultrajudge models and/login liquid(LIQUID_API_KEY) (#18076, #18100 by @SuperUserA)
@oh-my-pi/pi-coding-agent
Breaking Changes
secrets.ymlregex rules are now Rustregexpatterns 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,\wand\sare 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+topassword=(?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
…