65 lines
2.1 KiB
TypeScript
65 lines
2.1 KiB
TypeScript
import { GoogleGenAI } from "npm:@google/genai@1.12.0";
|
|
import { assert } from "https://deno.land/std@0.224.0/assert/mod.ts";
|
|
import schema from "./schemas/AiSnewuggestionOutput.json" with { type: "json" };
|
|
import { GetNewSuggestInput, GetNewSuggestOutput } from "./types/api.ts";
|
|
import { AiSnewuggestionOutput } from "./types/ai.ts";
|
|
|
|
const ai = new GoogleGenAI({});
|
|
|
|
// Generate songs using AI
|
|
export async function generateVibes(
|
|
input: GetNewSuggestInput,
|
|
): Promise<AiSnewuggestionOutput> {
|
|
const { rules } = input;
|
|
let aiPrompt = "";
|
|
let contextText = "";
|
|
|
|
if (input.type === "scratch-suggestion") {
|
|
contextText =
|
|
`The music request is for a place: "${input.room_name}". Your job is to find 15 songs that match the vibe of this place.`;
|
|
} else if (input.type === "from-songs-suggestion") {
|
|
const songList = input.songs.map((s, i) => `${i + 1}. ${s.song}`).join(
|
|
"\n",
|
|
);
|
|
contextText =
|
|
`The music request is based on the last 10 songs:\n${songList}\nYour job is to 15 find songs that match the vibe of these songs.`;
|
|
}
|
|
|
|
const rulesText = rules && rules.trim().length > 0
|
|
? `Make sure that they follow the following set of rules: "${rules}".`
|
|
: "";
|
|
|
|
aiPrompt = `
|
|
${contextText}
|
|
Make sure they are real, popular songs that exist on Spotify.
|
|
${rulesText}
|
|
`;
|
|
|
|
const response = await ai.models.generateContent({
|
|
model: "gemini-2.5-flash",
|
|
contents: aiPrompt,
|
|
config: { responseMimeType: "application/json", responseSchema: schema },
|
|
});
|
|
|
|
const text = response.candidates?.at(0)?.content?.parts?.at(0)?.text;
|
|
if (!text) {
|
|
throw Error("Text not found");
|
|
}
|
|
|
|
return JSON.parse(text) as AiSnewuggestionOutput;
|
|
}
|
|
|
|
Deno.test("generateVibes with array of songs", async () => {
|
|
const input: GetNewSuggestInput = {
|
|
type: "from-songs-suggestion" as const,
|
|
rules: "The songs must be great for food",
|
|
songs: [
|
|
{ song: "Something - The Beatles" },
|
|
{ song: "Come Together - The Beatles" },
|
|
{ song: "Help! - The Beatles" },
|
|
],
|
|
};
|
|
const result = await generateVibes(input);
|
|
|
|
console.log(result);
|
|
});
|