Release · Oh My Pi · can1357

Oh My Pi v18.16.0

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

Release notes

Oh My Pi v18.16.0

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

Changed
  • Deprecated createFileOps, computeFileLists, formatFileOperations, upsertFileOperations, isUrlSchemePath and FileOperations in @oh-my-pi/pi-agent-core/compaction; they now re-export @oh-my-pi/snapcompact, which callers should import directly
Fixed
  • Context estimates for a model without a known tokenizer family (Gemini, Grok and the like), and token counts made without a model (compress metrics, the legacy estimateTokens export), count text in o200k_base instead of guessing 4 bytes per token, which undercounted what those providers bill by 11–48% on code-heavy sessions and let compaction fire late after a switch to them (#17607 by @will-bogusz)
  • Context estimates no longer charge a reader another model's thinking signatures or redacted thinking, which the request strips: a Claude session switched to Grok or Gemini, including Gemini through Factory, counted them as text (#17607 by @will-bogusz)
Removed
  • Removed PI_TOKENIZER_ACCURATE: every model is now counted with a native tokenizer (#17607 by @will-bogusz)

@oh-my-pi/pi-ai

Added
  • /login mistral signs in through the browser like the Mistral Vibe CLI and stores the minted API key, whose usage counts against the plan's Vibe Code quota instead of pay-as-you-go API credits; MISTRAL_API_KEY still works (#13875 by @Gauthier-Huguenin, continued in #17672 by @abilliontokens)
  • Added dropsForeignReasoningPayload(turn, model), which tells whether transformMessages certainly strips a turn's thinking signatures and redacted thinking on the way to model, and, for Factory Droid's Gemini wire, isFactoryDroidGeminiWire(model) and keepsFactoryGeminiReasoning(turn) (#17607 by @will-bogusz)
  • Factory Droid Beam 1.0 requests accept tool-call turns that arrive without reasoning (#17766 by @will-bogusz)
Changed
  • Deprecated formatError on the embeddings, images, rerank, speech, transcriptions, video, pi-native and SystemOne server modules (now aliases of codedErrorResponse / noStoreErrorResponse in auth-gateway/http) and asStrict in providers/aws-sigv4 (now asStrictBytes from @oh-my-pi/pi-utils)
Fixed
  • Fixed Factory Droid Fable requests offering Opus 5 as the refusal fallback when your organization's model policy excludes Opus 5; Claude requests now offer only fallback models your account can use, and a request served by another organization's login than the one your model list came from offers none (#17772 by @will-bogusz)

@oh-my-pi/pi-catalog

Added
  • /login mistral now offers the Mistral Vibe browser sign-in beside MISTRAL_API_KEY (#13875 by @Gauthier-Huguenin, continued in #17672 by @abilliontokens)
  • Added revisionAtLeast to compat/revision and exported withOpenAICompatibleDiscoveryTimeout from discovery/openai-compatible
  • Added the Factory Droid models droid 1.1.0 serves: GPT-6.1 Terra, GPT-6 Sol and Luna Fast Mode, GPT-6 Astra and GPT-6.1 Sol Ultra Fast (after the organization's high-cost opt-in), Nemotron 3.5 Super, Muse Spark Open, Muse Spark 1.2 and Beam 1.0, each listed once the account may use it (#17766 by @will-bogusz)
  • Added Factory Droid's dated credit rates: the credit rate follows Factory's promotions, discounted from a promotion's start and back to the base rate at its end, using the same dated rate cards as dollar prices (currently GPT-5.6 Sol and Gemini 3.7/3.8 Flash) (#16309 by @will-bogusz)
Changed
  • Factory Droid lists Opus 5.5 Fast, GPT-6.1 Sol and MiniMax M3 without the feature flags Factory retired, and no longer routes GPT-5.5 to Snowflake (#17766 by @will-bogusz)
  • Factory Droid Opus 5.5 now falls back to Opus 5 when Anthropic refuses a request, as droid does, while your account can use Opus 5 (#17772 by @will-bogusz)
Fixed
  • GPT-3.5 and GPT-4 (Turbo) resolve the cl100k tokenizer, so their context estimates count in cl100k_base rather than the o200k_base default for models without one (#17607 by @will-bogusz)
  • Added Scaleway Generative APIs as a built-in provider with 12 serverless chat models (glm-5.3 default), API-key login, and live model discovery (#16687 by @reda-maizate)

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

Added
  • With the Hindsight memory backend, retain and learn can now store a memory with scope: "global" so every project recalls it. It is opt-in through the new hindsight.globalScope setting (off by default) and needs global or per-project-tagged scoping (#17706 by @alphastorm, from #15030 by @kithawk).
  • Added btw.inject (off by default; /settings → Interaction → "/btw Steering Inject"): when you ask /btw for a steering prompt, it drafts one in an <inject> block shown behind a pink rail, and Alt+I (app.btw.inject) sends it to the main session (as a steer while the agent runs, else as a new turn) from the inline answer or the BTW history sheet, once per answer from the current run. Once sent, the block turns green with ➤ on each line and "Injected into main session" below it; if the main session drops or refuses the send, the block turns back to pending and the same key retries (#17618 by @apullin)
  • With OTLP metrics export configured (OTEL_EXPORTER_OTLP_METRICS_ENDPOINT), composer predictions export content-free omp.composer.prediction.* metrics by serving model: requests by outcome (offered, skipped, stale, cancelled, timeout, error) with their duration, predictions shown (counted on the first frame that paints them), shown predictions by whether they were accepted with Tab or Right, and the time from first display to acceptance (#17739 by @wolfiesch)
  • Bash results the output minimizer rewrote now keep which filter ran and the bytes before and after in the session, and the bash card shows them (Minimized: git 120.4KB → 3.2KB) (#16586 by @will-bogusz)
  • Eval completion handles expose attempts (JS await handle.attempts()

…