import { genkit, z } from 'genkit';
import {
pinecone,
pineconeRetrieverRef,
pineconeIndexerRef,
createPineconeIndex,
describePineconeIndex,
} from 'genkitx-pinecone';
import { googleAI } from '@genkit-ai/google-genai';
import { Document } from 'genkit';
// Initialize
const ai = genkit({
plugins: [
googleAI(),
pinecone([{
indexId: 'documentation',
embedder: googleAI.embedder('gemini-embedding-001'),
}]),
],
});
const indexer = pineconeIndexerRef({ indexId: 'documentation' });
const retriever = pineconeRetrieverRef({ indexId: 'documentation' });
// Ensure index exists
try {
const info = await describePineconeIndex({ name: 'documentation' });
console.log('Index exists:', info.name);
} catch (error) {
console.log('Creating index...');
await createPineconeIndex({
options: {
name: 'documentation',
dimension: 768,
metric: 'cosine',
spec: {
serverless: {
cloud: 'aws',
region: 'us-east-1',
},
},
},
});
}
// Index documents
const docs = [
Document.fromText('Genkit simplifies AI development.', {
topic: 'genkit',
type: 'overview',
}),
Document.fromText('Pinecone provides vector search.', {
topic: 'pinecone',
type: 'overview',
}),
];
await ai.index({
indexer: indexer,
documents: docs,
options: { namespace: 'prod' },
});
// RAG flow
const docSearch = ai.defineFlow(
{
name: 'documentSearch',
inputSchema: z.object({
query: z.string(),
topic: z.string().optional(),
}),
},
async ({ query, topic }) => {
const docs = await ai.retrieve({
retriever: retriever,
query: query,
options: {
k: 5,
namespace: 'prod',
filter: topic ? { topic } : undefined,
},
});
const context = docs.documents.map(d => d.text).join('\n');
const { text } = await ai.generate({
model: googleAI.model('gemini-2.5-flash'),
prompt: `Context:\n${context}\n\nQuestion: ${query}`,
});
return text;
}
);