#2504: thread _signatureNamespace through the FORMATS.GEMINI and FORMATS.GEMINI_CLI
request translators so a cached Gemini thoughtSignature is re-attached to the
functionCall on the follow-up turn (was 400 'missing thought_signature').
#2515: accept input_file (Responses API) on the Gemini path and document (Gemini-style)
on the Responses/Codex path so PDFs reach the model regardless of content-part name.
- providers.ts: close the unterminated `dify` APIKEY_PROVIDERS entry (Wave-1b #2488
merge artifact) that broke the entire build (esbuild 'Expected }').
- CHANGELOG.md: restore the `# Changelog` header and an empty `[Unreleased]` section
(docs-sync requires the first section to be Unreleased); remove the duplicated
`[3.8.1]` block.
- Bump package.json / electron / open-sse / openapi.yaml to 3.8.2 to match the
CHANGELOG release header.
- Mirror the `[3.8.2]` section into all 41 i18n CHANGELOGs so docs-sync passes.
Unblocks all commits on release/v3.8.2-based branches.
OpenCode's Zen provider changed its slug from 'opencode-zen' to 'opencode',
breaking OmniRoute's provider resolution when users reference models with the
new prefix (e.g. 'opencode/deepseek-v4-flash-free').
Changes:
1. open-sse/services/model.ts: Add manual ALIAS_TO_PROVIDER_ID entry
mapping 'opencode' → 'opencode-zen' so parseModel() resolves
correctly for model strings using the new slug.
2. open-sse/executors/index.ts: Register 'opencode' as an OpencodeExecutor
alias for 'opencode-zen' so getExecutor() returns the correct executor.
3. open-sse/config/providerRegistry.ts: Update opencode-zen model list to
match the live API at https://opencode.ai/zen/v1/models:
- Add deepseek-v4-flash-free (the model users reported as broken)
- Add all 30+ models from the API (Claude, GPT, Gemini, Grok, GLM,
MiniMax, Kimi, Qwen series)
- Apply targetFormat: 'claude' to qwen3.5-plus (same SSE bug as qwen3.6)
- Remove ling-2.6-1t-free and trinity-large-preview-free (no longer in API)
- Enable passthroughModels so new models work without code deploys
4. @omniroute/opencode-provider/src/index.ts: Remove broken reference to
undefined OMNIROUTE_DEFAULT_MODEL_CONTEXT_LENGTHS constant.
5. tests/unit/opencode-executor.test.ts: Add tests for opencode alias,
deepseek-v4-flash-free routing, and model registry presence.
Prefer persisted tier when live subscription maps to an unknown label,
and only return mapped tier IDs from extractCodeAssistTierId. Add
regression test for fallback from providerSpecificData.
Co-authored-by: Cursor <cursoragent@cursor.com>
Extract paid/current/restricted tiers from loadCodeAssist (shared module), fix invalid LINUX metadata on Docker, refresh tier on quota update without re-auth, and persist tier fields back to connections.
Co-authored-by: Cursor <cursoragent@cursor.com>
The combo loop log messages misleadingly said '(all accounts in cooldown)'
when the actual reason could be model exclusion, rate-limiting, or other
credential unavailability. Updated to accurately describe the real reason.
A corrupted or mis-typed credential (non-string apiKey, or a non-string
modelsUrl from providerSpecificData/registry) could throw
'TypeError: ... is not a function' when validation called .startsWith()/.trim()
during a provider connection test. Adds typeof guards in validateOpenAILikeProvider,
validateGeminiLikeProvider and validateSnowflakeProvider so validation returns a
clean { valid } result instead of crashing. Does not pinpoint the NVIDIA NIM
e.startsWith report (needs a stack trace), but hardens the whole class.
OpenCode determines model context windows by reading limit.context from
opencode.json model entries. The provider was not emitting this field,
so all OmniRoute models appeared with an unknown (0) context window
in OpenCode, preventing proper compaction and overflow detection.
- Add limit.context to OpenCodeModelEntry interface
- Add OMNIROUTE_DEFAULT_MODEL_CONTEXT_LENGTHS map (200K Claude / 1M Gemini)
- Include limit.context when generating model entries
- Extend fetchLiveModels to capture context_length from /v1/models
- 5 new tests covering context length coverage, JSON serialisation,
unknown model fallback, and live model fetch
Closes#2481
New perplexityTlsClient.ts (Firefox-148 TLS profile, mirrors chatgptTlsClient)
routes perplexity-web requests so Cloudflare stops 403-challenging datacenter
IPs. Executor and connection validator now distinguish a Cloudflare block from
an invalid session cookie. Adds OMNIROUTE_PPLX_TLS_TIMEOUT_MS /
OMNIROUTE_PPLX_TLS_GRACE_MS. Co-authored analysis by havockdev.
selectBetaFlags now gates the heavy-agent betas (context-1m, effort,
advanced-tool-use) on Opus/Sonnet only; Haiku with OAuth was rejecting
context-1m with 400 'incompatible with the long context beta header'. base.ts
stops deleting Haiku's thinking config (real Claude Desktop keeps it). chatCore
passthrough converts historical thinking/redacted_thinking blocks to
redacted_thinking with a synthetic signature, fixing 400 'Invalid signature in
thinking block' on mid-session model switches. Co-authored analysis by havockdev.
An OpenAI-style role:"tool" message carrying structured/array content was
collapsing to content:[{ text: "" }], which CodeWhisperer rejects with
400 'Improperly formed request'. Reuse serializeToolResultContent (already used
by the Anthropic tool_result path) so structured output is never empty.
The omniroute_web_search fallback tool was always built in Chat Completions
nested shape ({type, function:{name}}). On the Responses->Responses passthrough
path nothing flattens it, so Codex/relay upstreams rejected it with
'Missing required parameter: tools[0].name'. buildFallbackTool and the
tool_choice injection now emit the flat Responses-API shape ({type, name})
when the target provider speaks the Responses API.
- Downgrade electron from ^42.2.0 to ^41.2.0 (V8 API breaking change)
- Move better-sqlite3 from optionalDependencies back to dependencies
- Add @xmldom/xmldom override (matching 9router config)
- Fixes: v8::External::Value/New signature mismatch on Windows CI