mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-09-15 19:32:20 +03:00
Landed with the design call resolved per the owner's pick — **option 1**: the synced store is now endpoint-agnostic (persistDiscoveredModels and managedModelImport no longer drop non-chat models at write time), and chat selectability moved to read time (auto-pool expansion in autoStrategy applies filterChatSelectableModels; the models-route projection already had its chatOnly filter). Your discovery test now passes end-to-end (3/3): /api/show capabilities persist per connection and image/embedding requests route through the advertising host. Reconciliation notes: conflicted areas merged onto the current tip (adobe discovery import, requestedModel preflight signature, resolvedProvider fast-path coexists with the synced-route override — explicit resolution wins); carried base-red drains (#10055 memoization, #11071 test variants) dropped as already-landed; the managed-model-import exclusion test was propagated to the new contract (image/video models persist; the read filter still hides them from chat pickers — pinned by a new assertion). Full battery: 205/206 focused (the one red is a confirmed periodic-timer timing flake on the loaded devbox — 20/20 isolated), autoCombo vitest 30/30, combo suites 46/46, gates + typecheck clean. Thank you @yourspraveen — the capability probe + routing design was right; it just needed the store contract opened up. Fixes #11087.
71 lines
2.1 KiB
TypeScript
71 lines
2.1 KiB
TypeScript
import { getModelSpec } from "../../src/shared/constants/modelSpecs.ts";
|
|
|
|
const CLOUD_CODE_REASONING_UNSUPPORTED_PATTERNS = [/^claude-/i, /^gpt-oss-/i, /^tab_/i];
|
|
|
|
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
}
|
|
|
|
const PREFIX_TRIM_RE = /^(?:models\/|antigravity\/)+/i;
|
|
|
|
function normalizeCloudCodeModel(model: string): string {
|
|
return String(model || "").trim().replace(PREFIX_TRIM_RE, "");
|
|
}
|
|
|
|
function stripGeminiThinkingConfig(value: unknown): unknown {
|
|
if (!isRecord(value)) return value;
|
|
if (!("thinkingConfig" in value) && !("thinking_config" in value)) return value;
|
|
|
|
const next = { ...value };
|
|
delete next.thinkingConfig;
|
|
delete next.thinking_config;
|
|
return next;
|
|
}
|
|
|
|
/**
|
|
* @deprecated This function will be removed in v4.0, reasoning configuration processing has migrated to translateRequest
|
|
*/
|
|
export function shouldStripCloudCodeThinking(provider: string, model: string): boolean {
|
|
if (!provider || !model) return false;
|
|
const normalizedModel = normalizeCloudCodeModel(model);
|
|
if (CLOUD_CODE_REASONING_UNSUPPORTED_PATTERNS.some((pattern) => pattern.test(normalizedModel))) {
|
|
return true;
|
|
}
|
|
const spec = getModelSpec(normalizedModel);
|
|
if (typeof spec?.supportsThinking === "boolean") {
|
|
return !spec.supportsThinking;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @deprecated This function will be removed in v4.0, reasoning configuration processing has migrated to translateRequest
|
|
*/
|
|
export function stripCloudCodeThinkingConfig(
|
|
body: Record<string, unknown>
|
|
): Record<string, unknown> {
|
|
const next = { ...body };
|
|
|
|
delete next.reasoning_effort;
|
|
delete next.reasoning;
|
|
delete next.thinking;
|
|
|
|
if ("generationConfig" in next) {
|
|
next.generationConfig = stripGeminiThinkingConfig(next.generationConfig);
|
|
}
|
|
|
|
if (isRecord(next.request)) {
|
|
const request = { ...next.request };
|
|
delete request.reasoning_effort;
|
|
delete request.reasoning;
|
|
delete request.thinking;
|
|
|
|
if ("generationConfig" in request) {
|
|
request.generationConfig = stripGeminiThinkingConfig(request.generationConfig);
|
|
}
|
|
next.request = request;
|
|
}
|
|
|
|
return next;
|
|
}
|