UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

171 lines (170 loc) 6.89 kB
import { c as normalizeOptionalString } from "./string-coerce-mnp54Vah.js"; import { c as asFiniteNumberInRange } from "./number-coercion-CJQ8TR--.js"; import { u as normalizeResolvedSecretInputString } from "./types.secrets-_0JOMGE5.js"; import { n as asObject } from "./provider-http-errors-DqaqQLLZ.js"; import "./string-coerce-runtime-CEGJWkQ_.js"; import { t as parseSpeechDirectiveNumberOverride } from "./speech-core-s8tZcO7c.js"; import "./secret-input-DVCzFGxN.js"; import { a as listInworldVoices, i as inworldTTS, o as normalizeInworldBaseUrl, r as INWORLD_TTS_MODELS, t as DEFAULT_INWORLD_MODEL_ID } from "./tts-CAYVPyRY.js"; //#region extensions/inworld/speech-provider.ts function normalizeInworldTemperature(value) { return asFiniteNumberInRange(value, { min: 0, minExclusive: true, max: 2 }); } function normalizeInworldProviderConfig(rawConfig) { const raw = asObject(asObject(rawConfig.providers)?.inworld) ?? asObject(rawConfig.inworld); return { apiKey: normalizeResolvedSecretInputString({ value: raw?.apiKey, path: "messages.tts.providers.inworld.apiKey" }), baseUrl: normalizeInworldBaseUrl(normalizeOptionalString(raw?.baseUrl)), voiceId: normalizeOptionalString(raw?.voiceId) ?? "Sarah", modelId: normalizeOptionalString(raw?.modelId) ?? "inworld-tts-1.5-max", temperature: normalizeInworldTemperature(raw?.temperature) }; } function readInworldProviderConfig(config) { const defaults = normalizeInworldProviderConfig({}); return { apiKey: normalizeOptionalString(config.apiKey) ?? defaults.apiKey, baseUrl: normalizeInworldBaseUrl(normalizeOptionalString(config.baseUrl) ?? defaults.baseUrl), voiceId: normalizeOptionalString(config.voiceId) ?? defaults.voiceId, modelId: normalizeOptionalString(config.modelId) ?? defaults.modelId, temperature: normalizeInworldTemperature(config.temperature) ?? defaults.temperature }; } function readInworldOverrides(overrides) { if (!overrides) return {}; return { voiceId: normalizeOptionalString(overrides.voiceId ?? overrides.voice), modelId: normalizeOptionalString(overrides.modelId ?? overrides.model), temperature: normalizeInworldTemperature(overrides.temperature) }; } function parseDirectiveToken(ctx) { switch (ctx.key) { case "voice": case "voiceid": case "voice_id": case "inworld_voice": case "inworldvoice": if (!ctx.policy.allowVoice) return { handled: true }; return { handled: true, overrides: { voiceId: ctx.value } }; case "model": case "modelid": case "model_id": case "inworld_model": case "inworldmodel": if (!ctx.policy.allowModelId) return { handled: true }; return { handled: true, overrides: { modelId: ctx.value } }; case "temperature": return parseSpeechDirectiveNumberOverride({ ctx, overrideKey: "temperature", range: { min: 0, minExclusive: true, max: 2 }, warning: (value) => `invalid Inworld temperature "${value}"` }); default: return { handled: false }; } } function buildInworldSpeechProvider() { return { id: "inworld", label: "Inworld", autoSelectOrder: 30, defaultModel: DEFAULT_INWORLD_MODEL_ID, models: INWORLD_TTS_MODELS, resolveConfig: ({ rawConfig }) => normalizeInworldProviderConfig(rawConfig), parseDirectiveToken, resolveTalkConfig: ({ baseTtsConfig, talkProviderConfig }) => { const base = normalizeInworldProviderConfig(baseTtsConfig); const resolvedApiKey = talkProviderConfig.apiKey === void 0 ? void 0 : normalizeResolvedSecretInputString({ value: talkProviderConfig.apiKey, path: "talk.providers.inworld.apiKey" }); return { ...base, ...resolvedApiKey === void 0 ? {} : { apiKey: resolvedApiKey }, ...normalizeOptionalString(talkProviderConfig.baseUrl) == null ? {} : { baseUrl: normalizeInworldBaseUrl(normalizeOptionalString(talkProviderConfig.baseUrl)) }, ...normalizeOptionalString(talkProviderConfig.voiceId) == null ? {} : { voiceId: normalizeOptionalString(talkProviderConfig.voiceId) }, ...normalizeOptionalString(talkProviderConfig.modelId) == null ? {} : { modelId: normalizeOptionalString(talkProviderConfig.modelId) }, ...normalizeInworldTemperature(talkProviderConfig.temperature) == null ? {} : { temperature: normalizeInworldTemperature(talkProviderConfig.temperature) } }; }, resolveTalkOverrides: ({ params }) => ({ ...normalizeOptionalString(params.voiceId) == null ? {} : { voiceId: normalizeOptionalString(params.voiceId) }, ...normalizeOptionalString(params.modelId) == null ? {} : { modelId: normalizeOptionalString(params.modelId) }, ...normalizeInworldTemperature(params.temperature) == null ? {} : { temperature: normalizeInworldTemperature(params.temperature) } }), listVoices: async (req) => { const config = req.providerConfig ? readInworldProviderConfig(req.providerConfig) : void 0; const apiKey = req.apiKey || config?.apiKey || process.env.INWORLD_API_KEY; if (!apiKey) throw new Error("Inworld API key missing"); return listInworldVoices({ apiKey, baseUrl: req.baseUrl ?? config?.baseUrl }); }, isConfigured: ({ providerConfig }) => Boolean(readInworldProviderConfig(providerConfig).apiKey || process.env.INWORLD_API_KEY), synthesize: async (req) => { const config = readInworldProviderConfig(req.providerConfig); const overrides = readInworldOverrides(req.providerOverrides); const apiKey = config.apiKey || process.env.INWORLD_API_KEY; if (!apiKey) throw new Error("Inworld API key missing"); const useOpus = req.target === "voice-note"; const audioEncoding = useOpus ? "OGG_OPUS" : "MP3"; return { audioBuffer: await inworldTTS({ text: req.text, apiKey, baseUrl: config.baseUrl, voiceId: overrides.voiceId ?? config.voiceId, modelId: overrides.modelId ?? config.modelId, audioEncoding, temperature: overrides.temperature ?? config.temperature, timeoutMs: req.timeoutMs }), outputFormat: audioEncoding.toLowerCase(), fileExtension: useOpus ? ".ogg" : ".mp3", voiceCompatible: useOpus }; }, synthesizeTelephony: async (req) => { const config = readInworldProviderConfig(req.providerConfig); const overrides = readInworldOverrides(req.providerOverrides); const apiKey = config.apiKey || process.env.INWORLD_API_KEY; if (!apiKey) throw new Error("Inworld API key missing"); const sampleRate = 22050; return { audioBuffer: await inworldTTS({ text: req.text, apiKey, baseUrl: config.baseUrl, voiceId: overrides.voiceId ?? config.voiceId, modelId: overrides.modelId ?? config.modelId, audioEncoding: "PCM", sampleRateHertz: sampleRate, temperature: overrides.temperature ?? config.temperature, timeoutMs: req.timeoutMs }), outputFormat: "pcm", sampleRate }; } }; } //#endregion export { buildInworldSpeechProvider as t };