@oh-my-pi/pi-ai
Added
- Added bounded auto-retry for empty assistant completions specifically to the OpenAI Responses provider
- Added bounded auto-retry for empty assistant completions across the OpenAI Chat Completions, OpenAI Responses, and Anthropic Messages providers. A benign terminal stop that streamed no content and billed no output tokens — the signature of a flaky OpenAI-/Anthropic-compatible gateway that intermittently 200s with an empty body — is now retried up to twice with exponential backoff (honoring
providerRetryWait) before being surfaced, instead of silently stalling the agent loop. Retries fire only before any content streams, so live streaming (including thinking) is never delayed, retried, or duplicated.
Fixed
- Fixed the Antigravity (
google-antigravity) request builder droppinglabels.model_enumwhen the wire profile does not declare one. Required for Claude 4.6 ids whoseAntigravityModelWireProfilecarries onlymaxOutputTokens(no capturedmodel_enum); the label is now emitted only when the catalog defines it. (#3067)
@oh-my-pi/pi-catalog
Fixed
- Fixed Claude 4.6 routing on the
google-antigravity(andgoogle-gemini-cli) Cloud Code Assist providers, whose backend exposes the models asymmetrically:claude-sonnet-4-6has no-thinkingtwin andclaude-opus-4-6has only the-thinkingtwin. The sharedthinkingPairfamily was routing thinking efforts onclaude-sonnet-4-6to a non-existentclaude-sonnet-4-6-thinkingwire id (404Requested entity was not found); replaced both 4.6 entries with bespoke single-wire families so every effort and off resolve to the live wire id. Addedclaude-sonnet-4-6andclaude-opus-4-6-thinkingentries toANTIGRAVITY_MODEL_WIRE_PROFILEScapped at the backend's 64000-output-token limit (over-cap requests 400'd withRequest contains an invalid argument);modelEnumis now optional onAntigravityModelWireProfilesince the Claude wire ids are accepted without a capturedlabels.model_enum. (#3067)
@oh-my-pi/pi-coding-agent
Fixed
- Fixed
omp benchandomp dry-balancefailing to resolve models from extension providers - Improved error reporting for
omp benchruns that return no output or tokens - Cache-miss marker no longer fires on a cold turn whose predecessor only wrote the prompt cache (never read it back). The session's opening request always writes the prefix with
cacheRead 0, so a long-running first tool call (e.g.gh run watch) that outlived the provider's cache TTL surfaced a spurious⊘ cache missdivider right under the opening message. The marker now requires the previous turn to have actually read a warm prefix, so it flags only a demonstrably working cache going cold — and collapses a run of consecutive cold turns to a single marker at the moment the cache broke. - Fixed
omp benchandomp dry-balancefailing to resolve models from extension-registered providers (pi.registerProvider(...)). Both commands build a one-shotModelRegistrythat previously only knew built-in catalog providers, so aprovider/modelselector for a provider contributed by an extension under~/.omp/agent/extensions/errored with "Model not found". A newloadCliExtensionProvidershelper loads the session's extensions, drains their provider registrations into the registry, and discovers dynamic provider catalogs before resolving selectors — mirroring the interactive session andomp modelspaths. omp benchnow reports a run that streamed no content and measured no output tokens as a failure ("provider returned no output") instead of a misleading green check withtokens 0 / TPS 0.0.- Cleared stale pending-preview gates when
resolvefinds no runnable handler, and forwarded the missingpeekPendingInvokerandclearPendingInvokershooks on the production session so staged previews actually reach the resolve tool and the gate drains on dispatch failure. (#3061) - Deferred status-line usage refreshes off the render path and timeboxed the startup fetch so slow Anthropic quota lookups no longer block interactive startup. (#3057)
- Fixed image paste placeholders falling through to terminal hyperlink settings before
Settings.init(), so early editor rendering falls back to plain text instead of crashing. (#3064) - Fixed
omp plugin install github:owner/reposilently keeping the user on a stale commit when re-run on an already-installed GitHub plugin.bun install <spec>respects the existingbun.lockpin when the spec is unchanged and never re-resolves the remote ref, so the manager now follows a git re-install withbun update <name>to refresh the lockfile pin against the upstream. The install transaction also snapshotsbun.lockup front and routes feature validation, extension validation, and runtime-config save through one rollback path so a failed install can never leave the rejected commit pinned in the active tree or lockfile. First-time installs are unaffected. (#3063)
What's Changed
- fix(coding-agent): timebox status usage refresh by @roboomp in #3058
- fix(agent): clear stale pending preview gates by @roboomp in #3062
- fix(tui): guard hyperlinks before settings init by @roboomp in #3066
- fix(coding-agent): refresh GitHub plugin lockfile pin on re-install by @roboomp in #3069
Full Changelog: v16.1.3...v16.1.4