@kaizen403/realtime-semantic-search
v0.1.1
Published
Library-first realtime RAG engine with pgvector and streaming generation.
Maintainers
Readme
Realtime RAG (TypeScript)
Library-first, realtime RAG engine built for production. This is infrastructure, not a chatbot.
You get:
- Realtime ingestion and updates
- pgvector-powered retrieval
- Streaming generation
- Pluggable embeddings and LLMs
- Prisma-friendly store
- Postgres-native LISTEN/NOTIFY
- Node or Bun runtime
Install
npm install realtime-rag @prisma/clientProject layout
realtime-rag/
├─ src/
│ ├─ index.ts
│ ├─ rag/
│ │ ├─ createRAG.ts
│ │ ├─ RAG.ts
│ │ └─ types.ts
│ ├─ ingestion/
│ │ ├─ chunk.ts
│ │ ├─ embed.ts
│ │ └─ ingest.ts
│ ├─ retrieval/
│ │ └─ retrieve.ts
│ ├─ generation/
│ │ └─ stream.ts
│ ├─ stores/
│ │ ├─ pgvector.ts
│ │ └─ memory.ts
│ ├─ realtime/
│ │ └─ postgres.ts
│ ├─ adapters/
│ │ ├─ langchain.ts
│ │ └─ vercel-ai.ts
│ └─ utils/
│ └─ hash.ts
├─ prisma/
│ └─ schema.prisma
├─ tsup.config.ts
├─ package.json
└─ README.mdCore interfaces
export interface Embedder {
embed(texts: string[]): Promise<number[][]>
}
export interface LLM {
stream(prompt: string): AsyncIterable<string>
}
export interface VectorStore {
upsert(vectors: StoredVector[]): Promise<void>
query(vector: number[], k: number): Promise<StoredVector[]>
delete(ids: string[]): Promise<void>
}Quickstart
import { createRAG, memoryStore } from "realtime-rag"
const rag = createRAG({
embedder,
llm,
store: memoryStore()
})
await rag.add({ id: "doc-1", text: "Hello world" })
for await (const token of rag.ask("What is hello?")) {
process.stdout.write(token)
}Prisma + pgvector schema
model Embedding {
id String @id
content String
embedding Unsupported("vector(1536)")
metadata Json?
updatedAt DateTime @updatedAt
}Enable pgvector:
CREATE EXTENSION IF NOT EXISTS vector;
CREATE INDEX embedding_idx ON "Embedding"
USING ivfflat (embedding vector_cosine_ops);pgvector store
import { PrismaClient } from "@prisma/client"
import { createRAG, pgVectorStore } from "realtime-rag"
const prisma = new PrismaClient()
const rag = createRAG({
embedder,
llm,
store: pgVectorStore(prisma)
})Realtime sync (Postgres)
import { Client } from "pg"
import { postgresRealtime } from "realtime-rag"
const client = new Client({ connectionString: process.env.DATABASE_URL })
await client.connect()
const realtime = postgresRealtime(client, { channel: "rag_updates" })Build
npm run buildLicense
MIT
