mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-09-13 18:32:12 +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.
73 lines
2.8 KiB
TypeScript
73 lines
2.8 KiB
TypeScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
const {
|
|
parseTranscriptionModel,
|
|
AUDIO_TRANSCRIPTION_PROVIDERS,
|
|
audioModelAliasCandidates,
|
|
findAlternateAudioProvider,
|
|
listAlternateAudioModelIds,
|
|
missingAudioProviderCredentialsMessage,
|
|
} = await import("../../open-sse/config/audioRegistry.ts");
|
|
|
|
test("parseTranscriptionModel prefix-matches native Deepgram for deepgram/nova-3", () => {
|
|
assert.deepEqual(parseTranscriptionModel("deepgram/nova-3"), {
|
|
provider: "deepgram",
|
|
model: "nova-3",
|
|
});
|
|
});
|
|
|
|
test("parseTranscriptionModel keeps OpenRouter when the id is qualified", () => {
|
|
assert.deepEqual(parseTranscriptionModel("openrouter/deepgram/nova-3"), {
|
|
provider: "openrouter",
|
|
model: "deepgram/nova-3",
|
|
});
|
|
});
|
|
|
|
test("findAlternateAudioProvider maps native Deepgram nova-3 to OpenRouter", () => {
|
|
const candidates = audioModelAliasCandidates("deepgram/nova-3", "deepgram", "nova-3");
|
|
const alternate = findAlternateAudioProvider(
|
|
AUDIO_TRANSCRIPTION_PROVIDERS,
|
|
"deepgram",
|
|
candidates
|
|
);
|
|
assert.ok(alternate);
|
|
assert.equal(alternate?.provider, "openrouter");
|
|
assert.equal(alternate?.model, "deepgram/nova-3");
|
|
});
|
|
|
|
test("findAlternateAudioProvider maps bare whisper-1 to OpenRouter when OpenAI has no creds", () => {
|
|
// Scoped to a 2-provider registry (rather than the live, growing
|
|
// AUDIO_TRANSCRIPTION_PROVIDERS) so this stays a deterministic test of the
|
|
// *qualified*-alias fallback branch (`${failedProvider}/${resolvedModel}`)
|
|
// regardless of future providers that also list a bare "whisper-1" id
|
|
// (e.g. nanogpt) and would otherwise intercept on the first candidate.
|
|
const scopedRegistry = {
|
|
openai: AUDIO_TRANSCRIPTION_PROVIDERS.openai,
|
|
openrouter: AUDIO_TRANSCRIPTION_PROVIDERS.openrouter,
|
|
};
|
|
const candidates = audioModelAliasCandidates("whisper-1", "openai", "whisper-1");
|
|
const alternate = findAlternateAudioProvider(scopedRegistry, "openai", candidates);
|
|
assert.ok(alternate);
|
|
assert.equal(alternate?.provider, "openrouter");
|
|
assert.equal(alternate?.model, "openai/whisper-1");
|
|
});
|
|
|
|
test("findAlternateAudioProvider returns null when no other provider lists the model", () => {
|
|
const alternate = findAlternateAudioProvider(AUDIO_TRANSCRIPTION_PROVIDERS, "assemblyai", [
|
|
"universal-3-pro",
|
|
"assemblyai/universal-3-pro",
|
|
]);
|
|
assert.equal(alternate, null);
|
|
});
|
|
|
|
test("missing-credential error lists qualified catalog aliases", () => {
|
|
const candidates = audioModelAliasCandidates("deepgram/nova-3", "deepgram", "nova-3");
|
|
const ids = listAlternateAudioModelIds(AUDIO_TRANSCRIPTION_PROVIDERS, "deepgram", candidates);
|
|
assert.ok(ids.includes("openrouter/deepgram/nova-3"));
|
|
assert.match(
|
|
missingAudioProviderCredentialsMessage("deepgram", ids),
|
|
/No credentials for provider: deepgram.*openrouter\/deepgram\/nova-3/
|
|
);
|
|
});
|