Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion genkit-tools/cli/context/GENKIT.go.md
Original file line number Diff line number Diff line change
@@ -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.

Expand Down
88 changes: 7 additions & 81 deletions genkit-tools/cli/context/GENKIT.js.md
Original file line number Diff line number Diff line change
@@ -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.

Expand Down Expand Up @@ -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<string> {
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
Expand All @@ -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({
Expand All @@ -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;
}
);
```
Expand All @@ -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({
Expand Down Expand Up @@ -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;
}
);
```
Expand All @@ -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({
Expand All @@ -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;
}
);
```
Expand Down
9 changes: 5 additions & 4 deletions genkit-tools/telemetry-server/src/file-trace-store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
Loading