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 cec56612da..5a39be8359 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. @@ -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 @@ -147,17 +112,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 +135,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 +155,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 +184,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; } ); ``` @@ -254,18 +196,13 @@ 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', 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 +211,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() {