v0.7.0 — long-running research models survive end-to-end
Highlights
- Research-class models (o3-deep-research and kin) now work end-to-end. The hidden undici 300s headers/body ceiling is gone — the SSRF-guarded dispatcher's timeouts are now derived above polyrouter's own typed bounds, so raising a timeout knob actually holds, and timeouts stay typed and correctly breaker-classified instead of surfacing as opaque socket errors.
- Per-provider patience overrides — set first-response and between-chunks timeouts (1s–1h) on a single provider from the provider form's Advanced section. Blank fields inherit the instance defaults (shown honestly from the server via
GET /api/providers/timeout-defaults); overrides resolve per fallback-chain attempt, so a raised research provider never slackens hang detection for anyone else in the chain. - Keepalives count as liveness — upstream bytes (OpenRouter's
: OPENROUTER PROCESSINGcomments included) re-arm the streaming stall watchdog and renew the circuit breaker's half-open probe lease, so a streamed deep-research call with long silent thinking gaps is no longer aborted as stalled. True silence still fails typed at exactly the configured bound. - The ChatGPT/Responses buffered path gained its own byte-re-armed idle guard — it previously had no typed post-headers bound at all.
- Body-capture card buttons fixed — "Purge all bodies" no longer renders as bare oversized text; the consent/disable dialogs follow the established primary/cancel/ghost idioms.
Upgrade notes
- No migrations in this release; drop-in upgrade.
- Long-call operator guidance: raise the slow provider's patience in its Advanced section, prefer streaming, and size your client SDK's own timeout — that one bound the router cannot lift.
- Per-provider timeout fields are optional and null by default; existing providers keep inheriting the instance defaults until you set them.
Full package changelogs live in packages/*/CHANGELOG.md.