openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
228 lines (227 loc) • 9 kB
JavaScript
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 { i as transcodeAudioBufferToOpus } from "./media-services-DE3J1qM-.js";
import "./media-runtime-fgpmX6eL.js";
import "./string-coerce-runtime-CEGJWkQ_.js";
import { t as parseSpeechDirectiveNumberOverride } from "./speech-core-s8tZcO7c.js";
import { i as isProviderAuthProfileConfigured, s as resolveProviderAuthProfileApiKey } from "./provider-auth-DAOC_qI9.js";
import "./secret-input-DVCzFGxN.js";
import { a as normalizeMinimaxTtsBaseUrl, i as minimaxTTS, n as MINIMAX_TTS_MODELS, r as MINIMAX_TTS_VOICES } from "./tts-BeqUilc6.js";
//#region extensions/minimax/speech-provider.ts
const MINIMAX_PORTAL_PROVIDER_ID = "minimax-portal";
const MINIMAX_TOKEN_PLAN_ENV_VARS = [
"MINIMAX_OAUTH_TOKEN",
"MINIMAX_CODE_PLAN_KEY",
"MINIMAX_CODING_API_KEY"
];
function resolveConfiguredPortalTtsBaseUrl(cfg) {
const portalBaseUrl = normalizeOptionalString(asObject(asObject(asObject(cfg?.models)?.providers)?.[MINIMAX_PORTAL_PROVIDER_ID])?.baseUrl);
return portalBaseUrl ? normalizeMinimaxTtsBaseUrl(portalBaseUrl) : void 0;
}
function resolveMinimaxTokenPlanEnvKey() {
for (const envVar of MINIMAX_TOKEN_PLAN_ENV_VARS) {
const value = normalizeOptionalString(process.env[envVar]);
if (value) return value;
}
}
async function resolveMinimaxPortalProfileToken(cfg) {
return await resolveProviderAuthProfileApiKey({
cfg,
provider: MINIMAX_PORTAL_PROVIDER_ID
});
}
async function resolveMinimaxTtsApiKey(params) {
return params.configApiKey ?? await resolveMinimaxPortalProfileToken(params.cfg) ?? resolveMinimaxTokenPlanEnvKey() ?? normalizeOptionalString(process.env.MINIMAX_API_KEY);
}
function normalizeMinimaxProviderConfig(rawConfig, cfg) {
const raw = asObject(asObject(rawConfig.providers)?.minimax) ?? asObject(rawConfig.minimax);
return {
apiKey: normalizeResolvedSecretInputString({
value: raw?.apiKey,
path: "messages.tts.providers.minimax.apiKey"
}),
baseUrl: normalizeMinimaxTtsBaseUrl(normalizeOptionalString(raw?.baseUrl) ?? normalizeOptionalString(process.env.MINIMAX_API_HOST) ?? resolveConfiguredPortalTtsBaseUrl(cfg) ?? "https://api.minimax.io"),
model: normalizeOptionalString(raw?.model) ?? normalizeOptionalString(process.env.MINIMAX_TTS_MODEL) ?? "speech-2.8-hd",
voiceId: normalizeOptionalString(raw?.voiceId) ?? normalizeOptionalString(process.env.MINIMAX_TTS_VOICE_ID) ?? "English_expressive_narrator",
speed: normalizeMinimaxSpeed(raw?.speed),
vol: normalizeMinimaxVolume(raw?.vol),
pitch: normalizeMinimaxPitch(raw?.pitch)
};
}
function normalizeMinimaxSpeed(value) {
return asFiniteNumberInRange(value, {
min: .5,
max: 2
});
}
function normalizeMinimaxVolume(value) {
return asFiniteNumberInRange(value, {
min: 0,
max: 10,
minExclusive: true
});
}
function normalizeMinimaxPitch(value) {
const pitch = asFiniteNumberInRange(value, {
min: -12,
max: 12
});
return pitch !== void 0 ? Math.trunc(pitch) : void 0;
}
function readMinimaxProviderConfig(config, cfg) {
const normalized = normalizeMinimaxProviderConfig({}, cfg);
return {
apiKey: normalizeOptionalString(config.apiKey) ?? normalized.apiKey,
baseUrl: normalizeMinimaxTtsBaseUrl(normalizeOptionalString(config.baseUrl) ?? normalized.baseUrl),
model: normalizeOptionalString(config.model) ?? normalized.model,
voiceId: normalizeOptionalString(config.voiceId) ?? normalized.voiceId,
speed: normalizeMinimaxSpeed(config.speed) ?? normalized.speed,
vol: normalizeMinimaxVolume(config.vol) ?? normalized.vol,
pitch: normalizeMinimaxPitch(config.pitch) ?? normalized.pitch
};
}
function readMinimaxOverrides(overrides) {
if (!overrides) return {};
return {
model: normalizeOptionalString(overrides.model),
voiceId: normalizeOptionalString(overrides.voiceId),
speed: normalizeMinimaxSpeed(overrides.speed),
vol: normalizeMinimaxVolume(overrides.vol),
pitch: normalizeMinimaxPitch(overrides.pitch)
};
}
function parseDirectiveToken(ctx) {
switch (ctx.key) {
case "voice":
case "voiceid":
case "voice_id":
case "minimax_voice":
case "minimaxvoice":
if (!ctx.policy.allowVoice) return { handled: true };
return {
handled: true,
overrides: { voiceId: ctx.value }
};
case "model":
case "minimax_model":
case "minimaxmodel":
if (!ctx.policy.allowModelId) return { handled: true };
return {
handled: true,
overrides: { model: ctx.value }
};
case "speed": return parseSpeechDirectiveNumberOverride({
ctx,
overrideKey: "speed",
range: {
min: .5,
max: 2
},
warning: (value) => `invalid MiniMax speed "${value}" (0.5-2.0)`
});
case "vol":
case "volume": return parseSpeechDirectiveNumberOverride({
ctx,
overrideKey: "vol",
range: {
min: 0,
minExclusive: true,
max: 10
},
warning: (value) => `invalid MiniMax volume "${value}" (0-10, exclusive)`
});
case "pitch": return parseSpeechDirectiveNumberOverride({
ctx,
overrideKey: "pitch",
range: {
min: -12,
max: 12
},
warning: (value) => `invalid MiniMax pitch "${value}" (-12 to 12)`
});
default: return { handled: false };
}
}
function buildMinimaxSpeechProvider() {
return {
id: "minimax",
label: "MiniMax",
autoSelectOrder: 40,
defaultModel: MINIMAX_TTS_MODELS[0],
models: MINIMAX_TTS_MODELS,
voices: MINIMAX_TTS_VOICES,
resolveConfig: ({ rawConfig, cfg }) => normalizeMinimaxProviderConfig(rawConfig, cfg),
parseDirectiveToken,
resolveTalkConfig: ({ baseTtsConfig, talkProviderConfig }) => {
return {
...normalizeMinimaxProviderConfig(baseTtsConfig),
...talkProviderConfig.apiKey === void 0 ? {} : { apiKey: normalizeResolvedSecretInputString({
value: talkProviderConfig.apiKey,
path: "talk.providers.minimax.apiKey"
}) },
...normalizeOptionalString(talkProviderConfig.baseUrl) == null ? {} : { baseUrl: normalizeMinimaxTtsBaseUrl(normalizeOptionalString(talkProviderConfig.baseUrl)) },
...normalizeOptionalString(talkProviderConfig.modelId) == null ? {} : { model: normalizeOptionalString(talkProviderConfig.modelId) },
...normalizeOptionalString(talkProviderConfig.voiceId) == null ? {} : { voiceId: normalizeOptionalString(talkProviderConfig.voiceId) },
...normalizeMinimaxSpeed(talkProviderConfig.speed) == null ? {} : { speed: normalizeMinimaxSpeed(talkProviderConfig.speed) },
...normalizeMinimaxVolume(talkProviderConfig.vol) == null ? {} : { vol: normalizeMinimaxVolume(talkProviderConfig.vol) },
...normalizeMinimaxPitch(talkProviderConfig.pitch) == null ? {} : { pitch: normalizeMinimaxPitch(talkProviderConfig.pitch) }
};
},
resolveTalkOverrides: ({ params }) => ({
...normalizeOptionalString(params.voiceId) == null ? {} : { voiceId: normalizeOptionalString(params.voiceId) },
...normalizeOptionalString(params.modelId) == null ? {} : { model: normalizeOptionalString(params.modelId) },
...normalizeMinimaxSpeed(params.speed) == null ? {} : { speed: normalizeMinimaxSpeed(params.speed) },
...normalizeMinimaxVolume(params.vol) == null ? {} : { vol: normalizeMinimaxVolume(params.vol) },
...normalizeMinimaxPitch(params.pitch) == null ? {} : { pitch: normalizeMinimaxPitch(params.pitch) }
}),
listVoices: async () => MINIMAX_TTS_VOICES.map((voice) => ({
id: voice,
name: voice
})),
isConfigured: ({ cfg, providerConfig }) => Boolean(readMinimaxProviderConfig(providerConfig, cfg).apiKey || isProviderAuthProfileConfigured({
cfg,
provider: MINIMAX_PORTAL_PROVIDER_ID
}) || resolveMinimaxTokenPlanEnvKey() || process.env.MINIMAX_API_KEY),
synthesize: async (req) => {
const config = readMinimaxProviderConfig(req.providerConfig, req.cfg);
const overrides = readMinimaxOverrides(req.providerOverrides);
const apiKey = await resolveMinimaxTtsApiKey({
cfg: req.cfg,
configApiKey: config.apiKey
});
if (!apiKey) throw new Error("MiniMax TTS auth missing");
const audioBuffer = await minimaxTTS({
text: req.text,
apiKey,
baseUrl: config.baseUrl,
model: overrides.model ?? config.model,
voiceId: overrides.voiceId ?? config.voiceId,
speed: overrides.speed ?? config.speed,
vol: overrides.vol ?? config.vol,
pitch: overrides.pitch ?? config.pitch,
timeoutMs: req.timeoutMs
});
if (req.target === "voice-note") return {
audioBuffer: await transcodeAudioBufferToOpus({
audioBuffer,
inputExtension: "mp3",
tempPrefix: "tts-minimax-",
timeoutMs: req.timeoutMs
}),
outputFormat: "opus",
fileExtension: ".opus",
voiceCompatible: true
};
return {
audioBuffer,
outputFormat: "mp3",
fileExtension: ".mp3",
voiceCompatible: false
};
}
};
}
//#endregion
export { buildMinimaxSpeechProvider as t };