Compare commits

...

3 Commits

Author SHA1 Message Date
github-actions[bot] 726eb41359 Release 0.6.5 (#1239)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-09-20 14:24:23 -07:00
André Mazayev e9714dbfcd feat: update PGVectorStore constructor parameters (#1225)
Co-authored-by: Alex Yang <himself65@outlook.com>
2024-09-20 01:34:51 -07:00
Alex Yang a3618e761e chore: fix cache for cloud package (#1236) 2024-09-19 17:48:39 -07:00
27 changed files with 211 additions and 105 deletions
+7
View File
@@ -1,5 +1,12 @@
# docs
## 0.0.74
### Patch Changes
- Updated dependencies [e9714db]
- llamaindex@0.6.5
## 0.0.73
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "docs",
"version": "0.0.73",
"version": "0.0.74",
"private": true,
"scripts": {
"docusaurus": "docusaurus",
+5 -1
View File
@@ -40,7 +40,11 @@ async function main(args: any) {
const rdr = new SimpleDirectoryReader(callback);
const docs = await rdr.loadData({ directoryPath: sourceDir });
const pgvs = new PGVectorStore();
const pgvs = new PGVectorStore({
clientConfig: {
connectionString: process.env.PG_CONNECTION_STRING,
},
});
pgvs.setCollection(sourceDir);
await pgvs.clearCollection();
+5 -1
View File
@@ -7,7 +7,11 @@ async function main() {
});
try {
const pgvs = new PGVectorStore();
const pgvs = new PGVectorStore({
clientConfig: {
connectionString: process.env.PG_CONNECTION_STRING,
},
});
// Optional - set your collection name, default is no filter on this field.
// pgvs.setCollection();
+7
View File
@@ -1,5 +1,12 @@
# @llamaindex/autotool
## 3.0.5
### Patch Changes
- Updated dependencies [e9714db]
- llamaindex@0.6.5
## 3.0.4
### Patch Changes
@@ -1,5 +1,13 @@
# @llamaindex/autotool-01-node-example
## 0.0.14
### Patch Changes
- Updated dependencies [e9714db]
- llamaindex@0.6.5
- @llamaindex/autotool@3.0.5
## 0.0.13
### Patch Changes
@@ -13,5 +13,5 @@
"scripts": {
"start": "node --import tsx --import @llamaindex/autotool/node ./src/index.ts"
},
"version": "0.0.13"
"version": "0.0.14"
}
@@ -1,5 +1,13 @@
# @llamaindex/autotool-02-next-example
## 0.1.58
### Patch Changes
- Updated dependencies [e9714db]
- llamaindex@0.6.5
- @llamaindex/autotool@3.0.5
## 0.1.57
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/autotool-02-next-example",
"private": true,
"version": "0.1.57",
"version": "0.1.58",
"scripts": {
"dev": "next dev",
"build": "next build",
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/autotool",
"type": "module",
"version": "3.0.4",
"version": "3.0.5",
"description": "auto transpile your JS function to LLM Agent compatible",
"files": [
"dist",
+8
View File
@@ -0,0 +1,8 @@
{
"extends": ["//"],
"tasks": {
"build": {
"outputs": ["dist/**", "src/client/**"]
}
}
}
+7
View File
@@ -1,5 +1,12 @@
# @llamaindex/experimental
## 0.0.83
### Patch Changes
- Updated dependencies [e9714db]
- llamaindex@0.6.5
## 0.0.82
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/experimental",
"description": "Experimental package for LlamaIndexTS",
"version": "0.0.82",
"version": "0.0.83",
"type": "module",
"types": "dist/type/index.d.ts",
"main": "dist/cjs/index.js",
+10
View File
@@ -1,5 +1,15 @@
# llamaindex
## 0.6.5
### Patch Changes
- e9714db: feat: update `PGVectorStore`
- move constructor parameter `config.user` | `config.database` | `config.password` | `config.connectionString` into `config.clientConfig`
- if you pass `pg.Client` or `pg.Pool` instance to `PGVectorStore`, move it to `config.client`, setting `config.shouldConnect` to false if it's already connected
- default value of `PGVectorStore.collection` is now `"data"` instead of `""` (empty string)
## 0.6.4
### Patch Changes
@@ -1,5 +1,12 @@
# @llamaindex/cloudflare-worker-agent-test
## 0.0.67
### Patch Changes
- Updated dependencies [e9714db]
- llamaindex@0.6.5
## 0.0.66
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/cloudflare-worker-agent-test",
"version": "0.0.66",
"version": "0.0.67",
"type": "module",
"private": true,
"scripts": {
@@ -1,5 +1,12 @@
# @llamaindex/next-agent-test
## 0.1.67
### Patch Changes
- Updated dependencies [e9714db]
- llamaindex@0.6.5
## 0.1.66
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/next-agent-test",
"version": "0.1.66",
"version": "0.1.67",
"private": true,
"scripts": {
"dev": "next dev",
@@ -1,5 +1,12 @@
# test-edge-runtime
## 0.1.66
### Patch Changes
- Updated dependencies [e9714db]
- llamaindex@0.6.5
## 0.1.65
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/nextjs-edge-runtime-test",
"version": "0.1.65",
"version": "0.1.66",
"private": true,
"scripts": {
"dev": "next dev",
@@ -1,5 +1,12 @@
# @llamaindex/next-node-runtime
## 0.0.48
### Patch Changes
- Updated dependencies [e9714db]
- llamaindex@0.6.5
## 0.0.47
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/next-node-runtime-test",
"version": "0.0.47",
"version": "0.0.48",
"private": true,
"scripts": {
"dev": "next dev",
@@ -1,5 +1,12 @@
# @llamaindex/waku-query-engine-test
## 0.0.67
### Patch Changes
- Updated dependencies [e9714db]
- llamaindex@0.6.5
## 0.0.66
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/waku-query-engine-test",
"version": "0.0.66",
"version": "0.0.67",
"type": "module",
"private": true,
"scripts": {
@@ -9,43 +9,54 @@ import { registerTypes } from "pgvector/pg";
config({ path: [".env.local", ".env", ".env.ci"] });
let pgClient: pg.Client | pg.Pool;
test.afterEach(async () => {
await pgClient.end();
});
const pgConfig = {
user: process.env.POSTGRES_USER ?? "user",
password: process.env.POSTGRES_PASSWORD ?? "password",
database: "llamaindex_node_test",
};
await test("init with client", async () => {
pgClient = new pg.Client(pgConfig);
await test("init with client", async (t) => {
const pgClient = new pg.Client(pgConfig);
await pgClient.connect();
await pgClient.query("CREATE EXTENSION IF NOT EXISTS vector");
await registerTypes(pgClient);
const vectorStore = new PGVectorStore(pgClient);
t.after(async () => {
await pgClient.end();
});
const vectorStore = new PGVectorStore({
client: pgClient,
shouldConnect: false,
});
assert.deepStrictEqual(await vectorStore.client(), pgClient);
});
await test("init with pool", async () => {
pgClient = new pg.Pool(pgConfig);
await test("init with pool", async (t) => {
const pgClient = new pg.Pool(pgConfig);
await pgClient.query("CREATE EXTENSION IF NOT EXISTS vector");
const client = await pgClient.connect();
await client.query("CREATE EXTENSION IF NOT EXISTS vector");
await registerTypes(client);
const vectorStore = new PGVectorStore(client);
t.after(async () => {
client.release();
await pgClient.end();
});
const vectorStore = new PGVectorStore({
shouldConnect: false,
client,
});
assert.deepStrictEqual(await vectorStore.client(), client);
client.release();
});
await test("init without client", async () => {
const vectorStore = new PGVectorStore(pgConfig);
pgClient = (await vectorStore.client()) as pg.Client;
await test("init without client", async (t) => {
const vectorStore = new PGVectorStore({ clientConfig: pgConfig });
const pgClient = (await vectorStore.client()) as pg.Client;
t.after(async () => {
await pgClient.end();
});
assert.notDeepStrictEqual(pgClient, undefined);
});
await test("simple node", async () => {
await test("simple node", async (t) => {
const dimensions = 3;
const schemaName =
"llamaindex_vector_store_test_" + Math.random().toString(36).substring(7);
@@ -56,10 +67,14 @@ await test("simple node", async () => {
embedding: [0.1, 0.2, 0.3],
});
const vectorStore = new PGVectorStore({
...pgConfig,
clientConfig: pgConfig,
dimensions,
schemaName,
});
const pgClient = (await vectorStore.client()) as pg.Client;
t.after(async () => {
await pgClient.end();
});
await vectorStore.add([node]);
@@ -89,6 +104,4 @@ await test("simple node", async () => {
});
assert.deepStrictEqual(result.nodes, []);
}
pgClient = (await vectorStore.client()) as pg.Client;
});
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "llamaindex",
"version": "0.6.4",
"version": "0.6.5",
"license": "MIT",
"type": "module",
"keywords": [
@@ -14,25 +14,44 @@ import {
import { escapeLikeString } from "./utils.js";
import type { BaseEmbedding } from "@llamaindex/core/embeddings";
import { DEFAULT_COLLECTION } from "@llamaindex/core/global";
import type { BaseNode, Metadata } from "@llamaindex/core/schema";
import { Document, MetadataMode } from "@llamaindex/core/schema";
export const PGVECTOR_SCHEMA = "public";
export const PGVECTOR_TABLE = "llamaindex_embedding";
export const DEFAULT_DIMENSIONS = 1536;
export type PGVectorStoreConfig = Pick<
pg.ClientConfig,
"user" | "database" | "password" | "connectionString"
> & {
type PGVectorStoreBaseConfig = {
schemaName?: string | undefined;
tableName?: string | undefined;
dimensions?: number | undefined;
embedModel?: BaseEmbedding | undefined;
};
export type PGVectorStoreConfig = PGVectorStoreBaseConfig &
(
| {
/**
* Client configuration options for the pg client.
*
* {@link https://node-postgres.com/apis/client#new-client PostgresSQL Client API}
*/
clientConfig: pg.ClientConfig;
}
| {
/**
* A pg client or pool client instance.
* If provided, make sure it is not connected to the database yet, or it will throw an error.
*/
shouldConnect?: boolean | undefined;
client: pg.Client | pg.PoolClient;
}
);
/**
* Provides support for writing and querying vector data in Postgres.
* Note: Can't be used with data created using the Python version of the vector store (https://docs.llamaindex.ai/en/stable/examples/vector_stores/postgres.html)
* Note: Can't be used with data created using the Python version of the vector store (https://docs.llamaindex.ai/en/stable/examples/vector_stores/postgres/)
*/
export class PGVectorStore
extends VectorStoreBase
@@ -40,52 +59,26 @@ export class PGVectorStore
{
storesText: boolean = true;
private collection: string = "";
private schemaName: string = PGVECTOR_SCHEMA;
private tableName: string = PGVECTOR_TABLE;
private collection: string = DEFAULT_COLLECTION;
private readonly schemaName: string = PGVECTOR_SCHEMA;
private readonly tableName: string = PGVECTOR_TABLE;
private readonly dimensions: number = DEFAULT_DIMENSIONS;
private user: pg.ClientConfig["user"] | undefined = undefined;
private password: pg.ClientConfig["password"] | undefined = undefined;
private database: pg.ClientConfig["database"] | undefined = undefined;
private connectionString: pg.ClientConfig["connectionString"] | undefined =
undefined;
private isDBConnected: boolean = false;
private db: pg.ClientBase | null = null;
private readonly clientConfig: pg.ClientConfig | null = null;
private dimensions: number = 1536;
private db?: pg.ClientBase;
/**
* Constructs a new instance of the PGVectorStore
*
* If the `connectionString` is not provided the following env variables are
* used to connect to the DB:
* PGHOST=your database host
* PGUSER=your database user
* PGPASSWORD=your database password
* PGDATABASE=your database name
* PGPORT=your database port
*/
constructor(configOrClient?: PGVectorStoreConfig | pg.ClientBase) {
// We cannot import pg from top level, it might have side effects
// so we only check if the config.connect function exists
if (
configOrClient &&
"connect" in configOrClient &&
typeof configOrClient.connect === "function"
) {
const db = configOrClient as pg.ClientBase;
super();
this.db = db;
constructor(config: PGVectorStoreConfig) {
super(config?.embedModel);
this.schemaName = config?.schemaName ?? PGVECTOR_SCHEMA;
this.tableName = config?.tableName ?? PGVECTOR_TABLE;
this.dimensions = config?.dimensions ?? DEFAULT_DIMENSIONS;
if ("clientConfig" in config) {
this.clientConfig = config.clientConfig;
} else {
const config = configOrClient as PGVectorStoreConfig;
super(config?.embedModel);
this.schemaName = config?.schemaName ?? PGVECTOR_SCHEMA;
this.tableName = config?.tableName ?? PGVECTOR_TABLE;
this.user = config?.user;
this.password = config?.password;
this.database = config?.database;
this.connectionString = config?.connectionString;
this.dimensions = config?.dimensions ?? 1536;
this.isDBConnected =
config.shouldConnect !== undefined ? !config.shouldConnect : false;
this.db = config.client;
}
}
@@ -113,39 +106,41 @@ export class PGVectorStore
private async getDb(): Promise<pg.ClientBase> {
if (!this.db) {
try {
const pg = await import("pg");
const { Client } = pg.default ? pg.default : pg;
const pg = await import("pg");
const { Client } = pg.default ? pg.default : pg;
const { registerType } = await import("pgvector/pg");
// Create DB connection
// Read connection params from env - see comment block above
const db = new Client({
user: this.user,
password: this.password,
database: this.database,
connectionString: this.connectionString,
});
await db.connect();
const { registerTypes } = await import("pgvector/pg");
// Create DB connection
// Read connection params from env - see comment block above
const db = new Client({
...this.clientConfig,
});
// Check vector extension
await db.query("CREATE EXTENSION IF NOT EXISTS vector");
await registerType(db);
await db.connect();
this.isDBConnected = true;
// All good? Keep the connection reference
this.db = db;
} catch (err) {
console.error(err);
return Promise.reject(err instanceof Error ? err : new Error(`${err}`));
}
// Check vector extension
await db.query("CREATE EXTENSION IF NOT EXISTS vector");
await registerTypes(db);
// All good? Keep the connection reference
this.db = db;
}
const db = this.db;
if (this.db && !this.isDBConnected) {
await this.db.connect();
this.isDBConnected = true;
}
this.db.on("end", () => {
// Connection closed
this.isDBConnected = false;
});
// Check schema, table(s), index(es)
await this.checkSchema(db);
await this.checkSchema(this.db);
return Promise.resolve(this.db);
return this.db;
}
private async checkSchema(db: pg.ClientBase) {