Files
openclaw/src/tts/provider-registry.ts
2026-03-27 16:39:41 +00:00

77 lines
2.3 KiB
TypeScript

import type { OpenClawConfig } from "../config/config.js";
import { resolvePluginCapabilityProviders } from "../plugins/capability-provider-runtime.js";
import type { SpeechProviderPlugin } from "../plugins/types.js";
import type { SpeechProviderId } from "./provider-types.js";
function trimToUndefined(value: string | undefined): string | undefined {
const trimmed = value?.trim().toLowerCase();
return trimmed ? trimmed : undefined;
}
export function normalizeSpeechProviderId(
providerId: string | undefined,
): SpeechProviderId | undefined {
return trimToUndefined(providerId);
}
function resolveSpeechProviderPluginEntries(cfg?: OpenClawConfig): SpeechProviderPlugin[] {
return resolvePluginCapabilityProviders({
key: "speechProviders",
cfg,
});
}
function buildProviderMaps(cfg?: OpenClawConfig): {
canonical: Map<string, SpeechProviderPlugin>;
aliases: Map<string, SpeechProviderPlugin>;
} {
const canonical = new Map<string, SpeechProviderPlugin>();
const aliases = new Map<string, SpeechProviderPlugin>();
const register = (provider: SpeechProviderPlugin) => {
const id = normalizeSpeechProviderId(provider.id);
if (!id) {
return;
}
canonical.set(id, provider);
aliases.set(id, provider);
for (const alias of provider.aliases ?? []) {
const normalizedAlias = normalizeSpeechProviderId(alias);
if (normalizedAlias) {
aliases.set(normalizedAlias, provider);
}
}
};
for (const provider of resolveSpeechProviderPluginEntries(cfg)) {
register(provider);
}
return { canonical, aliases };
}
export function listSpeechProviders(cfg?: OpenClawConfig): SpeechProviderPlugin[] {
return [...buildProviderMaps(cfg).canonical.values()];
}
export function getSpeechProvider(
providerId: string | undefined,
cfg?: OpenClawConfig,
): SpeechProviderPlugin | undefined {
const normalized = normalizeSpeechProviderId(providerId);
if (!normalized) {
return undefined;
}
return buildProviderMaps(cfg).aliases.get(normalized);
}
export function canonicalizeSpeechProviderId(
providerId: string | undefined,
cfg?: OpenClawConfig,
): SpeechProviderId | undefined {
const normalized = normalizeSpeechProviderId(providerId);
if (!normalized) {
return undefined;
}
return getSpeechProvider(normalized, cfg)?.id ?? normalized;
}