@langchain/google-cloud-sql-pg 1.0.20 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/dist/chat_message_history.cjs +5 -2
- package/dist/chat_message_history.cjs.map +1 -1
- package/dist/chat_message_history.js +5 -2
- package/dist/chat_message_history.js.map +1 -1
- package/dist/vectorstore.cjs +13 -3
- package/dist/vectorstore.cjs.map +1 -1
- package/dist/vectorstore.d.cts +2 -2
- package/dist/vectorstore.d.cts.map +1 -1
- package/dist/vectorstore.d.ts +2 -2
- package/dist/vectorstore.d.ts.map +1 -1
- package/dist/vectorstore.js +13 -3
- package/dist/vectorstore.js.map +1 -1
- package/package.json +10 -10
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# @langchain/google-cloud-sql-pg
|
|
2
2
|
|
|
3
|
+
## 1.0.22
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#10033](https://github.com/langchain-ai/langchainjs/pull/10033) [`aa2f89d`](https://github.com/langchain-ai/langchainjs/commit/aa2f89d5aa04beb4ae9ebaaa71427e7013301354) Thanks [@corridor-security](https://github.com/apps/corridor-security)! - Fix SQL Injection via Table/Schema Name in PostgresChatMessageHistory.initialize()
|
|
8
|
+
|
|
9
|
+
- [#10032](https://github.com/langchain-ai/langchainjs/pull/10032) [`33c0b5d`](https://github.com/langchain-ai/langchainjs/commit/33c0b5d2d547e18f6708511f7a3101b0a0ec76fb) Thanks [@corridor-security](https://github.com/apps/corridor-security)! - Fix SQL Injection via Filter Parameter in PostgresVectorStore.queryCollection()
|
|
10
|
+
|
|
11
|
+
## 1.0.21
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- Updated dependencies [[`71c3cba`](https://github.com/langchain-ai/langchainjs/commit/71c3cba843ab16d877299d158a1de0c7d22f3fb9)]:
|
|
16
|
+
- @langchain/core@1.1.20
|
|
17
|
+
|
|
3
18
|
## 1.0.20
|
|
4
19
|
|
|
5
20
|
### Patch Changes
|
|
@@ -31,8 +31,11 @@ var PostgresChatMessageHistory = class PostgresChatMessageHistory extends __lang
|
|
|
31
31
|
* @returns PostgresChatMessageHistory instance.
|
|
32
32
|
*/
|
|
33
33
|
static async initialize(engine, sessionId, tableName, schemaName = "public") {
|
|
34
|
-
const query = `SELECT column_name, data_type FROM information_schema.columns WHERE table_name =
|
|
35
|
-
const { rows } = await engine.pool.raw(query
|
|
34
|
+
const query = `SELECT column_name, data_type FROM information_schema.columns WHERE table_name = :tableName AND table_schema = :schemaName`;
|
|
35
|
+
const { rows } = await engine.pool.raw(query, {
|
|
36
|
+
tableName,
|
|
37
|
+
schemaName
|
|
38
|
+
});
|
|
36
39
|
const columnNames = [];
|
|
37
40
|
for (const index in rows) if (Object.prototype.hasOwnProperty.call(rows, index)) columnNames.push(rows[index].column_name);
|
|
38
41
|
const requiredColumns = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat_message_history.cjs","names":["BaseChatMessageHistory","engine: PostgresEngine","sessionId: string","tableName: string","schemaName: string","columnNames: string[]","message: string","HumanMessage","AIMessage","values: { [key: string]: string }","items: StoredMessage[]","message: BaseMessage","messages: BaseMessage[]"],"sources":["../src/chat_message_history.ts"],"sourcesContent":["import { BaseChatMessageHistory } from \"@langchain/core/chat_history\";\nimport {\n AIMessage,\n BaseMessage,\n HumanMessage,\n StoredMessage,\n mapStoredMessagesToChatMessages,\n} from \"@langchain/core/messages\";\nimport PostgresEngine from \"./engine.js\";\n\nexport interface PostgresChatMessageHistoryInput {\n engine: PostgresEngine;\n sessionId: string;\n tableName: string;\n schemaName: string;\n}\n\nexport class PostgresChatMessageHistory extends BaseChatMessageHistory {\n lc_namespace: string[] = [\n \"langchain\",\n \"stores\",\n \"message\",\n \"google-cloud-sql-pg\",\n ];\n\n engine: PostgresEngine;\n\n sessionId: string;\n\n tableName: string;\n\n schemaName: string;\n\n constructor({\n engine,\n sessionId,\n tableName,\n schemaName = \"public\",\n }: PostgresChatMessageHistoryInput) {\n super();\n this.engine = engine;\n this.sessionId = sessionId;\n this.tableName = tableName;\n this.schemaName = schemaName;\n }\n\n /**\n * Create a new PostgresChatMessageHistory instance.\n *\n * @param {PostgresEngine} engine Postgres engine instance to use.\n * @param {string} sessionId Retrieve the table content with this session ID.\n * @param {string} tableName Table name that stores that chat message history. Parameter is not escaped. Do not use with end user input.\n * @param {string} schemaName Schema name for the chat message history table. Default: \"public\". Parameter is not escaped. Do not use with end user input.\n * @returns PostgresChatMessageHistory instance.\n */\n static async initialize(\n engine: PostgresEngine,\n sessionId: string,\n tableName: string,\n schemaName: string = \"public\"\n ) {\n const query = `SELECT column_name, data_type FROM information_schema.columns WHERE table_name =
|
|
1
|
+
{"version":3,"file":"chat_message_history.cjs","names":["BaseChatMessageHistory","engine: PostgresEngine","sessionId: string","tableName: string","schemaName: string","columnNames: string[]","message: string","HumanMessage","AIMessage","values: { [key: string]: string }","items: StoredMessage[]","message: BaseMessage","messages: BaseMessage[]"],"sources":["../src/chat_message_history.ts"],"sourcesContent":["import { BaseChatMessageHistory } from \"@langchain/core/chat_history\";\nimport {\n AIMessage,\n BaseMessage,\n HumanMessage,\n StoredMessage,\n mapStoredMessagesToChatMessages,\n} from \"@langchain/core/messages\";\nimport PostgresEngine from \"./engine.js\";\n\nexport interface PostgresChatMessageHistoryInput {\n engine: PostgresEngine;\n sessionId: string;\n tableName: string;\n schemaName: string;\n}\n\nexport class PostgresChatMessageHistory extends BaseChatMessageHistory {\n lc_namespace: string[] = [\n \"langchain\",\n \"stores\",\n \"message\",\n \"google-cloud-sql-pg\",\n ];\n\n engine: PostgresEngine;\n\n sessionId: string;\n\n tableName: string;\n\n schemaName: string;\n\n constructor({\n engine,\n sessionId,\n tableName,\n schemaName = \"public\",\n }: PostgresChatMessageHistoryInput) {\n super();\n this.engine = engine;\n this.sessionId = sessionId;\n this.tableName = tableName;\n this.schemaName = schemaName;\n }\n\n /**\n * Create a new PostgresChatMessageHistory instance.\n *\n * @param {PostgresEngine} engine Postgres engine instance to use.\n * @param {string} sessionId Retrieve the table content with this session ID.\n * @param {string} tableName Table name that stores that chat message history. Parameter is not escaped. Do not use with end user input.\n * @param {string} schemaName Schema name for the chat message history table. Default: \"public\". Parameter is not escaped. Do not use with end user input.\n * @returns PostgresChatMessageHistory instance.\n */\n static async initialize(\n engine: PostgresEngine,\n sessionId: string,\n tableName: string,\n schemaName: string = \"public\"\n ) {\n const query = `SELECT column_name, data_type FROM information_schema.columns WHERE table_name = :tableName AND table_schema = :schemaName`;\n const { rows } = await engine.pool.raw(query, { tableName, schemaName });\n const columnNames: string[] = [];\n\n for (const index in rows) {\n if (Object.prototype.hasOwnProperty.call(rows, index)) {\n columnNames.push(rows[index].column_name);\n }\n }\n\n const requiredColumns = [\"id\", \"session_id\", \"data\", \"type\"];\n\n if (!requiredColumns.every((x) => columnNames.includes(x))) {\n throw new Error(\n `Table '${schemaName}'.'${tableName}' has incorrect schema.\n Got column names ${columnNames} but required column names ${requiredColumns}.\n Please create table with following schema: CREATE TABLE '${schemaName}'.'${tableName}' (\n id SERIAL AUTO_INCREMENT PRIMARY KEY,\n session_id TEXT NOT NULL,\n data JSONB NOT NULL,\n type TEXT NOT NULL\n );\n `\n );\n }\n\n return new PostgresChatMessageHistory({\n engine,\n sessionId,\n tableName,\n schemaName,\n });\n }\n\n addUserMessage(message: string): Promise<void> {\n return this.addMessage(new HumanMessage(message));\n }\n\n addAIChatMessage(message: string): Promise<void> {\n return this.addMessage(new AIMessage(message));\n }\n\n /**\n * Returns a list of messages stored in the store.\n */\n async getMessages(): Promise<BaseMessage[]> {\n const query = `SELECT data, type FROM \"${this.schemaName}\".\"${this.tableName}\" WHERE session_id = :session_id ORDER BY id;`;\n const values: { [key: string]: string } = {\n session_id: this.sessionId,\n };\n const items: StoredMessage[] = [];\n const { rows } = await this.engine.pool.raw(query, values);\n\n if (rows.length === 0) {\n return [];\n }\n\n for (const row of rows) {\n items.push({\n data: row.data.data,\n type: row.type,\n });\n }\n\n return mapStoredMessagesToChatMessages(items);\n }\n\n /**\n * Add a message object to the store.\n * @param {BaseMessage} message Message to be added to the store\n */\n async addMessage(message: BaseMessage): Promise<void> {\n const query = `INSERT INTO \"${this.schemaName}\".\"${this.tableName}\"(\"session_id\", \"data\", \"type\") VALUES (:session_id, :data, :type)`;\n const values: { [key: string]: string } = {\n session_id: this.sessionId,\n data: JSON.stringify(message.toDict()),\n type: message.getType(),\n };\n\n await this.engine.pool.raw(query, values);\n }\n\n /**\n * Add a list of messages object to the store.\n * @param {Array<BaseMessage>} messages List of messages to be added to the store\n */\n async addMessages(messages: BaseMessage[]): Promise<void> {\n for (const msg of messages) {\n await this.addMessage(msg);\n }\n }\n\n /**\n * Remove all messages from the store.\n */\n async clear(): Promise<void> {\n const query = `DELETE FROM \"${this.schemaName}\".\"${this.tableName}\" WHERE session_id = :session_id;`;\n const values: { [key: string]: string } = {\n session_id: this.sessionId,\n };\n\n await this.engine.pool.raw(query, values);\n }\n}\n"],"mappings":";;;;;AAiBA,IAAa,6BAAb,MAAa,mCAAmCA,qDAAuB;CACrE,eAAyB;EACvB;EACA;EACA;EACA;CACD;CAED;CAEA;CAEA;CAEA;CAEA,YAAY,EACV,QACA,WACA,WACA,aAAa,UACmB,EAAE;EAClC,OAAO;EACP,KAAK,SAAS;EACd,KAAK,YAAY;EACjB,KAAK,YAAY;EACjB,KAAK,aAAa;CACnB;;;;;;;;;;CAWD,aAAa,WACXC,QACAC,WACAC,WACAC,aAAqB,UACrB;EACA,MAAM,QAAQ,CAAC,0HAA0H,CAAC;EAC1I,MAAM,EAAE,MAAM,GAAG,MAAM,OAAO,KAAK,IAAI,OAAO;GAAE;GAAW;EAAY,EAAC;EACxE,MAAMC,cAAwB,CAAE;AAEhC,OAAK,MAAM,SAAS,KAClB,KAAI,OAAO,UAAU,eAAe,KAAK,MAAM,MAAM,EACnD,YAAY,KAAK,KAAK,OAAO,YAAY;EAI7C,MAAM,kBAAkB;GAAC;GAAM;GAAc;GAAQ;EAAO;AAE5D,MAAI,CAAC,gBAAgB,MAAM,CAAC,MAAM,YAAY,SAAS,EAAE,CAAC,CACxD,OAAM,IAAI,MACR,CAAC,OAAO,EAAE,WAAW,GAAG,EAAE,UAAU;yBACnB,EAAE,YAAY,2BAA2B,EAAE,gBAAgB;iEACnB,EAAE,WAAW,GAAG,EAAE,UAAU;;;;;;MAMvF,CAAC;AAIH,SAAO,IAAI,2BAA2B;GACpC;GACA;GACA;GACA;EACD;CACF;CAED,eAAeC,SAAgC;AAC7C,SAAO,KAAK,WAAW,IAAIC,uCAAa,SAAS;CAClD;CAED,iBAAiBD,SAAgC;AAC/C,SAAO,KAAK,WAAW,IAAIE,oCAAU,SAAS;CAC/C;;;;CAKD,MAAM,cAAsC;EAC1C,MAAM,QAAQ,CAAC,wBAAwB,EAAE,KAAK,WAAW,GAAG,EAAE,KAAK,UAAU,6CAA6C,CAAC;EAC3H,MAAMC,SAAoC,EACxC,YAAY,KAAK,UAClB;EACD,MAAMC,QAAyB,CAAE;EACjC,MAAM,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,KAAK,IAAI,OAAO,OAAO;AAE1D,MAAI,KAAK,WAAW,EAClB,QAAO,CAAE;AAGX,OAAK,MAAM,OAAO,MAChB,MAAM,KAAK;GACT,MAAM,IAAI,KAAK;GACf,MAAM,IAAI;EACX,EAAC;AAGJ,wEAAuC,MAAM;CAC9C;;;;;CAMD,MAAM,WAAWC,SAAqC;EACpD,MAAM,QAAQ,CAAC,aAAa,EAAE,KAAK,WAAW,GAAG,EAAE,KAAK,UAAU,kEAAkE,CAAC;EACrI,MAAMF,SAAoC;GACxC,YAAY,KAAK;GACjB,MAAM,KAAK,UAAU,QAAQ,QAAQ,CAAC;GACtC,MAAM,QAAQ,SAAS;EACxB;EAED,MAAM,KAAK,OAAO,KAAK,IAAI,OAAO,OAAO;CAC1C;;;;;CAMD,MAAM,YAAYG,UAAwC;AACxD,OAAK,MAAM,OAAO,UAChB,MAAM,KAAK,WAAW,IAAI;CAE7B;;;;CAKD,MAAM,QAAuB;EAC3B,MAAM,QAAQ,CAAC,aAAa,EAAE,KAAK,WAAW,GAAG,EAAE,KAAK,UAAU,iCAAiC,CAAC;EACpG,MAAMH,SAAoC,EACxC,YAAY,KAAK,UAClB;EAED,MAAM,KAAK,OAAO,KAAK,IAAI,OAAO,OAAO;CAC1C;AACF"}
|
|
@@ -30,8 +30,11 @@ var PostgresChatMessageHistory = class PostgresChatMessageHistory extends BaseCh
|
|
|
30
30
|
* @returns PostgresChatMessageHistory instance.
|
|
31
31
|
*/
|
|
32
32
|
static async initialize(engine, sessionId, tableName, schemaName = "public") {
|
|
33
|
-
const query = `SELECT column_name, data_type FROM information_schema.columns WHERE table_name =
|
|
34
|
-
const { rows } = await engine.pool.raw(query
|
|
33
|
+
const query = `SELECT column_name, data_type FROM information_schema.columns WHERE table_name = :tableName AND table_schema = :schemaName`;
|
|
34
|
+
const { rows } = await engine.pool.raw(query, {
|
|
35
|
+
tableName,
|
|
36
|
+
schemaName
|
|
37
|
+
});
|
|
35
38
|
const columnNames = [];
|
|
36
39
|
for (const index in rows) if (Object.prototype.hasOwnProperty.call(rows, index)) columnNames.push(rows[index].column_name);
|
|
37
40
|
const requiredColumns = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat_message_history.js","names":["engine: PostgresEngine","sessionId: string","tableName: string","schemaName: string","columnNames: string[]","message: string","values: { [key: string]: string }","items: StoredMessage[]","message: BaseMessage","messages: BaseMessage[]"],"sources":["../src/chat_message_history.ts"],"sourcesContent":["import { BaseChatMessageHistory } from \"@langchain/core/chat_history\";\nimport {\n AIMessage,\n BaseMessage,\n HumanMessage,\n StoredMessage,\n mapStoredMessagesToChatMessages,\n} from \"@langchain/core/messages\";\nimport PostgresEngine from \"./engine.js\";\n\nexport interface PostgresChatMessageHistoryInput {\n engine: PostgresEngine;\n sessionId: string;\n tableName: string;\n schemaName: string;\n}\n\nexport class PostgresChatMessageHistory extends BaseChatMessageHistory {\n lc_namespace: string[] = [\n \"langchain\",\n \"stores\",\n \"message\",\n \"google-cloud-sql-pg\",\n ];\n\n engine: PostgresEngine;\n\n sessionId: string;\n\n tableName: string;\n\n schemaName: string;\n\n constructor({\n engine,\n sessionId,\n tableName,\n schemaName = \"public\",\n }: PostgresChatMessageHistoryInput) {\n super();\n this.engine = engine;\n this.sessionId = sessionId;\n this.tableName = tableName;\n this.schemaName = schemaName;\n }\n\n /**\n * Create a new PostgresChatMessageHistory instance.\n *\n * @param {PostgresEngine} engine Postgres engine instance to use.\n * @param {string} sessionId Retrieve the table content with this session ID.\n * @param {string} tableName Table name that stores that chat message history. Parameter is not escaped. Do not use with end user input.\n * @param {string} schemaName Schema name for the chat message history table. Default: \"public\". Parameter is not escaped. Do not use with end user input.\n * @returns PostgresChatMessageHistory instance.\n */\n static async initialize(\n engine: PostgresEngine,\n sessionId: string,\n tableName: string,\n schemaName: string = \"public\"\n ) {\n const query = `SELECT column_name, data_type FROM information_schema.columns WHERE table_name =
|
|
1
|
+
{"version":3,"file":"chat_message_history.js","names":["engine: PostgresEngine","sessionId: string","tableName: string","schemaName: string","columnNames: string[]","message: string","values: { [key: string]: string }","items: StoredMessage[]","message: BaseMessage","messages: BaseMessage[]"],"sources":["../src/chat_message_history.ts"],"sourcesContent":["import { BaseChatMessageHistory } from \"@langchain/core/chat_history\";\nimport {\n AIMessage,\n BaseMessage,\n HumanMessage,\n StoredMessage,\n mapStoredMessagesToChatMessages,\n} from \"@langchain/core/messages\";\nimport PostgresEngine from \"./engine.js\";\n\nexport interface PostgresChatMessageHistoryInput {\n engine: PostgresEngine;\n sessionId: string;\n tableName: string;\n schemaName: string;\n}\n\nexport class PostgresChatMessageHistory extends BaseChatMessageHistory {\n lc_namespace: string[] = [\n \"langchain\",\n \"stores\",\n \"message\",\n \"google-cloud-sql-pg\",\n ];\n\n engine: PostgresEngine;\n\n sessionId: string;\n\n tableName: string;\n\n schemaName: string;\n\n constructor({\n engine,\n sessionId,\n tableName,\n schemaName = \"public\",\n }: PostgresChatMessageHistoryInput) {\n super();\n this.engine = engine;\n this.sessionId = sessionId;\n this.tableName = tableName;\n this.schemaName = schemaName;\n }\n\n /**\n * Create a new PostgresChatMessageHistory instance.\n *\n * @param {PostgresEngine} engine Postgres engine instance to use.\n * @param {string} sessionId Retrieve the table content with this session ID.\n * @param {string} tableName Table name that stores that chat message history. Parameter is not escaped. Do not use with end user input.\n * @param {string} schemaName Schema name for the chat message history table. Default: \"public\". Parameter is not escaped. Do not use with end user input.\n * @returns PostgresChatMessageHistory instance.\n */\n static async initialize(\n engine: PostgresEngine,\n sessionId: string,\n tableName: string,\n schemaName: string = \"public\"\n ) {\n const query = `SELECT column_name, data_type FROM information_schema.columns WHERE table_name = :tableName AND table_schema = :schemaName`;\n const { rows } = await engine.pool.raw(query, { tableName, schemaName });\n const columnNames: string[] = [];\n\n for (const index in rows) {\n if (Object.prototype.hasOwnProperty.call(rows, index)) {\n columnNames.push(rows[index].column_name);\n }\n }\n\n const requiredColumns = [\"id\", \"session_id\", \"data\", \"type\"];\n\n if (!requiredColumns.every((x) => columnNames.includes(x))) {\n throw new Error(\n `Table '${schemaName}'.'${tableName}' has incorrect schema.\n Got column names ${columnNames} but required column names ${requiredColumns}.\n Please create table with following schema: CREATE TABLE '${schemaName}'.'${tableName}' (\n id SERIAL AUTO_INCREMENT PRIMARY KEY,\n session_id TEXT NOT NULL,\n data JSONB NOT NULL,\n type TEXT NOT NULL\n );\n `\n );\n }\n\n return new PostgresChatMessageHistory({\n engine,\n sessionId,\n tableName,\n schemaName,\n });\n }\n\n addUserMessage(message: string): Promise<void> {\n return this.addMessage(new HumanMessage(message));\n }\n\n addAIChatMessage(message: string): Promise<void> {\n return this.addMessage(new AIMessage(message));\n }\n\n /**\n * Returns a list of messages stored in the store.\n */\n async getMessages(): Promise<BaseMessage[]> {\n const query = `SELECT data, type FROM \"${this.schemaName}\".\"${this.tableName}\" WHERE session_id = :session_id ORDER BY id;`;\n const values: { [key: string]: string } = {\n session_id: this.sessionId,\n };\n const items: StoredMessage[] = [];\n const { rows } = await this.engine.pool.raw(query, values);\n\n if (rows.length === 0) {\n return [];\n }\n\n for (const row of rows) {\n items.push({\n data: row.data.data,\n type: row.type,\n });\n }\n\n return mapStoredMessagesToChatMessages(items);\n }\n\n /**\n * Add a message object to the store.\n * @param {BaseMessage} message Message to be added to the store\n */\n async addMessage(message: BaseMessage): Promise<void> {\n const query = `INSERT INTO \"${this.schemaName}\".\"${this.tableName}\"(\"session_id\", \"data\", \"type\") VALUES (:session_id, :data, :type)`;\n const values: { [key: string]: string } = {\n session_id: this.sessionId,\n data: JSON.stringify(message.toDict()),\n type: message.getType(),\n };\n\n await this.engine.pool.raw(query, values);\n }\n\n /**\n * Add a list of messages object to the store.\n * @param {Array<BaseMessage>} messages List of messages to be added to the store\n */\n async addMessages(messages: BaseMessage[]): Promise<void> {\n for (const msg of messages) {\n await this.addMessage(msg);\n }\n }\n\n /**\n * Remove all messages from the store.\n */\n async clear(): Promise<void> {\n const query = `DELETE FROM \"${this.schemaName}\".\"${this.tableName}\" WHERE session_id = :session_id;`;\n const values: { [key: string]: string } = {\n session_id: this.sessionId,\n };\n\n await this.engine.pool.raw(query, values);\n }\n}\n"],"mappings":";;;;AAiBA,IAAa,6BAAb,MAAa,mCAAmC,uBAAuB;CACrE,eAAyB;EACvB;EACA;EACA;EACA;CACD;CAED;CAEA;CAEA;CAEA;CAEA,YAAY,EACV,QACA,WACA,WACA,aAAa,UACmB,EAAE;EAClC,OAAO;EACP,KAAK,SAAS;EACd,KAAK,YAAY;EACjB,KAAK,YAAY;EACjB,KAAK,aAAa;CACnB;;;;;;;;;;CAWD,aAAa,WACXA,QACAC,WACAC,WACAC,aAAqB,UACrB;EACA,MAAM,QAAQ,CAAC,0HAA0H,CAAC;EAC1I,MAAM,EAAE,MAAM,GAAG,MAAM,OAAO,KAAK,IAAI,OAAO;GAAE;GAAW;EAAY,EAAC;EACxE,MAAMC,cAAwB,CAAE;AAEhC,OAAK,MAAM,SAAS,KAClB,KAAI,OAAO,UAAU,eAAe,KAAK,MAAM,MAAM,EACnD,YAAY,KAAK,KAAK,OAAO,YAAY;EAI7C,MAAM,kBAAkB;GAAC;GAAM;GAAc;GAAQ;EAAO;AAE5D,MAAI,CAAC,gBAAgB,MAAM,CAAC,MAAM,YAAY,SAAS,EAAE,CAAC,CACxD,OAAM,IAAI,MACR,CAAC,OAAO,EAAE,WAAW,GAAG,EAAE,UAAU;yBACnB,EAAE,YAAY,2BAA2B,EAAE,gBAAgB;iEACnB,EAAE,WAAW,GAAG,EAAE,UAAU;;;;;;MAMvF,CAAC;AAIH,SAAO,IAAI,2BAA2B;GACpC;GACA;GACA;GACA;EACD;CACF;CAED,eAAeC,SAAgC;AAC7C,SAAO,KAAK,WAAW,IAAI,aAAa,SAAS;CAClD;CAED,iBAAiBA,SAAgC;AAC/C,SAAO,KAAK,WAAW,IAAI,UAAU,SAAS;CAC/C;;;;CAKD,MAAM,cAAsC;EAC1C,MAAM,QAAQ,CAAC,wBAAwB,EAAE,KAAK,WAAW,GAAG,EAAE,KAAK,UAAU,6CAA6C,CAAC;EAC3H,MAAMC,SAAoC,EACxC,YAAY,KAAK,UAClB;EACD,MAAMC,QAAyB,CAAE;EACjC,MAAM,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,KAAK,IAAI,OAAO,OAAO;AAE1D,MAAI,KAAK,WAAW,EAClB,QAAO,CAAE;AAGX,OAAK,MAAM,OAAO,MAChB,MAAM,KAAK;GACT,MAAM,IAAI,KAAK;GACf,MAAM,IAAI;EACX,EAAC;AAGJ,SAAO,gCAAgC,MAAM;CAC9C;;;;;CAMD,MAAM,WAAWC,SAAqC;EACpD,MAAM,QAAQ,CAAC,aAAa,EAAE,KAAK,WAAW,GAAG,EAAE,KAAK,UAAU,kEAAkE,CAAC;EACrI,MAAMF,SAAoC;GACxC,YAAY,KAAK;GACjB,MAAM,KAAK,UAAU,QAAQ,QAAQ,CAAC;GACtC,MAAM,QAAQ,SAAS;EACxB;EAED,MAAM,KAAK,OAAO,KAAK,IAAI,OAAO,OAAO;CAC1C;;;;;CAMD,MAAM,YAAYG,UAAwC;AACxD,OAAK,MAAM,OAAO,UAChB,MAAM,KAAK,WAAW,IAAI;CAE7B;;;;CAKD,MAAM,QAAuB;EAC3B,MAAM,QAAQ,CAAC,aAAa,EAAE,KAAK,WAAW,GAAG,EAAE,KAAK,UAAU,iCAAiC,CAAC;EACpG,MAAMH,SAAoC,EACxC,YAAY,KAAK,UAClB;EAED,MAAM,KAAK,OAAO,KAAK,IAAI,OAAO,OAAO;CAC1C;AACF"}
|
package/dist/vectorstore.cjs
CHANGED
|
@@ -110,7 +110,7 @@ const __langchain_core_utils_math = require_rolldown_runtime.__toESM(require("@l
|
|
|
110
110
|
* <summary><strong>Similarity search with filter</strong></summary>
|
|
111
111
|
*
|
|
112
112
|
* ```typescript
|
|
113
|
-
* const resultsWithFilter = await vectorStore.similaritySearch("thud", 1,
|
|
113
|
+
* const resultsWithFilter = await vectorStore.similaritySearch("thud", 1, { baz: "bar" });
|
|
114
114
|
*
|
|
115
115
|
* for (const doc of resultsWithFilter) {
|
|
116
116
|
* console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);
|
|
@@ -358,12 +358,22 @@ var PostgresVectorStore = class PostgresVectorStore extends __langchain_core_vec
|
|
|
358
358
|
const fetchK = k ?? this.k;
|
|
359
359
|
const { operator } = this.distanceStrategy;
|
|
360
360
|
const { searchFunction } = this.distanceStrategy;
|
|
361
|
-
const
|
|
361
|
+
const filterColumns = filter !== void 0 ? Object.keys(filter) : [];
|
|
362
|
+
const filterBindings = {};
|
|
363
|
+
let _filter = "";
|
|
364
|
+
if (filterColumns.length > 0) {
|
|
365
|
+
const conditions = filterColumns.map((col, i) => {
|
|
366
|
+
const bindingKey = `filter_${i}`;
|
|
367
|
+
filterBindings[bindingKey] = filter[col];
|
|
368
|
+
return `"${col.replace(/"/g, "\"\"")}" = :${bindingKey}`;
|
|
369
|
+
});
|
|
370
|
+
_filter = `WHERE ${conditions.join(" AND ")}`;
|
|
371
|
+
}
|
|
362
372
|
const metadataColNames = this.metadataColumns.length > 0 ? `, "${this.metadataColumns.join("\",\"")}"` : "";
|
|
363
373
|
const metadataJsonColName = this.metadataJsonColumn ? `, "${this.metadataJsonColumn}"` : "";
|
|
364
374
|
const query = `SELECT "${this.idColumn}", "${this.contentColumn}", "${this.embeddingColumn}" ${metadataColNames} ${metadataJsonColName}, ${searchFunction}("${this.embeddingColumn}", '[${embedding}]') as distance FROM "${this.schemaName}"."${this.tableName}" ${_filter} ORDER BY "${this.embeddingColumn}" ${operator} '[${embedding}]' LIMIT ${fetchK};`;
|
|
365
375
|
if (this.indexQueryOptions) await this.engine.pool.raw(`SET LOCAL ${this.indexQueryOptions.to_string()}`);
|
|
366
|
-
const { rows } = await this.engine.pool.raw(query);
|
|
376
|
+
const { rows } = await this.engine.pool.raw(query, filterBindings);
|
|
367
377
|
return rows;
|
|
368
378
|
}
|
|
369
379
|
async maxMarginalRelevanceSearch(query, options) {
|
package/dist/vectorstore.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vectorstore.cjs","names":["VectorStore","embeddings: EmbeddingsInterface","dbConfig: VSArgs","engine: PostgresEngine","tableName: string","DEFAULT_DISTANCE_STRATEGY","columns: { [key: string]: string }","allMetadataColumns: string[]","texts: string[]","metadatas: object[] | object","dbConfig: dbConfigArgs","documents: Document[]","Document","docs: Document[]","vectors: number[][]","options?: { ids?: string[] }","ids: string[]","metadatas: Record<string, string>[]","customZip","values: { [key: string]: string | string[] }","params: { ids?: string[] }","embedding: number[]","k: number","filter?: this[\"FilterType\"]","documentsWithScores: [Document, number][]","k?: number | undefined","filter?: this[\"FilterType\"] | undefined","query: string","options: MaxMarginalRelevanceSearchOptions<this[\"FilterType\"]>","docsList: Document[]","row: { [x: string]: string }","index: BaseIndex","name?: string","concurrently: boolean","DEFAULT_INDEX_NAME_SUFFIX","indexName?: string"],"sources":["../src/vectorstore.ts"],"sourcesContent":["import { EmbeddingsInterface } from \"@langchain/core/embeddings\";\nimport {\n MaxMarginalRelevanceSearchOptions,\n VectorStore,\n} from \"@langchain/core/vectorstores\";\nimport { Document } from \"@langchain/core/documents\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { maximalMarginalRelevance } from \"@langchain/core/utils/math\";\nimport {\n BaseIndex,\n DEFAULT_DISTANCE_STRATEGY,\n DEFAULT_INDEX_NAME_SUFFIX,\n DistanceStrategy,\n QueryOptions,\n} from \"./indexes.js\";\nimport PostgresEngine from \"./engine.js\";\nimport { customZip } from \"./utils/utils.js\";\n\nexport interface PostgresVectorStoreArgs {\n schemaName?: string;\n contentColumn?: string;\n embeddingColumn?: string;\n metadataColumns?: Array<string>;\n idColumn?: string;\n distanceStrategy?: DistanceStrategy;\n k?: number;\n fetchK?: number;\n lambdaMult?: number;\n ignoreMetadataColumns?: Array<string>;\n metadataJsonColumn?: string;\n indexQueryOptions?: QueryOptions;\n}\n\nexport interface dbConfigArgs {\n engine: PostgresEngine;\n tableName: string;\n dbConfig?: PostgresVectorStoreArgs;\n}\n\ninterface VSArgs {\n engine: PostgresEngine;\n tableName: string;\n schemaName: string;\n contentColumn: string;\n embeddingColumn: string;\n metadataColumns: Array<string>;\n idColumn: string;\n distanceStrategy: DistanceStrategy;\n k: number;\n fetchK: number;\n lambdaMult: number;\n metadataJsonColumn: string;\n indexQueryOptions?: QueryOptions;\n}\n\n/**\n * Google Cloud SQL for PostgreSQL vector store integration.\n *\n * Setup:\n * Install `@langchain/google-cloud-sql-pg`\n *\n * ```bash\n * npm install @langchain/google-cloud-sql-pg\n * ```\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { Column, PostgresEngine, PostgresEngineArgs, PostgresVectorStore, VectorStoreTableArgs } from \"@langchain/google-cloud-sql-pg\";\n * // Or other embeddings\n * import { OpenAIEmbeddings } from '@langchain/openai';\n *\n *\n * const embeddings = new OpenAIEmbeddings({\n * model: \"text-embedding-3-small\",\n * });\n *\n * const pgArgs: PostgresEngineArgs = {\n * user: \"db-user\",\n * password: \"password\"\n * }\n * // Create a shared connection pool\n * const engine: PostgresEngine = await PostgresEngine.fromInstance(\n * \"project-id\",\n * \"region\",\n * \"instance-name\",\n * \"database-name\",\n * pgArgs\n * );\n * // (Optional) Specify metadata columns for filtering\n * // All other metadata will be added to JSON\n * const vectorStoreTableArgs: VectorStoreTableArgs = {\n * metadataColumns: [new Column(\"baz\", \"TEXT\")],\n * };\n * // Create a vector store table\n * await engine.initVectorstoreTable(\"my-table\", 768, vectorStoreTableArgs);\n * // Customize the vector store\n * const pvectorArgs: PostgresVectorStoreArgs = {\n * idColumn: \"ID_COLUMN\",\n * contentColumn: \"CONTENT_COLUMN\",\n * embeddingColumn: \"EMBEDDING_COLUMN\",\n * metadataColumns: [\"baz\"]\n * }\n *\n * const vectorStore = await PostgresVectorStore.initialize(engine, embeddingService, \"my-table\", pvectorArgs);\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Add documents</strong></summary>\n *\n * ```typescript\n * import type { Document } from '@langchain/core/documents';\n *\n * const document1 = { pageContent: \"foo\", metadata: { baz: \"bar\" } };\n * const document2 = { pageContent: \"thud\", metadata: { bar: \"baz\" } };\n * const document3 = { pageContent: \"i will be deleted :(\", metadata: {} };\n *\n * const documents: Document[] = [document1, document2, document3];\n * const ids = [\"1\", \"2\", \"3\"];\n * await vectorStore.addDocuments(documents, { ids });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Delete documents</strong></summary>\n *\n * ```typescript\n * await vectorStore.delete({ ids: [\"3\"] });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Similarity search</strong></summary>\n *\n * ```typescript\n * const results = await vectorStore.similaritySearch(\"thud\", 1);\n * for (const doc of results) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:thud [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with filter</strong></summary>\n *\n * ```typescript\n * const resultsWithFilter = await vectorStore.similaritySearch(\"thud\", 1, \"baz = 'bar'\");\n *\n * for (const doc of resultsWithFilter) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:foo [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with score</strong></summary>\n *\n * ```typescript\n * const resultsWithScore = await vectorStore.similaritySearchWithScore(\"qux\", 1);\n * for (const [doc, score] of resultsWithScore) {\n * console.log(`* [SIM=${score.toFixed(6)}] ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:[SIM=0.000000] qux [{\"bar\":\"baz\",\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>As a retriever</strong></summary>\n *\n * ```typescript\n * const retriever = vectorStore.asRetriever({\n * searchType: \"mmr\", // Leave blank for standard similarity search\n * k: 1,\n * });\n * const resultAsRetriever = await retriever.invoke(\"thud\");\n * console.log(resultAsRetriever);\n *\n * // Output: [Document({ metadata: { \"baz\":\"bar\" }, pageContent: \"thud\" })]\n * ```\n * </details>\n *\n * <br />\n */\nexport class PostgresVectorStore extends VectorStore {\n declare FilterType: string;\n\n engine: PostgresEngine;\n\n embeddings: EmbeddingsInterface;\n\n tableName: string;\n\n schemaName: string;\n\n contentColumn: string;\n\n embeddingColumn: string;\n\n metadataColumns: Array<string>;\n\n idColumn: string;\n\n metadataJsonColumn: string;\n\n distanceStrategy: DistanceStrategy;\n\n k: number;\n\n fetchK: number;\n\n lambdaMult: number;\n\n indexQueryOptions: QueryOptions | undefined;\n\n /**\n * Initializes a new vector store with embeddings and database configuration.\n *\n * @param embeddings - Instance of `EmbeddingsInterface` used to embed queries.\n * @param dbConfig - Configuration settings for the database or storage system.\n */\n constructor(embeddings: EmbeddingsInterface, dbConfig: VSArgs) {\n super(embeddings, dbConfig);\n this.embeddings = embeddings;\n this.engine = dbConfig.engine;\n this.tableName = dbConfig.tableName;\n this.schemaName = dbConfig.schemaName;\n this.contentColumn = dbConfig.contentColumn;\n this.embeddingColumn = dbConfig.embeddingColumn;\n this.metadataColumns = dbConfig.metadataColumns\n ? dbConfig.metadataColumns\n : [];\n this.idColumn = dbConfig.idColumn;\n this.metadataJsonColumn = dbConfig.metadataJsonColumn;\n this.distanceStrategy = dbConfig.distanceStrategy;\n this.k = dbConfig.k;\n this.fetchK = dbConfig.fetchK;\n this.lambdaMult = dbConfig.lambdaMult;\n this.indexQueryOptions = dbConfig.indexQueryOptions;\n }\n\n /**\n * Create a new PostgresVectorStore instance.\n * @param {PostgresEngine} engine Required - Connection pool engine for managing connections to Cloud SQL for PostgreSQL database.\n * @param {Embeddings} embeddings Required - Text embedding model to use.\n * @param {string} tableName Required - Name of an existing table or table to be created.\n * @param {string} schemaName Database schema name of the table. Defaults to \"public\".\n * @param {string} contentColumn Column that represent a Document's page_content. Defaults to \"content\".\n * @param {string} embeddingColumn Column for embedding vectors. The embedding is generated from the document value. Defaults to \"embedding\".\n * @param {Array<string>} metadataColumns Column(s) that represent a document's metadata.\n * @param {Array<string>} ignoreMetadataColumns Optional - Column(s) to ignore in pre-existing tables for a document's metadata. Can not be used with metadata_columns.\n * @param {string} idColumn Column that represents the Document's id. Defaults to \"langchain_id\".\n * @param {string} metadataJsonColumn Optional - Column to store metadata as JSON. Defaults to \"langchain_metadata\".\n * @param {DistanceStrategy} distanceStrategy Distance strategy to use for vector similarity search. Defaults to COSINE_DISTANCE.\n * @param {number} k Number of Documents to return from search. Defaults to 4.\n * @param {number} fetchK Number of Documents to fetch to pass to MMR algorithm.\n * @param {number} lambdaMult Number between 0 and 1 that determines the degree of diversity among the results with 0 corresponding to maximum diversity and 1 to minimum diversity. Defaults to 0.5.\n * @param {QueryOptions} indexQueryOptions Optional - Index query option.\n * @returns PostgresVectorStore instance.\n */\n static async initialize(\n engine: PostgresEngine,\n embeddings: EmbeddingsInterface,\n tableName: string,\n {\n schemaName = \"public\",\n contentColumn = \"content\",\n embeddingColumn = \"embedding\",\n metadataColumns = [],\n ignoreMetadataColumns,\n idColumn = \"langchain_id\",\n metadataJsonColumn = \"langchain_metadata\",\n distanceStrategy = DEFAULT_DISTANCE_STRATEGY,\n k = 4,\n fetchK = 20,\n lambdaMult = 0.5,\n indexQueryOptions,\n }: PostgresVectorStoreArgs = {}\n ): Promise<PostgresVectorStore> {\n if (metadataColumns !== undefined && ignoreMetadataColumns !== undefined) {\n throw Error(\n \"Can not use both metadata_columns and ignore_metadata_columns.\"\n );\n }\n\n const { rows } = await engine.pool.raw(\n `SELECT column_name, data_type FROM information_schema.columns WHERE table_name = '${tableName}' AND table_schema = '${schemaName}'`\n );\n const columns: { [key: string]: string } = {};\n\n for (const index in rows) {\n if (rows[index]) {\n const row = rows[index];\n columns[row.column_name] = row.data_type;\n }\n }\n\n if (!Object.prototype.hasOwnProperty.call(columns, idColumn)) {\n throw Error(`Id column: ${idColumn}, does not exist.`);\n }\n\n if (!Object.prototype.hasOwnProperty.call(columns, contentColumn)) {\n throw Error(`Content column: ${contentColumn}, does not exist.`);\n }\n\n const contentType = columns[contentColumn];\n\n if (contentType !== \"text\" && !contentType.includes(\"char\")) {\n throw Error(\n `Content column: ${contentColumn}, is type: ${contentType}. It must be a type of character string.`\n );\n }\n\n if (!Object.prototype.hasOwnProperty.call(columns, embeddingColumn)) {\n throw Error(`Embedding column: ${embeddingColumn}, does not exist.`);\n }\n\n if (columns[embeddingColumn] !== \"USER-DEFINED\") {\n throw Error(\n `Embedding column: ${embeddingColumn} is not of type Vector.`\n );\n }\n\n const jsonColumn = Object.prototype.hasOwnProperty.call(\n columns,\n metadataJsonColumn\n )\n ? metadataJsonColumn\n : \"\";\n\n for (const column of metadataColumns) {\n if (!Object.prototype.hasOwnProperty.call(columns, column)) {\n throw Error(`Metadata column: ${column}, does not exist.`);\n }\n }\n\n const allColumns = columns;\n let allMetadataColumns: string[] = [];\n if (\n ignoreMetadataColumns !== undefined &&\n ignoreMetadataColumns.length > 0\n ) {\n for (const column of ignoreMetadataColumns) {\n delete allColumns[column];\n }\n\n delete allColumns[idColumn];\n delete allColumns[contentColumn];\n delete allColumns[embeddingColumn];\n allMetadataColumns = Object.keys(allColumns);\n } else {\n for (const column of metadataColumns) {\n if (Object.prototype.hasOwnProperty.call(allColumns, column)) {\n allMetadataColumns.push(column);\n }\n }\n }\n return new PostgresVectorStore(embeddings, {\n engine,\n tableName,\n schemaName,\n contentColumn,\n embeddingColumn,\n metadataColumns: allMetadataColumns,\n idColumn,\n metadataJsonColumn: jsonColumn,\n distanceStrategy,\n k,\n fetchK,\n lambdaMult,\n indexQueryOptions,\n });\n }\n\n static async fromTexts(\n texts: string[],\n metadatas: object[] | object,\n embeddings: EmbeddingsInterface,\n dbConfig: dbConfigArgs\n ): Promise<VectorStore> {\n const documents: Document[] = [];\n\n for (let i = 0; i < texts.length; i += 1) {\n const doc = new Document({\n pageContent: texts[i],\n metadata: Array.isArray(metadatas) ? metadatas[i] : metadatas,\n });\n documents.push(doc);\n }\n\n return PostgresVectorStore.fromDocuments(documents, embeddings, dbConfig);\n }\n\n static async fromDocuments(\n docs: Document[],\n embeddings: EmbeddingsInterface,\n dbConfig: dbConfigArgs\n ): Promise<VectorStore> {\n const { engine } = dbConfig;\n const { tableName } = dbConfig;\n const config = dbConfig.dbConfig;\n const vectorStore = await this.initialize(\n engine,\n embeddings,\n tableName,\n config\n );\n\n await vectorStore.addDocuments(docs);\n\n return vectorStore;\n }\n\n async addVectors(\n vectors: number[][],\n documents: Document[],\n options?: { ids?: string[] }\n ): Promise<string[] | void> {\n let ids: string[] = [];\n const metadatas: Record<string, string>[] = [];\n\n if (vectors.length !== documents.length) {\n throw new Error(\n \"The number of vectors must match the number of documents provided.\"\n );\n }\n\n if (options?.ids) {\n ids = options.ids;\n } else {\n documents.forEach((document) => {\n if (document.id !== undefined) {\n ids.push(document.id);\n } else {\n ids.push(uuidv4());\n }\n });\n }\n\n if (options && options.ids && options.ids.length !== documents.length) {\n throw new Error(\n \"The number of ids must match the number of documents provided.\"\n );\n }\n\n documents.forEach((document) => {\n metadatas.push(document.metadata);\n });\n\n const tuples = customZip(ids, documents, vectors, metadatas);\n\n // Insert embeddings\n for (const [id, document, embedding, metadata] of tuples) {\n const metadataColNames =\n this.metadataColumns.length > 0\n ? `, \"${this.metadataColumns.join('\",\"')}\"`\n : \"\";\n\n let stmt = `INSERT INTO \"${this.schemaName}\".\"${this.tableName}\"(\"${this.idColumn}\", \"${this.contentColumn}\", \"${this.embeddingColumn}\" ${metadataColNames}`;\n const values: { [key: string]: string | string[] } = {\n id,\n content: document.pageContent,\n embedding: `[${embedding.toString()}]`,\n };\n let valuesStmt = \" VALUES (:id, :content, :embedding\";\n\n // Add metadata\n const extra = metadata;\n for (const metadataColumn of this.metadataColumns) {\n if (Object.prototype.hasOwnProperty.call(metadata, metadataColumn)) {\n valuesStmt += `, :${metadataColumn}`;\n values[metadataColumn] = metadata[metadataColumn];\n delete extra[metadataColumn];\n } else {\n valuesStmt += \" ,null\";\n }\n }\n\n // Add JSON column and/or close statement\n stmt += this.metadataJsonColumn ? `, ${this.metadataJsonColumn})` : \")\";\n if (this.metadataJsonColumn) {\n valuesStmt += \", :extra)\";\n Object.assign(values, { extra: JSON.stringify(extra) });\n } else {\n valuesStmt += \")\";\n }\n\n const query = stmt + valuesStmt;\n await this.engine.pool.raw(query, values);\n }\n\n return options?.ids;\n }\n\n _vectorstoreType(): string {\n return \"cloudsqlpostgresql\";\n }\n\n /**\n * Adds documents to the vector store, embedding them first through the\n * `embeddings` instance.\n *\n * @param documents - Array of documents to embed and add.\n * @param options - Optional configuration for embedding and storing documents.\n * @returns A promise resolving to an array of document IDs or void, based on implementation.\n * @abstract\n */\n async addDocuments(\n documents: Document[],\n options?: { ids?: string[] }\n ): Promise<string[] | void> {\n const texts = [];\n\n for (const doc of documents) {\n texts.push(doc.pageContent);\n }\n\n const embeddings = await this.embeddings.embedDocuments(texts);\n const results = await this.addVectors(embeddings, documents, options);\n\n return results;\n }\n\n /**\n * Deletes documents from the vector store based on the specified ids.\n *\n * @param params - Flexible key-value pairs defining conditions for document deletion.\n * @param ids - Optional: Property of {params} that contains the array of ids to be deleted\n * @returns A promise that resolves once the deletion is complete.\n */\n async delete(params: { ids?: string[] }): Promise<void> {\n if (params.ids === undefined) return;\n const idList = params.ids.map((id) => `'${id}'`).join(\", \");\n const query = `DELETE FROM \"${this.schemaName}\".\"${this.tableName}\" WHERE \"${this.idColumn}\" in (${idList})`;\n await this.engine.pool.raw(query);\n }\n\n async similaritySearchVectorWithScore(\n embedding: number[],\n k: number,\n filter?: this[\"FilterType\"]\n ): Promise<[Document, number][]> {\n const results = await this.queryCollection(embedding, k, filter);\n const documentsWithScores: [Document, number][] = [];\n\n for (const row of results) {\n const metadata =\n this.metadataJsonColumn && row[this.metadataJsonColumn]\n ? row[this.metadataJsonColumn]\n : {};\n\n for (const col of this.metadataColumns) {\n metadata[col] = row[col];\n }\n\n documentsWithScores.push([\n new Document({ pageContent: row[this.contentColumn], metadata }),\n row.distance,\n ]);\n }\n\n return documentsWithScores;\n }\n\n private async queryCollection(\n embedding: number[],\n k?: number | undefined,\n filter?: this[\"FilterType\"] | undefined\n ) {\n const fetchK = k ?? this.k;\n const { operator } = this.distanceStrategy;\n const { searchFunction } = this.distanceStrategy;\n const _filter = filter !== undefined ? `WHERE ${filter}` : \"\";\n const metadataColNames =\n this.metadataColumns.length > 0\n ? `, \"${this.metadataColumns.join('\",\"')}\"`\n : \"\";\n const metadataJsonColName = this.metadataJsonColumn\n ? `, \"${this.metadataJsonColumn}\"`\n : \"\";\n\n const query = `SELECT \"${this.idColumn}\", \"${this.contentColumn}\", \"${this.embeddingColumn}\" ${metadataColNames} ${metadataJsonColName}, ${searchFunction}(\"${this.embeddingColumn}\", '[${embedding}]') as distance FROM \"${this.schemaName}\".\"${this.tableName}\" ${_filter} ORDER BY \"${this.embeddingColumn}\" ${operator} '[${embedding}]' LIMIT ${fetchK};`;\n\n if (this.indexQueryOptions) {\n await this.engine.pool.raw(\n `SET LOCAL ${this.indexQueryOptions.to_string()}`\n );\n }\n\n const { rows } = await this.engine.pool.raw(query);\n\n return rows;\n }\n\n async maxMarginalRelevanceSearch(\n query: string,\n options: MaxMarginalRelevanceSearchOptions<this[\"FilterType\"]>\n ): Promise<Document[]> {\n const vector = await this.embeddings.embedQuery(query);\n const results = await this.queryCollection(\n vector,\n options?.k,\n options?.filter\n );\n const k = options?.k ? options.k : this.k;\n const documentsWithScores: [Document, number][] = [];\n let docsList: Document[] = [];\n\n const embeddingList = results.map((row: { [x: string]: string }) =>\n JSON.parse(row[this.embeddingColumn])\n );\n const mmrSelected = maximalMarginalRelevance(\n vector,\n embeddingList,\n options?.lambda,\n k\n );\n\n for (const row of results) {\n const metadata =\n this.metadataJsonColumn && row[this.metadataJsonColumn]\n ? row[this.metadataJsonColumn]\n : {};\n for (const col of this.metadataColumns) {\n metadata[col] = row[col];\n }\n documentsWithScores.push([\n new Document({\n pageContent: row[this.contentColumn],\n metadata,\n }),\n row.distance,\n ]);\n }\n\n docsList = documentsWithScores\n .filter((_, i) => mmrSelected.includes(i))\n .map(([doc, _]) => doc);\n\n return docsList;\n }\n\n /**\n * Create an index on the vector store table\n * @param {BaseIndex} index\n * @param {string} name Optional\n * @param {boolean} concurrently Optional\n */\n async applyVectorIndex(\n index: BaseIndex,\n name?: string,\n concurrently: boolean = false\n ): Promise<void> {\n if (index.constructor.name === \"ExactNearestNeighbor\") {\n await this.dropVectorIndex();\n return;\n }\n\n const filter =\n index.partialIndexes && index.partialIndexes?.length > 0\n ? `WHERE (${index.partialIndexes})`\n : \"\";\n const params = `WITH ${index.indexOptions()}`;\n const funct = index.distanceStrategy.indexFunction;\n\n let indexName = name;\n if (!indexName) {\n if (!index.name) {\n indexName = this.tableName + DEFAULT_INDEX_NAME_SUFFIX;\n } else {\n indexName = index.name;\n }\n }\n\n const stmt = `CREATE INDEX ${\n concurrently ? \"CONCURRENTLY\" : \"\"\n } ${indexName} ON \"${this.schemaName}\".\"${this.tableName}\" USING ${\n index.indexType\n } (${this.embeddingColumn} ${funct}) ${params} ${filter};`;\n\n await this.engine.pool.raw(stmt);\n }\n\n /**\n * Check if index exists in the table.\n * @param {string} indexName Optional - index name\n */\n async isValidIndex(indexName?: string): Promise<boolean> {\n const idxName = indexName || this.tableName + DEFAULT_INDEX_NAME_SUFFIX;\n const stmt = `SELECT tablename, indexname\n FROM pg_indexes\n WHERE tablename = '${this.tableName}' AND schemaname = '${this.schemaName}' AND indexname = '${idxName}';`;\n const { rows } = await this.engine.pool.raw(stmt);\n\n return rows.length === 1;\n }\n\n /**\n * Drop the vector index\n * @param {string} indexName Optional - index name\n */\n async dropVectorIndex(indexName?: string): Promise<void> {\n const idxName = indexName || this.tableName + DEFAULT_INDEX_NAME_SUFFIX;\n const query = `DROP INDEX IF EXISTS ${idxName};`;\n await this.engine.pool.raw(query);\n }\n\n /**\n * Re-index the vector store table\n * @param {string} indexName Optional - index name\n */\n async reIndex(indexName?: string) {\n const idxName = indexName || this.tableName + DEFAULT_INDEX_NAME_SUFFIX;\n const query = `REINDEX INDEX ${idxName};`;\n await this.engine.pool.raw(query);\n }\n}\n\nexport default PostgresVectorStore;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"vectorstore.cjs","names":["VectorStore","embeddings: EmbeddingsInterface","dbConfig: VSArgs","engine: PostgresEngine","tableName: string","DEFAULT_DISTANCE_STRATEGY","columns: { [key: string]: string }","allMetadataColumns: string[]","texts: string[]","metadatas: object[] | object","dbConfig: dbConfigArgs","documents: Document[]","Document","docs: Document[]","vectors: number[][]","options?: { ids?: string[] }","ids: string[]","metadatas: Record<string, string>[]","customZip","values: { [key: string]: string | string[] }","params: { ids?: string[] }","embedding: number[]","k: number","filter?: this[\"FilterType\"]","documentsWithScores: [Document, number][]","k?: number | undefined","filter?: this[\"FilterType\"] | undefined","filterBindings: Record<string, string>","query: string","options: MaxMarginalRelevanceSearchOptions<this[\"FilterType\"]>","docsList: Document[]","row: { [x: string]: string }","index: BaseIndex","name?: string","concurrently: boolean","DEFAULT_INDEX_NAME_SUFFIX","indexName?: string"],"sources":["../src/vectorstore.ts"],"sourcesContent":["import { EmbeddingsInterface } from \"@langchain/core/embeddings\";\nimport {\n MaxMarginalRelevanceSearchOptions,\n VectorStore,\n} from \"@langchain/core/vectorstores\";\nimport { Document } from \"@langchain/core/documents\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { maximalMarginalRelevance } from \"@langchain/core/utils/math\";\nimport {\n BaseIndex,\n DEFAULT_DISTANCE_STRATEGY,\n DEFAULT_INDEX_NAME_SUFFIX,\n DistanceStrategy,\n QueryOptions,\n} from \"./indexes.js\";\nimport PostgresEngine from \"./engine.js\";\nimport { customZip } from \"./utils/utils.js\";\n\nexport interface PostgresVectorStoreArgs {\n schemaName?: string;\n contentColumn?: string;\n embeddingColumn?: string;\n metadataColumns?: Array<string>;\n idColumn?: string;\n distanceStrategy?: DistanceStrategy;\n k?: number;\n fetchK?: number;\n lambdaMult?: number;\n ignoreMetadataColumns?: Array<string>;\n metadataJsonColumn?: string;\n indexQueryOptions?: QueryOptions;\n}\n\nexport interface dbConfigArgs {\n engine: PostgresEngine;\n tableName: string;\n dbConfig?: PostgresVectorStoreArgs;\n}\n\ninterface VSArgs {\n engine: PostgresEngine;\n tableName: string;\n schemaName: string;\n contentColumn: string;\n embeddingColumn: string;\n metadataColumns: Array<string>;\n idColumn: string;\n distanceStrategy: DistanceStrategy;\n k: number;\n fetchK: number;\n lambdaMult: number;\n metadataJsonColumn: string;\n indexQueryOptions?: QueryOptions;\n}\n\n/**\n * Google Cloud SQL for PostgreSQL vector store integration.\n *\n * Setup:\n * Install `@langchain/google-cloud-sql-pg`\n *\n * ```bash\n * npm install @langchain/google-cloud-sql-pg\n * ```\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { Column, PostgresEngine, PostgresEngineArgs, PostgresVectorStore, VectorStoreTableArgs } from \"@langchain/google-cloud-sql-pg\";\n * // Or other embeddings\n * import { OpenAIEmbeddings } from '@langchain/openai';\n *\n *\n * const embeddings = new OpenAIEmbeddings({\n * model: \"text-embedding-3-small\",\n * });\n *\n * const pgArgs: PostgresEngineArgs = {\n * user: \"db-user\",\n * password: \"password\"\n * }\n * // Create a shared connection pool\n * const engine: PostgresEngine = await PostgresEngine.fromInstance(\n * \"project-id\",\n * \"region\",\n * \"instance-name\",\n * \"database-name\",\n * pgArgs\n * );\n * // (Optional) Specify metadata columns for filtering\n * // All other metadata will be added to JSON\n * const vectorStoreTableArgs: VectorStoreTableArgs = {\n * metadataColumns: [new Column(\"baz\", \"TEXT\")],\n * };\n * // Create a vector store table\n * await engine.initVectorstoreTable(\"my-table\", 768, vectorStoreTableArgs);\n * // Customize the vector store\n * const pvectorArgs: PostgresVectorStoreArgs = {\n * idColumn: \"ID_COLUMN\",\n * contentColumn: \"CONTENT_COLUMN\",\n * embeddingColumn: \"EMBEDDING_COLUMN\",\n * metadataColumns: [\"baz\"]\n * }\n *\n * const vectorStore = await PostgresVectorStore.initialize(engine, embeddingService, \"my-table\", pvectorArgs);\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Add documents</strong></summary>\n *\n * ```typescript\n * import type { Document } from '@langchain/core/documents';\n *\n * const document1 = { pageContent: \"foo\", metadata: { baz: \"bar\" } };\n * const document2 = { pageContent: \"thud\", metadata: { bar: \"baz\" } };\n * const document3 = { pageContent: \"i will be deleted :(\", metadata: {} };\n *\n * const documents: Document[] = [document1, document2, document3];\n * const ids = [\"1\", \"2\", \"3\"];\n * await vectorStore.addDocuments(documents, { ids });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Delete documents</strong></summary>\n *\n * ```typescript\n * await vectorStore.delete({ ids: [\"3\"] });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Similarity search</strong></summary>\n *\n * ```typescript\n * const results = await vectorStore.similaritySearch(\"thud\", 1);\n * for (const doc of results) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:thud [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with filter</strong></summary>\n *\n * ```typescript\n * const resultsWithFilter = await vectorStore.similaritySearch(\"thud\", 1, { baz: \"bar\" });\n *\n * for (const doc of resultsWithFilter) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:foo [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with score</strong></summary>\n *\n * ```typescript\n * const resultsWithScore = await vectorStore.similaritySearchWithScore(\"qux\", 1);\n * for (const [doc, score] of resultsWithScore) {\n * console.log(`* [SIM=${score.toFixed(6)}] ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:[SIM=0.000000] qux [{\"bar\":\"baz\",\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>As a retriever</strong></summary>\n *\n * ```typescript\n * const retriever = vectorStore.asRetriever({\n * searchType: \"mmr\", // Leave blank for standard similarity search\n * k: 1,\n * });\n * const resultAsRetriever = await retriever.invoke(\"thud\");\n * console.log(resultAsRetriever);\n *\n * // Output: [Document({ metadata: { \"baz\":\"bar\" }, pageContent: \"thud\" })]\n * ```\n * </details>\n *\n * <br />\n */\nexport class PostgresVectorStore extends VectorStore {\n declare FilterType: Record<string, string>;\n\n engine: PostgresEngine;\n\n embeddings: EmbeddingsInterface;\n\n tableName: string;\n\n schemaName: string;\n\n contentColumn: string;\n\n embeddingColumn: string;\n\n metadataColumns: Array<string>;\n\n idColumn: string;\n\n metadataJsonColumn: string;\n\n distanceStrategy: DistanceStrategy;\n\n k: number;\n\n fetchK: number;\n\n lambdaMult: number;\n\n indexQueryOptions: QueryOptions | undefined;\n\n /**\n * Initializes a new vector store with embeddings and database configuration.\n *\n * @param embeddings - Instance of `EmbeddingsInterface` used to embed queries.\n * @param dbConfig - Configuration settings for the database or storage system.\n */\n constructor(embeddings: EmbeddingsInterface, dbConfig: VSArgs) {\n super(embeddings, dbConfig);\n this.embeddings = embeddings;\n this.engine = dbConfig.engine;\n this.tableName = dbConfig.tableName;\n this.schemaName = dbConfig.schemaName;\n this.contentColumn = dbConfig.contentColumn;\n this.embeddingColumn = dbConfig.embeddingColumn;\n this.metadataColumns = dbConfig.metadataColumns\n ? dbConfig.metadataColumns\n : [];\n this.idColumn = dbConfig.idColumn;\n this.metadataJsonColumn = dbConfig.metadataJsonColumn;\n this.distanceStrategy = dbConfig.distanceStrategy;\n this.k = dbConfig.k;\n this.fetchK = dbConfig.fetchK;\n this.lambdaMult = dbConfig.lambdaMult;\n this.indexQueryOptions = dbConfig.indexQueryOptions;\n }\n\n /**\n * Create a new PostgresVectorStore instance.\n * @param {PostgresEngine} engine Required - Connection pool engine for managing connections to Cloud SQL for PostgreSQL database.\n * @param {Embeddings} embeddings Required - Text embedding model to use.\n * @param {string} tableName Required - Name of an existing table or table to be created.\n * @param {string} schemaName Database schema name of the table. Defaults to \"public\".\n * @param {string} contentColumn Column that represent a Document's page_content. Defaults to \"content\".\n * @param {string} embeddingColumn Column for embedding vectors. The embedding is generated from the document value. Defaults to \"embedding\".\n * @param {Array<string>} metadataColumns Column(s) that represent a document's metadata.\n * @param {Array<string>} ignoreMetadataColumns Optional - Column(s) to ignore in pre-existing tables for a document's metadata. Can not be used with metadata_columns.\n * @param {string} idColumn Column that represents the Document's id. Defaults to \"langchain_id\".\n * @param {string} metadataJsonColumn Optional - Column to store metadata as JSON. Defaults to \"langchain_metadata\".\n * @param {DistanceStrategy} distanceStrategy Distance strategy to use for vector similarity search. Defaults to COSINE_DISTANCE.\n * @param {number} k Number of Documents to return from search. Defaults to 4.\n * @param {number} fetchK Number of Documents to fetch to pass to MMR algorithm.\n * @param {number} lambdaMult Number between 0 and 1 that determines the degree of diversity among the results with 0 corresponding to maximum diversity and 1 to minimum diversity. Defaults to 0.5.\n * @param {QueryOptions} indexQueryOptions Optional - Index query option.\n * @returns PostgresVectorStore instance.\n */\n static async initialize(\n engine: PostgresEngine,\n embeddings: EmbeddingsInterface,\n tableName: string,\n {\n schemaName = \"public\",\n contentColumn = \"content\",\n embeddingColumn = \"embedding\",\n metadataColumns = [],\n ignoreMetadataColumns,\n idColumn = \"langchain_id\",\n metadataJsonColumn = \"langchain_metadata\",\n distanceStrategy = DEFAULT_DISTANCE_STRATEGY,\n k = 4,\n fetchK = 20,\n lambdaMult = 0.5,\n indexQueryOptions,\n }: PostgresVectorStoreArgs = {}\n ): Promise<PostgresVectorStore> {\n if (metadataColumns !== undefined && ignoreMetadataColumns !== undefined) {\n throw Error(\n \"Can not use both metadata_columns and ignore_metadata_columns.\"\n );\n }\n\n const { rows } = await engine.pool.raw(\n `SELECT column_name, data_type FROM information_schema.columns WHERE table_name = '${tableName}' AND table_schema = '${schemaName}'`\n );\n const columns: { [key: string]: string } = {};\n\n for (const index in rows) {\n if (rows[index]) {\n const row = rows[index];\n columns[row.column_name] = row.data_type;\n }\n }\n\n if (!Object.prototype.hasOwnProperty.call(columns, idColumn)) {\n throw Error(`Id column: ${idColumn}, does not exist.`);\n }\n\n if (!Object.prototype.hasOwnProperty.call(columns, contentColumn)) {\n throw Error(`Content column: ${contentColumn}, does not exist.`);\n }\n\n const contentType = columns[contentColumn];\n\n if (contentType !== \"text\" && !contentType.includes(\"char\")) {\n throw Error(\n `Content column: ${contentColumn}, is type: ${contentType}. It must be a type of character string.`\n );\n }\n\n if (!Object.prototype.hasOwnProperty.call(columns, embeddingColumn)) {\n throw Error(`Embedding column: ${embeddingColumn}, does not exist.`);\n }\n\n if (columns[embeddingColumn] !== \"USER-DEFINED\") {\n throw Error(\n `Embedding column: ${embeddingColumn} is not of type Vector.`\n );\n }\n\n const jsonColumn = Object.prototype.hasOwnProperty.call(\n columns,\n metadataJsonColumn\n )\n ? metadataJsonColumn\n : \"\";\n\n for (const column of metadataColumns) {\n if (!Object.prototype.hasOwnProperty.call(columns, column)) {\n throw Error(`Metadata column: ${column}, does not exist.`);\n }\n }\n\n const allColumns = columns;\n let allMetadataColumns: string[] = [];\n if (\n ignoreMetadataColumns !== undefined &&\n ignoreMetadataColumns.length > 0\n ) {\n for (const column of ignoreMetadataColumns) {\n delete allColumns[column];\n }\n\n delete allColumns[idColumn];\n delete allColumns[contentColumn];\n delete allColumns[embeddingColumn];\n allMetadataColumns = Object.keys(allColumns);\n } else {\n for (const column of metadataColumns) {\n if (Object.prototype.hasOwnProperty.call(allColumns, column)) {\n allMetadataColumns.push(column);\n }\n }\n }\n return new PostgresVectorStore(embeddings, {\n engine,\n tableName,\n schemaName,\n contentColumn,\n embeddingColumn,\n metadataColumns: allMetadataColumns,\n idColumn,\n metadataJsonColumn: jsonColumn,\n distanceStrategy,\n k,\n fetchK,\n lambdaMult,\n indexQueryOptions,\n });\n }\n\n static async fromTexts(\n texts: string[],\n metadatas: object[] | object,\n embeddings: EmbeddingsInterface,\n dbConfig: dbConfigArgs\n ): Promise<VectorStore> {\n const documents: Document[] = [];\n\n for (let i = 0; i < texts.length; i += 1) {\n const doc = new Document({\n pageContent: texts[i],\n metadata: Array.isArray(metadatas) ? metadatas[i] : metadatas,\n });\n documents.push(doc);\n }\n\n return PostgresVectorStore.fromDocuments(documents, embeddings, dbConfig);\n }\n\n static async fromDocuments(\n docs: Document[],\n embeddings: EmbeddingsInterface,\n dbConfig: dbConfigArgs\n ): Promise<VectorStore> {\n const { engine } = dbConfig;\n const { tableName } = dbConfig;\n const config = dbConfig.dbConfig;\n const vectorStore = await this.initialize(\n engine,\n embeddings,\n tableName,\n config\n );\n\n await vectorStore.addDocuments(docs);\n\n return vectorStore;\n }\n\n async addVectors(\n vectors: number[][],\n documents: Document[],\n options?: { ids?: string[] }\n ): Promise<string[] | void> {\n let ids: string[] = [];\n const metadatas: Record<string, string>[] = [];\n\n if (vectors.length !== documents.length) {\n throw new Error(\n \"The number of vectors must match the number of documents provided.\"\n );\n }\n\n if (options?.ids) {\n ids = options.ids;\n } else {\n documents.forEach((document) => {\n if (document.id !== undefined) {\n ids.push(document.id);\n } else {\n ids.push(uuidv4());\n }\n });\n }\n\n if (options && options.ids && options.ids.length !== documents.length) {\n throw new Error(\n \"The number of ids must match the number of documents provided.\"\n );\n }\n\n documents.forEach((document) => {\n metadatas.push(document.metadata);\n });\n\n const tuples = customZip(ids, documents, vectors, metadatas);\n\n // Insert embeddings\n for (const [id, document, embedding, metadata] of tuples) {\n const metadataColNames =\n this.metadataColumns.length > 0\n ? `, \"${this.metadataColumns.join('\",\"')}\"`\n : \"\";\n\n let stmt = `INSERT INTO \"${this.schemaName}\".\"${this.tableName}\"(\"${this.idColumn}\", \"${this.contentColumn}\", \"${this.embeddingColumn}\" ${metadataColNames}`;\n const values: { [key: string]: string | string[] } = {\n id,\n content: document.pageContent,\n embedding: `[${embedding.toString()}]`,\n };\n let valuesStmt = \" VALUES (:id, :content, :embedding\";\n\n // Add metadata\n const extra = metadata;\n for (const metadataColumn of this.metadataColumns) {\n if (Object.prototype.hasOwnProperty.call(metadata, metadataColumn)) {\n valuesStmt += `, :${metadataColumn}`;\n values[metadataColumn] = metadata[metadataColumn];\n delete extra[metadataColumn];\n } else {\n valuesStmt += \" ,null\";\n }\n }\n\n // Add JSON column and/or close statement\n stmt += this.metadataJsonColumn ? `, ${this.metadataJsonColumn})` : \")\";\n if (this.metadataJsonColumn) {\n valuesStmt += \", :extra)\";\n Object.assign(values, { extra: JSON.stringify(extra) });\n } else {\n valuesStmt += \")\";\n }\n\n const query = stmt + valuesStmt;\n await this.engine.pool.raw(query, values);\n }\n\n return options?.ids;\n }\n\n _vectorstoreType(): string {\n return \"cloudsqlpostgresql\";\n }\n\n /**\n * Adds documents to the vector store, embedding them first through the\n * `embeddings` instance.\n *\n * @param documents - Array of documents to embed and add.\n * @param options - Optional configuration for embedding and storing documents.\n * @returns A promise resolving to an array of document IDs or void, based on implementation.\n * @abstract\n */\n async addDocuments(\n documents: Document[],\n options?: { ids?: string[] }\n ): Promise<string[] | void> {\n const texts = [];\n\n for (const doc of documents) {\n texts.push(doc.pageContent);\n }\n\n const embeddings = await this.embeddings.embedDocuments(texts);\n const results = await this.addVectors(embeddings, documents, options);\n\n return results;\n }\n\n /**\n * Deletes documents from the vector store based on the specified ids.\n *\n * @param params - Flexible key-value pairs defining conditions for document deletion.\n * @param ids - Optional: Property of {params} that contains the array of ids to be deleted\n * @returns A promise that resolves once the deletion is complete.\n */\n async delete(params: { ids?: string[] }): Promise<void> {\n if (params.ids === undefined) return;\n const idList = params.ids.map((id) => `'${id}'`).join(\", \");\n const query = `DELETE FROM \"${this.schemaName}\".\"${this.tableName}\" WHERE \"${this.idColumn}\" in (${idList})`;\n await this.engine.pool.raw(query);\n }\n\n async similaritySearchVectorWithScore(\n embedding: number[],\n k: number,\n filter?: this[\"FilterType\"]\n ): Promise<[Document, number][]> {\n const results = await this.queryCollection(embedding, k, filter);\n const documentsWithScores: [Document, number][] = [];\n\n for (const row of results) {\n const metadata =\n this.metadataJsonColumn && row[this.metadataJsonColumn]\n ? row[this.metadataJsonColumn]\n : {};\n\n for (const col of this.metadataColumns) {\n metadata[col] = row[col];\n }\n\n documentsWithScores.push([\n new Document({ pageContent: row[this.contentColumn], metadata }),\n row.distance,\n ]);\n }\n\n return documentsWithScores;\n }\n\n private async queryCollection(\n embedding: number[],\n k?: number | undefined,\n filter?: this[\"FilterType\"] | undefined\n ) {\n const fetchK = k ?? this.k;\n const { operator } = this.distanceStrategy;\n const { searchFunction } = this.distanceStrategy;\n const filterColumns = filter !== undefined ? Object.keys(filter) : [];\n const filterBindings: Record<string, string> = {};\n let _filter = \"\";\n if (filterColumns.length > 0) {\n const conditions = filterColumns.map((col, i) => {\n const bindingKey = `filter_${i}`;\n filterBindings[bindingKey] = filter[col];\n return `\"${col.replace(/\"/g, '\"\"')}\" = :${bindingKey}`;\n });\n _filter = `WHERE ${conditions.join(\" AND \")}`;\n }\n const metadataColNames =\n this.metadataColumns.length > 0\n ? `, \"${this.metadataColumns.join('\",\"')}\"`\n : \"\";\n const metadataJsonColName = this.metadataJsonColumn\n ? `, \"${this.metadataJsonColumn}\"`\n : \"\";\n\n const query = `SELECT \"${this.idColumn}\", \"${this.contentColumn}\", \"${this.embeddingColumn}\" ${metadataColNames} ${metadataJsonColName}, ${searchFunction}(\"${this.embeddingColumn}\", '[${embedding}]') as distance FROM \"${this.schemaName}\".\"${this.tableName}\" ${_filter} ORDER BY \"${this.embeddingColumn}\" ${operator} '[${embedding}]' LIMIT ${fetchK};`;\n\n if (this.indexQueryOptions) {\n await this.engine.pool.raw(\n `SET LOCAL ${this.indexQueryOptions.to_string()}`\n );\n }\n\n const { rows } = await this.engine.pool.raw(query, filterBindings);\n\n return rows;\n }\n\n async maxMarginalRelevanceSearch(\n query: string,\n options: MaxMarginalRelevanceSearchOptions<this[\"FilterType\"]>\n ): Promise<Document[]> {\n const vector = await this.embeddings.embedQuery(query);\n const results = await this.queryCollection(\n vector,\n options?.k,\n options?.filter\n );\n const k = options?.k ? options.k : this.k;\n const documentsWithScores: [Document, number][] = [];\n let docsList: Document[] = [];\n\n const embeddingList = results.map((row: { [x: string]: string }) =>\n JSON.parse(row[this.embeddingColumn])\n );\n const mmrSelected = maximalMarginalRelevance(\n vector,\n embeddingList,\n options?.lambda,\n k\n );\n\n for (const row of results) {\n const metadata =\n this.metadataJsonColumn && row[this.metadataJsonColumn]\n ? row[this.metadataJsonColumn]\n : {};\n for (const col of this.metadataColumns) {\n metadata[col] = row[col];\n }\n documentsWithScores.push([\n new Document({\n pageContent: row[this.contentColumn],\n metadata,\n }),\n row.distance,\n ]);\n }\n\n docsList = documentsWithScores\n .filter((_, i) => mmrSelected.includes(i))\n .map(([doc, _]) => doc);\n\n return docsList;\n }\n\n /**\n * Create an index on the vector store table\n * @param {BaseIndex} index\n * @param {string} name Optional\n * @param {boolean} concurrently Optional\n */\n async applyVectorIndex(\n index: BaseIndex,\n name?: string,\n concurrently: boolean = false\n ): Promise<void> {\n if (index.constructor.name === \"ExactNearestNeighbor\") {\n await this.dropVectorIndex();\n return;\n }\n\n const filter =\n index.partialIndexes && index.partialIndexes?.length > 0\n ? `WHERE (${index.partialIndexes})`\n : \"\";\n const params = `WITH ${index.indexOptions()}`;\n const funct = index.distanceStrategy.indexFunction;\n\n let indexName = name;\n if (!indexName) {\n if (!index.name) {\n indexName = this.tableName + DEFAULT_INDEX_NAME_SUFFIX;\n } else {\n indexName = index.name;\n }\n }\n\n const stmt = `CREATE INDEX ${\n concurrently ? \"CONCURRENTLY\" : \"\"\n } ${indexName} ON \"${this.schemaName}\".\"${this.tableName}\" USING ${\n index.indexType\n } (${this.embeddingColumn} ${funct}) ${params} ${filter};`;\n\n await this.engine.pool.raw(stmt);\n }\n\n /**\n * Check if index exists in the table.\n * @param {string} indexName Optional - index name\n */\n async isValidIndex(indexName?: string): Promise<boolean> {\n const idxName = indexName || this.tableName + DEFAULT_INDEX_NAME_SUFFIX;\n const stmt = `SELECT tablename, indexname\n FROM pg_indexes\n WHERE tablename = '${this.tableName}' AND schemaname = '${this.schemaName}' AND indexname = '${idxName}';`;\n const { rows } = await this.engine.pool.raw(stmt);\n\n return rows.length === 1;\n }\n\n /**\n * Drop the vector index\n * @param {string} indexName Optional - index name\n */\n async dropVectorIndex(indexName?: string): Promise<void> {\n const idxName = indexName || this.tableName + DEFAULT_INDEX_NAME_SUFFIX;\n const query = `DROP INDEX IF EXISTS ${idxName};`;\n await this.engine.pool.raw(query);\n }\n\n /**\n * Re-index the vector store table\n * @param {string} indexName Optional - index name\n */\n async reIndex(indexName?: string) {\n const idxName = indexName || this.tableName + DEFAULT_INDEX_NAME_SUFFIX;\n const query = `REINDEX INDEX ${idxName};`;\n await this.engine.pool.raw(query);\n }\n}\n\nexport default PostgresVectorStore;\n"],"mappings":"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"}
|
package/dist/vectorstore.d.cts
CHANGED
|
@@ -142,7 +142,7 @@ interface VSArgs {
|
|
|
142
142
|
* <summary><strong>Similarity search with filter</strong></summary>
|
|
143
143
|
*
|
|
144
144
|
* ```typescript
|
|
145
|
-
* const resultsWithFilter = await vectorStore.similaritySearch("thud", 1,
|
|
145
|
+
* const resultsWithFilter = await vectorStore.similaritySearch("thud", 1, { baz: "bar" });
|
|
146
146
|
*
|
|
147
147
|
* for (const doc of resultsWithFilter) {
|
|
148
148
|
* console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);
|
|
@@ -186,7 +186,7 @@ interface VSArgs {
|
|
|
186
186
|
* <br />
|
|
187
187
|
*/
|
|
188
188
|
declare class PostgresVectorStore extends VectorStore {
|
|
189
|
-
FilterType: string
|
|
189
|
+
FilterType: Record<string, string>;
|
|
190
190
|
engine: PostgresEngine;
|
|
191
191
|
embeddings: EmbeddingsInterface;
|
|
192
192
|
tableName: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vectorstore.d.cts","names":["EmbeddingsInterface","MaxMarginalRelevanceSearchOptions","VectorStore","Document","BaseIndex","DistanceStrategy","QueryOptions","PostgresEngine","PostgresVectorStoreArgs","Array","dbConfigArgs","VSArgs","PostgresVectorStore","schemaName","contentColumn","embeddingColumn","metadataColumns","ignoreMetadataColumns","idColumn","metadataJsonColumn","distanceStrategy","k","fetchK","lambdaMult","indexQueryOptions","Promise","default"],"sources":["../src/vectorstore.d.ts"],"sourcesContent":["import { EmbeddingsInterface } from \"@langchain/core/embeddings\";\nimport { MaxMarginalRelevanceSearchOptions, VectorStore } from \"@langchain/core/vectorstores\";\nimport { Document } from \"@langchain/core/documents\";\nimport { BaseIndex, DistanceStrategy, QueryOptions } from \"./indexes.js\";\nimport PostgresEngine from \"./engine.js\";\nexport interface PostgresVectorStoreArgs {\n schemaName?: string;\n contentColumn?: string;\n embeddingColumn?: string;\n metadataColumns?: Array<string>;\n idColumn?: string;\n distanceStrategy?: DistanceStrategy;\n k?: number;\n fetchK?: number;\n lambdaMult?: number;\n ignoreMetadataColumns?: Array<string>;\n metadataJsonColumn?: string;\n indexQueryOptions?: QueryOptions;\n}\nexport interface dbConfigArgs {\n engine: PostgresEngine;\n tableName: string;\n dbConfig?: PostgresVectorStoreArgs;\n}\ninterface VSArgs {\n engine: PostgresEngine;\n tableName: string;\n schemaName: string;\n contentColumn: string;\n embeddingColumn: string;\n metadataColumns: Array<string>;\n idColumn: string;\n distanceStrategy: DistanceStrategy;\n k: number;\n fetchK: number;\n lambdaMult: number;\n metadataJsonColumn: string;\n indexQueryOptions?: QueryOptions;\n}\n/**\n * Google Cloud SQL for PostgreSQL vector store integration.\n *\n * Setup:\n * Install `@langchain/google-cloud-sql-pg`\n *\n * ```bash\n * npm install @langchain/google-cloud-sql-pg\n * ```\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { Column, PostgresEngine, PostgresEngineArgs, PostgresVectorStore, VectorStoreTableArgs } from \"@langchain/google-cloud-sql-pg\";\n * // Or other embeddings\n * import { OpenAIEmbeddings } from '@langchain/openai';\n *\n *\n * const embeddings = new OpenAIEmbeddings({\n * model: \"text-embedding-3-small\",\n * });\n *\n * const pgArgs: PostgresEngineArgs = {\n * user: \"db-user\",\n * password: \"password\"\n * }\n * // Create a shared connection pool\n * const engine: PostgresEngine = await PostgresEngine.fromInstance(\n * \"project-id\",\n * \"region\",\n * \"instance-name\",\n * \"database-name\",\n * pgArgs\n * );\n * // (Optional) Specify metadata columns for filtering\n * // All other metadata will be added to JSON\n * const vectorStoreTableArgs: VectorStoreTableArgs = {\n * metadataColumns: [new Column(\"baz\", \"TEXT\")],\n * };\n * // Create a vector store table\n * await engine.initVectorstoreTable(\"my-table\", 768, vectorStoreTableArgs);\n * // Customize the vector store\n * const pvectorArgs: PostgresVectorStoreArgs = {\n * idColumn: \"ID_COLUMN\",\n * contentColumn: \"CONTENT_COLUMN\",\n * embeddingColumn: \"EMBEDDING_COLUMN\",\n * metadataColumns: [\"baz\"]\n * }\n *\n * const vectorStore = await PostgresVectorStore.initialize(engine, embeddingService, \"my-table\", pvectorArgs);\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Add documents</strong></summary>\n *\n * ```typescript\n * import type { Document } from '@langchain/core/documents';\n *\n * const document1 = { pageContent: \"foo\", metadata: { baz: \"bar\" } };\n * const document2 = { pageContent: \"thud\", metadata: { bar: \"baz\" } };\n * const document3 = { pageContent: \"i will be deleted :(\", metadata: {} };\n *\n * const documents: Document[] = [document1, document2, document3];\n * const ids = [\"1\", \"2\", \"3\"];\n * await vectorStore.addDocuments(documents, { ids });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Delete documents</strong></summary>\n *\n * ```typescript\n * await vectorStore.delete({ ids: [\"3\"] });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Similarity search</strong></summary>\n *\n * ```typescript\n * const results = await vectorStore.similaritySearch(\"thud\", 1);\n * for (const doc of results) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:thud [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with filter</strong></summary>\n *\n * ```typescript\n * const resultsWithFilter = await vectorStore.similaritySearch(\"thud\", 1, \"baz = 'bar'\");\n *\n * for (const doc of resultsWithFilter) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:foo [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with score</strong></summary>\n *\n * ```typescript\n * const resultsWithScore = await vectorStore.similaritySearchWithScore(\"qux\", 1);\n * for (const [doc, score] of resultsWithScore) {\n * console.log(`* [SIM=${score.toFixed(6)}] ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:[SIM=0.000000] qux [{\"bar\":\"baz\",\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>As a retriever</strong></summary>\n *\n * ```typescript\n * const retriever = vectorStore.asRetriever({\n * searchType: \"mmr\", // Leave blank for standard similarity search\n * k: 1,\n * });\n * const resultAsRetriever = await retriever.invoke(\"thud\");\n * console.log(resultAsRetriever);\n *\n * // Output: [Document({ metadata: { \"baz\":\"bar\" }, pageContent: \"thud\" })]\n * ```\n * </details>\n *\n * <br />\n */\nexport declare class PostgresVectorStore extends VectorStore {\n FilterType: string;\n engine: PostgresEngine;\n embeddings: EmbeddingsInterface;\n tableName: string;\n schemaName: string;\n contentColumn: string;\n embeddingColumn: string;\n metadataColumns: Array<string>;\n idColumn: string;\n metadataJsonColumn: string;\n distanceStrategy: DistanceStrategy;\n k: number;\n fetchK: number;\n lambdaMult: number;\n indexQueryOptions: QueryOptions | undefined;\n /**\n * Initializes a new vector store with embeddings and database configuration.\n *\n * @param embeddings - Instance of `EmbeddingsInterface` used to embed queries.\n * @param dbConfig - Configuration settings for the database or storage system.\n */\n constructor(embeddings: EmbeddingsInterface, dbConfig: VSArgs);\n /**\n * Create a new PostgresVectorStore instance.\n * @param {PostgresEngine} engine Required - Connection pool engine for managing connections to Cloud SQL for PostgreSQL database.\n * @param {Embeddings} embeddings Required - Text embedding model to use.\n * @param {string} tableName Required - Name of an existing table or table to be created.\n * @param {string} schemaName Database schema name of the table. Defaults to \"public\".\n * @param {string} contentColumn Column that represent a Document's page_content. Defaults to \"content\".\n * @param {string} embeddingColumn Column for embedding vectors. The embedding is generated from the document value. Defaults to \"embedding\".\n * @param {Array<string>} metadataColumns Column(s) that represent a document's metadata.\n * @param {Array<string>} ignoreMetadataColumns Optional - Column(s) to ignore in pre-existing tables for a document's metadata. Can not be used with metadata_columns.\n * @param {string} idColumn Column that represents the Document's id. Defaults to \"langchain_id\".\n * @param {string} metadataJsonColumn Optional - Column to store metadata as JSON. Defaults to \"langchain_metadata\".\n * @param {DistanceStrategy} distanceStrategy Distance strategy to use for vector similarity search. Defaults to COSINE_DISTANCE.\n * @param {number} k Number of Documents to return from search. Defaults to 4.\n * @param {number} fetchK Number of Documents to fetch to pass to MMR algorithm.\n * @param {number} lambdaMult Number between 0 and 1 that determines the degree of diversity among the results with 0 corresponding to maximum diversity and 1 to minimum diversity. Defaults to 0.5.\n * @param {QueryOptions} indexQueryOptions Optional - Index query option.\n * @returns PostgresVectorStore instance.\n */\n static initialize(engine: PostgresEngine, embeddings: EmbeddingsInterface, tableName: string, { schemaName, contentColumn, embeddingColumn, metadataColumns, ignoreMetadataColumns, idColumn, metadataJsonColumn, distanceStrategy, k, fetchK, lambdaMult, indexQueryOptions }?: PostgresVectorStoreArgs): Promise<PostgresVectorStore>;\n static fromTexts(texts: string[], metadatas: object[] | object, embeddings: EmbeddingsInterface, dbConfig: dbConfigArgs): Promise<VectorStore>;\n static fromDocuments(docs: Document[], embeddings: EmbeddingsInterface, dbConfig: dbConfigArgs): Promise<VectorStore>;\n addVectors(vectors: number[][], documents: Document[], options?: {\n ids?: string[];\n }): Promise<string[] | void>;\n _vectorstoreType(): string;\n /**\n * Adds documents to the vector store, embedding them first through the\n * `embeddings` instance.\n *\n * @param documents - Array of documents to embed and add.\n * @param options - Optional configuration for embedding and storing documents.\n * @returns A promise resolving to an array of document IDs or void, based on implementation.\n * @abstract\n */\n addDocuments(documents: Document[], options?: {\n ids?: string[];\n }): Promise<string[] | void>;\n /**\n * Deletes documents from the vector store based on the specified ids.\n *\n * @param params - Flexible key-value pairs defining conditions for document deletion.\n * @param ids - Optional: Property of {params} that contains the array of ids to be deleted\n * @returns A promise that resolves once the deletion is complete.\n */\n delete(params: {\n ids?: string[];\n }): Promise<void>;\n similaritySearchVectorWithScore(embedding: number[], k: number, filter?: this[\"FilterType\"]): Promise<[Document, number][]>;\n private queryCollection;\n maxMarginalRelevanceSearch(query: string, options: MaxMarginalRelevanceSearchOptions<this[\"FilterType\"]>): Promise<Document[]>;\n /**\n * Create an index on the vector store table\n * @param {BaseIndex} index\n * @param {string} name Optional\n * @param {boolean} concurrently Optional\n */\n applyVectorIndex(index: BaseIndex, name?: string, concurrently?: boolean): Promise<void>;\n /**\n * Check if index exists in the table.\n * @param {string} indexName Optional - index name\n */\n isValidIndex(indexName?: string): Promise<boolean>;\n /**\n * Drop the vector index\n * @param {string} indexName Optional - index name\n */\n dropVectorIndex(indexName?: string): Promise<void>;\n /**\n * Re-index the vector store table\n * @param {string} indexName Optional - index name\n */\n reIndex(indexName?: string): Promise<void>;\n}\nexport default PostgresVectorStore;\n//# sourceMappingURL=vectorstore.d.ts.map"],"mappings":";;;;;;;UAKiBQ,uBAAAA;;EAAAA,aAAAA,CAAAA,EAAAA,MAAAA;EAIKC,eAAAA,CAAAA,EAAAA,MAAAA;EAECJ,eAAAA,CAAAA,EAFDI,KAECJ,CAAAA,MAAAA,CAAAA;EAIKI,QAAAA,CAAAA,EAAAA,MAAAA;EAEJH,gBAAAA,CAAAA,EANDD,gBAMCC;EAAY,CAAA,CAAA,EAAA,MAAA;EAEnBI,MAAAA,CAAAA,EAAAA,MAAY;EAKnBC,UAAM,CAAA,EAAA,MAAA;EACJJ,qBAAAA,CAAAA,EAVgBE,KAUhBF,CAAAA,MAAAA,CAAAA;EAKSE,kBAAAA,CAAAA,EAAAA,MAAAA;EAECJ,iBAAAA,CAAAA,EAfEC,YAeFD;;AAKc,UAlBnBK,YAAAA,CAkBmB;EAoJfE,MAAAA,EArKTL,cAqK4B;EAE5BA,SAAAA,EAAAA,MAAAA;EACIP,QAAAA,CAAAA,EAtKDQ,uBAsKCR;;UApKNW,MAAAA,CA4KYN;EAICC,MAAAA,EA/KXC,cA+KWD;EAOKN,SAAAA,EAAAA,MAAAA;EAA+BW,UAAAA,EAAAA,MAAAA;EAoB7BJ,aAAAA,EAAAA,MAAAA;EAA4BP,eAAAA,EAAAA,MAAAA;EAA0Ca,eAAAA,EArM/EJ,KAqM+EI,CAAAA,MAAAA,CAAAA;EAAYC,QAAAA,EAAAA,MAAAA;EAAeC,gBAAAA,EAnMzGV,gBAmMyGU;EAAiBC,CAAAA,EAAAA,MAAAA;EAAiBC,MAAAA,EAAAA,MAAAA;EAAuBC,UAAAA,EAAAA,MAAAA;EAAUC,kBAAAA,EAAAA,MAAAA;EAAoBC,iBAAAA,CAAAA,EA9L9Ld,YA8L8Lc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA1C1J;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAvCR,mBAAAA,SAA4BV,WAAAA;;UAErCK;cACIP;;;;;mBAKKS;;;oBAGCJ;;;;qBAICC;;;;;;;0BAOKN,+BAA+BW;;;;;;;;;;;;;;;;;;;;4BAoB7BJ,4BAA4BP;;;;;;;;;;;;;MAA2NQ,0BAA0BiB,QAAQb;8EACvOZ,+BAA+BU,eAAee,QAAQvB;6BACvGC,wBAAwBH,+BAA+BU,eAAee,QAAQvB;6CAC9DC;;MAEvCsB;;;;;;;;;;;0BAWoBtB;;MAEpBsB;;;;;;;;;;MAUAA;gGAC0FA,SAAStB;;qDAEpDF,wDAAwDwB,QAAQtB;;;;;;;0BAO3FC,mDAAmDqB;;;;;oCAKzCA;;;;;uCAKGA;;;;;+BAKRA"}
|
|
1
|
+
{"version":3,"file":"vectorstore.d.cts","names":["EmbeddingsInterface","MaxMarginalRelevanceSearchOptions","VectorStore","Document","BaseIndex","DistanceStrategy","QueryOptions","PostgresEngine","PostgresVectorStoreArgs","Array","dbConfigArgs","VSArgs","PostgresVectorStore","Record","schemaName","contentColumn","embeddingColumn","metadataColumns","ignoreMetadataColumns","idColumn","metadataJsonColumn","distanceStrategy","k","fetchK","lambdaMult","indexQueryOptions","Promise","default"],"sources":["../src/vectorstore.d.ts"],"sourcesContent":["import { EmbeddingsInterface } from \"@langchain/core/embeddings\";\nimport { MaxMarginalRelevanceSearchOptions, VectorStore } from \"@langchain/core/vectorstores\";\nimport { Document } from \"@langchain/core/documents\";\nimport { BaseIndex, DistanceStrategy, QueryOptions } from \"./indexes.js\";\nimport PostgresEngine from \"./engine.js\";\nexport interface PostgresVectorStoreArgs {\n schemaName?: string;\n contentColumn?: string;\n embeddingColumn?: string;\n metadataColumns?: Array<string>;\n idColumn?: string;\n distanceStrategy?: DistanceStrategy;\n k?: number;\n fetchK?: number;\n lambdaMult?: number;\n ignoreMetadataColumns?: Array<string>;\n metadataJsonColumn?: string;\n indexQueryOptions?: QueryOptions;\n}\nexport interface dbConfigArgs {\n engine: PostgresEngine;\n tableName: string;\n dbConfig?: PostgresVectorStoreArgs;\n}\ninterface VSArgs {\n engine: PostgresEngine;\n tableName: string;\n schemaName: string;\n contentColumn: string;\n embeddingColumn: string;\n metadataColumns: Array<string>;\n idColumn: string;\n distanceStrategy: DistanceStrategy;\n k: number;\n fetchK: number;\n lambdaMult: number;\n metadataJsonColumn: string;\n indexQueryOptions?: QueryOptions;\n}\n/**\n * Google Cloud SQL for PostgreSQL vector store integration.\n *\n * Setup:\n * Install `@langchain/google-cloud-sql-pg`\n *\n * ```bash\n * npm install @langchain/google-cloud-sql-pg\n * ```\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { Column, PostgresEngine, PostgresEngineArgs, PostgresVectorStore, VectorStoreTableArgs } from \"@langchain/google-cloud-sql-pg\";\n * // Or other embeddings\n * import { OpenAIEmbeddings } from '@langchain/openai';\n *\n *\n * const embeddings = new OpenAIEmbeddings({\n * model: \"text-embedding-3-small\",\n * });\n *\n * const pgArgs: PostgresEngineArgs = {\n * user: \"db-user\",\n * password: \"password\"\n * }\n * // Create a shared connection pool\n * const engine: PostgresEngine = await PostgresEngine.fromInstance(\n * \"project-id\",\n * \"region\",\n * \"instance-name\",\n * \"database-name\",\n * pgArgs\n * );\n * // (Optional) Specify metadata columns for filtering\n * // All other metadata will be added to JSON\n * const vectorStoreTableArgs: VectorStoreTableArgs = {\n * metadataColumns: [new Column(\"baz\", \"TEXT\")],\n * };\n * // Create a vector store table\n * await engine.initVectorstoreTable(\"my-table\", 768, vectorStoreTableArgs);\n * // Customize the vector store\n * const pvectorArgs: PostgresVectorStoreArgs = {\n * idColumn: \"ID_COLUMN\",\n * contentColumn: \"CONTENT_COLUMN\",\n * embeddingColumn: \"EMBEDDING_COLUMN\",\n * metadataColumns: [\"baz\"]\n * }\n *\n * const vectorStore = await PostgresVectorStore.initialize(engine, embeddingService, \"my-table\", pvectorArgs);\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Add documents</strong></summary>\n *\n * ```typescript\n * import type { Document } from '@langchain/core/documents';\n *\n * const document1 = { pageContent: \"foo\", metadata: { baz: \"bar\" } };\n * const document2 = { pageContent: \"thud\", metadata: { bar: \"baz\" } };\n * const document3 = { pageContent: \"i will be deleted :(\", metadata: {} };\n *\n * const documents: Document[] = [document1, document2, document3];\n * const ids = [\"1\", \"2\", \"3\"];\n * await vectorStore.addDocuments(documents, { ids });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Delete documents</strong></summary>\n *\n * ```typescript\n * await vectorStore.delete({ ids: [\"3\"] });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Similarity search</strong></summary>\n *\n * ```typescript\n * const results = await vectorStore.similaritySearch(\"thud\", 1);\n * for (const doc of results) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:thud [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with filter</strong></summary>\n *\n * ```typescript\n * const resultsWithFilter = await vectorStore.similaritySearch(\"thud\", 1, { baz: \"bar\" });\n *\n * for (const doc of resultsWithFilter) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:foo [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with score</strong></summary>\n *\n * ```typescript\n * const resultsWithScore = await vectorStore.similaritySearchWithScore(\"qux\", 1);\n * for (const [doc, score] of resultsWithScore) {\n * console.log(`* [SIM=${score.toFixed(6)}] ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:[SIM=0.000000] qux [{\"bar\":\"baz\",\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>As a retriever</strong></summary>\n *\n * ```typescript\n * const retriever = vectorStore.asRetriever({\n * searchType: \"mmr\", // Leave blank for standard similarity search\n * k: 1,\n * });\n * const resultAsRetriever = await retriever.invoke(\"thud\");\n * console.log(resultAsRetriever);\n *\n * // Output: [Document({ metadata: { \"baz\":\"bar\" }, pageContent: \"thud\" })]\n * ```\n * </details>\n *\n * <br />\n */\nexport declare class PostgresVectorStore extends VectorStore {\n FilterType: Record<string, string>;\n engine: PostgresEngine;\n embeddings: EmbeddingsInterface;\n tableName: string;\n schemaName: string;\n contentColumn: string;\n embeddingColumn: string;\n metadataColumns: Array<string>;\n idColumn: string;\n metadataJsonColumn: string;\n distanceStrategy: DistanceStrategy;\n k: number;\n fetchK: number;\n lambdaMult: number;\n indexQueryOptions: QueryOptions | undefined;\n /**\n * Initializes a new vector store with embeddings and database configuration.\n *\n * @param embeddings - Instance of `EmbeddingsInterface` used to embed queries.\n * @param dbConfig - Configuration settings for the database or storage system.\n */\n constructor(embeddings: EmbeddingsInterface, dbConfig: VSArgs);\n /**\n * Create a new PostgresVectorStore instance.\n * @param {PostgresEngine} engine Required - Connection pool engine for managing connections to Cloud SQL for PostgreSQL database.\n * @param {Embeddings} embeddings Required - Text embedding model to use.\n * @param {string} tableName Required - Name of an existing table or table to be created.\n * @param {string} schemaName Database schema name of the table. Defaults to \"public\".\n * @param {string} contentColumn Column that represent a Document's page_content. Defaults to \"content\".\n * @param {string} embeddingColumn Column for embedding vectors. The embedding is generated from the document value. Defaults to \"embedding\".\n * @param {Array<string>} metadataColumns Column(s) that represent a document's metadata.\n * @param {Array<string>} ignoreMetadataColumns Optional - Column(s) to ignore in pre-existing tables for a document's metadata. Can not be used with metadata_columns.\n * @param {string} idColumn Column that represents the Document's id. Defaults to \"langchain_id\".\n * @param {string} metadataJsonColumn Optional - Column to store metadata as JSON. Defaults to \"langchain_metadata\".\n * @param {DistanceStrategy} distanceStrategy Distance strategy to use for vector similarity search. Defaults to COSINE_DISTANCE.\n * @param {number} k Number of Documents to return from search. Defaults to 4.\n * @param {number} fetchK Number of Documents to fetch to pass to MMR algorithm.\n * @param {number} lambdaMult Number between 0 and 1 that determines the degree of diversity among the results with 0 corresponding to maximum diversity and 1 to minimum diversity. Defaults to 0.5.\n * @param {QueryOptions} indexQueryOptions Optional - Index query option.\n * @returns PostgresVectorStore instance.\n */\n static initialize(engine: PostgresEngine, embeddings: EmbeddingsInterface, tableName: string, { schemaName, contentColumn, embeddingColumn, metadataColumns, ignoreMetadataColumns, idColumn, metadataJsonColumn, distanceStrategy, k, fetchK, lambdaMult, indexQueryOptions }?: PostgresVectorStoreArgs): Promise<PostgresVectorStore>;\n static fromTexts(texts: string[], metadatas: object[] | object, embeddings: EmbeddingsInterface, dbConfig: dbConfigArgs): Promise<VectorStore>;\n static fromDocuments(docs: Document[], embeddings: EmbeddingsInterface, dbConfig: dbConfigArgs): Promise<VectorStore>;\n addVectors(vectors: number[][], documents: Document[], options?: {\n ids?: string[];\n }): Promise<string[] | void>;\n _vectorstoreType(): string;\n /**\n * Adds documents to the vector store, embedding them first through the\n * `embeddings` instance.\n *\n * @param documents - Array of documents to embed and add.\n * @param options - Optional configuration for embedding and storing documents.\n * @returns A promise resolving to an array of document IDs or void, based on implementation.\n * @abstract\n */\n addDocuments(documents: Document[], options?: {\n ids?: string[];\n }): Promise<string[] | void>;\n /**\n * Deletes documents from the vector store based on the specified ids.\n *\n * @param params - Flexible key-value pairs defining conditions for document deletion.\n * @param ids - Optional: Property of {params} that contains the array of ids to be deleted\n * @returns A promise that resolves once the deletion is complete.\n */\n delete(params: {\n ids?: string[];\n }): Promise<void>;\n similaritySearchVectorWithScore(embedding: number[], k: number, filter?: this[\"FilterType\"]): Promise<[Document, number][]>;\n private queryCollection;\n maxMarginalRelevanceSearch(query: string, options: MaxMarginalRelevanceSearchOptions<this[\"FilterType\"]>): Promise<Document[]>;\n /**\n * Create an index on the vector store table\n * @param {BaseIndex} index\n * @param {string} name Optional\n * @param {boolean} concurrently Optional\n */\n applyVectorIndex(index: BaseIndex, name?: string, concurrently?: boolean): Promise<void>;\n /**\n * Check if index exists in the table.\n * @param {string} indexName Optional - index name\n */\n isValidIndex(indexName?: string): Promise<boolean>;\n /**\n * Drop the vector index\n * @param {string} indexName Optional - index name\n */\n dropVectorIndex(indexName?: string): Promise<void>;\n /**\n * Re-index the vector store table\n * @param {string} indexName Optional - index name\n */\n reIndex(indexName?: string): Promise<void>;\n}\nexport default PostgresVectorStore;\n//# sourceMappingURL=vectorstore.d.ts.map"],"mappings":";;;;;;;UAKiBQ,uBAAAA;;EAAAA,aAAAA,CAAAA,EAAAA,MAAAA;EAIKC,eAAAA,CAAAA,EAAAA,MAAAA;EAECJ,eAAAA,CAAAA,EAFDI,KAECJ,CAAAA,MAAAA,CAAAA;EAIKI,QAAAA,CAAAA,EAAAA,MAAAA;EAEJH,gBAAAA,CAAAA,EANDD,gBAMCC;EAAY,CAAA,CAAA,EAAA,MAAA;EAEnBI,MAAAA,CAAAA,EAAAA,MAAY;EAKnBC,UAAM,CAAA,EAAA,MAAA;EACJJ,qBAAAA,CAAAA,EAVgBE,KAUhBF,CAAAA,MAAAA,CAAAA;EAKSE,kBAAAA,CAAAA,EAAAA,MAAAA;EAECJ,iBAAAA,CAAAA,EAfEC,YAeFD;;AAKc,UAlBnBK,YAAAA,CAkBmB;EAoJfE,MAAAA,EArKTL,cAqK4B;EACxBM,SAAAA,EAAAA,MAAAA;EACJN,QAAAA,CAAAA,EArKGC,uBAqKHD;;UAnKFI,MAAAA,CAyKWF;EAGCJ,MAAAA,EA3KVE,cA2KUF;EAICC,SAAAA,EAAAA,MAAAA;EAOKN,UAAAA,EAAAA,MAAAA;EAA+BW,aAAAA,EAAAA,MAAAA;EAoB7BJ,eAAAA,EAAAA,MAAAA;EAA4BP,eAAAA,EArMrCS,KAqMqCT,CAAAA,MAAAA,CAAAA;EAA0Cc,QAAAA,EAAAA,MAAAA;EAAYC,gBAAAA,EAnM1FV,gBAmM0FU;EAAeC,CAAAA,EAAAA,MAAAA;EAAiBC,MAAAA,EAAAA,MAAAA;EAAiBC,UAAAA,EAAAA,MAAAA;EAAuBC,kBAAAA,EAAAA,MAAAA;EAAUC,iBAAAA,CAAAA,EA9L1Kd,YA8L0Kc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA1CtI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAvCR,mBAAAA,SAA4BV,WAAAA;cACjCW;UACJN;cACIP;;;;;mBAKKS;;;oBAGCJ;;;;qBAICC;;;;;;;0BAOKN,+BAA+BW;;;;;;;;;;;;;;;;;;;;4BAoB7BJ,4BAA4BP;;;;;;;;;;;;;MAA2NQ,0BAA0BkB,QAAQd;8EACvOZ,+BAA+BU,eAAegB,QAAQxB;6BACvGC,wBAAwBH,+BAA+BU,eAAegB,QAAQxB;6CAC9DC;;MAEvCuB;;;;;;;;;;;0BAWoBvB;;MAEpBuB;;;;;;;;;;MAUAA;gGAC0FA,SAASvB;;qDAEpDF,wDAAwDyB,QAAQvB;;;;;;;0BAO3FC,mDAAmDsB;;;;;oCAKzCA;;;;;uCAKGA;;;;;+BAKRA"}
|
package/dist/vectorstore.d.ts
CHANGED
|
@@ -142,7 +142,7 @@ interface VSArgs {
|
|
|
142
142
|
* <summary><strong>Similarity search with filter</strong></summary>
|
|
143
143
|
*
|
|
144
144
|
* ```typescript
|
|
145
|
-
* const resultsWithFilter = await vectorStore.similaritySearch("thud", 1,
|
|
145
|
+
* const resultsWithFilter = await vectorStore.similaritySearch("thud", 1, { baz: "bar" });
|
|
146
146
|
*
|
|
147
147
|
* for (const doc of resultsWithFilter) {
|
|
148
148
|
* console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);
|
|
@@ -186,7 +186,7 @@ interface VSArgs {
|
|
|
186
186
|
* <br />
|
|
187
187
|
*/
|
|
188
188
|
declare class PostgresVectorStore extends VectorStore {
|
|
189
|
-
FilterType: string
|
|
189
|
+
FilterType: Record<string, string>;
|
|
190
190
|
engine: PostgresEngine;
|
|
191
191
|
embeddings: EmbeddingsInterface;
|
|
192
192
|
tableName: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vectorstore.d.ts","names":["EmbeddingsInterface","MaxMarginalRelevanceSearchOptions","VectorStore","Document","BaseIndex","DistanceStrategy","QueryOptions","PostgresEngine","PostgresVectorStoreArgs","Array","dbConfigArgs","VSArgs","PostgresVectorStore","schemaName","contentColumn","embeddingColumn","metadataColumns","ignoreMetadataColumns","idColumn","metadataJsonColumn","distanceStrategy","k","fetchK","lambdaMult","indexQueryOptions","Promise","default"],"sources":["../src/vectorstore.d.ts"],"sourcesContent":["import { EmbeddingsInterface } from \"@langchain/core/embeddings\";\nimport { MaxMarginalRelevanceSearchOptions, VectorStore } from \"@langchain/core/vectorstores\";\nimport { Document } from \"@langchain/core/documents\";\nimport { BaseIndex, DistanceStrategy, QueryOptions } from \"./indexes.js\";\nimport PostgresEngine from \"./engine.js\";\nexport interface PostgresVectorStoreArgs {\n schemaName?: string;\n contentColumn?: string;\n embeddingColumn?: string;\n metadataColumns?: Array<string>;\n idColumn?: string;\n distanceStrategy?: DistanceStrategy;\n k?: number;\n fetchK?: number;\n lambdaMult?: number;\n ignoreMetadataColumns?: Array<string>;\n metadataJsonColumn?: string;\n indexQueryOptions?: QueryOptions;\n}\nexport interface dbConfigArgs {\n engine: PostgresEngine;\n tableName: string;\n dbConfig?: PostgresVectorStoreArgs;\n}\ninterface VSArgs {\n engine: PostgresEngine;\n tableName: string;\n schemaName: string;\n contentColumn: string;\n embeddingColumn: string;\n metadataColumns: Array<string>;\n idColumn: string;\n distanceStrategy: DistanceStrategy;\n k: number;\n fetchK: number;\n lambdaMult: number;\n metadataJsonColumn: string;\n indexQueryOptions?: QueryOptions;\n}\n/**\n * Google Cloud SQL for PostgreSQL vector store integration.\n *\n * Setup:\n * Install `@langchain/google-cloud-sql-pg`\n *\n * ```bash\n * npm install @langchain/google-cloud-sql-pg\n * ```\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { Column, PostgresEngine, PostgresEngineArgs, PostgresVectorStore, VectorStoreTableArgs } from \"@langchain/google-cloud-sql-pg\";\n * // Or other embeddings\n * import { OpenAIEmbeddings } from '@langchain/openai';\n *\n *\n * const embeddings = new OpenAIEmbeddings({\n * model: \"text-embedding-3-small\",\n * });\n *\n * const pgArgs: PostgresEngineArgs = {\n * user: \"db-user\",\n * password: \"password\"\n * }\n * // Create a shared connection pool\n * const engine: PostgresEngine = await PostgresEngine.fromInstance(\n * \"project-id\",\n * \"region\",\n * \"instance-name\",\n * \"database-name\",\n * pgArgs\n * );\n * // (Optional) Specify metadata columns for filtering\n * // All other metadata will be added to JSON\n * const vectorStoreTableArgs: VectorStoreTableArgs = {\n * metadataColumns: [new Column(\"baz\", \"TEXT\")],\n * };\n * // Create a vector store table\n * await engine.initVectorstoreTable(\"my-table\", 768, vectorStoreTableArgs);\n * // Customize the vector store\n * const pvectorArgs: PostgresVectorStoreArgs = {\n * idColumn: \"ID_COLUMN\",\n * contentColumn: \"CONTENT_COLUMN\",\n * embeddingColumn: \"EMBEDDING_COLUMN\",\n * metadataColumns: [\"baz\"]\n * }\n *\n * const vectorStore = await PostgresVectorStore.initialize(engine, embeddingService, \"my-table\", pvectorArgs);\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Add documents</strong></summary>\n *\n * ```typescript\n * import type { Document } from '@langchain/core/documents';\n *\n * const document1 = { pageContent: \"foo\", metadata: { baz: \"bar\" } };\n * const document2 = { pageContent: \"thud\", metadata: { bar: \"baz\" } };\n * const document3 = { pageContent: \"i will be deleted :(\", metadata: {} };\n *\n * const documents: Document[] = [document1, document2, document3];\n * const ids = [\"1\", \"2\", \"3\"];\n * await vectorStore.addDocuments(documents, { ids });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Delete documents</strong></summary>\n *\n * ```typescript\n * await vectorStore.delete({ ids: [\"3\"] });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Similarity search</strong></summary>\n *\n * ```typescript\n * const results = await vectorStore.similaritySearch(\"thud\", 1);\n * for (const doc of results) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:thud [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with filter</strong></summary>\n *\n * ```typescript\n * const resultsWithFilter = await vectorStore.similaritySearch(\"thud\", 1, \"baz = 'bar'\");\n *\n * for (const doc of resultsWithFilter) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:foo [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with score</strong></summary>\n *\n * ```typescript\n * const resultsWithScore = await vectorStore.similaritySearchWithScore(\"qux\", 1);\n * for (const [doc, score] of resultsWithScore) {\n * console.log(`* [SIM=${score.toFixed(6)}] ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:[SIM=0.000000] qux [{\"bar\":\"baz\",\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>As a retriever</strong></summary>\n *\n * ```typescript\n * const retriever = vectorStore.asRetriever({\n * searchType: \"mmr\", // Leave blank for standard similarity search\n * k: 1,\n * });\n * const resultAsRetriever = await retriever.invoke(\"thud\");\n * console.log(resultAsRetriever);\n *\n * // Output: [Document({ metadata: { \"baz\":\"bar\" }, pageContent: \"thud\" })]\n * ```\n * </details>\n *\n * <br />\n */\nexport declare class PostgresVectorStore extends VectorStore {\n FilterType: string;\n engine: PostgresEngine;\n embeddings: EmbeddingsInterface;\n tableName: string;\n schemaName: string;\n contentColumn: string;\n embeddingColumn: string;\n metadataColumns: Array<string>;\n idColumn: string;\n metadataJsonColumn: string;\n distanceStrategy: DistanceStrategy;\n k: number;\n fetchK: number;\n lambdaMult: number;\n indexQueryOptions: QueryOptions | undefined;\n /**\n * Initializes a new vector store with embeddings and database configuration.\n *\n * @param embeddings - Instance of `EmbeddingsInterface` used to embed queries.\n * @param dbConfig - Configuration settings for the database or storage system.\n */\n constructor(embeddings: EmbeddingsInterface, dbConfig: VSArgs);\n /**\n * Create a new PostgresVectorStore instance.\n * @param {PostgresEngine} engine Required - Connection pool engine for managing connections to Cloud SQL for PostgreSQL database.\n * @param {Embeddings} embeddings Required - Text embedding model to use.\n * @param {string} tableName Required - Name of an existing table or table to be created.\n * @param {string} schemaName Database schema name of the table. Defaults to \"public\".\n * @param {string} contentColumn Column that represent a Document's page_content. Defaults to \"content\".\n * @param {string} embeddingColumn Column for embedding vectors. The embedding is generated from the document value. Defaults to \"embedding\".\n * @param {Array<string>} metadataColumns Column(s) that represent a document's metadata.\n * @param {Array<string>} ignoreMetadataColumns Optional - Column(s) to ignore in pre-existing tables for a document's metadata. Can not be used with metadata_columns.\n * @param {string} idColumn Column that represents the Document's id. Defaults to \"langchain_id\".\n * @param {string} metadataJsonColumn Optional - Column to store metadata as JSON. Defaults to \"langchain_metadata\".\n * @param {DistanceStrategy} distanceStrategy Distance strategy to use for vector similarity search. Defaults to COSINE_DISTANCE.\n * @param {number} k Number of Documents to return from search. Defaults to 4.\n * @param {number} fetchK Number of Documents to fetch to pass to MMR algorithm.\n * @param {number} lambdaMult Number between 0 and 1 that determines the degree of diversity among the results with 0 corresponding to maximum diversity and 1 to minimum diversity. Defaults to 0.5.\n * @param {QueryOptions} indexQueryOptions Optional - Index query option.\n * @returns PostgresVectorStore instance.\n */\n static initialize(engine: PostgresEngine, embeddings: EmbeddingsInterface, tableName: string, { schemaName, contentColumn, embeddingColumn, metadataColumns, ignoreMetadataColumns, idColumn, metadataJsonColumn, distanceStrategy, k, fetchK, lambdaMult, indexQueryOptions }?: PostgresVectorStoreArgs): Promise<PostgresVectorStore>;\n static fromTexts(texts: string[], metadatas: object[] | object, embeddings: EmbeddingsInterface, dbConfig: dbConfigArgs): Promise<VectorStore>;\n static fromDocuments(docs: Document[], embeddings: EmbeddingsInterface, dbConfig: dbConfigArgs): Promise<VectorStore>;\n addVectors(vectors: number[][], documents: Document[], options?: {\n ids?: string[];\n }): Promise<string[] | void>;\n _vectorstoreType(): string;\n /**\n * Adds documents to the vector store, embedding them first through the\n * `embeddings` instance.\n *\n * @param documents - Array of documents to embed and add.\n * @param options - Optional configuration for embedding and storing documents.\n * @returns A promise resolving to an array of document IDs or void, based on implementation.\n * @abstract\n */\n addDocuments(documents: Document[], options?: {\n ids?: string[];\n }): Promise<string[] | void>;\n /**\n * Deletes documents from the vector store based on the specified ids.\n *\n * @param params - Flexible key-value pairs defining conditions for document deletion.\n * @param ids - Optional: Property of {params} that contains the array of ids to be deleted\n * @returns A promise that resolves once the deletion is complete.\n */\n delete(params: {\n ids?: string[];\n }): Promise<void>;\n similaritySearchVectorWithScore(embedding: number[], k: number, filter?: this[\"FilterType\"]): Promise<[Document, number][]>;\n private queryCollection;\n maxMarginalRelevanceSearch(query: string, options: MaxMarginalRelevanceSearchOptions<this[\"FilterType\"]>): Promise<Document[]>;\n /**\n * Create an index on the vector store table\n * @param {BaseIndex} index\n * @param {string} name Optional\n * @param {boolean} concurrently Optional\n */\n applyVectorIndex(index: BaseIndex, name?: string, concurrently?: boolean): Promise<void>;\n /**\n * Check if index exists in the table.\n * @param {string} indexName Optional - index name\n */\n isValidIndex(indexName?: string): Promise<boolean>;\n /**\n * Drop the vector index\n * @param {string} indexName Optional - index name\n */\n dropVectorIndex(indexName?: string): Promise<void>;\n /**\n * Re-index the vector store table\n * @param {string} indexName Optional - index name\n */\n reIndex(indexName?: string): Promise<void>;\n}\nexport default PostgresVectorStore;\n//# sourceMappingURL=vectorstore.d.ts.map"],"mappings":";;;;;;;UAKiBQ,uBAAAA;;EAAAA,aAAAA,CAAAA,EAAAA,MAAAA;EAIKC,eAAAA,CAAAA,EAAAA,MAAAA;EAECJ,eAAAA,CAAAA,EAFDI,KAECJ,CAAAA,MAAAA,CAAAA;EAIKI,QAAAA,CAAAA,EAAAA,MAAAA;EAEJH,gBAAAA,CAAAA,EANDD,gBAMCC;EAAY,CAAA,CAAA,EAAA,MAAA;EAEnBI,MAAAA,CAAAA,EAAAA,MAAY;EAKnBC,UAAM,CAAA,EAAA,MAAA;EACJJ,qBAAAA,CAAAA,EAVgBE,KAUhBF,CAAAA,MAAAA,CAAAA;EAKSE,kBAAAA,CAAAA,EAAAA,MAAAA;EAECJ,iBAAAA,CAAAA,EAfEC,YAeFD;;AAKc,UAlBnBK,YAAAA,CAkBmB;EAoJfE,MAAAA,EArKTL,cAqK4B;EAE5BA,SAAAA,EAAAA,MAAAA;EACIP,QAAAA,CAAAA,EAtKDQ,uBAsKCR;;UApKNW,MAAAA,CA4KYN;EAICC,MAAAA,EA/KXC,cA+KWD;EAOKN,SAAAA,EAAAA,MAAAA;EAA+BW,UAAAA,EAAAA,MAAAA;EAoB7BJ,aAAAA,EAAAA,MAAAA;EAA4BP,eAAAA,EAAAA,MAAAA;EAA0Ca,eAAAA,EArM/EJ,KAqM+EI,CAAAA,MAAAA,CAAAA;EAAYC,QAAAA,EAAAA,MAAAA;EAAeC,gBAAAA,EAnMzGV,gBAmMyGU;EAAiBC,CAAAA,EAAAA,MAAAA;EAAiBC,MAAAA,EAAAA,MAAAA;EAAuBC,UAAAA,EAAAA,MAAAA;EAAUC,kBAAAA,EAAAA,MAAAA;EAAoBC,iBAAAA,CAAAA,EA9L9Ld,YA8L8Lc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA1C1J;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAvCR,mBAAAA,SAA4BV,WAAAA;;UAErCK;cACIP;;;;;mBAKKS;;;oBAGCJ;;;;qBAICC;;;;;;;0BAOKN,+BAA+BW;;;;;;;;;;;;;;;;;;;;4BAoB7BJ,4BAA4BP;;;;;;;;;;;;;MAA2NQ,0BAA0BiB,QAAQb;8EACvOZ,+BAA+BU,eAAee,QAAQvB;6BACvGC,wBAAwBH,+BAA+BU,eAAee,QAAQvB;6CAC9DC;;MAEvCsB;;;;;;;;;;;0BAWoBtB;;MAEpBsB;;;;;;;;;;MAUAA;gGAC0FA,SAAStB;;qDAEpDF,wDAAwDwB,QAAQtB;;;;;;;0BAO3FC,mDAAmDqB;;;;;oCAKzCA;;;;;uCAKGA;;;;;+BAKRA"}
|
|
1
|
+
{"version":3,"file":"vectorstore.d.ts","names":["EmbeddingsInterface","MaxMarginalRelevanceSearchOptions","VectorStore","Document","BaseIndex","DistanceStrategy","QueryOptions","PostgresEngine","PostgresVectorStoreArgs","Array","dbConfigArgs","VSArgs","PostgresVectorStore","Record","schemaName","contentColumn","embeddingColumn","metadataColumns","ignoreMetadataColumns","idColumn","metadataJsonColumn","distanceStrategy","k","fetchK","lambdaMult","indexQueryOptions","Promise","default"],"sources":["../src/vectorstore.d.ts"],"sourcesContent":["import { EmbeddingsInterface } from \"@langchain/core/embeddings\";\nimport { MaxMarginalRelevanceSearchOptions, VectorStore } from \"@langchain/core/vectorstores\";\nimport { Document } from \"@langchain/core/documents\";\nimport { BaseIndex, DistanceStrategy, QueryOptions } from \"./indexes.js\";\nimport PostgresEngine from \"./engine.js\";\nexport interface PostgresVectorStoreArgs {\n schemaName?: string;\n contentColumn?: string;\n embeddingColumn?: string;\n metadataColumns?: Array<string>;\n idColumn?: string;\n distanceStrategy?: DistanceStrategy;\n k?: number;\n fetchK?: number;\n lambdaMult?: number;\n ignoreMetadataColumns?: Array<string>;\n metadataJsonColumn?: string;\n indexQueryOptions?: QueryOptions;\n}\nexport interface dbConfigArgs {\n engine: PostgresEngine;\n tableName: string;\n dbConfig?: PostgresVectorStoreArgs;\n}\ninterface VSArgs {\n engine: PostgresEngine;\n tableName: string;\n schemaName: string;\n contentColumn: string;\n embeddingColumn: string;\n metadataColumns: Array<string>;\n idColumn: string;\n distanceStrategy: DistanceStrategy;\n k: number;\n fetchK: number;\n lambdaMult: number;\n metadataJsonColumn: string;\n indexQueryOptions?: QueryOptions;\n}\n/**\n * Google Cloud SQL for PostgreSQL vector store integration.\n *\n * Setup:\n * Install `@langchain/google-cloud-sql-pg`\n *\n * ```bash\n * npm install @langchain/google-cloud-sql-pg\n * ```\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { Column, PostgresEngine, PostgresEngineArgs, PostgresVectorStore, VectorStoreTableArgs } from \"@langchain/google-cloud-sql-pg\";\n * // Or other embeddings\n * import { OpenAIEmbeddings } from '@langchain/openai';\n *\n *\n * const embeddings = new OpenAIEmbeddings({\n * model: \"text-embedding-3-small\",\n * });\n *\n * const pgArgs: PostgresEngineArgs = {\n * user: \"db-user\",\n * password: \"password\"\n * }\n * // Create a shared connection pool\n * const engine: PostgresEngine = await PostgresEngine.fromInstance(\n * \"project-id\",\n * \"region\",\n * \"instance-name\",\n * \"database-name\",\n * pgArgs\n * );\n * // (Optional) Specify metadata columns for filtering\n * // All other metadata will be added to JSON\n * const vectorStoreTableArgs: VectorStoreTableArgs = {\n * metadataColumns: [new Column(\"baz\", \"TEXT\")],\n * };\n * // Create a vector store table\n * await engine.initVectorstoreTable(\"my-table\", 768, vectorStoreTableArgs);\n * // Customize the vector store\n * const pvectorArgs: PostgresVectorStoreArgs = {\n * idColumn: \"ID_COLUMN\",\n * contentColumn: \"CONTENT_COLUMN\",\n * embeddingColumn: \"EMBEDDING_COLUMN\",\n * metadataColumns: [\"baz\"]\n * }\n *\n * const vectorStore = await PostgresVectorStore.initialize(engine, embeddingService, \"my-table\", pvectorArgs);\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Add documents</strong></summary>\n *\n * ```typescript\n * import type { Document } from '@langchain/core/documents';\n *\n * const document1 = { pageContent: \"foo\", metadata: { baz: \"bar\" } };\n * const document2 = { pageContent: \"thud\", metadata: { bar: \"baz\" } };\n * const document3 = { pageContent: \"i will be deleted :(\", metadata: {} };\n *\n * const documents: Document[] = [document1, document2, document3];\n * const ids = [\"1\", \"2\", \"3\"];\n * await vectorStore.addDocuments(documents, { ids });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Delete documents</strong></summary>\n *\n * ```typescript\n * await vectorStore.delete({ ids: [\"3\"] });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Similarity search</strong></summary>\n *\n * ```typescript\n * const results = await vectorStore.similaritySearch(\"thud\", 1);\n * for (const doc of results) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:thud [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with filter</strong></summary>\n *\n * ```typescript\n * const resultsWithFilter = await vectorStore.similaritySearch(\"thud\", 1, { baz: \"bar\" });\n *\n * for (const doc of resultsWithFilter) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:foo [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with score</strong></summary>\n *\n * ```typescript\n * const resultsWithScore = await vectorStore.similaritySearchWithScore(\"qux\", 1);\n * for (const [doc, score] of resultsWithScore) {\n * console.log(`* [SIM=${score.toFixed(6)}] ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:[SIM=0.000000] qux [{\"bar\":\"baz\",\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>As a retriever</strong></summary>\n *\n * ```typescript\n * const retriever = vectorStore.asRetriever({\n * searchType: \"mmr\", // Leave blank for standard similarity search\n * k: 1,\n * });\n * const resultAsRetriever = await retriever.invoke(\"thud\");\n * console.log(resultAsRetriever);\n *\n * // Output: [Document({ metadata: { \"baz\":\"bar\" }, pageContent: \"thud\" })]\n * ```\n * </details>\n *\n * <br />\n */\nexport declare class PostgresVectorStore extends VectorStore {\n FilterType: Record<string, string>;\n engine: PostgresEngine;\n embeddings: EmbeddingsInterface;\n tableName: string;\n schemaName: string;\n contentColumn: string;\n embeddingColumn: string;\n metadataColumns: Array<string>;\n idColumn: string;\n metadataJsonColumn: string;\n distanceStrategy: DistanceStrategy;\n k: number;\n fetchK: number;\n lambdaMult: number;\n indexQueryOptions: QueryOptions | undefined;\n /**\n * Initializes a new vector store with embeddings and database configuration.\n *\n * @param embeddings - Instance of `EmbeddingsInterface` used to embed queries.\n * @param dbConfig - Configuration settings for the database or storage system.\n */\n constructor(embeddings: EmbeddingsInterface, dbConfig: VSArgs);\n /**\n * Create a new PostgresVectorStore instance.\n * @param {PostgresEngine} engine Required - Connection pool engine for managing connections to Cloud SQL for PostgreSQL database.\n * @param {Embeddings} embeddings Required - Text embedding model to use.\n * @param {string} tableName Required - Name of an existing table or table to be created.\n * @param {string} schemaName Database schema name of the table. Defaults to \"public\".\n * @param {string} contentColumn Column that represent a Document's page_content. Defaults to \"content\".\n * @param {string} embeddingColumn Column for embedding vectors. The embedding is generated from the document value. Defaults to \"embedding\".\n * @param {Array<string>} metadataColumns Column(s) that represent a document's metadata.\n * @param {Array<string>} ignoreMetadataColumns Optional - Column(s) to ignore in pre-existing tables for a document's metadata. Can not be used with metadata_columns.\n * @param {string} idColumn Column that represents the Document's id. Defaults to \"langchain_id\".\n * @param {string} metadataJsonColumn Optional - Column to store metadata as JSON. Defaults to \"langchain_metadata\".\n * @param {DistanceStrategy} distanceStrategy Distance strategy to use for vector similarity search. Defaults to COSINE_DISTANCE.\n * @param {number} k Number of Documents to return from search. Defaults to 4.\n * @param {number} fetchK Number of Documents to fetch to pass to MMR algorithm.\n * @param {number} lambdaMult Number between 0 and 1 that determines the degree of diversity among the results with 0 corresponding to maximum diversity and 1 to minimum diversity. Defaults to 0.5.\n * @param {QueryOptions} indexQueryOptions Optional - Index query option.\n * @returns PostgresVectorStore instance.\n */\n static initialize(engine: PostgresEngine, embeddings: EmbeddingsInterface, tableName: string, { schemaName, contentColumn, embeddingColumn, metadataColumns, ignoreMetadataColumns, idColumn, metadataJsonColumn, distanceStrategy, k, fetchK, lambdaMult, indexQueryOptions }?: PostgresVectorStoreArgs): Promise<PostgresVectorStore>;\n static fromTexts(texts: string[], metadatas: object[] | object, embeddings: EmbeddingsInterface, dbConfig: dbConfigArgs): Promise<VectorStore>;\n static fromDocuments(docs: Document[], embeddings: EmbeddingsInterface, dbConfig: dbConfigArgs): Promise<VectorStore>;\n addVectors(vectors: number[][], documents: Document[], options?: {\n ids?: string[];\n }): Promise<string[] | void>;\n _vectorstoreType(): string;\n /**\n * Adds documents to the vector store, embedding them first through the\n * `embeddings` instance.\n *\n * @param documents - Array of documents to embed and add.\n * @param options - Optional configuration for embedding and storing documents.\n * @returns A promise resolving to an array of document IDs or void, based on implementation.\n * @abstract\n */\n addDocuments(documents: Document[], options?: {\n ids?: string[];\n }): Promise<string[] | void>;\n /**\n * Deletes documents from the vector store based on the specified ids.\n *\n * @param params - Flexible key-value pairs defining conditions for document deletion.\n * @param ids - Optional: Property of {params} that contains the array of ids to be deleted\n * @returns A promise that resolves once the deletion is complete.\n */\n delete(params: {\n ids?: string[];\n }): Promise<void>;\n similaritySearchVectorWithScore(embedding: number[], k: number, filter?: this[\"FilterType\"]): Promise<[Document, number][]>;\n private queryCollection;\n maxMarginalRelevanceSearch(query: string, options: MaxMarginalRelevanceSearchOptions<this[\"FilterType\"]>): Promise<Document[]>;\n /**\n * Create an index on the vector store table\n * @param {BaseIndex} index\n * @param {string} name Optional\n * @param {boolean} concurrently Optional\n */\n applyVectorIndex(index: BaseIndex, name?: string, concurrently?: boolean): Promise<void>;\n /**\n * Check if index exists in the table.\n * @param {string} indexName Optional - index name\n */\n isValidIndex(indexName?: string): Promise<boolean>;\n /**\n * Drop the vector index\n * @param {string} indexName Optional - index name\n */\n dropVectorIndex(indexName?: string): Promise<void>;\n /**\n * Re-index the vector store table\n * @param {string} indexName Optional - index name\n */\n reIndex(indexName?: string): Promise<void>;\n}\nexport default PostgresVectorStore;\n//# sourceMappingURL=vectorstore.d.ts.map"],"mappings":";;;;;;;UAKiBQ,uBAAAA;;EAAAA,aAAAA,CAAAA,EAAAA,MAAAA;EAIKC,eAAAA,CAAAA,EAAAA,MAAAA;EAECJ,eAAAA,CAAAA,EAFDI,KAECJ,CAAAA,MAAAA,CAAAA;EAIKI,QAAAA,CAAAA,EAAAA,MAAAA;EAEJH,gBAAAA,CAAAA,EANDD,gBAMCC;EAAY,CAAA,CAAA,EAAA,MAAA;EAEnBI,MAAAA,CAAAA,EAAAA,MAAY;EAKnBC,UAAM,CAAA,EAAA,MAAA;EACJJ,qBAAAA,CAAAA,EAVgBE,KAUhBF,CAAAA,MAAAA,CAAAA;EAKSE,kBAAAA,CAAAA,EAAAA,MAAAA;EAECJ,iBAAAA,CAAAA,EAfEC,YAeFD;;AAKc,UAlBnBK,YAAAA,CAkBmB;EAoJfE,MAAAA,EArKTL,cAqK4B;EACxBM,SAAAA,EAAAA,MAAAA;EACJN,QAAAA,CAAAA,EArKGC,uBAqKHD;;UAnKFI,MAAAA,CAyKWF;EAGCJ,MAAAA,EA3KVE,cA2KUF;EAICC,SAAAA,EAAAA,MAAAA;EAOKN,UAAAA,EAAAA,MAAAA;EAA+BW,aAAAA,EAAAA,MAAAA;EAoB7BJ,eAAAA,EAAAA,MAAAA;EAA4BP,eAAAA,EArMrCS,KAqMqCT,CAAAA,MAAAA,CAAAA;EAA0Cc,QAAAA,EAAAA,MAAAA;EAAYC,gBAAAA,EAnM1FV,gBAmM0FU;EAAeC,CAAAA,EAAAA,MAAAA;EAAiBC,MAAAA,EAAAA,MAAAA;EAAiBC,UAAAA,EAAAA,MAAAA;EAAuBC,kBAAAA,EAAAA,MAAAA;EAAUC,iBAAAA,CAAAA,EA9L1Kd,YA8L0Kc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA1CtI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAvCR,mBAAAA,SAA4BV,WAAAA;cACjCW;UACJN;cACIP;;;;;mBAKKS;;;oBAGCJ;;;;qBAICC;;;;;;;0BAOKN,+BAA+BW;;;;;;;;;;;;;;;;;;;;4BAoB7BJ,4BAA4BP;;;;;;;;;;;;;MAA2NQ,0BAA0BkB,QAAQd;8EACvOZ,+BAA+BU,eAAegB,QAAQxB;6BACvGC,wBAAwBH,+BAA+BU,eAAegB,QAAQxB;6CAC9DC;;MAEvCuB;;;;;;;;;;;0BAWoBvB;;MAEpBuB;;;;;;;;;;MAUAA;gGAC0FA,SAASvB;;qDAEpDF,wDAAwDyB,QAAQvB;;;;;;;0BAO3FC,mDAAmDsB;;;;;oCAKzCA;;;;;uCAKGA;;;;;+BAKRA"}
|
package/dist/vectorstore.js
CHANGED
|
@@ -109,7 +109,7 @@ import { maximalMarginalRelevance } from "@langchain/core/utils/math";
|
|
|
109
109
|
* <summary><strong>Similarity search with filter</strong></summary>
|
|
110
110
|
*
|
|
111
111
|
* ```typescript
|
|
112
|
-
* const resultsWithFilter = await vectorStore.similaritySearch("thud", 1,
|
|
112
|
+
* const resultsWithFilter = await vectorStore.similaritySearch("thud", 1, { baz: "bar" });
|
|
113
113
|
*
|
|
114
114
|
* for (const doc of resultsWithFilter) {
|
|
115
115
|
* console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);
|
|
@@ -357,12 +357,22 @@ var PostgresVectorStore = class PostgresVectorStore extends VectorStore {
|
|
|
357
357
|
const fetchK = k ?? this.k;
|
|
358
358
|
const { operator } = this.distanceStrategy;
|
|
359
359
|
const { searchFunction } = this.distanceStrategy;
|
|
360
|
-
const
|
|
360
|
+
const filterColumns = filter !== void 0 ? Object.keys(filter) : [];
|
|
361
|
+
const filterBindings = {};
|
|
362
|
+
let _filter = "";
|
|
363
|
+
if (filterColumns.length > 0) {
|
|
364
|
+
const conditions = filterColumns.map((col, i) => {
|
|
365
|
+
const bindingKey = `filter_${i}`;
|
|
366
|
+
filterBindings[bindingKey] = filter[col];
|
|
367
|
+
return `"${col.replace(/"/g, "\"\"")}" = :${bindingKey}`;
|
|
368
|
+
});
|
|
369
|
+
_filter = `WHERE ${conditions.join(" AND ")}`;
|
|
370
|
+
}
|
|
361
371
|
const metadataColNames = this.metadataColumns.length > 0 ? `, "${this.metadataColumns.join("\",\"")}"` : "";
|
|
362
372
|
const metadataJsonColName = this.metadataJsonColumn ? `, "${this.metadataJsonColumn}"` : "";
|
|
363
373
|
const query = `SELECT "${this.idColumn}", "${this.contentColumn}", "${this.embeddingColumn}" ${metadataColNames} ${metadataJsonColName}, ${searchFunction}("${this.embeddingColumn}", '[${embedding}]') as distance FROM "${this.schemaName}"."${this.tableName}" ${_filter} ORDER BY "${this.embeddingColumn}" ${operator} '[${embedding}]' LIMIT ${fetchK};`;
|
|
364
374
|
if (this.indexQueryOptions) await this.engine.pool.raw(`SET LOCAL ${this.indexQueryOptions.to_string()}`);
|
|
365
|
-
const { rows } = await this.engine.pool.raw(query);
|
|
375
|
+
const { rows } = await this.engine.pool.raw(query, filterBindings);
|
|
366
376
|
return rows;
|
|
367
377
|
}
|
|
368
378
|
async maxMarginalRelevanceSearch(query, options) {
|
package/dist/vectorstore.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vectorstore.js","names":["embeddings: EmbeddingsInterface","dbConfig: VSArgs","engine: PostgresEngine","tableName: string","columns: { [key: string]: string }","allMetadataColumns: string[]","texts: string[]","metadatas: object[] | object","dbConfig: dbConfigArgs","documents: Document[]","docs: Document[]","vectors: number[][]","options?: { ids?: string[] }","ids: string[]","metadatas: Record<string, string>[]","uuidv4","values: { [key: string]: string | string[] }","params: { ids?: string[] }","embedding: number[]","k: number","filter?: this[\"FilterType\"]","documentsWithScores: [Document, number][]","k?: number | undefined","filter?: this[\"FilterType\"] | undefined","query: string","options: MaxMarginalRelevanceSearchOptions<this[\"FilterType\"]>","docsList: Document[]","row: { [x: string]: string }","index: BaseIndex","name?: string","concurrently: boolean","indexName?: string"],"sources":["../src/vectorstore.ts"],"sourcesContent":["import { EmbeddingsInterface } from \"@langchain/core/embeddings\";\nimport {\n MaxMarginalRelevanceSearchOptions,\n VectorStore,\n} from \"@langchain/core/vectorstores\";\nimport { Document } from \"@langchain/core/documents\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { maximalMarginalRelevance } from \"@langchain/core/utils/math\";\nimport {\n BaseIndex,\n DEFAULT_DISTANCE_STRATEGY,\n DEFAULT_INDEX_NAME_SUFFIX,\n DistanceStrategy,\n QueryOptions,\n} from \"./indexes.js\";\nimport PostgresEngine from \"./engine.js\";\nimport { customZip } from \"./utils/utils.js\";\n\nexport interface PostgresVectorStoreArgs {\n schemaName?: string;\n contentColumn?: string;\n embeddingColumn?: string;\n metadataColumns?: Array<string>;\n idColumn?: string;\n distanceStrategy?: DistanceStrategy;\n k?: number;\n fetchK?: number;\n lambdaMult?: number;\n ignoreMetadataColumns?: Array<string>;\n metadataJsonColumn?: string;\n indexQueryOptions?: QueryOptions;\n}\n\nexport interface dbConfigArgs {\n engine: PostgresEngine;\n tableName: string;\n dbConfig?: PostgresVectorStoreArgs;\n}\n\ninterface VSArgs {\n engine: PostgresEngine;\n tableName: string;\n schemaName: string;\n contentColumn: string;\n embeddingColumn: string;\n metadataColumns: Array<string>;\n idColumn: string;\n distanceStrategy: DistanceStrategy;\n k: number;\n fetchK: number;\n lambdaMult: number;\n metadataJsonColumn: string;\n indexQueryOptions?: QueryOptions;\n}\n\n/**\n * Google Cloud SQL for PostgreSQL vector store integration.\n *\n * Setup:\n * Install `@langchain/google-cloud-sql-pg`\n *\n * ```bash\n * npm install @langchain/google-cloud-sql-pg\n * ```\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { Column, PostgresEngine, PostgresEngineArgs, PostgresVectorStore, VectorStoreTableArgs } from \"@langchain/google-cloud-sql-pg\";\n * // Or other embeddings\n * import { OpenAIEmbeddings } from '@langchain/openai';\n *\n *\n * const embeddings = new OpenAIEmbeddings({\n * model: \"text-embedding-3-small\",\n * });\n *\n * const pgArgs: PostgresEngineArgs = {\n * user: \"db-user\",\n * password: \"password\"\n * }\n * // Create a shared connection pool\n * const engine: PostgresEngine = await PostgresEngine.fromInstance(\n * \"project-id\",\n * \"region\",\n * \"instance-name\",\n * \"database-name\",\n * pgArgs\n * );\n * // (Optional) Specify metadata columns for filtering\n * // All other metadata will be added to JSON\n * const vectorStoreTableArgs: VectorStoreTableArgs = {\n * metadataColumns: [new Column(\"baz\", \"TEXT\")],\n * };\n * // Create a vector store table\n * await engine.initVectorstoreTable(\"my-table\", 768, vectorStoreTableArgs);\n * // Customize the vector store\n * const pvectorArgs: PostgresVectorStoreArgs = {\n * idColumn: \"ID_COLUMN\",\n * contentColumn: \"CONTENT_COLUMN\",\n * embeddingColumn: \"EMBEDDING_COLUMN\",\n * metadataColumns: [\"baz\"]\n * }\n *\n * const vectorStore = await PostgresVectorStore.initialize(engine, embeddingService, \"my-table\", pvectorArgs);\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Add documents</strong></summary>\n *\n * ```typescript\n * import type { Document } from '@langchain/core/documents';\n *\n * const document1 = { pageContent: \"foo\", metadata: { baz: \"bar\" } };\n * const document2 = { pageContent: \"thud\", metadata: { bar: \"baz\" } };\n * const document3 = { pageContent: \"i will be deleted :(\", metadata: {} };\n *\n * const documents: Document[] = [document1, document2, document3];\n * const ids = [\"1\", \"2\", \"3\"];\n * await vectorStore.addDocuments(documents, { ids });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Delete documents</strong></summary>\n *\n * ```typescript\n * await vectorStore.delete({ ids: [\"3\"] });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Similarity search</strong></summary>\n *\n * ```typescript\n * const results = await vectorStore.similaritySearch(\"thud\", 1);\n * for (const doc of results) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:thud [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with filter</strong></summary>\n *\n * ```typescript\n * const resultsWithFilter = await vectorStore.similaritySearch(\"thud\", 1, \"baz = 'bar'\");\n *\n * for (const doc of resultsWithFilter) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:foo [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with score</strong></summary>\n *\n * ```typescript\n * const resultsWithScore = await vectorStore.similaritySearchWithScore(\"qux\", 1);\n * for (const [doc, score] of resultsWithScore) {\n * console.log(`* [SIM=${score.toFixed(6)}] ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:[SIM=0.000000] qux [{\"bar\":\"baz\",\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>As a retriever</strong></summary>\n *\n * ```typescript\n * const retriever = vectorStore.asRetriever({\n * searchType: \"mmr\", // Leave blank for standard similarity search\n * k: 1,\n * });\n * const resultAsRetriever = await retriever.invoke(\"thud\");\n * console.log(resultAsRetriever);\n *\n * // Output: [Document({ metadata: { \"baz\":\"bar\" }, pageContent: \"thud\" })]\n * ```\n * </details>\n *\n * <br />\n */\nexport class PostgresVectorStore extends VectorStore {\n declare FilterType: string;\n\n engine: PostgresEngine;\n\n embeddings: EmbeddingsInterface;\n\n tableName: string;\n\n schemaName: string;\n\n contentColumn: string;\n\n embeddingColumn: string;\n\n metadataColumns: Array<string>;\n\n idColumn: string;\n\n metadataJsonColumn: string;\n\n distanceStrategy: DistanceStrategy;\n\n k: number;\n\n fetchK: number;\n\n lambdaMult: number;\n\n indexQueryOptions: QueryOptions | undefined;\n\n /**\n * Initializes a new vector store with embeddings and database configuration.\n *\n * @param embeddings - Instance of `EmbeddingsInterface` used to embed queries.\n * @param dbConfig - Configuration settings for the database or storage system.\n */\n constructor(embeddings: EmbeddingsInterface, dbConfig: VSArgs) {\n super(embeddings, dbConfig);\n this.embeddings = embeddings;\n this.engine = dbConfig.engine;\n this.tableName = dbConfig.tableName;\n this.schemaName = dbConfig.schemaName;\n this.contentColumn = dbConfig.contentColumn;\n this.embeddingColumn = dbConfig.embeddingColumn;\n this.metadataColumns = dbConfig.metadataColumns\n ? dbConfig.metadataColumns\n : [];\n this.idColumn = dbConfig.idColumn;\n this.metadataJsonColumn = dbConfig.metadataJsonColumn;\n this.distanceStrategy = dbConfig.distanceStrategy;\n this.k = dbConfig.k;\n this.fetchK = dbConfig.fetchK;\n this.lambdaMult = dbConfig.lambdaMult;\n this.indexQueryOptions = dbConfig.indexQueryOptions;\n }\n\n /**\n * Create a new PostgresVectorStore instance.\n * @param {PostgresEngine} engine Required - Connection pool engine for managing connections to Cloud SQL for PostgreSQL database.\n * @param {Embeddings} embeddings Required - Text embedding model to use.\n * @param {string} tableName Required - Name of an existing table or table to be created.\n * @param {string} schemaName Database schema name of the table. Defaults to \"public\".\n * @param {string} contentColumn Column that represent a Document's page_content. Defaults to \"content\".\n * @param {string} embeddingColumn Column for embedding vectors. The embedding is generated from the document value. Defaults to \"embedding\".\n * @param {Array<string>} metadataColumns Column(s) that represent a document's metadata.\n * @param {Array<string>} ignoreMetadataColumns Optional - Column(s) to ignore in pre-existing tables for a document's metadata. Can not be used with metadata_columns.\n * @param {string} idColumn Column that represents the Document's id. Defaults to \"langchain_id\".\n * @param {string} metadataJsonColumn Optional - Column to store metadata as JSON. Defaults to \"langchain_metadata\".\n * @param {DistanceStrategy} distanceStrategy Distance strategy to use for vector similarity search. Defaults to COSINE_DISTANCE.\n * @param {number} k Number of Documents to return from search. Defaults to 4.\n * @param {number} fetchK Number of Documents to fetch to pass to MMR algorithm.\n * @param {number} lambdaMult Number between 0 and 1 that determines the degree of diversity among the results with 0 corresponding to maximum diversity and 1 to minimum diversity. Defaults to 0.5.\n * @param {QueryOptions} indexQueryOptions Optional - Index query option.\n * @returns PostgresVectorStore instance.\n */\n static async initialize(\n engine: PostgresEngine,\n embeddings: EmbeddingsInterface,\n tableName: string,\n {\n schemaName = \"public\",\n contentColumn = \"content\",\n embeddingColumn = \"embedding\",\n metadataColumns = [],\n ignoreMetadataColumns,\n idColumn = \"langchain_id\",\n metadataJsonColumn = \"langchain_metadata\",\n distanceStrategy = DEFAULT_DISTANCE_STRATEGY,\n k = 4,\n fetchK = 20,\n lambdaMult = 0.5,\n indexQueryOptions,\n }: PostgresVectorStoreArgs = {}\n ): Promise<PostgresVectorStore> {\n if (metadataColumns !== undefined && ignoreMetadataColumns !== undefined) {\n throw Error(\n \"Can not use both metadata_columns and ignore_metadata_columns.\"\n );\n }\n\n const { rows } = await engine.pool.raw(\n `SELECT column_name, data_type FROM information_schema.columns WHERE table_name = '${tableName}' AND table_schema = '${schemaName}'`\n );\n const columns: { [key: string]: string } = {};\n\n for (const index in rows) {\n if (rows[index]) {\n const row = rows[index];\n columns[row.column_name] = row.data_type;\n }\n }\n\n if (!Object.prototype.hasOwnProperty.call(columns, idColumn)) {\n throw Error(`Id column: ${idColumn}, does not exist.`);\n }\n\n if (!Object.prototype.hasOwnProperty.call(columns, contentColumn)) {\n throw Error(`Content column: ${contentColumn}, does not exist.`);\n }\n\n const contentType = columns[contentColumn];\n\n if (contentType !== \"text\" && !contentType.includes(\"char\")) {\n throw Error(\n `Content column: ${contentColumn}, is type: ${contentType}. It must be a type of character string.`\n );\n }\n\n if (!Object.prototype.hasOwnProperty.call(columns, embeddingColumn)) {\n throw Error(`Embedding column: ${embeddingColumn}, does not exist.`);\n }\n\n if (columns[embeddingColumn] !== \"USER-DEFINED\") {\n throw Error(\n `Embedding column: ${embeddingColumn} is not of type Vector.`\n );\n }\n\n const jsonColumn = Object.prototype.hasOwnProperty.call(\n columns,\n metadataJsonColumn\n )\n ? metadataJsonColumn\n : \"\";\n\n for (const column of metadataColumns) {\n if (!Object.prototype.hasOwnProperty.call(columns, column)) {\n throw Error(`Metadata column: ${column}, does not exist.`);\n }\n }\n\n const allColumns = columns;\n let allMetadataColumns: string[] = [];\n if (\n ignoreMetadataColumns !== undefined &&\n ignoreMetadataColumns.length > 0\n ) {\n for (const column of ignoreMetadataColumns) {\n delete allColumns[column];\n }\n\n delete allColumns[idColumn];\n delete allColumns[contentColumn];\n delete allColumns[embeddingColumn];\n allMetadataColumns = Object.keys(allColumns);\n } else {\n for (const column of metadataColumns) {\n if (Object.prototype.hasOwnProperty.call(allColumns, column)) {\n allMetadataColumns.push(column);\n }\n }\n }\n return new PostgresVectorStore(embeddings, {\n engine,\n tableName,\n schemaName,\n contentColumn,\n embeddingColumn,\n metadataColumns: allMetadataColumns,\n idColumn,\n metadataJsonColumn: jsonColumn,\n distanceStrategy,\n k,\n fetchK,\n lambdaMult,\n indexQueryOptions,\n });\n }\n\n static async fromTexts(\n texts: string[],\n metadatas: object[] | object,\n embeddings: EmbeddingsInterface,\n dbConfig: dbConfigArgs\n ): Promise<VectorStore> {\n const documents: Document[] = [];\n\n for (let i = 0; i < texts.length; i += 1) {\n const doc = new Document({\n pageContent: texts[i],\n metadata: Array.isArray(metadatas) ? metadatas[i] : metadatas,\n });\n documents.push(doc);\n }\n\n return PostgresVectorStore.fromDocuments(documents, embeddings, dbConfig);\n }\n\n static async fromDocuments(\n docs: Document[],\n embeddings: EmbeddingsInterface,\n dbConfig: dbConfigArgs\n ): Promise<VectorStore> {\n const { engine } = dbConfig;\n const { tableName } = dbConfig;\n const config = dbConfig.dbConfig;\n const vectorStore = await this.initialize(\n engine,\n embeddings,\n tableName,\n config\n );\n\n await vectorStore.addDocuments(docs);\n\n return vectorStore;\n }\n\n async addVectors(\n vectors: number[][],\n documents: Document[],\n options?: { ids?: string[] }\n ): Promise<string[] | void> {\n let ids: string[] = [];\n const metadatas: Record<string, string>[] = [];\n\n if (vectors.length !== documents.length) {\n throw new Error(\n \"The number of vectors must match the number of documents provided.\"\n );\n }\n\n if (options?.ids) {\n ids = options.ids;\n } else {\n documents.forEach((document) => {\n if (document.id !== undefined) {\n ids.push(document.id);\n } else {\n ids.push(uuidv4());\n }\n });\n }\n\n if (options && options.ids && options.ids.length !== documents.length) {\n throw new Error(\n \"The number of ids must match the number of documents provided.\"\n );\n }\n\n documents.forEach((document) => {\n metadatas.push(document.metadata);\n });\n\n const tuples = customZip(ids, documents, vectors, metadatas);\n\n // Insert embeddings\n for (const [id, document, embedding, metadata] of tuples) {\n const metadataColNames =\n this.metadataColumns.length > 0\n ? `, \"${this.metadataColumns.join('\",\"')}\"`\n : \"\";\n\n let stmt = `INSERT INTO \"${this.schemaName}\".\"${this.tableName}\"(\"${this.idColumn}\", \"${this.contentColumn}\", \"${this.embeddingColumn}\" ${metadataColNames}`;\n const values: { [key: string]: string | string[] } = {\n id,\n content: document.pageContent,\n embedding: `[${embedding.toString()}]`,\n };\n let valuesStmt = \" VALUES (:id, :content, :embedding\";\n\n // Add metadata\n const extra = metadata;\n for (const metadataColumn of this.metadataColumns) {\n if (Object.prototype.hasOwnProperty.call(metadata, metadataColumn)) {\n valuesStmt += `, :${metadataColumn}`;\n values[metadataColumn] = metadata[metadataColumn];\n delete extra[metadataColumn];\n } else {\n valuesStmt += \" ,null\";\n }\n }\n\n // Add JSON column and/or close statement\n stmt += this.metadataJsonColumn ? `, ${this.metadataJsonColumn})` : \")\";\n if (this.metadataJsonColumn) {\n valuesStmt += \", :extra)\";\n Object.assign(values, { extra: JSON.stringify(extra) });\n } else {\n valuesStmt += \")\";\n }\n\n const query = stmt + valuesStmt;\n await this.engine.pool.raw(query, values);\n }\n\n return options?.ids;\n }\n\n _vectorstoreType(): string {\n return \"cloudsqlpostgresql\";\n }\n\n /**\n * Adds documents to the vector store, embedding them first through the\n * `embeddings` instance.\n *\n * @param documents - Array of documents to embed and add.\n * @param options - Optional configuration for embedding and storing documents.\n * @returns A promise resolving to an array of document IDs or void, based on implementation.\n * @abstract\n */\n async addDocuments(\n documents: Document[],\n options?: { ids?: string[] }\n ): Promise<string[] | void> {\n const texts = [];\n\n for (const doc of documents) {\n texts.push(doc.pageContent);\n }\n\n const embeddings = await this.embeddings.embedDocuments(texts);\n const results = await this.addVectors(embeddings, documents, options);\n\n return results;\n }\n\n /**\n * Deletes documents from the vector store based on the specified ids.\n *\n * @param params - Flexible key-value pairs defining conditions for document deletion.\n * @param ids - Optional: Property of {params} that contains the array of ids to be deleted\n * @returns A promise that resolves once the deletion is complete.\n */\n async delete(params: { ids?: string[] }): Promise<void> {\n if (params.ids === undefined) return;\n const idList = params.ids.map((id) => `'${id}'`).join(\", \");\n const query = `DELETE FROM \"${this.schemaName}\".\"${this.tableName}\" WHERE \"${this.idColumn}\" in (${idList})`;\n await this.engine.pool.raw(query);\n }\n\n async similaritySearchVectorWithScore(\n embedding: number[],\n k: number,\n filter?: this[\"FilterType\"]\n ): Promise<[Document, number][]> {\n const results = await this.queryCollection(embedding, k, filter);\n const documentsWithScores: [Document, number][] = [];\n\n for (const row of results) {\n const metadata =\n this.metadataJsonColumn && row[this.metadataJsonColumn]\n ? row[this.metadataJsonColumn]\n : {};\n\n for (const col of this.metadataColumns) {\n metadata[col] = row[col];\n }\n\n documentsWithScores.push([\n new Document({ pageContent: row[this.contentColumn], metadata }),\n row.distance,\n ]);\n }\n\n return documentsWithScores;\n }\n\n private async queryCollection(\n embedding: number[],\n k?: number | undefined,\n filter?: this[\"FilterType\"] | undefined\n ) {\n const fetchK = k ?? this.k;\n const { operator } = this.distanceStrategy;\n const { searchFunction } = this.distanceStrategy;\n const _filter = filter !== undefined ? `WHERE ${filter}` : \"\";\n const metadataColNames =\n this.metadataColumns.length > 0\n ? `, \"${this.metadataColumns.join('\",\"')}\"`\n : \"\";\n const metadataJsonColName = this.metadataJsonColumn\n ? `, \"${this.metadataJsonColumn}\"`\n : \"\";\n\n const query = `SELECT \"${this.idColumn}\", \"${this.contentColumn}\", \"${this.embeddingColumn}\" ${metadataColNames} ${metadataJsonColName}, ${searchFunction}(\"${this.embeddingColumn}\", '[${embedding}]') as distance FROM \"${this.schemaName}\".\"${this.tableName}\" ${_filter} ORDER BY \"${this.embeddingColumn}\" ${operator} '[${embedding}]' LIMIT ${fetchK};`;\n\n if (this.indexQueryOptions) {\n await this.engine.pool.raw(\n `SET LOCAL ${this.indexQueryOptions.to_string()}`\n );\n }\n\n const { rows } = await this.engine.pool.raw(query);\n\n return rows;\n }\n\n async maxMarginalRelevanceSearch(\n query: string,\n options: MaxMarginalRelevanceSearchOptions<this[\"FilterType\"]>\n ): Promise<Document[]> {\n const vector = await this.embeddings.embedQuery(query);\n const results = await this.queryCollection(\n vector,\n options?.k,\n options?.filter\n );\n const k = options?.k ? options.k : this.k;\n const documentsWithScores: [Document, number][] = [];\n let docsList: Document[] = [];\n\n const embeddingList = results.map((row: { [x: string]: string }) =>\n JSON.parse(row[this.embeddingColumn])\n );\n const mmrSelected = maximalMarginalRelevance(\n vector,\n embeddingList,\n options?.lambda,\n k\n );\n\n for (const row of results) {\n const metadata =\n this.metadataJsonColumn && row[this.metadataJsonColumn]\n ? row[this.metadataJsonColumn]\n : {};\n for (const col of this.metadataColumns) {\n metadata[col] = row[col];\n }\n documentsWithScores.push([\n new Document({\n pageContent: row[this.contentColumn],\n metadata,\n }),\n row.distance,\n ]);\n }\n\n docsList = documentsWithScores\n .filter((_, i) => mmrSelected.includes(i))\n .map(([doc, _]) => doc);\n\n return docsList;\n }\n\n /**\n * Create an index on the vector store table\n * @param {BaseIndex} index\n * @param {string} name Optional\n * @param {boolean} concurrently Optional\n */\n async applyVectorIndex(\n index: BaseIndex,\n name?: string,\n concurrently: boolean = false\n ): Promise<void> {\n if (index.constructor.name === \"ExactNearestNeighbor\") {\n await this.dropVectorIndex();\n return;\n }\n\n const filter =\n index.partialIndexes && index.partialIndexes?.length > 0\n ? `WHERE (${index.partialIndexes})`\n : \"\";\n const params = `WITH ${index.indexOptions()}`;\n const funct = index.distanceStrategy.indexFunction;\n\n let indexName = name;\n if (!indexName) {\n if (!index.name) {\n indexName = this.tableName + DEFAULT_INDEX_NAME_SUFFIX;\n } else {\n indexName = index.name;\n }\n }\n\n const stmt = `CREATE INDEX ${\n concurrently ? \"CONCURRENTLY\" : \"\"\n } ${indexName} ON \"${this.schemaName}\".\"${this.tableName}\" USING ${\n index.indexType\n } (${this.embeddingColumn} ${funct}) ${params} ${filter};`;\n\n await this.engine.pool.raw(stmt);\n }\n\n /**\n * Check if index exists in the table.\n * @param {string} indexName Optional - index name\n */\n async isValidIndex(indexName?: string): Promise<boolean> {\n const idxName = indexName || this.tableName + DEFAULT_INDEX_NAME_SUFFIX;\n const stmt = `SELECT tablename, indexname\n FROM pg_indexes\n WHERE tablename = '${this.tableName}' AND schemaname = '${this.schemaName}' AND indexname = '${idxName}';`;\n const { rows } = await this.engine.pool.raw(stmt);\n\n return rows.length === 1;\n }\n\n /**\n * Drop the vector index\n * @param {string} indexName Optional - index name\n */\n async dropVectorIndex(indexName?: string): Promise<void> {\n const idxName = indexName || this.tableName + DEFAULT_INDEX_NAME_SUFFIX;\n const query = `DROP INDEX IF EXISTS ${idxName};`;\n await this.engine.pool.raw(query);\n }\n\n /**\n * Re-index the vector store table\n * @param {string} indexName Optional - index name\n */\n async reIndex(indexName?: string) {\n const idxName = indexName || this.tableName + DEFAULT_INDEX_NAME_SUFFIX;\n const query = `REINDEX INDEX ${idxName};`;\n await this.engine.pool.raw(query);\n }\n}\n\nexport default PostgresVectorStore;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"vectorstore.js","names":["embeddings: EmbeddingsInterface","dbConfig: VSArgs","engine: PostgresEngine","tableName: string","columns: { [key: string]: string }","allMetadataColumns: string[]","texts: string[]","metadatas: object[] | object","dbConfig: dbConfigArgs","documents: Document[]","docs: Document[]","vectors: number[][]","options?: { ids?: string[] }","ids: string[]","metadatas: Record<string, string>[]","uuidv4","values: { [key: string]: string | string[] }","params: { ids?: string[] }","embedding: number[]","k: number","filter?: this[\"FilterType\"]","documentsWithScores: [Document, number][]","k?: number | undefined","filter?: this[\"FilterType\"] | undefined","filterBindings: Record<string, string>","query: string","options: MaxMarginalRelevanceSearchOptions<this[\"FilterType\"]>","docsList: Document[]","row: { [x: string]: string }","index: BaseIndex","name?: string","concurrently: boolean","indexName?: string"],"sources":["../src/vectorstore.ts"],"sourcesContent":["import { EmbeddingsInterface } from \"@langchain/core/embeddings\";\nimport {\n MaxMarginalRelevanceSearchOptions,\n VectorStore,\n} from \"@langchain/core/vectorstores\";\nimport { Document } from \"@langchain/core/documents\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { maximalMarginalRelevance } from \"@langchain/core/utils/math\";\nimport {\n BaseIndex,\n DEFAULT_DISTANCE_STRATEGY,\n DEFAULT_INDEX_NAME_SUFFIX,\n DistanceStrategy,\n QueryOptions,\n} from \"./indexes.js\";\nimport PostgresEngine from \"./engine.js\";\nimport { customZip } from \"./utils/utils.js\";\n\nexport interface PostgresVectorStoreArgs {\n schemaName?: string;\n contentColumn?: string;\n embeddingColumn?: string;\n metadataColumns?: Array<string>;\n idColumn?: string;\n distanceStrategy?: DistanceStrategy;\n k?: number;\n fetchK?: number;\n lambdaMult?: number;\n ignoreMetadataColumns?: Array<string>;\n metadataJsonColumn?: string;\n indexQueryOptions?: QueryOptions;\n}\n\nexport interface dbConfigArgs {\n engine: PostgresEngine;\n tableName: string;\n dbConfig?: PostgresVectorStoreArgs;\n}\n\ninterface VSArgs {\n engine: PostgresEngine;\n tableName: string;\n schemaName: string;\n contentColumn: string;\n embeddingColumn: string;\n metadataColumns: Array<string>;\n idColumn: string;\n distanceStrategy: DistanceStrategy;\n k: number;\n fetchK: number;\n lambdaMult: number;\n metadataJsonColumn: string;\n indexQueryOptions?: QueryOptions;\n}\n\n/**\n * Google Cloud SQL for PostgreSQL vector store integration.\n *\n * Setup:\n * Install `@langchain/google-cloud-sql-pg`\n *\n * ```bash\n * npm install @langchain/google-cloud-sql-pg\n * ```\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { Column, PostgresEngine, PostgresEngineArgs, PostgresVectorStore, VectorStoreTableArgs } from \"@langchain/google-cloud-sql-pg\";\n * // Or other embeddings\n * import { OpenAIEmbeddings } from '@langchain/openai';\n *\n *\n * const embeddings = new OpenAIEmbeddings({\n * model: \"text-embedding-3-small\",\n * });\n *\n * const pgArgs: PostgresEngineArgs = {\n * user: \"db-user\",\n * password: \"password\"\n * }\n * // Create a shared connection pool\n * const engine: PostgresEngine = await PostgresEngine.fromInstance(\n * \"project-id\",\n * \"region\",\n * \"instance-name\",\n * \"database-name\",\n * pgArgs\n * );\n * // (Optional) Specify metadata columns for filtering\n * // All other metadata will be added to JSON\n * const vectorStoreTableArgs: VectorStoreTableArgs = {\n * metadataColumns: [new Column(\"baz\", \"TEXT\")],\n * };\n * // Create a vector store table\n * await engine.initVectorstoreTable(\"my-table\", 768, vectorStoreTableArgs);\n * // Customize the vector store\n * const pvectorArgs: PostgresVectorStoreArgs = {\n * idColumn: \"ID_COLUMN\",\n * contentColumn: \"CONTENT_COLUMN\",\n * embeddingColumn: \"EMBEDDING_COLUMN\",\n * metadataColumns: [\"baz\"]\n * }\n *\n * const vectorStore = await PostgresVectorStore.initialize(engine, embeddingService, \"my-table\", pvectorArgs);\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Add documents</strong></summary>\n *\n * ```typescript\n * import type { Document } from '@langchain/core/documents';\n *\n * const document1 = { pageContent: \"foo\", metadata: { baz: \"bar\" } };\n * const document2 = { pageContent: \"thud\", metadata: { bar: \"baz\" } };\n * const document3 = { pageContent: \"i will be deleted :(\", metadata: {} };\n *\n * const documents: Document[] = [document1, document2, document3];\n * const ids = [\"1\", \"2\", \"3\"];\n * await vectorStore.addDocuments(documents, { ids });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Delete documents</strong></summary>\n *\n * ```typescript\n * await vectorStore.delete({ ids: [\"3\"] });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Similarity search</strong></summary>\n *\n * ```typescript\n * const results = await vectorStore.similaritySearch(\"thud\", 1);\n * for (const doc of results) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:thud [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with filter</strong></summary>\n *\n * ```typescript\n * const resultsWithFilter = await vectorStore.similaritySearch(\"thud\", 1, { baz: \"bar\" });\n *\n * for (const doc of resultsWithFilter) {\n * console.log(`* ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:foo [{\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n *\n * <details>\n * <summary><strong>Similarity search with score</strong></summary>\n *\n * ```typescript\n * const resultsWithScore = await vectorStore.similaritySearchWithScore(\"qux\", 1);\n * for (const [doc, score] of resultsWithScore) {\n * console.log(`* [SIM=${score.toFixed(6)}] ${doc.pageContent} [${JSON.stringify(doc.metadata, null)}]`);\n * }\n * // Output:[SIM=0.000000] qux [{\"bar\":\"baz\",\"baz\":\"bar\"}]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>As a retriever</strong></summary>\n *\n * ```typescript\n * const retriever = vectorStore.asRetriever({\n * searchType: \"mmr\", // Leave blank for standard similarity search\n * k: 1,\n * });\n * const resultAsRetriever = await retriever.invoke(\"thud\");\n * console.log(resultAsRetriever);\n *\n * // Output: [Document({ metadata: { \"baz\":\"bar\" }, pageContent: \"thud\" })]\n * ```\n * </details>\n *\n * <br />\n */\nexport class PostgresVectorStore extends VectorStore {\n declare FilterType: Record<string, string>;\n\n engine: PostgresEngine;\n\n embeddings: EmbeddingsInterface;\n\n tableName: string;\n\n schemaName: string;\n\n contentColumn: string;\n\n embeddingColumn: string;\n\n metadataColumns: Array<string>;\n\n idColumn: string;\n\n metadataJsonColumn: string;\n\n distanceStrategy: DistanceStrategy;\n\n k: number;\n\n fetchK: number;\n\n lambdaMult: number;\n\n indexQueryOptions: QueryOptions | undefined;\n\n /**\n * Initializes a new vector store with embeddings and database configuration.\n *\n * @param embeddings - Instance of `EmbeddingsInterface` used to embed queries.\n * @param dbConfig - Configuration settings for the database or storage system.\n */\n constructor(embeddings: EmbeddingsInterface, dbConfig: VSArgs) {\n super(embeddings, dbConfig);\n this.embeddings = embeddings;\n this.engine = dbConfig.engine;\n this.tableName = dbConfig.tableName;\n this.schemaName = dbConfig.schemaName;\n this.contentColumn = dbConfig.contentColumn;\n this.embeddingColumn = dbConfig.embeddingColumn;\n this.metadataColumns = dbConfig.metadataColumns\n ? dbConfig.metadataColumns\n : [];\n this.idColumn = dbConfig.idColumn;\n this.metadataJsonColumn = dbConfig.metadataJsonColumn;\n this.distanceStrategy = dbConfig.distanceStrategy;\n this.k = dbConfig.k;\n this.fetchK = dbConfig.fetchK;\n this.lambdaMult = dbConfig.lambdaMult;\n this.indexQueryOptions = dbConfig.indexQueryOptions;\n }\n\n /**\n * Create a new PostgresVectorStore instance.\n * @param {PostgresEngine} engine Required - Connection pool engine for managing connections to Cloud SQL for PostgreSQL database.\n * @param {Embeddings} embeddings Required - Text embedding model to use.\n * @param {string} tableName Required - Name of an existing table or table to be created.\n * @param {string} schemaName Database schema name of the table. Defaults to \"public\".\n * @param {string} contentColumn Column that represent a Document's page_content. Defaults to \"content\".\n * @param {string} embeddingColumn Column for embedding vectors. The embedding is generated from the document value. Defaults to \"embedding\".\n * @param {Array<string>} metadataColumns Column(s) that represent a document's metadata.\n * @param {Array<string>} ignoreMetadataColumns Optional - Column(s) to ignore in pre-existing tables for a document's metadata. Can not be used with metadata_columns.\n * @param {string} idColumn Column that represents the Document's id. Defaults to \"langchain_id\".\n * @param {string} metadataJsonColumn Optional - Column to store metadata as JSON. Defaults to \"langchain_metadata\".\n * @param {DistanceStrategy} distanceStrategy Distance strategy to use for vector similarity search. Defaults to COSINE_DISTANCE.\n * @param {number} k Number of Documents to return from search. Defaults to 4.\n * @param {number} fetchK Number of Documents to fetch to pass to MMR algorithm.\n * @param {number} lambdaMult Number between 0 and 1 that determines the degree of diversity among the results with 0 corresponding to maximum diversity and 1 to minimum diversity. Defaults to 0.5.\n * @param {QueryOptions} indexQueryOptions Optional - Index query option.\n * @returns PostgresVectorStore instance.\n */\n static async initialize(\n engine: PostgresEngine,\n embeddings: EmbeddingsInterface,\n tableName: string,\n {\n schemaName = \"public\",\n contentColumn = \"content\",\n embeddingColumn = \"embedding\",\n metadataColumns = [],\n ignoreMetadataColumns,\n idColumn = \"langchain_id\",\n metadataJsonColumn = \"langchain_metadata\",\n distanceStrategy = DEFAULT_DISTANCE_STRATEGY,\n k = 4,\n fetchK = 20,\n lambdaMult = 0.5,\n indexQueryOptions,\n }: PostgresVectorStoreArgs = {}\n ): Promise<PostgresVectorStore> {\n if (metadataColumns !== undefined && ignoreMetadataColumns !== undefined) {\n throw Error(\n \"Can not use both metadata_columns and ignore_metadata_columns.\"\n );\n }\n\n const { rows } = await engine.pool.raw(\n `SELECT column_name, data_type FROM information_schema.columns WHERE table_name = '${tableName}' AND table_schema = '${schemaName}'`\n );\n const columns: { [key: string]: string } = {};\n\n for (const index in rows) {\n if (rows[index]) {\n const row = rows[index];\n columns[row.column_name] = row.data_type;\n }\n }\n\n if (!Object.prototype.hasOwnProperty.call(columns, idColumn)) {\n throw Error(`Id column: ${idColumn}, does not exist.`);\n }\n\n if (!Object.prototype.hasOwnProperty.call(columns, contentColumn)) {\n throw Error(`Content column: ${contentColumn}, does not exist.`);\n }\n\n const contentType = columns[contentColumn];\n\n if (contentType !== \"text\" && !contentType.includes(\"char\")) {\n throw Error(\n `Content column: ${contentColumn}, is type: ${contentType}. It must be a type of character string.`\n );\n }\n\n if (!Object.prototype.hasOwnProperty.call(columns, embeddingColumn)) {\n throw Error(`Embedding column: ${embeddingColumn}, does not exist.`);\n }\n\n if (columns[embeddingColumn] !== \"USER-DEFINED\") {\n throw Error(\n `Embedding column: ${embeddingColumn} is not of type Vector.`\n );\n }\n\n const jsonColumn = Object.prototype.hasOwnProperty.call(\n columns,\n metadataJsonColumn\n )\n ? metadataJsonColumn\n : \"\";\n\n for (const column of metadataColumns) {\n if (!Object.prototype.hasOwnProperty.call(columns, column)) {\n throw Error(`Metadata column: ${column}, does not exist.`);\n }\n }\n\n const allColumns = columns;\n let allMetadataColumns: string[] = [];\n if (\n ignoreMetadataColumns !== undefined &&\n ignoreMetadataColumns.length > 0\n ) {\n for (const column of ignoreMetadataColumns) {\n delete allColumns[column];\n }\n\n delete allColumns[idColumn];\n delete allColumns[contentColumn];\n delete allColumns[embeddingColumn];\n allMetadataColumns = Object.keys(allColumns);\n } else {\n for (const column of metadataColumns) {\n if (Object.prototype.hasOwnProperty.call(allColumns, column)) {\n allMetadataColumns.push(column);\n }\n }\n }\n return new PostgresVectorStore(embeddings, {\n engine,\n tableName,\n schemaName,\n contentColumn,\n embeddingColumn,\n metadataColumns: allMetadataColumns,\n idColumn,\n metadataJsonColumn: jsonColumn,\n distanceStrategy,\n k,\n fetchK,\n lambdaMult,\n indexQueryOptions,\n });\n }\n\n static async fromTexts(\n texts: string[],\n metadatas: object[] | object,\n embeddings: EmbeddingsInterface,\n dbConfig: dbConfigArgs\n ): Promise<VectorStore> {\n const documents: Document[] = [];\n\n for (let i = 0; i < texts.length; i += 1) {\n const doc = new Document({\n pageContent: texts[i],\n metadata: Array.isArray(metadatas) ? metadatas[i] : metadatas,\n });\n documents.push(doc);\n }\n\n return PostgresVectorStore.fromDocuments(documents, embeddings, dbConfig);\n }\n\n static async fromDocuments(\n docs: Document[],\n embeddings: EmbeddingsInterface,\n dbConfig: dbConfigArgs\n ): Promise<VectorStore> {\n const { engine } = dbConfig;\n const { tableName } = dbConfig;\n const config = dbConfig.dbConfig;\n const vectorStore = await this.initialize(\n engine,\n embeddings,\n tableName,\n config\n );\n\n await vectorStore.addDocuments(docs);\n\n return vectorStore;\n }\n\n async addVectors(\n vectors: number[][],\n documents: Document[],\n options?: { ids?: string[] }\n ): Promise<string[] | void> {\n let ids: string[] = [];\n const metadatas: Record<string, string>[] = [];\n\n if (vectors.length !== documents.length) {\n throw new Error(\n \"The number of vectors must match the number of documents provided.\"\n );\n }\n\n if (options?.ids) {\n ids = options.ids;\n } else {\n documents.forEach((document) => {\n if (document.id !== undefined) {\n ids.push(document.id);\n } else {\n ids.push(uuidv4());\n }\n });\n }\n\n if (options && options.ids && options.ids.length !== documents.length) {\n throw new Error(\n \"The number of ids must match the number of documents provided.\"\n );\n }\n\n documents.forEach((document) => {\n metadatas.push(document.metadata);\n });\n\n const tuples = customZip(ids, documents, vectors, metadatas);\n\n // Insert embeddings\n for (const [id, document, embedding, metadata] of tuples) {\n const metadataColNames =\n this.metadataColumns.length > 0\n ? `, \"${this.metadataColumns.join('\",\"')}\"`\n : \"\";\n\n let stmt = `INSERT INTO \"${this.schemaName}\".\"${this.tableName}\"(\"${this.idColumn}\", \"${this.contentColumn}\", \"${this.embeddingColumn}\" ${metadataColNames}`;\n const values: { [key: string]: string | string[] } = {\n id,\n content: document.pageContent,\n embedding: `[${embedding.toString()}]`,\n };\n let valuesStmt = \" VALUES (:id, :content, :embedding\";\n\n // Add metadata\n const extra = metadata;\n for (const metadataColumn of this.metadataColumns) {\n if (Object.prototype.hasOwnProperty.call(metadata, metadataColumn)) {\n valuesStmt += `, :${metadataColumn}`;\n values[metadataColumn] = metadata[metadataColumn];\n delete extra[metadataColumn];\n } else {\n valuesStmt += \" ,null\";\n }\n }\n\n // Add JSON column and/or close statement\n stmt += this.metadataJsonColumn ? `, ${this.metadataJsonColumn})` : \")\";\n if (this.metadataJsonColumn) {\n valuesStmt += \", :extra)\";\n Object.assign(values, { extra: JSON.stringify(extra) });\n } else {\n valuesStmt += \")\";\n }\n\n const query = stmt + valuesStmt;\n await this.engine.pool.raw(query, values);\n }\n\n return options?.ids;\n }\n\n _vectorstoreType(): string {\n return \"cloudsqlpostgresql\";\n }\n\n /**\n * Adds documents to the vector store, embedding them first through the\n * `embeddings` instance.\n *\n * @param documents - Array of documents to embed and add.\n * @param options - Optional configuration for embedding and storing documents.\n * @returns A promise resolving to an array of document IDs or void, based on implementation.\n * @abstract\n */\n async addDocuments(\n documents: Document[],\n options?: { ids?: string[] }\n ): Promise<string[] | void> {\n const texts = [];\n\n for (const doc of documents) {\n texts.push(doc.pageContent);\n }\n\n const embeddings = await this.embeddings.embedDocuments(texts);\n const results = await this.addVectors(embeddings, documents, options);\n\n return results;\n }\n\n /**\n * Deletes documents from the vector store based on the specified ids.\n *\n * @param params - Flexible key-value pairs defining conditions for document deletion.\n * @param ids - Optional: Property of {params} that contains the array of ids to be deleted\n * @returns A promise that resolves once the deletion is complete.\n */\n async delete(params: { ids?: string[] }): Promise<void> {\n if (params.ids === undefined) return;\n const idList = params.ids.map((id) => `'${id}'`).join(\", \");\n const query = `DELETE FROM \"${this.schemaName}\".\"${this.tableName}\" WHERE \"${this.idColumn}\" in (${idList})`;\n await this.engine.pool.raw(query);\n }\n\n async similaritySearchVectorWithScore(\n embedding: number[],\n k: number,\n filter?: this[\"FilterType\"]\n ): Promise<[Document, number][]> {\n const results = await this.queryCollection(embedding, k, filter);\n const documentsWithScores: [Document, number][] = [];\n\n for (const row of results) {\n const metadata =\n this.metadataJsonColumn && row[this.metadataJsonColumn]\n ? row[this.metadataJsonColumn]\n : {};\n\n for (const col of this.metadataColumns) {\n metadata[col] = row[col];\n }\n\n documentsWithScores.push([\n new Document({ pageContent: row[this.contentColumn], metadata }),\n row.distance,\n ]);\n }\n\n return documentsWithScores;\n }\n\n private async queryCollection(\n embedding: number[],\n k?: number | undefined,\n filter?: this[\"FilterType\"] | undefined\n ) {\n const fetchK = k ?? this.k;\n const { operator } = this.distanceStrategy;\n const { searchFunction } = this.distanceStrategy;\n const filterColumns = filter !== undefined ? Object.keys(filter) : [];\n const filterBindings: Record<string, string> = {};\n let _filter = \"\";\n if (filterColumns.length > 0) {\n const conditions = filterColumns.map((col, i) => {\n const bindingKey = `filter_${i}`;\n filterBindings[bindingKey] = filter[col];\n return `\"${col.replace(/\"/g, '\"\"')}\" = :${bindingKey}`;\n });\n _filter = `WHERE ${conditions.join(\" AND \")}`;\n }\n const metadataColNames =\n this.metadataColumns.length > 0\n ? `, \"${this.metadataColumns.join('\",\"')}\"`\n : \"\";\n const metadataJsonColName = this.metadataJsonColumn\n ? `, \"${this.metadataJsonColumn}\"`\n : \"\";\n\n const query = `SELECT \"${this.idColumn}\", \"${this.contentColumn}\", \"${this.embeddingColumn}\" ${metadataColNames} ${metadataJsonColName}, ${searchFunction}(\"${this.embeddingColumn}\", '[${embedding}]') as distance FROM \"${this.schemaName}\".\"${this.tableName}\" ${_filter} ORDER BY \"${this.embeddingColumn}\" ${operator} '[${embedding}]' LIMIT ${fetchK};`;\n\n if (this.indexQueryOptions) {\n await this.engine.pool.raw(\n `SET LOCAL ${this.indexQueryOptions.to_string()}`\n );\n }\n\n const { rows } = await this.engine.pool.raw(query, filterBindings);\n\n return rows;\n }\n\n async maxMarginalRelevanceSearch(\n query: string,\n options: MaxMarginalRelevanceSearchOptions<this[\"FilterType\"]>\n ): Promise<Document[]> {\n const vector = await this.embeddings.embedQuery(query);\n const results = await this.queryCollection(\n vector,\n options?.k,\n options?.filter\n );\n const k = options?.k ? options.k : this.k;\n const documentsWithScores: [Document, number][] = [];\n let docsList: Document[] = [];\n\n const embeddingList = results.map((row: { [x: string]: string }) =>\n JSON.parse(row[this.embeddingColumn])\n );\n const mmrSelected = maximalMarginalRelevance(\n vector,\n embeddingList,\n options?.lambda,\n k\n );\n\n for (const row of results) {\n const metadata =\n this.metadataJsonColumn && row[this.metadataJsonColumn]\n ? row[this.metadataJsonColumn]\n : {};\n for (const col of this.metadataColumns) {\n metadata[col] = row[col];\n }\n documentsWithScores.push([\n new Document({\n pageContent: row[this.contentColumn],\n metadata,\n }),\n row.distance,\n ]);\n }\n\n docsList = documentsWithScores\n .filter((_, i) => mmrSelected.includes(i))\n .map(([doc, _]) => doc);\n\n return docsList;\n }\n\n /**\n * Create an index on the vector store table\n * @param {BaseIndex} index\n * @param {string} name Optional\n * @param {boolean} concurrently Optional\n */\n async applyVectorIndex(\n index: BaseIndex,\n name?: string,\n concurrently: boolean = false\n ): Promise<void> {\n if (index.constructor.name === \"ExactNearestNeighbor\") {\n await this.dropVectorIndex();\n return;\n }\n\n const filter =\n index.partialIndexes && index.partialIndexes?.length > 0\n ? `WHERE (${index.partialIndexes})`\n : \"\";\n const params = `WITH ${index.indexOptions()}`;\n const funct = index.distanceStrategy.indexFunction;\n\n let indexName = name;\n if (!indexName) {\n if (!index.name) {\n indexName = this.tableName + DEFAULT_INDEX_NAME_SUFFIX;\n } else {\n indexName = index.name;\n }\n }\n\n const stmt = `CREATE INDEX ${\n concurrently ? \"CONCURRENTLY\" : \"\"\n } ${indexName} ON \"${this.schemaName}\".\"${this.tableName}\" USING ${\n index.indexType\n } (${this.embeddingColumn} ${funct}) ${params} ${filter};`;\n\n await this.engine.pool.raw(stmt);\n }\n\n /**\n * Check if index exists in the table.\n * @param {string} indexName Optional - index name\n */\n async isValidIndex(indexName?: string): Promise<boolean> {\n const idxName = indexName || this.tableName + DEFAULT_INDEX_NAME_SUFFIX;\n const stmt = `SELECT tablename, indexname\n FROM pg_indexes\n WHERE tablename = '${this.tableName}' AND schemaname = '${this.schemaName}' AND indexname = '${idxName}';`;\n const { rows } = await this.engine.pool.raw(stmt);\n\n return rows.length === 1;\n }\n\n /**\n * Drop the vector index\n * @param {string} indexName Optional - index name\n */\n async dropVectorIndex(indexName?: string): Promise<void> {\n const idxName = indexName || this.tableName + DEFAULT_INDEX_NAME_SUFFIX;\n const query = `DROP INDEX IF EXISTS ${idxName};`;\n await this.engine.pool.raw(query);\n }\n\n /**\n * Re-index the vector store table\n * @param {string} indexName Optional - index name\n */\n async reIndex(indexName?: string) {\n const idxName = indexName || this.tableName + DEFAULT_INDEX_NAME_SUFFIX;\n const query = `REINDEX INDEX ${idxName};`;\n await this.engine.pool.raw(query);\n }\n}\n\nexport default PostgresVectorStore;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@langchain/google-cloud-sql-pg",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.22",
|
|
4
4
|
"description": "LangChain.js integrations for Google Cloud SQL for PostgreSQL",
|
|
5
5
|
"author": "Google LLC",
|
|
6
6
|
"license": "MIT",
|
|
@@ -18,26 +18,26 @@
|
|
|
18
18
|
"google-auth-library": "^9.15.0",
|
|
19
19
|
"knex": "^3.1.0",
|
|
20
20
|
"uuid": "^11.0.5",
|
|
21
|
-
"@langchain/core": "1.1.
|
|
21
|
+
"@langchain/core": "^1.1.24"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
|
-
"@jest/globals": "^
|
|
25
|
-
"@swc/core": "^1.
|
|
24
|
+
"@jest/globals": "^30.2.0",
|
|
25
|
+
"@swc/core": "^1.15.11",
|
|
26
26
|
"@swc/jest": "^0.2.29",
|
|
27
|
-
"@testcontainers/postgresql": "^
|
|
27
|
+
"@testcontainers/postgresql": "^11.11.0",
|
|
28
28
|
"@tsconfig/recommended": "^1.0.3",
|
|
29
29
|
"@types/pg": "^8",
|
|
30
30
|
"dotenv": "^16.3.1",
|
|
31
31
|
"dpdm": "^3.14.0",
|
|
32
32
|
"eslint": "^9.34.0",
|
|
33
|
-
"jest": "^
|
|
34
|
-
"jest-environment-node": "^
|
|
33
|
+
"jest": "^30.2.0",
|
|
34
|
+
"jest-environment-node": "^30.2.0",
|
|
35
35
|
"pg": "^8.14.1",
|
|
36
36
|
"prettier": "^3.5.0",
|
|
37
|
-
"testcontainers": "^
|
|
38
|
-
"ts-jest": "^29.
|
|
37
|
+
"testcontainers": "^11.11.0",
|
|
38
|
+
"ts-jest": "^29.4.6",
|
|
39
39
|
"typescript": "~5.8.3",
|
|
40
|
-
"@langchain/core": "1.1.
|
|
40
|
+
"@langchain/core": "^1.1.24",
|
|
41
41
|
"@langchain/eslint": "0.1.1",
|
|
42
42
|
"@langchain/tsconfig": "0.0.1"
|
|
43
43
|
},
|