Files
ace-step-ui/services/geminiService.ts
T

60 lines
1.8 KiB
TypeScript

import { GoogleGenAI, Type } from "@google/genai";
const apiKey = process.env.API_KEY || ''; // Fallback for dev env without key
const ai = new GoogleGenAI({ apiKey });
export const generateSongData = async (
topic: string,
style: string
): Promise<{ title: string; lyrics: string; tags: string[] }> => {
if (!apiKey) {
// Mock response if no API key is present
return new Promise((resolve) => {
setTimeout(() => {
resolve({
title: "Neon Echoes (Mock)",
lyrics: "[Verse]\nChecking for API key...\nNone found, so here is a mock.\n\n[Chorus]\nVirtual sounds in a digital world.",
tags: ["electronic", "mock", "ambient"]
});
}, 2000);
});
}
try {
const prompt = `Generate a song title, lyrics, and 3 style tags based on this user prompt: "${topic}". The style requested is: "${style}".
Format the lyrics with standard song structure headers like [Verse], [Chorus].`;
const response = await ai.models.generateContent({
model: "gemini-2.5-flash-latest",
contents: prompt,
config: {
responseMimeType: "application/json",
responseSchema: {
type: Type.OBJECT,
properties: {
title: { type: Type.STRING },
lyrics: { type: Type.STRING },
tags: {
type: Type.ARRAY,
items: { type: Type.STRING }
}
},
required: ["title", "lyrics", "tags"]
}
}
});
const jsonText = response.text;
if (!jsonText) throw new Error("No response from Gemini");
return JSON.parse(jsonText);
} catch (error) {
console.error("Gemini generation error:", error);
return {
title: "Generation Failed",
lyrics: "[Error]\nCould not generate lyrics at this time.",
tags: ["error"]
};
}
};