From ad43c46b456315a7faa8db94e9646c84955abea0 Mon Sep 17 00:00:00 2001 From: Samuel Bushi Date: Mon, 6 Oct 2025 14:54:43 -0400 Subject: [PATCH 1/3] fix: Handle missing trace index, better multimedia samples for AI --- genkit-tools/cli/context/GENKIT.js.md | 46 +++---------------- .../telemetry-server/src/file-trace-store.ts | 9 ++-- 2 files changed, 11 insertions(+), 44 deletions(-) diff --git a/genkit-tools/cli/context/GENKIT.js.md b/genkit-tools/cli/context/GENKIT.js.md index cec56612da..b1fe17454c 100644 --- a/genkit-tools/cli/context/GENKIT.js.md +++ b/genkit-tools/cli/context/GENKIT.js.md @@ -147,17 +147,12 @@ const TextToSpeechInputSchema = z.object({ .optional() .describe('The voice name to use. Defaults to Algenib if not specified.'), }); -const TextToSpeechOutputSchema = z.object({ - audioDataUri: z - .string() - .describe('The generated speech in WAV format as a base64 data URI.'), -}); export const textToSpeechFlow = ai.defineFlow( { name: 'textToSpeechFlow', inputSchema: TextToSpeechInputSchema, - outputSchema: TextToSpeechOutputSchema, + outputSchema: z.string().optional().describe('The generated audio URI'), }, async (input) => { const response = await ai.generate({ @@ -175,16 +170,7 @@ export const textToSpeechFlow = ai.defineFlow( }, }); - const audioUrl = response.media?.url; - if (!audioUrl) - throw new Error('Audio generation failed: No media URL in response.'); - - const base64 = audioUrl.split(';base64,')[1]; - if (!base64) throw new Error('Invalid audio data URI format from Genkit.'); - - const pcmBuffer = Buffer.from(base64, 'base64'); - const audioDataUri = await pcmToWavDataUri(pcmBuffer); - return { audioDataUri }; + return response.media?.url; } ); ``` @@ -204,7 +190,7 @@ export const multiSpeakerTextToSpeechFlow = ai.defineFlow( { name: 'multiSpeakerTextToSpeechFlow', inputSchema: MultiSpeakerInputSchema, - outputSchema: TextToSpeechOutputSchema, + outputSchema: z.string().optional().describe('The generated audio URI'), }, async (input) => { const response = await ai.generate({ @@ -233,16 +219,7 @@ export const multiSpeakerTextToSpeechFlow = ai.defineFlow( }, }); - const audioUrl = response.media?.url; - if (!audioUrl) - throw new Error('Audio generation failed: No media URL in response.'); - - const base64 = audioUrl.split(';base64,')[1]; - if (!base64) throw new Error('Invalid audio data URI format from Genkit.'); - - const pcmBuffer = Buffer.from(base64, 'base64'); - const audioDataUri = await pcmToWavDataUri(pcmBuffer); - return { audioDataUri }; + return response.media?.url; } ); ``` @@ -265,7 +242,7 @@ export const imageGenerationFlow = ai.defineFlow( inputSchema: z .string() .describe('A detailed description of the image to generate'), - outputSchema: z.string().describe('Path to the generated .png image file'), + outputSchema: z.string().optional().describe('The generated image as URI'), }, async (prompt) => { const response = await ai.generate({ @@ -274,18 +251,7 @@ export const imageGenerationFlow = ai.defineFlow( output: { format: 'media' }, }); - if (!response.media?.url) { - throw new Error('Image generation failed to produce media.'); - } - - const parsed = parseDataURL(response.media.url); - if (!parsed) { - throw new Error('Could not parse image data URL.'); - } - - const outputPath = './output.png'; - await fs.writeFile(outputPath, parsed.body); - return outputPath; + return response.media?.url; } ); ``` diff --git a/genkit-tools/telemetry-server/src/file-trace-store.ts b/genkit-tools/telemetry-server/src/file-trace-store.ts index 66d5fb88c4..46e456e4bf 100644 --- a/genkit-tools/telemetry-server/src/file-trace-store.ts +++ b/genkit-tools/telemetry-server/src/file-trace-store.ts @@ -317,12 +317,13 @@ export class Index { } getMetadata(): { version: string } | undefined { - if (!fs.existsSync(this.metadataFileName())) { + try { + return JSON.parse( + fs.readFileSync(this.metadataFileName(), { encoding: 'utf8' }) + ); + } catch (e) { return undefined; } - return JSON.parse( - fs.readFileSync(this.metadataFileName(), { encoding: 'utf8' }) - ); } private newIndexFileName() { From b7b82bc66dca9fad4144ba04540803f428ab80e5 Mon Sep 17 00:00:00 2001 From: Samuel Bushi Date: Mon, 6 Oct 2025 15:30:52 -0400 Subject: [PATCH 2/3] update version --- genkit-tools/cli/context/GENKIT.go.md | 2 +- genkit-tools/cli/context/GENKIT.js.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/genkit-tools/cli/context/GENKIT.go.md b/genkit-tools/cli/context/GENKIT.go.md index e1e1455ff5..80e7fabf1f 100644 --- a/genkit-tools/cli/context/GENKIT.go.md +++ b/genkit-tools/cli/context/GENKIT.go.md @@ -1,4 +1,4 @@ -# Genkit Go API Rules (v1.0.0) +# Genkit Go API Rules (v1.20.0) This document provides rules and examples for building with the Genkit API in Go. diff --git a/genkit-tools/cli/context/GENKIT.js.md b/genkit-tools/cli/context/GENKIT.js.md index b1fe17454c..30a8bc8e6a 100644 --- a/genkit-tools/cli/context/GENKIT.js.md +++ b/genkit-tools/cli/context/GENKIT.js.md @@ -1,4 +1,4 @@ -# Genkit Node.js API Rules (v1.17.1) +# Genkit Node.js API Rules (v1.20.0) This document provides rules and examples for building with the Genkit API in Node.js. From b39e33525ead3268b5c3943375bc9572f2fa042c Mon Sep 17 00:00:00 2001 From: Samuel Bushi Date: Mon, 6 Oct 2025 15:40:58 -0400 Subject: [PATCH 3/3] remove helper --- genkit-tools/cli/context/GENKIT.js.md | 40 --------------------------- 1 file changed, 40 deletions(-) diff --git a/genkit-tools/cli/context/GENKIT.js.md b/genkit-tools/cli/context/GENKIT.js.md index 30a8bc8e6a..5a39be8359 100644 --- a/genkit-tools/cli/context/GENKIT.js.md +++ b/genkit-tools/cli/context/GENKIT.js.md @@ -102,41 +102,6 @@ export const basicInferenceFlow = ai.defineFlow( ### Text-to-Speech (TTS) Generation -This helper function converts PCM audio data from the TTS model into a WAV-formatted data URI. - -```ts -import { Buffer } from 'buffer'; -import { PassThrough } from 'stream'; -import { Writer as WavWriter } from 'wav'; - -... - -async function pcmToWavDataUri( - pcmData: Buffer, - channels = 1, - sampleRate = 24000, - bitDepth = 16 -): Promise { - return new Promise((resolve, reject) => { - const chunks: Buffer[] = []; - const passThrough = new PassThrough(); - - passThrough.on('data', (chunk) => chunks.push(chunk as Buffer)); - passThrough.on('end', () => { - const wavBuffer = Buffer.concat(chunks); - const dataUri = `data:audio/wav;base64,${wavBuffer.toString('base64')}`; - resolve(dataUri); - }); - passThrough.on('error', reject); - - const writer = new WavWriter({ channels, sampleRate, bitDepth }); - writer.pipe(passThrough); - writer.write(pcmData); - writer.end(); - }); -} -``` - #### Single-Speaker TTS ```ts @@ -231,11 +196,6 @@ export const multiSpeakerTextToSpeechFlow = ai.defineFlow( ### Image Generation ```ts -import * as fs from 'fs/promises'; -import parseDataURL from 'data-urls'; - -... - export const imageGenerationFlow = ai.defineFlow( { name: 'imageGenerationFlow',