@oh-my-pi/pi-agent-core
Added
- Added optional
fetchoverrides toSummaryOptionsandcompact/generateSummaryso remote compaction can use custom HTTP clients - Added optional
fetchoption toProxyStreamOptionsto control the HTTP request used bystreamProxy - Added optional
fetchoverrides torequestOpenAiRemoteCompactionandrequestRemoteCompactionfor injectable HTTP transport - Added the upstream provider that served a request (
AssistantMessage.upstreamProvider, e.g. OpenRouter's routed provider) as api.gen_ai.response.upstream_providerchat-span telemetry attribute, alongside the existing response id and time-to-first-chunk.
@oh-my-pi/pi-ai
Added
- Added optional
fetchtransport override (fetch?: FetchImpl) to Google, Ollama, and OpenAI-compatible model-manager options so dynamic model discovery and metadata lookups can use a caller-supplied HTTP client instead of only globalfetch - Added optional
fetchon OAuth controller and API-key validation/login flows so token exchange, refresh, and device/PKCE login requests can be routed through a customfetchimplementation - Added optional
fetchsupport to usage polling context, allowing usage providers to execute usage checks using an injected HTTP client - Added
AssistantMessage.upstreamProvider, capturing the upstream provider an aggregator routed the request to (OpenRouter reports it via a top-levelproviderfield on every chunk, e.g."Anthropic"). Surfaced from the OpenAI-completions stream alongsideresponseId.
Fixed
- Fixed a degenerate OpenAI Codex stream (the model emits whitespace-only
function_call_arguments.deltaframes forever — commonly seen right after atodotool call) terminating the turn with an error instead of recovering. The whitespace-loop circuit-breaker now (a) stops aborting the shared per-requestAbortController—requestSignalis anAbortSignal.anyover it, so aborting latched it and made every reopen on the reusedrequestSetupimpossible — and (b) drops the half-built junk tool call and replays the request from scratch, bounded byCODEX_WHITESPACE_LOOP_RETRY_LIMIT(2). Sampling nondeterminism usually clears the loop on a fresh attempt; once the budget is exhausted the error is surfaced as before, but without the junk tool call polluting the message. - Capped requested output tokens at 64k (
OPENAI_MAX_OUTPUT_TOKENS, mirroring Anthropic'sCLAUDE_CODE_MAX_OUTPUT_TOKENS) on OpenAI-family wires with a known upstream output cap — theopenai-completionsrequest builder (non-OpenRouter) and the shared responses sampling helper (openai-responses,azure-openai-responses). A model's catalogmaxTokensoften tracks its context window rather than the upstream's per-request output cap, so requesting the full ceiling 400'd (e.g.z-ai/glm-4.7asking for 131072 output exceeded the upstream's 131072-token total context). Output is nowmin(requested, model.maxTokens, 64000). - Stopped sending
max_tokens/max_completion_tokenson OpenRouter (openrouter.ai) completions requests. OpenRouter filters out any upstream whose advertised output cap is below the requestedmax_tokens, so a value derived from the catalog (which reflects the highest-cap provider) silently excluded lower-cap upstreams —provider.order: ["cerebras"]forz-ai/glm-4.7fell through to DeepInfra because Cerebras's ~40k output cap is below the request, whileonly: ["cerebras"](no fallback target) bypassed the filter and worked. Omitting the field lets each upstream self-cap and keeps provider routing (only/order) honored. Kimi via OpenRouter stays exempt — it derives TPM rate limits frommax_tokens.
@oh-my-pi/pi-coding-agent
Added
- Added an optional
fetchoption toCustomToolContextso custom tools can use a caller-provided HTTP implementation - Added optional
fetchoverrides toModelRegistryconstruction and MCP/web search/tool network calls, enabling callers to inject custom HTTP clients instead of relying on globalfetch - Added a
bash.enabledsetting to disable the model-facing bash tool while leaving user-initiated bang/RPC bash commands available. - Added an
@<upstream>model-selector suffix to pin an aggregator model to a single upstream provider per invocation, e.g.--model openrouter/z-ai/glm-4.7@cerebras(sets OpenRouterprovider.only; Vercel AI Gateway models map tovercelGatewayRouting.only). Resolved throughparseModelPattern, so it works for--model/--smol, model roles, and the SDK, and composes with a trailing thinking level (...@cerebras:high). The base must resolve to an aggregator (openrouter.ai/ai-gateway.vercel.sh); otherwise the@stays part of the id, so ids that legitimately contain@(claude-opus-4-8@default,workers-ai/@cf/...) are unaffected.
Fixed
- Fixed a turn-ending provider error (e.g. a 502 whose body is the proxy's full HTML page) flooding the transcript:
AnthropicApiErrorfolds the entire response body intoerrorMessage, and the inline transcript render reprinted it verbatim — every embedded blank line included — leaving a tall mostly-empty block ending in</html>. The inline error now drops blank lines, clamps to 8 lines, and width-truncates each line viagetPreviewLines, matching the pinned error banner.
@oh-my-pi/pi-mnemopi
Added
- Added a
fetchoption toExtractionClientto inject a custom fetch implementation for remote LLM requests - Added an optional
fetchoption toextractFactsto control the transport used for remote extraction calls - Added support for passing a custom
fetchimplementation throughcompleteandsummarizeMemoriesvia remote LLM options
@oh-my-pi/pi-tui
Fixed
- Fixed TUI renders repeatedly clearing terminal scrollback after content filled the viewport. Unknown viewport probes no longer let foreground-streaming offscreen growth take the destructive
historyRebuildpath on every frame; newly appended tail rows stay reachable while stale history waits for a safe checkpoint. (#2154)
@oh-my-pi/pi-utils
Removed
- Removed the exported
hookFetchAPI, which previously interceptedglobalThis.fetchvia middleware handlers - Removed
hookFetchfrom the package entrypoint, so imports from@.../utilsno longer provide this fetch interception helper
What's Changed
Full Changelog: v15.10.7...v15.10.8