Supabase Vector Store (#2427)

This commit is contained in:
Saket Aryan
2025-03-25 00:15:50 +05:30
committed by GitHub
parent 9db5f62262
commit 2b49c9eedd
14 changed files with 8422 additions and 8 deletions
@@ -0,0 +1,99 @@
import { Memory } from "../../src";
export async function runTests(memory: Memory) {
try {
// Reset all memories
console.log("\nResetting all memories...");
await memory.reset();
console.log("All memories reset");
// Add a single memory
console.log("\nAdding a single memory...");
const result1 = await memory.add(
"Hi, my name is John and I am a software engineer.",
{
userId: "john",
},
);
console.log("Added memory:", result1);
// Add multiple messages
console.log("\nAdding multiple messages...");
const result2 = await memory.add(
[
{ role: "user", content: "What is your favorite city?" },
{ role: "assistant", content: "I love Paris, it is my favorite city." },
],
{
userId: "john",
},
);
console.log("Added messages:", result2);
// Trying to update the memory
const result3 = await memory.add(
[
{ role: "user", content: "What is your favorite city?" },
{
role: "assistant",
content: "I love New York, it is my favorite city.",
},
],
{
userId: "john",
},
);
console.log("Updated messages:", result3);
// Get a single memory
console.log("\nGetting a single memory...");
if (result1.results && result1.results.length > 0) {
const singleMemory = await memory.get(result1.results[0].id);
console.log("Single memory:", singleMemory);
} else {
console.log("No memory was added in the first step");
}
// Updating this memory
const result4 = await memory.update(
result1.results[0].id,
"I love India, it is my favorite country.",
);
console.log("Updated memory:", result4);
// Get all memories
console.log("\nGetting all memories...");
const allMemories = await memory.getAll({
userId: "john",
});
console.log("All memories:", allMemories);
// Search for memories
console.log("\nSearching memories...");
const searchResult = await memory.search("What do you know about Paris?", {
userId: "john",
});
console.log("Search results:", searchResult);
// Get memory history
if (result1.results && result1.results.length > 0) {
console.log("\nGetting memory history...");
const history = await memory.history(result1.results[0].id);
console.log("Memory history:", history);
}
// Delete a memory
if (result1.results && result1.results.length > 0) {
console.log("\nDeleting a memory...");
await memory.delete(result1.results[0].id);
console.log("Memory deleted successfully");
}
// Reset all memories
console.log("\nResetting all memories...");
await memory.reset();
console.log("All memories reset");
} catch (error) {
console.error("Error:", error);
}
}
@@ -0,0 +1,53 @@
import dotenv from "dotenv";
import { demoMemoryStore } from "./memory";
import { demoSupabase } from "./supabase";
// import { demoQdrant } from "./qdrant";
// import { demoRedis } from "./redis";
// import { demoPGVector } from "./pgvector";
// Load environment variables
dotenv.config();
async function main() {
const args = process.argv.slice(2);
const selectedStore = args[0]?.toLowerCase();
const stores: Record<string, () => Promise<void>> = {
// memory: demoMemoryStore,
supabase: demoSupabase,
// Uncomment these as they are implemented
// qdrant: demoQdrant,
// redis: demoRedis,
// pgvector: demoPGVector,
};
if (selectedStore) {
const demo = stores[selectedStore];
if (demo) {
try {
await demo();
} catch (error) {
console.error(`\nError running ${selectedStore} demo:`, error);
if (selectedStore !== "memory") {
console.log("\nFalling back to memory store...");
await stores.memory();
}
}
} else {
console.log(`\nUnknown vector store: ${selectedStore}`);
console.log("Available stores:", Object.keys(stores).join(", "));
}
return;
}
// If no store specified, run all available demos
for (const [name, demo] of Object.entries(stores)) {
try {
await demo();
} catch (error) {
console.error(`\nError running ${name} demo:`, error);
}
}
}
main().catch(console.error);
@@ -0,0 +1,38 @@
import { Memory } from "../../src";
import { runTests } from "../utils/test-utils";
export async function demoMemoryStore() {
console.log("\n=== Testing In-Memory Vector Store ===\n");
const memory = new Memory({
version: "v1.1",
embedder: {
provider: "openai",
config: {
apiKey: process.env.OPENAI_API_KEY || "",
model: "text-embedding-3-small",
},
},
vectorStore: {
provider: "memory",
config: {
collectionName: "memories",
dimension: 1536,
},
},
llm: {
provider: "openai",
config: {
apiKey: process.env.OPENAI_API_KEY || "",
model: "gpt-4-turbo-preview",
},
},
historyDbPath: "memory.db",
});
await runTests(memory);
}
if (require.main === module) {
demoMemoryStore();
}
@@ -0,0 +1,49 @@
import { Memory } from "../../src";
import { runTests } from "../utils/test-utils";
export async function demoPGVector() {
console.log("\n=== Testing PGVector Store ===\n");
const memory = new Memory({
version: "v1.1",
embedder: {
provider: "openai",
config: {
apiKey: process.env.OPENAI_API_KEY || "",
model: "text-embedding-3-small",
},
},
vectorStore: {
provider: "pgvector",
config: {
collectionName: "memories",
dimension: 1536,
dbname: process.env.PGVECTOR_DB || "vectordb",
user: process.env.PGVECTOR_USER || "postgres",
password: process.env.PGVECTOR_PASSWORD || "postgres",
host: process.env.PGVECTOR_HOST || "localhost",
port: parseInt(process.env.PGVECTOR_PORT || "5432"),
embeddingModelDims: 1536,
hnsw: true,
},
},
llm: {
provider: "openai",
config: {
apiKey: process.env.OPENAI_API_KEY || "",
model: "gpt-4-turbo-preview",
},
},
historyDbPath: "memory.db",
});
await runTests(memory);
}
if (require.main === module) {
if (!process.env.PGVECTOR_DB) {
console.log("\nSkipping PGVector test - environment variables not set");
process.exit(0);
}
demoPGVector();
}
@@ -0,0 +1,50 @@
import { Memory } from "../../src";
import { runTests } from "../utils/test-utils";
export async function demoQdrant() {
console.log("\n=== Testing Qdrant Store ===\n");
const memory = new Memory({
version: "v1.1",
embedder: {
provider: "openai",
config: {
apiKey: process.env.OPENAI_API_KEY || "",
model: "text-embedding-3-small",
},
},
vectorStore: {
provider: "qdrant",
config: {
collectionName: "memories",
embeddingModelDims: 1536,
url: process.env.QDRANT_URL,
apiKey: process.env.QDRANT_API_KEY,
path: process.env.QDRANT_PATH,
host: process.env.QDRANT_HOST,
port: process.env.QDRANT_PORT
? parseInt(process.env.QDRANT_PORT)
: undefined,
onDisk: true,
},
},
llm: {
provider: "openai",
config: {
apiKey: process.env.OPENAI_API_KEY || "",
model: "gpt-4-turbo-preview",
},
},
historyDbPath: "memory.db",
});
await runTests(memory);
}
if (require.main === module) {
if (!process.env.QDRANT_URL && !process.env.QDRANT_HOST) {
console.log("\nSkipping Qdrant test - environment variables not set");
process.exit(0);
}
demoQdrant();
}
@@ -0,0 +1,45 @@
import { Memory } from "../../src";
import { runTests } from "../utils/test-utils";
export async function demoRedis() {
console.log("\n=== Testing Redis Store ===\n");
const memory = new Memory({
version: "v1.1",
embedder: {
provider: "openai",
config: {
apiKey: process.env.OPENAI_API_KEY || "",
model: "text-embedding-3-small",
},
},
vectorStore: {
provider: "redis",
config: {
collectionName: "memories",
embeddingModelDims: 1536,
redisUrl: process.env.REDIS_URL || "redis://localhost:6379",
username: process.env.REDIS_USERNAME,
password: process.env.REDIS_PASSWORD,
},
},
llm: {
provider: "openai",
config: {
apiKey: process.env.OPENAI_API_KEY || "",
model: "gpt-4-turbo-preview",
},
},
historyDbPath: "memory.db",
});
await runTests(memory);
}
if (require.main === module) {
if (!process.env.REDIS_URL) {
console.log("\nSkipping Redis test - environment variables not set");
process.exit(0);
}
demoRedis();
}
@@ -0,0 +1,49 @@
import { Memory } from "../../src";
import { runTests } from "../utils/test-utils";
import dotenv from "dotenv";
// Load environment variables
dotenv.config();
export async function demoSupabase() {
console.log("\n=== Testing Supabase Vector Store ===\n");
const memory = new Memory({
version: "v1.1",
embedder: {
provider: "openai",
config: {
apiKey: process.env.OPENAI_API_KEY || "",
model: "text-embedding-3-small",
},
},
vectorStore: {
provider: "supabase",
config: {
collectionName: "memories",
embeddingModelDims: 1536,
supabaseUrl: process.env.SUPABASE_URL || "",
supabaseKey: process.env.SUPABASE_KEY || "",
tableName: "memories",
},
},
llm: {
provider: "openai",
config: {
apiKey: process.env.OPENAI_API_KEY || "",
model: "gpt-4-turbo-preview",
},
},
historyDbPath: "memory.db",
});
await runTests(memory);
}
if (require.main === module) {
if (!process.env.SUPABASE_URL || !process.env.SUPABASE_KEY) {
console.log("\nSkipping Supabase test - environment variables not set");
process.exit(0);
}
demoSupabase();
}