Release notes
Oh My Pi v18.16.0
@oh-my-pi/pi-agent-core
Changed
- Deprecated
createFileOps,computeFileLists,formatFileOperations,upsertFileOperations,isUrlSchemePathandFileOperationsin@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
estimateTokensexport), 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 mistralsigns 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_KEYstill works (#13875 by @Gauthier-Huguenin, continued in #17672 by @abilliontokens)- Added
dropsForeignReasoningPayload(turn, model), which tells whethertransformMessagescertainly strips a turn's thinking signatures and redacted thinking on the way tomodel, and, for Factory Droid's Gemini wire,isFactoryDroidGeminiWire(model)andkeepsFactoryGeminiReasoning(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
formatErroron the embeddings, images, rerank, speech, transcriptions, video, pi-native and SystemOne server modules (now aliases ofcodedErrorResponse/noStoreErrorResponseinauth-gateway/http) andasStrictinproviders/aws-sigv4(nowasStrictBytesfrom@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 mistralnow offers the Mistral Vibe browser sign-in besideMISTRAL_API_KEY(#13875 by @Gauthier-Huguenin, continued in #17672 by @abilliontokens)- Added
revisionAtLeasttocompat/revisionand exportedwithOpenAICompatibleDiscoveryTimeoutfromdiscovery/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
cl100ktokenizer, 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,
retainandlearncan now store a memory withscope: "global"so every project recalls it. It is opt-in through the newhindsight.globalScopesetting (off by default) and needsglobalorper-project-taggedscoping (#17706 by @alphastorm, from #15030 by @kithawk). - Added
btw.inject(off by default;/settings→ Interaction → "/btw Steering Inject"): when you ask/btwfor a steering prompt, it drafts one in an<inject>block shown behind a pink rail, andAlt+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-freeomp.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(JSawait handle.attempts()
…