Prisma 8 extension
pgvector
Vector columns and similarity search for embeddings.
By PrismaPostgreSQL
What it does
Adds the pgvector Vector(n) column type, cosine and other distance operators, and vector indexes. Ships the migration that runs CREATE EXTENSION IF NOT EXISTS vector, so db init installs pgvector for you.
Register it in the config
prisma.config.ts
import { definePrismaConfig } from 'prisma/config';
import pgvector from '@prisma/orm-extension-pgvector/control';
import { defineConfig as ormConfig } from '@prisma/orm-postgres/config';
export default definePrismaConfig({
orm: ormConfig({
contract: './src/prisma/contract.prisma',
extensions: [pgvector],
db: {
connection: process.env['DATABASE_URL']!,
},
}),
});Register it on the client
src/prisma/db.ts
import pgvector from '@prisma/orm-extension-pgvector/runtime';
import postgres from '@prisma/orm-postgres/runtime';
import type { Contract } from './contract.d';
import contractJson from './contract.json' with { type: 'json' };
export const db = postgres<Contract>({
contractJson,
url: process.env['DATABASE_URL']!,
extensions: [pgvector],
});Declare a vector column
src/prisma/contract.prisma
types {
Embedding1536 = pgvector.Vector(1536)
}
model Post {
id String @id @default(uuid())
title String
embedding Embedding1536?
}Query by similarity
src/prisma/similarity-search.ts
const plan = db.sql.public.post
.select('id', 'title')
.select('distance', (f, fns) => fns.cosineDistance(f.embedding, queryVector))
.orderBy((f, fns) => fns.cosineDistance(f.embedding, queryVector), { direction: 'asc' })
.limit(10)
.build();
const similar = await db.runtime().query(plan);Then run npx prisma@latest db init, or db update on an existing database. The extension ships its own migration for anything the database needs installed. Full walkthrough in the extensions docs.
