Skip to content
Snippets Groups Projects
Unverified Commit 0213fe07 authored by Marcus Schiesser's avatar Marcus Schiesser Committed by GitHub
Browse files

fix: add dependencies for pg vector store (#312)

parent b31fa803
No related branches found
No related tags found
No related merge requests found
Showing
with 178 additions and 26 deletions
---
"create-llama": patch
---
Update dependencies for vector stores and add e2e test to ensure that they work as expected.
# coderabbit.yml
reviews:
path_instructions:
- path: "templates/**"
instructions: |
For files under the `templates` folder, do not report 'Missing Dependencies Detected' errors.
import { expect, test } from "@playwright/test";
import { exec } from "child_process";
import fs from "fs";
import path from "path";
import util from "util";
import { TemplateFramework, TemplateVectorDB } from "../helpers/types";
import { createTestDir, runCreateLlama } from "./utils";
const execAsync = util.promisify(exec);
const templateFramework: TemplateFramework = process.env.FRAMEWORK
? (process.env.FRAMEWORK as TemplateFramework)
: "nextjs";
const dataSource: string = process.env.DATASOURCE
? process.env.DATASOURCE
: "--example-file";
if (
templateFramework == "nextjs" ||
templateFramework == "express" // test is only relevant for TS projects
) {
// vectorDBs combinations to test
const vectorDbs: TemplateVectorDB[] = [
"mongo",
"pg",
"qdrant",
"pinecone",
"milvus",
"astra",
"chroma",
"llamacloud",
"weaviate",
];
test.describe("Test resolve TS dependencies", () => {
for (const vectorDb of vectorDbs) {
const optionDescription = `vectorDb: ${vectorDb}, dataSource: ${dataSource}`;
test(`options: ${optionDescription}`, async () => {
const cwd = await createTestDir();
const result = await runCreateLlama(
cwd,
"streaming",
templateFramework,
dataSource,
vectorDb,
3000, // port
8000, // externalPort
"none", // postInstallAction
undefined, // ui
templateFramework === "nextjs" ? "" : "--no-frontend", // appType
undefined, // llamaCloudProjectName
undefined, // llamaCloudIndexName
);
const name = result.projectName;
// Check if the app folder exists
const appDir = path.join(cwd, name);
const dirExists = fs.existsSync(appDir);
expect(dirExists).toBeTruthy();
// Install dependencies using pnpm
try {
const { stderr: installStderr } = await execAsync(
"pnpm install --prefer-offline",
{
cwd: appDir,
},
);
expect(installStderr).toBeFalsy();
} catch (error) {
console.error("Error installing dependencies:", error);
throw error;
}
// Run tsc type check and capture the output
try {
const { stdout, stderr } = await execAsync(
"pnpm exec tsc -b --diagnostics",
{
cwd: appDir,
},
);
// Check if there's any error output
expect(stderr).toBeFalsy();
// Log the stdout for debugging purposes
console.log("TypeScript type-check output:", stdout);
} catch (error) {
console.error("Error running tsc:", error);
throw error;
}
});
}
});
}
...@@ -105,11 +105,11 @@ export async function runCreateLlama( ...@@ -105,11 +105,11 @@ export async function runCreateLlama(
}, },
}); });
appProcess.stderr?.on("data", (data) => { appProcess.stderr?.on("data", (data) => {
console.log(data.toString()); console.error(data.toString());
}); });
appProcess.on("exit", (code) => { appProcess.on("exit", (code) => {
if (code !== 0 && code !== null) { if (code !== 0 && code !== null) {
throw new Error(`create-llama command was failed!`); throw new Error(`create-llama command failed with exit code ${code}`);
} }
}); });
...@@ -121,6 +121,8 @@ export async function runCreateLlama( ...@@ -121,6 +121,8 @@ export async function runCreateLlama(
port, port,
externalPort, externalPort,
); );
} else if (postInstallAction === "dependencies") {
await waitForProcess(appProcess, 1000 * 60); // wait 1 min for dependencies to be resolved
} else { } else {
// wait 10 seconds for create-llama to exit // wait 10 seconds for create-llama to exit
await waitForProcess(appProcess, 1000 * 10); await waitForProcess(appProcess, 1000 * 10);
......
...@@ -180,6 +180,7 @@ export const installTSTemplate = async ({ ...@@ -180,6 +180,7 @@ export const installTSTemplate = async ({
framework, framework,
ui, ui,
observability, observability,
vectorDb,
}); });
if (postInstallAction === "runApp" || postInstallAction === "dependencies") { if (postInstallAction === "runApp" || postInstallAction === "dependencies") {
...@@ -200,9 +201,16 @@ async function updatePackageJson({ ...@@ -200,9 +201,16 @@ async function updatePackageJson({
framework, framework,
ui, ui,
observability, observability,
vectorDb,
}: Pick< }: Pick<
InstallTemplateArgs, InstallTemplateArgs,
"root" | "appName" | "dataSources" | "framework" | "ui" | "observability" | "root"
| "appName"
| "dataSources"
| "framework"
| "ui"
| "observability"
| "vectorDb"
> & { > & {
relativeEngineDestPath: string; relativeEngineDestPath: string;
}): Promise<any> { }): Promise<any> {
...@@ -249,6 +257,33 @@ async function updatePackageJson({ ...@@ -249,6 +257,33 @@ async function updatePackageJson({
}; };
} }
if (vectorDb === "pg") {
packageJson.dependencies = {
...packageJson.dependencies,
pg: "^8.12.0",
};
}
if (vectorDb === "qdrant") {
packageJson.dependencies = {
...packageJson.dependencies,
"@qdrant/js-client-rest": "^1.11.0",
};
}
if (vectorDb === "mongo") {
packageJson.dependencies = {
...packageJson.dependencies,
mongodb: "^6.7.0",
};
}
if (vectorDb === "milvus") {
packageJson.dependencies = {
...packageJson.dependencies,
"@zilliz/milvus2-sdk-node": "^2.4.6",
};
}
if (observability === "traceloop") { if (observability === "traceloop") {
packageJson.dependencies = { packageJson.dependencies = {
...packageJson.dependencies, ...packageJson.dependencies,
......
import { BaseToolWithCall, OpenAIAgent, QueryEngineTool } from "llamaindex"; import {
BaseToolWithCall,
ChatEngine,
OpenAIAgent,
QueryEngineTool,
} from "llamaindex";
import fs from "node:fs/promises"; import fs from "node:fs/promises";
import path from "node:path"; import path from "node:path";
import { getDataSource } from "./index"; import { getDataSource } from "./index";
...@@ -37,8 +42,10 @@ export async function createChatEngine(documentIds?: string[], params?: any) { ...@@ -37,8 +42,10 @@ export async function createChatEngine(documentIds?: string[], params?: any) {
tools.push(...(await createTools(toolConfig))); tools.push(...(await createTools(toolConfig)));
} }
return new OpenAIAgent({ const agent = new OpenAIAgent({
tools, tools,
systemPrompt: process.env.SYSTEM_PROMPT, systemPrompt: process.env.SYSTEM_PROMPT,
}); }) as unknown as ChatEngine;
return agent;
} }
/* eslint-disable turbo/no-undeclared-env-vars */ /* eslint-disable turbo/no-undeclared-env-vars */
import * as dotenv from "dotenv"; import * as dotenv from "dotenv";
import { VectorStoreIndex, storageContextFromDefaults } from "llamaindex"; import { VectorStoreIndex, storageContextFromDefaults } from "llamaindex";
import { AstraDBVectorStore } from "llamaindex/storage/vectorStore/AstraDBVectorStore"; import { AstraDBVectorStore } from "llamaindex/vector-store/AstraDBVectorStore";
import { getDocuments } from "./loader"; import { getDocuments } from "./loader";
import { initSettings } from "./settings"; import { initSettings } from "./settings";
import { checkRequiredEnvVars } from "./shared"; import { checkRequiredEnvVars } from "./shared";
...@@ -15,13 +15,12 @@ async function loadAndIndex() { ...@@ -15,13 +15,12 @@ async function loadAndIndex() {
// create vector store and a collection // create vector store and a collection
const collectionName = process.env.ASTRA_DB_COLLECTION!; const collectionName = process.env.ASTRA_DB_COLLECTION!;
const vectorStore = new AstraDBVectorStore(); const vectorStore = new AstraDBVectorStore();
await vectorStore.create(collectionName, { await vectorStore.createAndConnect(collectionName, {
vector: { vector: {
dimension: parseInt(process.env.EMBEDDING_DIM!), dimension: parseInt(process.env.EMBEDDING_DIM!),
metric: "cosine", metric: "cosine",
}, },
}); });
await vectorStore.connect(collectionName);
// create index from documents and store them in Astra // create index from documents and store them in Astra
console.log("Start creating embeddings..."); console.log("Start creating embeddings...");
......
/* eslint-disable turbo/no-undeclared-env-vars */ /* eslint-disable turbo/no-undeclared-env-vars */
import { VectorStoreIndex } from "llamaindex"; import { VectorStoreIndex } from "llamaindex";
import { AstraDBVectorStore } from "llamaindex/storage/vectorStore/AstraDBVectorStore"; import { AstraDBVectorStore } from "llamaindex/vector-store/AstraDBVectorStore";
import { checkRequiredEnvVars } from "./shared"; import { checkRequiredEnvVars } from "./shared";
export async function getDataSource(params?: any) { export async function getDataSource(params?: any) {
......
/* eslint-disable turbo/no-undeclared-env-vars */ /* eslint-disable turbo/no-undeclared-env-vars */
import * as dotenv from "dotenv"; import * as dotenv from "dotenv";
import { VectorStoreIndex, storageContextFromDefaults } from "llamaindex"; import { VectorStoreIndex, storageContextFromDefaults } from "llamaindex";
import { ChromaVectorStore } from "llamaindex/storage/vectorStore/ChromaVectorStore"; import { ChromaVectorStore } from "llamaindex/vector-store/ChromaVectorStore";
import { getDocuments } from "./loader"; import { getDocuments } from "./loader";
import { initSettings } from "./settings"; import { initSettings } from "./settings";
import { checkRequiredEnvVars } from "./shared"; import { checkRequiredEnvVars } from "./shared";
...@@ -16,7 +16,7 @@ async function loadAndIndex() { ...@@ -16,7 +16,7 @@ async function loadAndIndex() {
const chromaUri = `http://${process.env.CHROMA_HOST}:${process.env.CHROMA_PORT}`; const chromaUri = `http://${process.env.CHROMA_HOST}:${process.env.CHROMA_PORT}`;
const vectorStore = new ChromaVectorStore({ const vectorStore = new ChromaVectorStore({
collectionName: process.env.CHROMA_COLLECTION, collectionName: process.env.CHROMA_COLLECTION!,
chromaClientParams: { path: chromaUri }, chromaClientParams: { path: chromaUri },
}); });
......
/* eslint-disable turbo/no-undeclared-env-vars */ /* eslint-disable turbo/no-undeclared-env-vars */
import { VectorStoreIndex } from "llamaindex"; import { VectorStoreIndex } from "llamaindex";
import { ChromaVectorStore } from "llamaindex/storage/vectorStore/ChromaVectorStore"; import { ChromaVectorStore } from "llamaindex/vector-store/ChromaVectorStore";
import { checkRequiredEnvVars } from "./shared"; import { checkRequiredEnvVars } from "./shared";
export async function getDataSource(params?: any) { export async function getDataSource(params?: any) {
...@@ -8,7 +8,7 @@ export async function getDataSource(params?: any) { ...@@ -8,7 +8,7 @@ export async function getDataSource(params?: any) {
const chromaUri = `http://${process.env.CHROMA_HOST}:${process.env.CHROMA_PORT}`; const chromaUri = `http://${process.env.CHROMA_HOST}:${process.env.CHROMA_PORT}`;
const store = new ChromaVectorStore({ const store = new ChromaVectorStore({
collectionName: process.env.CHROMA_COLLECTION, collectionName: process.env.CHROMA_COLLECTION!,
chromaClientParams: { path: chromaUri }, chromaClientParams: { path: chromaUri },
}); });
......
...@@ -4,7 +4,6 @@ export function generateFilters(documentIds: string[]): MetadataFilters { ...@@ -4,7 +4,6 @@ export function generateFilters(documentIds: string[]): MetadataFilters {
// public documents don't have the "private" field or it's set to "false" // public documents don't have the "private" field or it's set to "false"
const publicDocumentsFilter: MetadataFilter = { const publicDocumentsFilter: MetadataFilter = {
key: "private", key: "private",
value: null,
operator: "is_empty", operator: "is_empty",
}; };
......
/* eslint-disable turbo/no-undeclared-env-vars */ /* eslint-disable turbo/no-undeclared-env-vars */
import * as dotenv from "dotenv"; import * as dotenv from "dotenv";
import { VectorStoreIndex, storageContextFromDefaults } from "llamaindex"; import { VectorStoreIndex, storageContextFromDefaults } from "llamaindex";
import { MilvusVectorStore } from "llamaindex/storage/vectorStore/MilvusVectorStore"; import { MilvusVectorStore } from "llamaindex/vector-store/MilvusVectorStore";
import { getDocuments } from "./loader"; import { getDocuments } from "./loader";
import { initSettings } from "./settings"; import { initSettings } from "./settings";
import { checkRequiredEnvVars, getMilvusClient } from "./shared"; import { checkRequiredEnvVars, getMilvusClient } from "./shared";
......
import { VectorStoreIndex } from "llamaindex"; import { VectorStoreIndex } from "llamaindex";
import { MilvusVectorStore } from "llamaindex/storage/vectorStore/MilvusVectorStore"; import { MilvusVectorStore } from "llamaindex/vector-store/MilvusVectorStore";
import { checkRequiredEnvVars, getMilvusClient } from "./shared"; import { checkRequiredEnvVars, getMilvusClient } from "./shared";
export async function getDataSource(params?: any) { export async function getDataSource(params?: any) {
......
/* eslint-disable turbo/no-undeclared-env-vars */ /* eslint-disable turbo/no-undeclared-env-vars */
import * as dotenv from "dotenv"; import * as dotenv from "dotenv";
import { storageContextFromDefaults, VectorStoreIndex } from "llamaindex"; import { storageContextFromDefaults, VectorStoreIndex } from "llamaindex";
import { MongoDBAtlasVectorSearch } from "llamaindex/storage/vectorStore/MongoDBAtlasVectorStore"; import { MongoDBAtlasVectorSearch } from "llamaindex/vector-store/MongoDBAtlasVectorStore";
import { MongoClient } from "mongodb"; import { MongoClient } from "mongodb";
import { getDocuments } from "./loader"; import { getDocuments } from "./loader";
import { initSettings } from "./settings"; import { initSettings } from "./settings";
......
/* eslint-disable turbo/no-undeclared-env-vars */ /* eslint-disable turbo/no-undeclared-env-vars */
import { VectorStoreIndex } from "llamaindex"; import { VectorStoreIndex } from "llamaindex";
import { MongoDBAtlasVectorSearch } from "llamaindex/storage/vectorStore/MongoDBAtlasVectorStore"; import { MongoDBAtlasVectorSearch } from "llamaindex/vector-store/MongoDBAtlasVectorStore";
import { MongoClient } from "mongodb"; import { MongoClient } from "mongodb";
import { checkRequiredEnvVars, POPULATED_METADATA_FIELDS } from "./shared"; import { checkRequiredEnvVars, POPULATED_METADATA_FIELDS } from "./shared";
......
/* eslint-disable turbo/no-undeclared-env-vars */ /* eslint-disable turbo/no-undeclared-env-vars */
import * as dotenv from "dotenv"; import * as dotenv from "dotenv";
import { VectorStoreIndex, storageContextFromDefaults } from "llamaindex"; import {
import { PGVectorStore } from "llamaindex/storage/vectorStore/PGVectorStore"; PGVectorStore,
VectorStoreIndex,
storageContextFromDefaults,
} from "llamaindex";
import { getDocuments } from "./loader"; import { getDocuments } from "./loader";
import { initSettings } from "./settings"; import { initSettings } from "./settings";
import { import {
......
/* eslint-disable turbo/no-undeclared-env-vars */ /* eslint-disable turbo/no-undeclared-env-vars */
import { VectorStoreIndex } from "llamaindex"; import { PGVectorStore, VectorStoreIndex } from "llamaindex";
import { PGVectorStore } from "llamaindex/storage/vectorStore/PGVectorStore";
import { import {
PGVECTOR_SCHEMA, PGVECTOR_SCHEMA,
PGVECTOR_TABLE, PGVECTOR_TABLE,
......
/* eslint-disable turbo/no-undeclared-env-vars */ /* eslint-disable turbo/no-undeclared-env-vars */
import * as dotenv from "dotenv"; import * as dotenv from "dotenv";
import { VectorStoreIndex, storageContextFromDefaults } from "llamaindex"; import { VectorStoreIndex, storageContextFromDefaults } from "llamaindex";
import { PineconeVectorStore } from "llamaindex/storage/vectorStore/PineconeVectorStore"; import { PineconeVectorStore } from "llamaindex/vector-store/PineconeVectorStore";
import { getDocuments } from "./loader"; import { getDocuments } from "./loader";
import { initSettings } from "./settings"; import { initSettings } from "./settings";
import { checkRequiredEnvVars } from "./shared"; import { checkRequiredEnvVars } from "./shared";
......
/* eslint-disable turbo/no-undeclared-env-vars */ /* eslint-disable turbo/no-undeclared-env-vars */
import { VectorStoreIndex } from "llamaindex"; import { VectorStoreIndex } from "llamaindex";
import { PineconeVectorStore } from "llamaindex/storage/vectorStore/PineconeVectorStore"; import { PineconeVectorStore } from "llamaindex/vector-store/PineconeVectorStore";
import { checkRequiredEnvVars } from "./shared"; import { checkRequiredEnvVars } from "./shared";
export async function getDataSource(params?: any) { export async function getDataSource(params?: any) {
......
/* eslint-disable turbo/no-undeclared-env-vars */ /* eslint-disable turbo/no-undeclared-env-vars */
import * as dotenv from "dotenv"; import * as dotenv from "dotenv";
import { VectorStoreIndex, storageContextFromDefaults } from "llamaindex"; import { VectorStoreIndex, storageContextFromDefaults } from "llamaindex";
import { QdrantVectorStore } from "llamaindex/storage/vectorStore/QdrantVectorStore"; import { QdrantVectorStore } from "llamaindex/vector-store/QdrantVectorStore";
import { getDocuments } from "./loader"; import { getDocuments } from "./loader";
import { initSettings } from "./settings"; import { initSettings } from "./settings";
import { checkRequiredEnvVars, getQdrantClient } from "./shared"; import { checkRequiredEnvVars, getQdrantClient } from "./shared";
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment