openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
109 lines (108 loc) • 4.33 kB
JavaScript
import { c as normalizeOptionalString } from "../../string-coerce-mnp54Vah.js";
import { r as extensionForMime } from "../../mime-C8mVE2Bw.js";
import "../../string-coerce-runtime-CEGJWkQ_.js";
import "../../media-mime-v9DSctG7.js";
import { a as resolveApiKeyForProvider } from "../../provider-auth-runtime-D2xYnWtb.js";
import { c as resolveGoogleGenerativeAiApiOrigin } from "../../provider-policy-CT7vRcoH.js";
import { c as createGoogleMusicGenerationProviderMetadata } from "../../generation-provider-metadata-DrbobYwI.js";
import "../../api-Cysqpi9q.js";
import { t as createGoogleGenAI } from "../../google-genai-runtime-CMlucVkZ.js";
//#region extensions/google/music-generation-provider.ts
const DEFAULT_TIMEOUT_MS = 18e4;
function resolveConfiguredGoogleMusicBaseUrl(req) {
const configured = normalizeOptionalString(req.cfg?.models?.providers?.google?.baseUrl);
return configured ? resolveGoogleGenerativeAiApiOrigin(configured) : void 0;
}
function buildMusicPrompt(req) {
const parts = [req.prompt.trim()];
const lyrics = normalizeOptionalString(req.lyrics);
if (req.instrumental === true) parts.push("Instrumental only. No vocals, no sung lyrics, no spoken word.");
if (lyrics) parts.push(`Lyrics:\n${lyrics}`);
return parts.join("\n\n");
}
function resolveSupportedFormats(model) {
return model === "lyria-3-pro-preview" ? ["mp3", "wav"] : ["mp3"];
}
function resolveTrackFileName(params) {
const ext = extensionForMime(params.mimeType)?.replace(/^\./u, "") || (params.model === "lyria-3-pro-preview" ? "wav" : "mp3");
return `track-${params.index + 1}.${ext}`;
}
function extractTracks(params) {
const lyrics = [];
const tracks = [];
for (const candidate of params.payload.candidates ?? []) for (const part of candidate.content?.parts ?? []) {
const text = normalizeOptionalString(part.text);
if (text) {
lyrics.push(text);
continue;
}
const inline = part.inlineData ?? part.inline_data;
const data = normalizeOptionalString(inline?.data);
if (!data) continue;
const mimeType = normalizeOptionalString(inline?.mimeType) || normalizeOptionalString(inline?.mime_type) || "audio/mpeg";
tracks.push({
buffer: Buffer.from(data, "base64"),
mimeType,
fileName: resolveTrackFileName({
index: tracks.length,
mimeType,
model: params.model
})
});
}
return {
tracks,
lyrics
};
}
function buildGoogleMusicGenerationProvider() {
return {
...createGoogleMusicGenerationProviderMetadata(),
async generateMusic(req) {
if ((req.inputImages?.length ?? 0) > 10) throw new Error(`Google music generation supports at most 10 reference images.`);
const auth = await resolveApiKeyForProvider({
provider: "google",
cfg: req.cfg,
agentDir: req.agentDir,
store: req.authStore
});
if (!auth.apiKey) throw new Error("Google API key missing");
const model = normalizeOptionalString(req.model) || "lyria-3-clip-preview";
if (req.format) {
const supportedFormats = resolveSupportedFormats(model);
if (!supportedFormats.includes(req.format)) throw new Error(`Google music generation model ${model} supports ${supportedFormats.join(", ")} output.`);
}
const { tracks, lyrics } = extractTracks({
payload: await createGoogleGenAI({
apiKey: auth.apiKey,
httpOptions: {
...resolveConfiguredGoogleMusicBaseUrl(req) ? { baseUrl: resolveConfiguredGoogleMusicBaseUrl(req) } : {},
timeout: req.timeoutMs ?? DEFAULT_TIMEOUT_MS
}
}).models.generateContent({
model,
contents: [{ text: buildMusicPrompt(req) }, ...(req.inputImages ?? []).map((image) => ({ inlineData: {
mimeType: normalizeOptionalString(image.mimeType) || "image/png",
data: image.buffer?.toString("base64") ?? ""
} }))],
config: { responseModalities: ["AUDIO", "TEXT"] }
}),
model
});
if (tracks.length === 0) throw new Error("Google music generation response missing audio data");
return {
tracks,
...lyrics.length > 0 ? { lyrics } : {},
model,
metadata: {
inputImageCount: req.inputImages?.length ?? 0,
instrumental: req.instrumental === true,
...normalizeOptionalString(req.lyrics) ? { requestedLyrics: true } : {},
...req.format ? { requestedFormat: req.format } : {}
}
};
}
};
}
//#endregion
export { buildGoogleMusicGenerationProvider };