TTS: adopt backend catalog order

This commit is contained in:
Gustavo Madeira Santana
2026-03-15 21:13:01 +00:00
parent 858024e58c
commit cc3d77c290
8 changed files with 50 additions and 12 deletions

View File

@@ -117,6 +117,11 @@ describe("runtime-backend-catalog", () => {
"elevenlabs",
"edge",
]);
expect(catalog.resolveExtensionHostTtsRuntimeBackendOrder("edge")).toEqual([
"edge",
"openai",
"elevenlabs",
]);
});
it("aggregates runtime-backend catalog entries across subsystem families", async () => {

View File

@@ -235,12 +235,31 @@ export function listExtensionHostRuntimeBackendIdsForSubsystem(
.map((entry) => entry.backendId);
}
export function resolveExtensionHostRuntimeBackendOrderForSubsystem(
subsystemId: ExtensionHostRuntimeBackendSubsystemId,
preferredBackendId: string,
): readonly string[] {
const ordered = listExtensionHostRuntimeBackendIdsForSubsystem(subsystemId);
if (!ordered.includes(preferredBackendId)) {
return [preferredBackendId, ...ordered];
}
return [preferredBackendId, ...ordered.filter((backendId) => backendId !== preferredBackendId)];
}
export function listExtensionHostMediaRuntimeBackendIds(
subsystemId: ExtensionHostMediaRuntimeSubsystemId,
): readonly string[] {
return listExtensionHostRuntimeBackendIdsForSubsystem(subsystemId);
}
export function resolveExtensionHostTtsRuntimeBackendOrder(
preferredBackendId: TtsProvider,
): readonly TtsProvider[] {
return resolveExtensionHostRuntimeBackendOrderForSubsystem("tts", preferredBackendId).map(
(backendId) => backendId as TtsProvider,
);
}
export function listExtensionHostRuntimeBackendCatalogEntries(): readonly ExtensionHostRuntimeBackendCatalogEntry[] {
return [
...listExtensionHostEmbeddingRuntimeBackendCatalogEntries(),

View File

@@ -10,7 +10,11 @@ import {
} from "./tts-runtime-setup.js";
vi.mock("./runtime-backend-catalog.js", () => ({
listExtensionHostTtsRuntimeBackendIds: vi.fn(() => ["openai", "elevenlabs", "edge"]),
resolveExtensionHostTtsRuntimeBackendOrder: vi.fn((provider: string) =>
[provider, "openai", "elevenlabs", "edge"].filter(
(candidate, index, items) => items.indexOf(candidate) === index,
),
),
}));
const tempDirs: string[] = [];

View File

@@ -1,6 +1,6 @@
import { existsSync, readFileSync } from "node:fs";
import type { TtsProvider } from "../config/types.tts.js";
import { listExtensionHostTtsRuntimeBackendIds } from "./runtime-backend-catalog.js";
import { resolveExtensionHostTtsRuntimeBackendOrder } from "./runtime-backend-catalog.js";
import type { ResolvedTtsConfig } from "./tts-config.js";
import { resolveExtensionHostTtsApiKey } from "./tts-runtime-registry.js";
@@ -65,9 +65,8 @@ export function resolveExtensionHostTtsRequestSetup(params: {
const provider =
params.providerOverride ?? resolveExtensionHostTtsProvider(params.config, params.prefsPath);
const providerOrder = listExtensionHostTtsRuntimeBackendIds();
return {
config: params.config,
providers: [provider, ...providerOrder.filter((candidate) => candidate !== provider)],
providers: [...resolveExtensionHostTtsRuntimeBackendOrder(provider)],
};
}

View File

@@ -6,7 +6,11 @@ import {
} from "./tts-status.js";
vi.mock("./runtime-backend-catalog.js", () => ({
listExtensionHostTtsRuntimeBackendIds: vi.fn(() => ["openai", "elevenlabs", "edge"]),
resolveExtensionHostTtsRuntimeBackendOrder: vi.fn((provider: string) =>
[provider, "openai", "elevenlabs", "edge"].filter(
(candidate, index, items) => items.indexOf(candidate) === index,
),
),
}));
describe("tts-status", () => {

View File

@@ -1,5 +1,5 @@
import type { TtsProvider } from "../config/types.tts.js";
import { listExtensionHostTtsRuntimeBackendIds } from "./runtime-backend-catalog.js";
import { resolveExtensionHostTtsRuntimeBackendOrder } from "./runtime-backend-catalog.js";
import type { ResolvedTtsConfig } from "./tts-config.js";
import {
getExtensionHostTtsMaxLength,
@@ -57,8 +57,8 @@ export function resolveExtensionHostTtsStatusSnapshot(params: {
}): ExtensionHostTtsStatusSnapshot {
const { config, prefsPath } = params;
const provider = resolveExtensionHostTtsProvider(config, prefsPath);
const fallbackProviders = listExtensionHostTtsRuntimeBackendIds()
.filter((candidate) => candidate !== provider)
const fallbackProviders = resolveExtensionHostTtsRuntimeBackendOrder(provider)
.slice(1)
.filter((candidate) => isExtensionHostTtsProviderConfigured(config, candidate));
return {
enabled: isExtensionHostTtsEnabled(config, prefsPath),

View File

@@ -124,6 +124,11 @@ describe("tts", () => {
);
});
it("keeps compatibility provider exports aligned with the runtime-backend catalog", () => {
expect(tts.TTS_PROVIDERS).toEqual(["openai", "elevenlabs", "edge"]);
expect(tts.resolveTtsProviderOrder("edge")).toEqual(["edge", "openai", "elevenlabs"]);
});
describe("isValidVoiceId", () => {
it("validates ElevenLabs voice ID length and character rules", () => {
const cases = [

View File

@@ -1,4 +1,8 @@
import type { TtsProvider } from "../config/types.tts.js";
import {
listExtensionHostTtsRuntimeBackendIds,
resolveExtensionHostTtsRuntimeBackendOrder,
} from "../extension-host/runtime-backend-catalog.js";
import {
applyExtensionHostTtsToPayload,
buildExtensionHostTtsSystemPromptHint,
@@ -26,10 +30,8 @@ import {
setExtensionHostTtsSummarizationEnabled,
} from "../extension-host/tts-preferences.js";
import {
EXTENSION_HOST_TTS_PROVIDER_IDS,
isExtensionHostTtsProviderConfigured,
resolveExtensionHostTtsApiKey,
resolveExtensionHostTtsProviderOrder,
} from "../extension-host/tts-runtime-registry.js";
import { resolveExtensionHostTtsProvider } from "../extension-host/tts-runtime-setup.js";
import {
@@ -129,11 +131,11 @@ export function setLastTtsAttempt(entry: TtsStatusEntry | undefined): void {
setExtensionHostLastTtsAttempt(entry);
}
export const TTS_PROVIDERS = EXTENSION_HOST_TTS_PROVIDER_IDS;
export const TTS_PROVIDERS = listExtensionHostTtsRuntimeBackendIds();
export const resolveTtsApiKey = resolveExtensionHostTtsApiKey;
export const resolveTtsProviderOrder = resolveExtensionHostTtsProviderOrder;
export const resolveTtsProviderOrder = resolveExtensionHostTtsRuntimeBackendOrder;
export const isTtsProviderConfigured = isExtensionHostTtsProviderConfigured;