Skip to main content
Embedders convert text and documents into vector embeddings for semantic search and retrieval.

defineEmbedder()

Defines and registers an embedder.
import { defineEmbedder } from '@genkit-ai/ai';
import { z } from 'zod';

const myEmbedder = defineEmbedder(
  registry,
  {
    name: 'myEmbedder',
    configSchema: z.object({
      dimensions: z.number().optional(),
    }),
    info: {
      label: 'My Custom Embedder',
      dimensions: 768,
      supports: {
        input: ['text'],
      },
    },
  },
  async (input, options) => {
    // Generate embeddings for each document
    const embeddings = input.map(doc => ({
      embedding: generateEmbedding(doc.text()),
    }));
    
    return { embeddings };
  }
);

Parameters

registry
Registry
required
The Genkit registry instance
options
EmbedderOptions<ConfigSchema>
required
Embedder configuration
runner
EmbedderFn<ConfigSchema>
required
Implementation functionFunction signature:
(input: Document[], options?: z.infer<ConfigSchema>) => Promise<EmbedResponse>

Returns

EmbedderAction
EmbedderAction<ConfigSchema>
An embedder action that can be used with embed()

embed()

Generates embeddings for text or documents.
import { embed } from '@genkit-ai/ai';

const embeddings = await embed(registry, {
  embedder: 'myEmbedder',
  content: 'Hello, world!',
});

console.log(embeddings[0].embedding); // [0.123, 0.456, ...]

Parameters

registry
Registry
required
The Genkit registry instance
params
EmbedderParams<CustomOptions>
required
Embedding request parameters

Returns

embeddings
Embedding[]
Array of embedding objects
{
  embedding: number[];  // Vector representation
  metadata?: Record<string, unknown>;
}

embedMany()

Generates embeddings for multiple documents in a batch.
import { embedMany } from '@genkit-ai/ai';

const embeddings = await embedMany(registry, {
  embedder: 'myEmbedder',
  content: ['First document', 'Second document', 'Third document'],
});

console.log(embeddings.length); // 3

Parameters

registry
Registry
required
The Genkit registry instance
params
object
required
embedder
EmbedderArgument<ConfigSchema>
required
Embedder to use
content
string[] | DocumentData[]
required
Array of texts or documents to embed
metadata
Record<string, unknown>
Metadata to attach to all documents
options
z.infer<ConfigSchema>
Embedder-specific options

Returns

embeddings
EmbeddingBatch
Batch of embeddings
type EmbeddingBatch = { embedding: number[] }[];

embedderRef()

Creates a reference to an embedder with configuration.
import { embedderRef } from '@genkit-ai/ai';
import { z } from 'zod';

const myEmbedderRef = embedderRef({
  name: 'myEmbedder',
  config: { dimensions: 512 },
  info: {
    label: 'My Embedder',
    dimensions: 512,
  },
});

// Use the reference
const embeddings = await embed(registry, {
  embedder: myEmbedderRef,
  content: 'Hello',
});

Parameters

options
EmbedderReference<CustomOptionsSchema>
required
name
string
required
Embedder name
configSchema
CustomOptionsSchema
Configuration schema
info
EmbedderInfo
Embedder metadata
config
z.infer<CustomOptionsSchema>
Configuration values
version
string
Embedder version
namespace
string
Optional namespace prefix

Returns

reference
EmbedderReference<CustomOptionsSchema>
An embedder reference that can be passed to embed()

Types

EmbedRequest

interface EmbedRequest<O = any> {
  input: Document[];
  options?: O;
}

EmbedResponse

interface EmbedResponse {
  embeddings: Embedding[];
}

Embedding

interface Embedding {
  embedding: number[];
  metadata?: Record<string, unknown>;
}

EmbedderAction

type EmbedderAction<CustomOptions extends z.ZodTypeAny = z.ZodTypeAny> = 
  Action<typeof EmbedRequestSchema, typeof EmbedResponseSchema> & {
    __configSchema?: CustomOptions;
  };

Example: Custom Embedder

import { ai } from './genkit';
import { Document } from '@genkit-ai/ai';
import { z } from 'zod';

const customEmbedder = ai.defineEmbedder(
  {
    name: 'custom/embedder',
    configSchema: z.object({
      model: z.string().default('base'),
      batchSize: z.number().default(32),
    }),
    info: {
      label: 'Custom Embedder',
      dimensions: 768,
      supports: {
        input: ['text'],
        multilingual: false,
      },
    },
  },
  async (documents, options) => {
    const embeddings = [];
    
    // Process in batches
    for (let i = 0; i < documents.length; i += options.batchSize) {
      const batch = documents.slice(i, i + options.batchSize);
      const batchEmbeddings = await generateEmbeddingsBatch(
        batch.map(d => d.text()),
        options.model
      );
      embeddings.push(...batchEmbeddings);
    }
    
    return {
      embeddings: embeddings.map((embedding, i) => ({
        embedding,
        metadata: documents[i].metadata,
      })),
    };
  }
);

// Use the embedder
const result = await ai.embed({
  embedder: customEmbedder,
  content: 'Sample text to embed',
});

Build docs developers (and LLMs) love