openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
111 lines (110 loc) • 3.98 kB
JavaScript
import { c as normalizeOptionalString } from "./string-coerce-mnp54Vah.js";
import { u as normalizeResolvedSecretInputString } from "./types.secrets-_0JOMGE5.js";
import { n as asObject } from "./provider-http-errors-DqaqQLLZ.js";
import "./secret-input-DVCzFGxN.js";
import "./speech-DeKvI3F1.js";
import { n as GRADIUM_VOICES, r as normalizeGradiumBaseUrl } from "./shared-BI174QeF.js";
import { t as gradiumTTS } from "./tts-B3AdaSL9.js";
//#region extensions/gradium/speech-provider.ts
const DEFAULT_GENERATED_AUDIO_MAX_BYTES = 16 * 1024 * 1024;
function normalizeGradiumProviderConfig(rawConfig) {
const raw = asObject(asObject(rawConfig.providers)?.gradium) ?? asObject(rawConfig.gradium);
return {
apiKey: normalizeResolvedSecretInputString({
value: raw?.apiKey,
path: "messages.tts.providers.gradium.apiKey"
}),
baseUrl: normalizeGradiumBaseUrl(normalizeOptionalString(raw?.baseUrl)),
voiceId: normalizeOptionalString(raw?.voiceId) ?? "YTpq7expH9539ERJ"
};
}
function readGradiumProviderConfig(config) {
const defaults = normalizeGradiumProviderConfig({});
return {
apiKey: normalizeOptionalString(config.apiKey) ?? defaults.apiKey,
baseUrl: normalizeGradiumBaseUrl(normalizeOptionalString(config.baseUrl) ?? defaults.baseUrl),
voiceId: normalizeOptionalString(config.voiceId) ?? defaults.voiceId
};
}
function resolveGeneratedAudioMaxBytes(req) {
const configured = req.cfg.agents?.defaults?.mediaMaxMb;
if (typeof configured === "number" && Number.isFinite(configured) && configured > 0) return Math.floor(configured * 1024 * 1024);
return DEFAULT_GENERATED_AUDIO_MAX_BYTES;
}
function parseDirectiveToken(ctx) {
switch (ctx.key) {
case "voice":
case "voice_id":
case "voiceid":
case "gradium_voice":
case "gradiumvoice":
if (!ctx.policy.allowVoice) return { handled: true };
return {
handled: true,
overrides: {
...ctx.currentOverrides,
voiceId: ctx.value
}
};
default: return { handled: false };
}
}
function buildGradiumSpeechProvider() {
return {
id: "gradium",
label: "Gradium",
autoSelectOrder: 30,
voices: GRADIUM_VOICES.map((v) => v.id),
resolveConfig: ({ rawConfig }) => normalizeGradiumProviderConfig(rawConfig),
parseDirectiveToken,
listVoices: async () => GRADIUM_VOICES.map((v) => ({
id: v.id,
name: v.name
})),
isConfigured: ({ providerConfig }) => Boolean(readGradiumProviderConfig(providerConfig).apiKey || process.env.GRADIUM_API_KEY),
synthesize: async (req) => {
const config = readGradiumProviderConfig(req.providerConfig);
const overrides = req.providerOverrides ?? {};
const apiKey = config.apiKey || process.env.GRADIUM_API_KEY;
if (!apiKey) throw new Error("Gradium API key missing");
const wantsVoiceNote = req.target === "voice-note";
const outputFormat = wantsVoiceNote ? "opus" : "wav";
return {
audioBuffer: await gradiumTTS({
text: req.text,
apiKey,
baseUrl: config.baseUrl,
voiceId: normalizeOptionalString(overrides.voiceId) ?? config.voiceId,
outputFormat,
timeoutMs: req.timeoutMs,
maxBytes: resolveGeneratedAudioMaxBytes(req)
}),
outputFormat,
fileExtension: wantsVoiceNote ? ".opus" : ".wav",
voiceCompatible: wantsVoiceNote
};
},
synthesizeTelephony: async (req) => {
const config = readGradiumProviderConfig(req.providerConfig);
const overrides = req.providerOverrides ?? {};
const apiKey = config.apiKey || process.env.GRADIUM_API_KEY;
if (!apiKey) throw new Error("Gradium API key missing");
const outputFormat = "ulaw_8000";
return {
audioBuffer: await gradiumTTS({
text: req.text,
apiKey,
baseUrl: config.baseUrl,
voiceId: normalizeOptionalString(overrides.voiceId) ?? config.voiceId,
outputFormat,
timeoutMs: req.timeoutMs,
maxBytes: resolveGeneratedAudioMaxBytes(req)
}),
outputFormat,
sampleRate: 8e3
};
}
};
}
//#endregion
export { buildGradiumSpeechProvider as t };