Compare commits

..

28 Commits

Author SHA1 Message Date
diegosouzapw
f3d3590482 chore(release): v3.8.10 — 2026-06-04 (finalize CHANGELOG) 2026-06-04 19:38:40 -03:00
Diego Rodrigues de Sa e Souza
ee791000a2 fix(providers): empty refresh must not resurface just-cleared synced models (#3181)
Empty refresh must not resurface just-cleared synced models (fixes the release-blocking provider-models-route test). Integrated into release/v3.8.10.
2026-06-04 19:05:00 -03:00
Diego Rodrigues de Sa e Souza
3ac40829c0 feat(quota): show OAuth token expiry on provider cards (small, blue, informative) (#3178)
Show OAuth token expiry on provider cards (small, blue, informative). Integrated into release/v3.8.10.
2026-06-04 18:33:34 -03:00
Diego Rodrigues de Sa e Souza
42df1703c6 fix(healthcheck): per-provider proactive-refresh skip list (rescue short-TTL OAuth) (#3159)
Per-provider proactive-refresh skip list (OMNIROUTE_HEALTHCHECK_SKIP_PROVIDERS) to rescue short-TTL OAuth. Integrated into release/v3.8.10.
2026-06-04 18:33:31 -03:00
Diego Rodrigues de Sa e Souza
1be9606cc2 fix(usage): sequential+spaced OAuth quota sync, reactive force-refresh, actionable 401 (#3156)
Sequential+spaced OAuth quota sync, reactive force-refresh on 401, actionable 401 in UI. Integrated into release/v3.8.10.
2026-06-04 18:33:28 -03:00
PizzaV
76838f6594 feat(dashboard): provider stats API endpoint and dashboard page (#3175)
Provider stats dashboard + API (SQL moved to db module per Hard Rule #5, +test). Integrated into release/v3.8.10.
2026-06-04 18:21:52 -03:00
PizzaV
9d3c0d10af feat(metrics): cross-request TTFT and gap latency after tool calls (#3173)
Cross-request TTFT + gap-after-tool latency metrics (+test). Integrated into release/v3.8.10.
2026-06-04 18:18:24 -03:00
Nicolas Lorin
989d4811f2 fix(providerRegistry): update kilocode format and executor (#3166)
kilocode: openai format + default executor (matches kilo-gateway) + registry test. Integrated into release/v3.8.10.
2026-06-04 18:15:49 -03:00
dependabot[bot]
05aafa1374 deps: bump hono from 4.12.18 to 4.12.23 (#3179)
Bump hono to 4.12.23. Integrated into release/v3.8.10.
2026-06-04 18:10:35 -03:00
PizzaV
17ea178dc8 fix(kiro): minor OAuth social exchange tweaks (#3176)
Kiro social OAuth: optional targetProvider passthrough. Integrated into release/v3.8.10.
2026-06-04 18:10:31 -03:00
PizzaV
0ff8949dc5 fix(misc): minor fixes across reasoning cache, account fallback, binary manager (#3177)
Misc: ProviderProfile export, DeepSeek reasoning regex, binary guard. Integrated into release/v3.8.10.
2026-06-04 18:10:27 -03:00
Wilson
afe8f11bf8 fix(web-tools): parse bare JSON tool calls (#3157)
Parse bare JSON tool calls for deepseek-web (#2820) + fuzzy tool-name matching. Integrated into release/v3.8.10.
2026-06-04 18:10:23 -03:00
Diego Rodrigues de Sa e Souza
8fb51f44d0 fix(combo): invalidate nested-combo cache on edits + log DATA_DIR (#3147) (#3165)
Editing a combo did not invalidate the 10s nested-combo expansion caches
(chat.ts getCombosCachedForChat + chatCore.ts getCombosCached; the exported
clearCombosCache was dead code), so a removed nested target/model could be
served as a phantom for up to 10s. Wire a shared monotonic combos-cache
version in readCache (bumped by invalidateDbCache("combos") on every combo
write); both cache layers treat a version mismatch as a miss.

Also log the resolved DATA_DIR/SQLITE_FILE absolute path at DB init so the
reporter's 'persists across restart + volume wipe' symptom (a multi-replica
Docker volume/DATA_DIR mismatch, not a routing bug) is diagnosable from logs.

Includes consolidated CHANGELOG entries for #3133/#3136/#3007/#3141/#3120/#3121.

Co-authored-by: ViFigueiredo <ViFigueiredo@users.noreply.github.com>
2026-06-04 17:06:27 -03:00
Diego Rodrigues de Sa e Souza
0909b31f50 fix(github-copilot): discover model catalog live from api.githubcopilot.com (#3120, #3121) (#3164)
The github (Copilot) provider had a static hardcoded catalog with no
discovery source, so Import Models never refreshed (#3120) and advertised
non-entitled models that 400 on use (#3121). Add a live /models fetch with
fallback to the static list.

Co-authored-by: gabrielmoreira <gabrielmoreira@users.noreply.github.com>
2026-06-04 16:57:55 -03:00
Diego Rodrigues de Sa e Souza
cb94bf695d fix(minimax): stop capping MiniMax-M3 / M2.7 max_tokens at 8192 (#3141) (#3163)
MiniMax-M3 had no MODEL_SPECS entry and capitalized MiniMax-M2.7 missed
its lowercase spec (case-sensitive lookup) → both fell to the 8192 default
cap. Add the M3 spec (512K output), alias the capitalized ids, and make
getModelSpec lookups case-insensitive.

Co-authored-by: totaltube <totaltube@users.noreply.github.com>
2026-06-04 16:57:52 -03:00
Diego Rodrigues de Sa e Souza
f8fb3d524d fix(t3-chat-web): parse cookies + convexSessionId from stored credential (#3007) (#3162)
The executor read credentials.cookies/convexSessionId, but the pipeline
only stores the pasted string under apiKey → t3.chat always 400'd. Parse
both values from apiKey (fallback accessToken), mirroring validation.ts.

Co-authored-by: minhtran162 <minhtran162@users.noreply.github.com>
2026-06-04 16:57:48 -03:00
Diego Rodrigues de Sa e Souza
a2fd56c313 fix(llama-cpp): route to configured local baseUrl instead of OpenAI (#3136) (#3161)
llama-cpp was missing from the local-provider group in buildUrl(), so it
fell through to the OpenAI baseUrl and returned an OpenAI 401. Add the
case to resolve the connection's providerSpecificData.baseUrl.

Co-authored-by: tjengbudi <tjengbudi@users.noreply.github.com>
2026-06-04 16:57:45 -03:00
Diego Rodrigues de Sa e Souza
58a9573904 fix(fireworks): preserve fully-qualified router/model IDs (#3133) (#3160)
Fireworks router IDs (accounts/fireworks/routers/...) were double-prefixed
with accounts/fireworks/models/ → upstream 404. Add optional
acceptedModelIdPrefixes to the registry entry and skip the prepend when the
model already starts with an accepted prefix.

Co-authored-by: KooshaPari <KooshaPari@users.noreply.github.com>
2026-06-04 16:57:41 -03:00
Markus Hartung
f0e3a9bec9 Feature/batch allow big (#3128)
Podman deployment options + larger upload body-size limits (+CONTAINER_HOST docs). Integrated into release/v3.8.10.
2026-06-04 14:49:18 -03:00
Hernan Javier Ardila Sanchez
67addc63ad fix(antigravity): dynamic model resolution via MITM alias table (#3144)
Dynamic antigravity MITM model resolution in the executor (+bug fix +regression test; DB import dropped from client-reachable config). Integrated into release/v3.8.10.
2026-06-04 14:40:24 -03:00
Hernan Javier Ardila Sanchez
28b44b01d4 fix(qoder): bifurcate validation by token type — PAT→Cosy, regular API key→dashscope (#3149)
Bifurcate Qoder validation by token type (PAT→Cosy, regular→dashscope) +regression test. Integrated into release/v3.8.10.
2026-06-04 14:25:29 -03:00
Hernan Javier Ardila Sanchez
d3c753ecbe fix(providers): use synced models as fallback for all providers (#3148)
Use synced models as authoritative local catalog for all providers (+regression test). Integrated into release/v3.8.10.
2026-06-04 14:25:25 -03:00
M.M
44b9d0e5f7 fix(opencode-plugin): map thinking cap to interleaved in model+combo (#3138)
Map caps.thinking to ModelV2.capabilities.interleaved for opencode-plugin. Integrated into release/v3.8.10.
2026-06-04 14:24:51 -03:00
Jan Leon
273268c18d Strip previous_response_id for stateless Responses upstreams (#3143)
Strip previous_response_id for stateless Responses upstreams (auto/strip/preserve). Integrated into release/v3.8.10.
2026-06-04 14:10:45 -03:00
Xiangzhe
3fd8f2ce11 fix(api-manager): preserve API key expiration local time (#3146)
Preserve API key expiration local time + clear button. Integrated into release/v3.8.10.
2026-06-04 14:10:41 -03:00
Wilson
32bb4b9652 fix(responses): normalize image_url parts across input paths (#3150)
Normalize image_url parts across all Responses input paths. Integrated into release/v3.8.10.
2026-06-04 14:10:36 -03:00
diegosouzapw
2eb0f0500c fix(providers): resolve web provider alias collisions
Assign unique aliases to HuggingChat, Kimi Web, and Qwen Web so they no longer shadow primary providers or trigger startup warnings.

Add a unit test to enforce provider alias uniqueness and prevent future collisions. Also expand local ignore and VS Code exclude rules for agent, build, and worktree artifacts.
2026-06-04 13:42:25 -03:00
diegosouzapw
406a150f15 chore(release): open v3.8.10 development cycle
Bump 3.8.9 → 3.8.10 across package.json, lockfile, electron, open-sse, and
docs/reference/openapi.yaml; add the [3.8.10] CHANGELOG section (root + 41 i18n
mirrors) as the integration target for the cycle. Entries land here as work
merges into release/v3.8.10; finalized by the release flow.
2026-06-04 06:36:10 -03:00
2 changed files with 9 additions and 7 deletions

View File

@@ -54,9 +54,9 @@ const MAX_RETRY_AFTER_MS = 60_000;
const LONG_RETRY_THRESHOLD_MS = 60_000;
const CREDITS_EXHAUSTED_TTL_MS = 5 * 60 * 60 * 1000; // 5 hours
// The upstream API uses plain model IDs (no -high/-low suffix).
// Tier suffixes were speculative and caused 404 for gemini-3.x models — the
// bare-Pro→Low normalization was retired (the set stayed empty, making the guard
// dead code). Only keep models that are live-proven via streamGenerateContent.
// Tier suffixes were speculative and caused 404 for gemini-3.x models.
// Only keep models that are live-proven via streamGenerateContent.
const BARE_PRO_IDS: Set<string> = new Set();
interface AntigravityContent {
role: string;
@@ -432,6 +432,11 @@ async function cleanModelName(model: string): Promise<string> {
clean = resolveAntigravityModelId(clean);
}
// 3. Normalize bare Pro IDs to the Low tier (matching OpenClaw convention).
// The upstream API requires an explicit tier suffix; bare IDs cause errors.
if (BARE_PRO_IDS.has(clean)) {
clean = `${clean}-low`;
}
return clean;
}

View File

@@ -16,8 +16,5 @@ test("llama-cpp buildUrl routes to the configured local baseUrl, not OpenAI", ()
});
assert.equal(url, "http://127.0.0.1:8080/v1/chat/completions");
// Assert the resolved host is the local one — parse the URL and compare the
// hostname exactly (a substring check like `url.includes("api.openai.com")`
// is an incomplete URL sanitization pattern: `api.openai.com.evil` would match).
assert.equal(new URL(url).hostname, "127.0.0.1", `expected local host, got ${url}`);
assert.ok(!url.includes("api.openai.com"), `expected local URL, got ${url}`);
});