Release · Oh My Pi · can1357

Oh My Pi v18.15.0

What's new in Oh My Pi v18.15.0, released Nov 1, 2026 (). Newer: v18.18.0 (Nov 7, 2026)

Release notes

Oh My Pi v18.15.0

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

Fixed
  • Fixed OpenAI remote compaction (/responses/compact) replaying backend-only internal_chat_message_metadata_passthrough metadata that Codex rejects as an unknown parameter (#17590 by @briankeefe)

@oh-my-pi/pi-ai

Fixed
  • Fixed Codex conversation replay failing with an unknown internal_chat_message_metadata_passthrough.content_token_count parameter by omitting backend-internal response metadata from replayed input (#17590, #17597 by @briankeefe).
  • Fixed service_tier: "ultrafast" being dropped for OpenAI-family models on custom providers even when the model's serviceTiers lists it (#17577 by @jakehemmerle)
  • Fixed Google Vertex requests with Workforce Identity Federation ADC failing token refresh against the wrong endpoint (#17447).
  • Fixed Anthropic (and other rotating-token) OAuth accounts being signed out automatically when a background usage poll's token refresh got invalid_grant, including refreshes a client delegates to an auth broker; usage polling no longer disables credentials, so only a real request's refresh can do that (#17468)

@oh-my-pi/pi-catalog

Added
  • Added Modular Cloud (modular) as a provider: /login modular with an API key, models and prices from the models.dev modular entry, and per-model reasoning controls for MiniMax M3.1 Flash, MiniMax M3, and Gemma 4 31B (#17334 by @tommyjtl)
  • SambaNova Cloud follow-up turns now reuse the provider's prefix cache, so multi-turn conversations stop re-processing earlier context (#17555 by @rjuez00)
Fixed
  • Fixed newly discovered OpenAI-compatible models ignoring provider-reported context and output token limits (#17561 by @wolfiesch)

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

Added
  • Long or multi-step background shell commands get a one-line caption saying what they do and when they end, written once per job by the widget model role when the job, after running 15 seconds, is shown in a live widget or listed by /jobs full; the jobs sheet and /jobs full show it under the job's purpose. It follows the Live Job Widgets setting (async.widgets), and CreateAgentSessionOptions.jobCaptionWriter replaces the model call (#17649 by @wolfiesch)
Changed
  • In a source checkout, the error for a missing HTML export viewer now names the script that builds it, packages/collab-web/scripts/build-export-viewer.ts, beside bun gen:export-viewer (#17636 by @sjawhar)
  • Fixed an eval cell running silently on a new kernel after the session's Python kernel or JS worker died between cells (a crash, a kill, an out-of-memory kill, or a cancelled JS cell): the first cell on the replacement now carries Kernel restarted: … state is unavailable. Re-run needed setup ahead of its own output, instead of failing with a bare NameError on a variable an earlier cell set (#17595 by @sjawhar)
  • Fixed a task worker messaged (write agent://<id>) while still starting up running on the shared context alone and never receiving its tasks[].task assignment; the message now waits for the assignment's turn (#17587)
  • lsp reload now discovers Rust crates created after rust-analyzer started, so hover and other analysis work without restarting omp (#17658).
  • A model without image input (GLM, DeepSeek, Grok Composer and the like) reads a snapcompact archive's full kept text instead of image-omitted placeholders for its frames, after a model switch, on resume and in side requests (#17510 by @will-bogusz)
  • Snapcompact no longer refuses a new archive as "would not reduce context" when it shrinks a session that already holds one (/compact snapcompact, idle and pre-prompt compaction) (#17490 by @will-bogusz)
  • A failed /compact snapcompact now reports its reason once instead of twice, and names the /compact mode to run instead (#17490 by @will-bogusz)
  • Background bash and eval jobs now carry the purpose the model gave for the call: /jobs, /jobs full, proc:// listings, wait and job results, and the jobs HUD hover lead with it ahead of the raw command line (#17649 by @wolfiesch)
  • The seance guidance in the task tool and the archive docs now say that a question about an earlier session is answered by the seance agent, and that reading the session's raw JSONL belongs to narrow mechanical checks only, so a consult is no longer duplicated by transcript reads and re-run checks (#17523 by @iacore)
Fixed
  • A prompt on a model whose provider has no usable credential (logged out, refresh token expired, or an auth broker holding none) now switches to the first retry.fallbackChains candidate that has one instead of failing with "No API key found", and switches back on the first prompt after the credential returns (#17559 by @wolfiesch)
  • Fixed background results arriving during manual /compact starting turns on stale history or disappearing from the saved session (#17599).
  • Fixed isolated tasks on fuse-overlayfs leaving their overlay mounted and the fuse-overlayfs daemon running when the unmount hit a transient "Device or resource busy"; a failed unmount now reports fusermount's error and keeps the workspace for omp worktree clear instead of deleting its layers under the live mount (#17644)
  • Usage-limit retries now count system sleep toward the quota-reset deadline instead of re-arming the remaining uptime delay after the countdown reaches zero (#17606 by @zhiland).
  • Fixed role assignments to a models.yml model whose id differs only by case from a bundled model of the same provider (such as xiaomi/MiMo-V2.6-Pro beside xiaomi/mimo-v2.6-pro) silently staying unset (#17580)
  • Fixed Eval's direct browser wait helpers (tab.waitForSelector, tab.waitForText, …) giving up after 29 s when passed a longer { timeout }; the requested timeout is now honored up to the browser tool's 300 s cap (#17617)
  • Fixed browser.open

…