Deep Agents
AgentContextOrchestratorRetrievalText2SQLToolbox

Embedders

Configure embedding models for vector representations

Embedders convert text into vector representations (embeddings) that enable semantic similarity search. The retrieval package includes a local fastembed() embedder with stable model identifiers and multiple model options.

FastEmbed

fastembed() is the package's local embedding adapter. It preserves the historical FastEmbed-style API while running model inference through Transformers.js, downloading models on first use, and caching them for subsequent runs.

Import

import { fastembed } from '@deepagents/retrieval';

Basic Usage

import { fastembed, nodeSQLite, similaritySearch } from '@deepagents/retrieval';
import { local } from '@deepagents/retrieval/connectors';

// Default model: BGE-small-en-v1.5 (384 dimensions)
const embedder = fastembed();
const store = nodeSQLite('./docs.db', 384);

const results = await similaritySearch('authentication', {
  connector: local('**/*.md'),
  store,
  embedder,
});

Options

import type { EmbeddingModel } from '@deepagents/retrieval';

fastembed({
  model?: EmbeddingModel;  // Embedding model (default: BGESmallENV15)
  batchSize?: number;      // Batch size for embedding (default: varies by model)
  cacheDir?: string;       // Custom cache directory for models
})

Available Models

ModelIDDimensionsNotes
BGE-small-en-v1.5EmbeddingModels.BGESmallENV15384Default, good balance
BGE-base-en-v1.5EmbeddingModels.BGEBaseENV15768Higher quality, slower
BGE-small-enEmbeddingModels.BGESmallEN384Earlier version
BGE-base-enEmbeddingModels.BGEBaseEN768Earlier version
BGE-small-zhEmbeddingModels.BGESmallZH384Chinese language
All-MiniLM-L6-v2EmbeddingModels.AllMiniLML6V2384Fast, lightweight
MLE5-LargeEmbeddingModels.MLE5Large1024Highest quality

Model Selection

import { EmbeddingModels, fastembed } from '@deepagents/retrieval';

// High quality (slower, more memory)
const highQuality = fastembed({
  model: EmbeddingModels.BGEBaseENV15,
});

// Fast and lightweight
const fast = fastembed({
  model: EmbeddingModels.AllMiniLML6V2,
});

// Chinese content
const chinese = fastembed({
  model: EmbeddingModels.BGESmallZH,
});

Dimension Matching

The store dimension must match your embedding model's output dimension:

import { EmbeddingModels, fastembed, nodeSQLite } from '@deepagents/retrieval';

// 384-dimension models
const embedder384 = fastembed(); // BGE-small-en-v1.5
const store384 = nodeSQLite('./384.db', 384);

// 768-dimension models
const embedder768 = fastembed({ model: EmbeddingModels.BGEBaseENV15 });
const store768 = nodeSQLite('./768.db', 768);

// 1024-dimension models
const embedder1024 = fastembed({ model: EmbeddingModels.MLE5Large });
const store1024 = nodeSQLite('./1024.db', 1024);

Mismatched dimensions will cause runtime errors.

Batch Processing

fastembed() processes embeddings in batches to optimize memory usage:

// Custom batch size for memory-constrained environments
const embedder = fastembed({
  batchSize: 16, // Smaller batches use less memory
});

// Larger batches for faster processing
const fastEmbedder = fastembed({
  batchSize: 64,
});

Model Caching

Models are downloaded on first use and cached locally:

// Custom cache directory
const embedder = fastembed({
  cacheDir: '/path/to/cache',
});

Default cache location varies by OS:

  • macOS: ~/Library/Caches/fastembed
  • Linux: ~/.cache/fastembed
  • Windows: %LOCALAPPDATA%\fastembed

Embedder Interface

All embedders implement this interface:

type Embedder = (documents: string[]) => Promise<{
  embeddings: (number[] | Float32Array)[];
  dimensions: number;
}>;

You can create custom embedders that follow this interface:

const customEmbedder: Embedder = async (documents) => {
  // Call your embedding API
  const response = await fetch('https://api.example.com/embed', {
    method: 'POST',
    body: JSON.stringify({ texts: documents }),
  });

  const data = await response.json();

  return {
    embeddings: data.embeddings,
    dimensions: data.dimensions,
  };
};

Real-World Examples

Quality vs Speed Trade-off

import {
  EmbeddingModels,
  fastembed,
  nodeSQLite,
  similaritySearch,
} from '@deepagents/retrieval';
import { local } from '@deepagents/retrieval/connectors';

// For development: fast iteration
const devEmbedder = fastembed({
  model: EmbeddingModels.AllMiniLML6V2,
  batchSize: 32,
});
const devStore = nodeSQLite('./dev.db', 384);

// For production: highest quality
const prodEmbedder = fastembed({
  model: EmbeddingModels.BGEBaseENV15,
  batchSize: 16,
});
const prodStore = nodeSQLite('./prod.db', 768);

// Use environment to switch
const embedder =
  process.env.NODE_ENV === 'production' ? prodEmbedder : devEmbedder;

const store = process.env.NODE_ENV === 'production' ? prodStore : devStore;

Reusable Embedder Instance

import {
  fastembed,
  ingest,
  nodeSQLite,
  similaritySearch,
} from '@deepagents/retrieval';
import { github, local } from '@deepagents/retrieval/connectors';

// Create embedder once, reuse across operations
const embedder = fastembed();
const store = nodeSQLite('./knowledge.db', 384);

// Index local docs
await ingest({
  connector: local('docs/**/*.md'),
  store,
  embedder,
});

// Index GitHub docs
await ingest({
  connector: github.file('vercel/next.js/README.md'),
  store,
  embedder,
});

// Search with same embedder
const results = await similaritySearch('routing', {
  connector: local('docs/**/*.md'),
  store,
  embedder,
});

Memory-Efficient Processing

import { fastembed, ingest, nodeSQLite } from '@deepagents/retrieval';
import { local } from '@deepagents/retrieval/connectors';

// For large codebases, use smaller batches
const embedder = fastembed({
  batchSize: 8, // Reduce memory usage
});

// The ingestion pipeline also batches internally (40 chunks at a time)
await ingest({
  connector: local('**/*.ts'),
  store: nodeSQLite('./code.db', 384),
  embedder,
});

Next Steps

On this page