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.