mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-20 06:02:14 +03:00
Co-authored-by: Markus Hartung <mail@hartmark.se>
This commit is contained in:
committed by
GitHub
parent
4d92dfe0a2
commit
a8000bf1a2
1
changelog.d/fixes/10586-audio-alias-prefix-gap.md
Normal file
1
changelog.d/fixes/10586-audio-alias-prefix-gap.md
Normal file
@@ -0,0 +1 @@
|
||||
- fix(sse): resolve the short provider-alias prefix (e.g. `el/`) advertised by GET /v1/models for audio speech, transcription and translation model ids (#10586)
|
||||
@@ -7,6 +7,8 @@
|
||||
* - /v1/audio/speech (TTS API)
|
||||
*/
|
||||
|
||||
import { getProviderAlias } from "@/shared/constants/providers";
|
||||
|
||||
interface AudioModel {
|
||||
id: string;
|
||||
name: string;
|
||||
@@ -677,6 +679,16 @@ function parseAudioModel(
|
||||
}
|
||||
}
|
||||
|
||||
// Phase 1.5: prefix match against the short provider alias the catalog itself
|
||||
// advertises (e.g. "el/eleven_multilingual_v2" for elevenlabs) when it differs
|
||||
// from the canonical registry key already tried in Phase 1.
|
||||
for (const [providerId] of Object.entries(registry)) {
|
||||
const alias = getProviderAlias(providerId);
|
||||
if (alias && alias !== providerId && modelStr.startsWith(alias + "/")) {
|
||||
return { provider: providerId, model: modelStr.slice(alias.length + 1) };
|
||||
}
|
||||
}
|
||||
|
||||
// Phase 2: bare model lookup in hardcoded registry
|
||||
for (const [providerId, config] of Object.entries(registry)) {
|
||||
if (config.models.some((m) => m.id === modelStr)) {
|
||||
|
||||
78
tests/unit/audio-alias-prefix-10586.test.ts
Normal file
78
tests/unit/audio-alias-prefix-10586.test.ts
Normal file
@@ -0,0 +1,78 @@
|
||||
import test from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
|
||||
test("parseSpeechModel resolves the elevenlabs short-alias prefix advertised by /v1/models", async () => {
|
||||
const { parseSpeechModel } = await import("../../open-sse/config/audioRegistry.ts");
|
||||
|
||||
const canonical = parseSpeechModel("elevenlabs/eleven_multilingual_v2");
|
||||
assert.deepEqual(canonical, { provider: "elevenlabs", model: "eleven_multilingual_v2" });
|
||||
|
||||
// This is the id /v1/models actually advertises in default "dual" prefix mode
|
||||
// (REGISTRY["elevenlabs"].alias === "el"). It currently fails to parse.
|
||||
const aliased = parseSpeechModel("el/eleven_multilingual_v2");
|
||||
assert.deepEqual(
|
||||
aliased,
|
||||
{ provider: "elevenlabs", model: "eleven_multilingual_v2" },
|
||||
`expected "el/eleven_multilingual_v2" to resolve to the elevenlabs provider like its canonical twin does, but got ${JSON.stringify(aliased)}`
|
||||
);
|
||||
});
|
||||
|
||||
test("parseSpeechModel resolves every alias registered for an AUDIO_SPEECH_PROVIDERS entry", async () => {
|
||||
const { parseSpeechModel, AUDIO_SPEECH_PROVIDERS } = await import(
|
||||
"../../open-sse/config/audioRegistry.ts"
|
||||
);
|
||||
const { getProviderAlias } = await import("../../src/shared/constants/providers.ts");
|
||||
|
||||
for (const providerId of Object.keys(AUDIO_SPEECH_PROVIDERS)) {
|
||||
const alias = getProviderAlias(providerId);
|
||||
if (!alias || alias === providerId) continue;
|
||||
const canonical = parseSpeechModel(`${providerId}/sample-model`);
|
||||
assert.deepEqual(canonical, { provider: providerId, model: "sample-model" });
|
||||
const aliased = parseSpeechModel(`${alias}/sample-model`);
|
||||
assert.deepEqual(
|
||||
aliased,
|
||||
{ provider: providerId, model: "sample-model" },
|
||||
`expected "${alias}/sample-model" to resolve to ${providerId} but got ${JSON.stringify(aliased)}`
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
test("parseTranscriptionModel resolves every alias registered for an AUDIO_TRANSCRIPTION_PROVIDERS entry", async () => {
|
||||
const { parseTranscriptionModel, AUDIO_TRANSCRIPTION_PROVIDERS } = await import(
|
||||
"../../open-sse/config/audioRegistry.ts"
|
||||
);
|
||||
const { getProviderAlias } = await import("../../src/shared/constants/providers.ts");
|
||||
|
||||
for (const providerId of Object.keys(AUDIO_TRANSCRIPTION_PROVIDERS)) {
|
||||
const alias = getProviderAlias(providerId);
|
||||
if (!alias || alias === providerId) continue;
|
||||
const canonical = parseTranscriptionModel(`${providerId}/sample-model`);
|
||||
assert.deepEqual(canonical, { provider: providerId, model: "sample-model" });
|
||||
const aliased = parseTranscriptionModel(`${alias}/sample-model`);
|
||||
assert.deepEqual(
|
||||
aliased,
|
||||
{ provider: providerId, model: "sample-model" },
|
||||
`expected "${alias}/sample-model" to resolve to ${providerId} but got ${JSON.stringify(aliased)}`
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
test("parseTranslationModel resolves every alias registered for an AUDIO_TRANSLATION_PROVIDERS entry", async () => {
|
||||
const { parseTranslationModel, AUDIO_TRANSLATION_PROVIDERS } = await import(
|
||||
"../../open-sse/config/audioRegistry.ts"
|
||||
);
|
||||
const { getProviderAlias } = await import("../../src/shared/constants/providers.ts");
|
||||
|
||||
for (const providerId of Object.keys(AUDIO_TRANSLATION_PROVIDERS)) {
|
||||
const alias = getProviderAlias(providerId);
|
||||
if (!alias || alias === providerId) continue;
|
||||
const canonical = parseTranslationModel(`${providerId}/sample-model`);
|
||||
assert.deepEqual(canonical, { provider: providerId, model: "sample-model" });
|
||||
const aliased = parseTranslationModel(`${alias}/sample-model`);
|
||||
assert.deepEqual(
|
||||
aliased,
|
||||
{ provider: providerId, model: "sample-model" },
|
||||
`expected "${alias}/sample-model" to resolve to ${providerId} but got ${JSON.stringify(aliased)}`
|
||||
);
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user