DatabaseChat
Guides

Vector Search

Helpers for embeddings and vector tools.

The @dayhaysoos/convex-database-chat/vector entry provides utilities for embedding and formatting vector search results.

Generate embeddings

import { generateEmbedding } from "@dayhaysoos/convex-database-chat/vector";

const embedding = await generateEmbedding({
  apiKey: process.env.OPENROUTER_API_KEY!,
  text: args.query,
});

Defaults:

  • Model: openai/text-embedding-3-small
  • Dimensions: 1536

Format vector results

import { formatVectorResults } from "@dayhaysoos/convex-database-chat/vector";

const formatted = formatVectorResults(results, docs, {
  includeScore: true,
  snippetLength: 200,
  fields: ["name", "viewUrl"],
});

Define a vector search tool

import { defineVectorSearchTool } from "@dayhaysoos/convex-database-chat/vector";
import { createFunctionHandle } from "convex/server";
import { api } from "./_generated/api";

async function getTools() {
  return [
    defineVectorSearchTool({
      name: "semanticSearch",
      description: "Find candidates by meaning or concept",
      handler: await createFunctionHandle(
        api.chatTools.semanticSearchCandidates,
      ),
    }),
  ];
}

defineVectorSearchTool sets handlerType to "action" and metadata.kind to "semantic_search" automatically. It does not set metadata.resultContract because formatVectorResults returns an array, not the standard { data, meta } result envelope.

If you want semantic search to participate in the standard result contract and automatic reliability guidance, use defineSemanticSearchTool from @dayhaysoos/convex-database-chat/tools instead. That builder also defaults to handlerType: "action", but expects your handler to return { data, meta } with meta.sampled: true and meta.exhaustive: false.