@langchain/google-cloud-sql-pg 1.0.21 → 1.0.23

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.
Files changed (42) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +37 -23
  3. package/dist/_virtual/{rolldown_runtime.cjs → _rolldown/runtime.cjs} +2 -4
  4. package/dist/chat_message_history.cjs +12 -11
  5. package/dist/chat_message_history.cjs.map +1 -1
  6. package/dist/chat_message_history.d.cts.map +1 -1
  7. package/dist/chat_message_history.d.ts.map +1 -1
  8. package/dist/chat_message_history.js +5 -4
  9. package/dist/chat_message_history.js.map +1 -1
  10. package/dist/engine.cjs +23 -32
  11. package/dist/engine.cjs.map +1 -1
  12. package/dist/engine.d.cts.map +1 -1
  13. package/dist/engine.d.ts.map +1 -1
  14. package/dist/engine.js +15 -25
  15. package/dist/engine.js.map +1 -1
  16. package/dist/index.cjs +9 -9
  17. package/dist/index.js +3 -4
  18. package/dist/indexes.cjs +1 -2
  19. package/dist/indexes.cjs.map +1 -1
  20. package/dist/indexes.d.cts.map +1 -1
  21. package/dist/indexes.d.ts.map +1 -1
  22. package/dist/indexes.js +1 -1
  23. package/dist/indexes.js.map +1 -1
  24. package/dist/loader.cjs +6 -8
  25. package/dist/loader.cjs.map +1 -1
  26. package/dist/loader.d.cts.map +1 -1
  27. package/dist/loader.d.ts.map +1 -1
  28. package/dist/loader.js +2 -4
  29. package/dist/loader.js.map +1 -1
  30. package/dist/utils/utils.cjs +1 -2
  31. package/dist/utils/utils.cjs.map +1 -1
  32. package/dist/utils/utils.js +1 -1
  33. package/dist/utils/utils.js.map +1 -1
  34. package/dist/vectorstore.cjs +29 -27
  35. package/dist/vectorstore.cjs.map +1 -1
  36. package/dist/vectorstore.d.cts +2 -2
  37. package/dist/vectorstore.d.cts.map +1 -1
  38. package/dist/vectorstore.d.ts +2 -2
  39. package/dist/vectorstore.d.ts.map +1 -1
  40. package/dist/vectorstore.js +18 -16
  41. package/dist/vectorstore.js.map +1 -1
  42. package/package.json +15 -25
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @langchain/google-cloud-sql-pg
2
2
 
3
+ ## 1.0.23
4
+
5
+ ### Patch Changes
6
+
7
+ - [#10776](https://github.com/langchain-ai/langchainjs/pull/10776) [`20a9abe`](https://github.com/langchain-ai/langchainjs/commit/20a9abea23ffacf4ae8dc9a7aeec217143bbdeb6) Thanks [@hntrl](https://github.com/hntrl)! - fix(deps): remediate uuid vulnerability by removing direct uuid usage
8
+
9
+ - Updated dependencies [[`20a9abe`](https://github.com/langchain-ai/langchainjs/commit/20a9abea23ffacf4ae8dc9a7aeec217143bbdeb6)]:
10
+ - @langchain/core@1.1.42
11
+
12
+ ## 1.0.22
13
+
14
+ ### Patch Changes
15
+
16
+ - [#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()
17
+
18
+ - [#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()
19
+
3
20
  ## 1.0.21
4
21
 
5
22
  ### Patch Changes
package/README.md CHANGED
@@ -2,14 +2,15 @@
2
2
 
3
3
  The LangChain package for CloudSQL for Postgres provides a way to connect to Cloud SQL instances from the LangChain ecosystem.
4
4
 
5
-
6
5
  Main features:
7
- * The package creates a shared connection pool to connect to Google Cloud Postgres databases utilizing different ways for authentication such as IAM, user and password authorization.
8
- * Store metadata in columns instead of JSON, resulting in significant performance improvements.
9
6
 
10
- ## Before you begin
7
+ - The package creates a shared connection pool to connect to Google Cloud Postgres databases utilizing different ways for authentication such as IAM, user and password authorization.
8
+ - Store metadata in columns instead of JSON, resulting in significant performance improvements.
9
+
10
+ ## Before you begin
11
11
 
12
12
  In order to use this package, you first need to go through the following steps:
13
+
13
14
  1. [Select or create a Cloud Platform project.](https://console.cloud.google.com/project)
14
15
  2. [Enable billing for your project.](https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project)
15
16
  3. [Enable the Cloud SQL Admin API.](https://cloud.google.com/sql/docs/postgres/admin-api)
@@ -53,9 +54,9 @@ const embeddingService = new SyntheticEmbeddings({ vectorSize: 768 });
53
54
 
54
55
  ```
55
56
 
56
- - You can pass the ipType, user, password and iamAccountEmail through the PostgresEngineArgs interface to the PostgresEngine creation.
57
- - You can pass the schemaName, contentColumn, embeddingColum, metadataColumns and others through the VectorStoreTableArgs interface to the init_vectorstore_table method.
58
- - Passing an empty object to these methods allows you to use the default values.
57
+ - You can pass the ipType, user, password and iamAccountEmail through the PostgresEngineArgs interface to the PostgresEngine creation.
58
+ - You can pass the schemaName, contentColumn, embeddingColum, metadataColumns and others through the VectorStoreTableArgs interface to the init_vectorstore_table method.
59
+ - Passing an empty object to these methods allows you to use the default values.
59
60
 
60
61
  ### Vector Store usage
61
62
 
@@ -71,15 +72,16 @@ const pvectorArgs: PostgresVectorStoreArgs = {
71
72
 
72
73
  const vectorStoreInstance = await PostgresVectorStore.initialize(engine, embeddingService, "my-table", pvectorArgs)
73
74
  ```
74
- - You can pass the schemaName, contentColumn, embeddingColumn, distanceStrategy and others through the PostgresVectorStoreArgs interface to the PostgresVectorStore creation.
75
- - Passing an empty object to these methods allows you to use the default values.
75
+
76
+ - You can pass the schemaName, contentColumn, embeddingColumn, distanceStrategy and others through the PostgresVectorStoreArgs interface to the PostgresVectorStore creation.
77
+ - Passing an empty object to these methods allows you to use the default values.
76
78
 
77
79
  PostgresVectorStore interface methods available:
78
80
 
79
- - addDocuments
80
- - addVectors
81
- - similaritySearch
82
- - and others.
81
+ - addDocuments
82
+ - addVectors
83
+ - similaritySearch
84
+ - and others.
83
85
 
84
86
  See the full [Vector Store](https://js.langchain.com/docs/integrations/vectorstores/google_cloudsql_pg) tutorial.
85
87
 
@@ -93,17 +95,21 @@ First, initialize the Chat History Table and then create the ChatMessageHistory
93
95
  // ChatHistory table initialization
94
96
  await engine.initChatHistoryTable("chat_message_table");
95
97
 
96
- const historyInstance = await PostgresChatMessageHistory.initialize(engine, "test", "chat_message_table");
98
+ const historyInstance = await PostgresChatMessageHistory.initialize(
99
+ engine,
100
+ "test",
101
+ "chat_message_table"
102
+ );
97
103
  ```
98
104
 
99
105
  The create method of the PostgresChatMessageHistory receives the engine, the session Id and the table name.
100
106
 
101
107
  PostgresChatMessageHistory interface methods available:
102
108
 
103
- - addMessage
104
- - addMessages
105
- - getMessages
106
- - clear
109
+ - addMessage
110
+ - addMessages
111
+ - getMessages
112
+ - clear
107
113
 
108
114
  See the full [Chat Message History](https://js.langchain.com/docs/integrations/memory/google_cloudsql_pg) tutorial.
109
115
 
@@ -116,14 +122,22 @@ import { PostgresEngine, PostgresLoader } from "@langchain/google-cloud-sql-pg";
116
122
 
117
123
  const documentLoaderArgs: PostgresLoaderOptions = {
118
124
  tableName: "test_table_custom",
119
- contentColumns: [ "fruit_name", "variety"],
120
- metadataColumns: ["fruit_id", "quantity_in_stock", "price_per_unit", "organic"],
121
- format: "text"
125
+ contentColumns: ["fruit_name", "variety"],
126
+ metadataColumns: [
127
+ "fruit_id",
128
+ "quantity_in_stock",
129
+ "price_per_unit",
130
+ "organic",
131
+ ],
132
+ format: "text",
122
133
  };
123
134
 
124
- const documentLoaderInstance = await PostgresLoader.initialize(PEInstance, documentLoaderArgs);
135
+ const documentLoaderInstance = await PostgresLoader.initialize(
136
+ PEInstance,
137
+ documentLoaderArgs
138
+ );
125
139
 
126
140
  const documents = await documentLoaderInstance.load();
127
141
  ```
128
142
 
129
- See the full [Loader](https://js.langchain.com/docs/integrations/document_loaders/web_loaders/google_cloudsql_pg) tutorial.
143
+ See the full [Loader](https://js.langchain.com/docs/integrations/document_loaders/web_loaders/google_cloudsql_pg) tutorial.
@@ -1,4 +1,4 @@
1
- //#region rolldown:runtime
1
+ //#region \0rolldown/runtime.js
2
2
  var __create = Object.create;
3
3
  var __defProp = Object.defineProperty;
4
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -19,7 +19,5 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
19
19
  value: mod,
20
20
  enumerable: true
21
21
  }) : target, mod));
22
-
23
22
  //#endregion
24
-
25
- exports.__toESM = __toESM;
23
+ exports.__toESM = __toESM;
@@ -1,9 +1,8 @@
1
- const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
- const __langchain_core_chat_history = require_rolldown_runtime.__toESM(require("@langchain/core/chat_history"));
3
- const __langchain_core_messages = require_rolldown_runtime.__toESM(require("@langchain/core/messages"));
4
-
1
+ require("./_virtual/_rolldown/runtime.cjs");
2
+ let _langchain_core_chat_history = require("@langchain/core/chat_history");
3
+ let _langchain_core_messages = require("@langchain/core/messages");
5
4
  //#region src/chat_message_history.ts
6
- var PostgresChatMessageHistory = class PostgresChatMessageHistory extends __langchain_core_chat_history.BaseChatMessageHistory {
5
+ var PostgresChatMessageHistory = class PostgresChatMessageHistory extends _langchain_core_chat_history.BaseChatMessageHistory {
7
6
  lc_namespace = [
8
7
  "langchain",
9
8
  "stores",
@@ -31,8 +30,10 @@ var PostgresChatMessageHistory = class PostgresChatMessageHistory extends __lang
31
30
  * @returns PostgresChatMessageHistory instance.
32
31
  */
33
32
  static async initialize(engine, sessionId, tableName, schemaName = "public") {
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);
33
+ const { rows } = await engine.pool.raw(`SELECT column_name, data_type FROM information_schema.columns WHERE table_name = :tableName AND table_schema = :schemaName`, {
34
+ tableName,
35
+ schemaName
36
+ });
36
37
  const columnNames = [];
37
38
  for (const index in rows) if (Object.prototype.hasOwnProperty.call(rows, index)) columnNames.push(rows[index].column_name);
38
39
  const requiredColumns = [
@@ -58,10 +59,10 @@ var PostgresChatMessageHistory = class PostgresChatMessageHistory extends __lang
58
59
  });
59
60
  }
60
61
  addUserMessage(message) {
61
- return this.addMessage(new __langchain_core_messages.HumanMessage(message));
62
+ return this.addMessage(new _langchain_core_messages.HumanMessage(message));
62
63
  }
63
64
  addAIChatMessage(message) {
64
- return this.addMessage(new __langchain_core_messages.AIMessage(message));
65
+ return this.addMessage(new _langchain_core_messages.AIMessage(message));
65
66
  }
66
67
  /**
67
68
  * Returns a list of messages stored in the store.
@@ -76,7 +77,7 @@ var PostgresChatMessageHistory = class PostgresChatMessageHistory extends __lang
76
77
  data: row.data.data,
77
78
  type: row.type
78
79
  });
79
- return (0, __langchain_core_messages.mapStoredMessagesToChatMessages)(items);
80
+ return (0, _langchain_core_messages.mapStoredMessagesToChatMessages)(items);
80
81
  }
81
82
  /**
82
83
  * Add a message object to the store.
@@ -107,7 +108,7 @@ var PostgresChatMessageHistory = class PostgresChatMessageHistory extends __lang
107
108
  await this.engine.pool.raw(query, values);
108
109
  }
109
110
  };
110
-
111
111
  //#endregion
112
112
  exports.PostgresChatMessageHistory = PostgresChatMessageHistory;
113
+
113
114
  //# sourceMappingURL=chat_message_history.cjs.map
@@ -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 = '${tableName}' AND table_schema = '${schemaName}'`;\n const { rows } = await engine.pool.raw(query);\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,kFAAkF,EAAE,UAAU,sBAAsB,EAAE,WAAW,CAAC,CAAC;EAClJ,MAAM,EAAE,MAAM,GAAG,MAAM,OAAO,KAAK,IAAI,MAAM;EAC7C,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"}
1
+ {"version":3,"file":"chat_message_history.cjs","names":["BaseChatMessageHistory","HumanMessage","AIMessage"],"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,6BAAAA,uBAAuB;CACrE,eAAyB;EACvB;EACA;EACA;EACA;EACD;CAED;CAEA;CAEA;CAEA;CAEA,YAAY,EACV,QACA,WACA,WACA,aAAa,YACqB;AAClC,SAAO;AACP,OAAK,SAAS;AACd,OAAK,YAAY;AACjB,OAAK,YAAY;AACjB,OAAK,aAAa;;;;;;;;;;;CAYpB,aAAa,WACX,QACA,WACA,WACA,aAAqB,UACrB;EAEA,MAAM,EAAE,SAAS,MAAM,OAAO,KAAK,IADrB,8HACgC;GAAE;GAAW;GAAY,CAAC;EACxE,MAAM,cAAwB,EAAE;AAEhC,OAAK,MAAM,SAAS,KAClB,KAAI,OAAO,UAAU,eAAe,KAAK,MAAM,MAAM,CACnD,aAAY,KAAK,KAAK,OAAO,YAAY;EAI7C,MAAM,kBAAkB;GAAC;GAAM;GAAc;GAAQ;GAAO;AAE5D,MAAI,CAAC,gBAAgB,OAAO,MAAM,YAAY,SAAS,EAAE,CAAC,CACxD,OAAM,IAAI,MACR,UAAU,WAAW,KAAK,UAAU;2BACjB,YAAY,6BAA6B,gBAAgB;mEACjB,WAAW,KAAK,UAAU;;;;;;QAOtF;AAGH,SAAO,IAAI,2BAA2B;GACpC;GACA;GACA;GACA;GACD,CAAC;;CAGJ,eAAe,SAAgC;AAC7C,SAAO,KAAK,WAAW,IAAIC,yBAAAA,aAAa,QAAQ,CAAC;;CAGnD,iBAAiB,SAAgC;AAC/C,SAAO,KAAK,WAAW,IAAIC,yBAAAA,UAAU,QAAQ,CAAC;;;;;CAMhD,MAAM,cAAsC;EAC1C,MAAM,QAAQ,2BAA2B,KAAK,WAAW,KAAK,KAAK,UAAU;EAC7E,MAAM,SAAoC,EACxC,YAAY,KAAK,WAClB;EACD,MAAM,QAAyB,EAAE;EACjC,MAAM,EAAE,SAAS,MAAM,KAAK,OAAO,KAAK,IAAI,OAAO,OAAO;AAE1D,MAAI,KAAK,WAAW,EAClB,QAAO,EAAE;AAGX,OAAK,MAAM,OAAO,KAChB,OAAM,KAAK;GACT,MAAM,IAAI,KAAK;GACf,MAAM,IAAI;GACX,CAAC;AAGJ,UAAA,GAAA,yBAAA,iCAAuC,MAAM;;;;;;CAO/C,MAAM,WAAW,SAAqC;EACpD,MAAM,QAAQ,gBAAgB,KAAK,WAAW,KAAK,KAAK,UAAU;EAClE,MAAM,SAAoC;GACxC,YAAY,KAAK;GACjB,MAAM,KAAK,UAAU,QAAQ,QAAQ,CAAC;GACtC,MAAM,QAAQ,SAAS;GACxB;AAED,QAAM,KAAK,OAAO,KAAK,IAAI,OAAO,OAAO;;;;;;CAO3C,MAAM,YAAY,UAAwC;AACxD,OAAK,MAAM,OAAO,SAChB,OAAM,KAAK,WAAW,IAAI;;;;;CAO9B,MAAM,QAAuB;EAC3B,MAAM,QAAQ,gBAAgB,KAAK,WAAW,KAAK,KAAK,UAAU;EAClE,MAAM,SAAoC,EACxC,YAAY,KAAK,WAClB;AAED,QAAM,KAAK,OAAO,KAAK,IAAI,OAAO,OAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat_message_history.d.cts","names":["BaseChatMessageHistory","BaseMessage","PostgresEngine","PostgresChatMessageHistoryInput","PostgresChatMessageHistory","engine","sessionId","tableName","schemaName","Promise"],"sources":["../src/chat_message_history.d.ts"],"sourcesContent":["import { BaseChatMessageHistory } from \"@langchain/core/chat_history\";\nimport { BaseMessage } from \"@langchain/core/messages\";\nimport PostgresEngine from \"./engine.js\";\nexport interface PostgresChatMessageHistoryInput {\n engine: PostgresEngine;\n sessionId: string;\n tableName: string;\n schemaName: string;\n}\nexport declare class PostgresChatMessageHistory extends BaseChatMessageHistory {\n lc_namespace: string[];\n engine: PostgresEngine;\n sessionId: string;\n tableName: string;\n schemaName: string;\n constructor({ engine, sessionId, tableName, schemaName }: PostgresChatMessageHistoryInput);\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 initialize(engine: PostgresEngine, sessionId: string, tableName: string, schemaName?: string): Promise<PostgresChatMessageHistory>;\n addUserMessage(message: string): Promise<void>;\n addAIChatMessage(message: string): Promise<void>;\n /**\n * Returns a list of messages stored in the store.\n */\n getMessages(): Promise<BaseMessage[]>;\n /**\n * Add a message object to the store.\n * @param {BaseMessage} message Message to be added to the store\n */\n addMessage(message: BaseMessage): Promise<void>;\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 addMessages(messages: BaseMessage[]): Promise<void>;\n /**\n * Remove all messages from the store.\n */\n clear(): Promise<void>;\n}\n//# sourceMappingURL=chat_message_history.d.ts.map"],"mappings":";;;;;UAGiBG,+BAAAA;UACLD;EADKC,SAAAA,EAAAA,MAAAA;EAMIC,SAAAA,EAAAA,MAAAA;EAETF,UAAAA,EAAAA,MAAAA;;AAIcI,cANLF,0BAAAA,SAAmCJ,sBAAAA,CAM9BM;EAAWC,YAAAA,EAAAA,MAAAA,EAAAA;EAAWC,MAAAA,EAJpCN,cAIoCM;EAAcL,SAAAA,EAAAA,MAAAA;EAUhCD,SAAAA,EAAAA,MAAAA;EAAoFE,UAAAA,EAAAA,MAAAA;EAARK,WAAAA,CAAAA;IAAAA,MAAAA;IAAAA,SAAAA;IAAAA,SAAAA;IAAAA;EAAAA,CAAAA,EAV5CN,+BAU4CM;EACrEA;;;;;;;;;EAjBmBT,OAAAA,UAAAA,CAAAA,MAAAA,EAgB1BE,cAhB0BF,EAAAA,SAAAA,EAAAA,MAAAA,EAAAA,SAAAA,EAAAA,MAAAA,EAAAA,UAAAA,CAAAA,EAAAA,MAAAA,CAAAA,EAgBkDS,OAhBlDT,CAgB0DI,0BAhB1DJ,CAAAA;EAAsB,cAAA,CAAA,OAAA,EAAA,MAAA,CAAA,EAiBzCS,OAjByC,CAAA,IAAA,CAAA;qCAkBvCA;;;;iBAIpBA,QAAQR;;;;;sBAKHA,cAAcQ;;;;;wBAKZR,gBAAgBQ;;;;WAI7BA"}
1
+ {"version":3,"file":"chat_message_history.d.cts","names":[],"sources":["../src/chat_message_history.ts"],"mappings":";;;;;UAUiB,+BAAA;EACf,MAAA,EAAQ,cAAA;EACR,SAAA;EACA,SAAA;EACA,UAAA;AAAA;AAAA,cAGW,0BAAA,SAAmC,sBAAA;EAC9C,YAAA;EAOA,MAAA,EAAQ,cAAA;EAER,SAAA;EAEA,SAAA;EAEA,UAAA;EAEA,WAAA,CAAA;IACE,MAAA;IACA,SAAA;IACA,SAAA;IACA;EAAA,GACC,+BAAA;EArBQ;;;;;;;;;EAAA,OAsCE,UAAA,CACX,MAAA,EAAQ,cAAA,EACR,SAAA,UACA,SAAA,UACA,UAAA,YAA6B,OAAA,CAAA,0BAAA;EAoC/B,cAAA,CAAe,OAAA,WAAkB,OAAA;EAIjC,gBAAA,CAAiB,OAAA,WAAkB,OAAA;EAJF;;;EAW3B,WAAA,CAAA,GAAe,OAAA,CAAQ,WAAA;EA0BH;;;;EAApB,UAAA,CAAW,OAAA,EAAS,WAAA,GAAc,OAAA;EAnHM;;;;EAkIxC,WAAA,CAAY,QAAA,EAAU,WAAA,KAAgB,OAAA;EA1H5C;;;EAmIM,KAAA,CAAA,GAAS,OAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat_message_history.d.ts","names":["BaseChatMessageHistory","BaseMessage","PostgresEngine","PostgresChatMessageHistoryInput","PostgresChatMessageHistory","engine","sessionId","tableName","schemaName","Promise"],"sources":["../src/chat_message_history.d.ts"],"sourcesContent":["import { BaseChatMessageHistory } from \"@langchain/core/chat_history\";\nimport { BaseMessage } from \"@langchain/core/messages\";\nimport PostgresEngine from \"./engine.js\";\nexport interface PostgresChatMessageHistoryInput {\n engine: PostgresEngine;\n sessionId: string;\n tableName: string;\n schemaName: string;\n}\nexport declare class PostgresChatMessageHistory extends BaseChatMessageHistory {\n lc_namespace: string[];\n engine: PostgresEngine;\n sessionId: string;\n tableName: string;\n schemaName: string;\n constructor({ engine, sessionId, tableName, schemaName }: PostgresChatMessageHistoryInput);\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 initialize(engine: PostgresEngine, sessionId: string, tableName: string, schemaName?: string): Promise<PostgresChatMessageHistory>;\n addUserMessage(message: string): Promise<void>;\n addAIChatMessage(message: string): Promise<void>;\n /**\n * Returns a list of messages stored in the store.\n */\n getMessages(): Promise<BaseMessage[]>;\n /**\n * Add a message object to the store.\n * @param {BaseMessage} message Message to be added to the store\n */\n addMessage(message: BaseMessage): Promise<void>;\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 addMessages(messages: BaseMessage[]): Promise<void>;\n /**\n * Remove all messages from the store.\n */\n clear(): Promise<void>;\n}\n//# sourceMappingURL=chat_message_history.d.ts.map"],"mappings":";;;;;UAGiBG,+BAAAA;UACLD;EADKC,SAAAA,EAAAA,MAAAA;EAMIC,SAAAA,EAAAA,MAAAA;EAETF,UAAAA,EAAAA,MAAAA;;AAIcI,cANLF,0BAAAA,SAAmCJ,sBAAAA,CAM9BM;EAAWC,YAAAA,EAAAA,MAAAA,EAAAA;EAAWC,MAAAA,EAJpCN,cAIoCM;EAAcL,SAAAA,EAAAA,MAAAA;EAUhCD,SAAAA,EAAAA,MAAAA;EAAoFE,UAAAA,EAAAA,MAAAA;EAARK,WAAAA,CAAAA;IAAAA,MAAAA;IAAAA,SAAAA;IAAAA,SAAAA;IAAAA;EAAAA,CAAAA,EAV5CN,+BAU4CM;EACrEA;;;;;;;;;EAjBmBT,OAAAA,UAAAA,CAAAA,MAAAA,EAgB1BE,cAhB0BF,EAAAA,SAAAA,EAAAA,MAAAA,EAAAA,SAAAA,EAAAA,MAAAA,EAAAA,UAAAA,CAAAA,EAAAA,MAAAA,CAAAA,EAgBkDS,OAhBlDT,CAgB0DI,0BAhB1DJ,CAAAA;EAAsB,cAAA,CAAA,OAAA,EAAA,MAAA,CAAA,EAiBzCS,OAjByC,CAAA,IAAA,CAAA;qCAkBvCA;;;;iBAIpBA,QAAQR;;;;;sBAKHA,cAAcQ;;;;;wBAKZR,gBAAgBQ;;;;WAI7BA"}
1
+ {"version":3,"file":"chat_message_history.d.ts","names":[],"sources":["../src/chat_message_history.ts"],"mappings":";;;;;UAUiB,+BAAA;EACf,MAAA,EAAQ,cAAA;EACR,SAAA;EACA,SAAA;EACA,UAAA;AAAA;AAAA,cAGW,0BAAA,SAAmC,sBAAA;EAC9C,YAAA;EAOA,MAAA,EAAQ,cAAA;EAER,SAAA;EAEA,SAAA;EAEA,UAAA;EAEA,WAAA,CAAA;IACE,MAAA;IACA,SAAA;IACA,SAAA;IACA;EAAA,GACC,+BAAA;EArBQ;;;;;;;;;EAAA,OAsCE,UAAA,CACX,MAAA,EAAQ,cAAA,EACR,SAAA,UACA,SAAA,UACA,UAAA,YAA6B,OAAA,CAAA,0BAAA;EAoC/B,cAAA,CAAe,OAAA,WAAkB,OAAA;EAIjC,gBAAA,CAAiB,OAAA,WAAkB,OAAA;EAJF;;;EAW3B,WAAA,CAAA,GAAe,OAAA,CAAQ,WAAA;EA0BH;;;;EAApB,UAAA,CAAW,OAAA,EAAS,WAAA,GAAc,OAAA;EAnHM;;;;EAkIxC,WAAA,CAAY,QAAA,EAAU,WAAA,KAAgB,OAAA;EA1H5C;;;EAmIM,KAAA,CAAA,GAAS,OAAA;AAAA"}
@@ -1,6 +1,5 @@
1
1
  import { BaseChatMessageHistory } from "@langchain/core/chat_history";
2
2
  import { AIMessage, HumanMessage, mapStoredMessagesToChatMessages } from "@langchain/core/messages";
3
-
4
3
  //#region src/chat_message_history.ts
5
4
  var PostgresChatMessageHistory = class PostgresChatMessageHistory extends BaseChatMessageHistory {
6
5
  lc_namespace = [
@@ -30,8 +29,10 @@ var PostgresChatMessageHistory = class PostgresChatMessageHistory extends BaseCh
30
29
  * @returns PostgresChatMessageHistory instance.
31
30
  */
32
31
  static async initialize(engine, sessionId, tableName, schemaName = "public") {
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);
32
+ const { rows } = await engine.pool.raw(`SELECT column_name, data_type FROM information_schema.columns WHERE table_name = :tableName AND table_schema = :schemaName`, {
33
+ tableName,
34
+ schemaName
35
+ });
35
36
  const columnNames = [];
36
37
  for (const index in rows) if (Object.prototype.hasOwnProperty.call(rows, index)) columnNames.push(rows[index].column_name);
37
38
  const requiredColumns = [
@@ -106,7 +107,7 @@ var PostgresChatMessageHistory = class PostgresChatMessageHistory extends BaseCh
106
107
  await this.engine.pool.raw(query, values);
107
108
  }
108
109
  };
109
-
110
110
  //#endregion
111
111
  export { PostgresChatMessageHistory };
112
+
112
113
  //# sourceMappingURL=chat_message_history.js.map
@@ -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 = '${tableName}' AND table_schema = '${schemaName}'`;\n const { rows } = await engine.pool.raw(query);\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,kFAAkF,EAAE,UAAU,sBAAsB,EAAE,WAAW,CAAC,CAAC;EAClJ,MAAM,EAAE,MAAM,GAAG,MAAM,OAAO,KAAK,IAAI,MAAM;EAC7C,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"}
1
+ {"version":3,"file":"chat_message_history.js","names":[],"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;EACD;CAED;CAEA;CAEA;CAEA;CAEA,YAAY,EACV,QACA,WACA,WACA,aAAa,YACqB;AAClC,SAAO;AACP,OAAK,SAAS;AACd,OAAK,YAAY;AACjB,OAAK,YAAY;AACjB,OAAK,aAAa;;;;;;;;;;;CAYpB,aAAa,WACX,QACA,WACA,WACA,aAAqB,UACrB;EAEA,MAAM,EAAE,SAAS,MAAM,OAAO,KAAK,IADrB,8HACgC;GAAE;GAAW;GAAY,CAAC;EACxE,MAAM,cAAwB,EAAE;AAEhC,OAAK,MAAM,SAAS,KAClB,KAAI,OAAO,UAAU,eAAe,KAAK,MAAM,MAAM,CACnD,aAAY,KAAK,KAAK,OAAO,YAAY;EAI7C,MAAM,kBAAkB;GAAC;GAAM;GAAc;GAAQ;GAAO;AAE5D,MAAI,CAAC,gBAAgB,OAAO,MAAM,YAAY,SAAS,EAAE,CAAC,CACxD,OAAM,IAAI,MACR,UAAU,WAAW,KAAK,UAAU;2BACjB,YAAY,6BAA6B,gBAAgB;mEACjB,WAAW,KAAK,UAAU;;;;;;QAOtF;AAGH,SAAO,IAAI,2BAA2B;GACpC;GACA;GACA;GACA;GACD,CAAC;;CAGJ,eAAe,SAAgC;AAC7C,SAAO,KAAK,WAAW,IAAI,aAAa,QAAQ,CAAC;;CAGnD,iBAAiB,SAAgC;AAC/C,SAAO,KAAK,WAAW,IAAI,UAAU,QAAQ,CAAC;;;;;CAMhD,MAAM,cAAsC;EAC1C,MAAM,QAAQ,2BAA2B,KAAK,WAAW,KAAK,KAAK,UAAU;EAC7E,MAAM,SAAoC,EACxC,YAAY,KAAK,WAClB;EACD,MAAM,QAAyB,EAAE;EACjC,MAAM,EAAE,SAAS,MAAM,KAAK,OAAO,KAAK,IAAI,OAAO,OAAO;AAE1D,MAAI,KAAK,WAAW,EAClB,QAAO,EAAE;AAGX,OAAK,MAAM,OAAO,KAChB,OAAM,KAAK;GACT,MAAM,IAAI,KAAK;GACf,MAAM,IAAI;GACX,CAAC;AAGJ,SAAO,gCAAgC,MAAM;;;;;;CAO/C,MAAM,WAAW,SAAqC;EACpD,MAAM,QAAQ,gBAAgB,KAAK,WAAW,KAAK,KAAK,UAAU;EAClE,MAAM,SAAoC;GACxC,YAAY,KAAK;GACjB,MAAM,KAAK,UAAU,QAAQ,QAAQ,CAAC;GACtC,MAAM,QAAQ,SAAS;GACxB;AAED,QAAM,KAAK,OAAO,KAAK,IAAI,OAAO,OAAO;;;;;;CAO3C,MAAM,YAAY,UAAwC;AACxD,OAAK,MAAM,OAAO,SAChB,OAAM,KAAK,WAAW,IAAI;;;;;CAO9B,MAAM,QAAuB;EAC3B,MAAM,QAAQ,gBAAgB,KAAK,WAAW,KAAK,KAAK,UAAU;EAClE,MAAM,SAAoC,EACxC,YAAY,KAAK,WAClB;AAED,QAAM,KAAK,OAAO,KAAK,IAAI,OAAO,OAAO"}
package/dist/engine.cjs CHANGED
@@ -1,9 +1,9 @@
1
- const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
- const require_utils = require('./utils/utils.cjs');
3
- const __google_cloud_cloud_sql_connector = require_rolldown_runtime.__toESM(require("@google-cloud/cloud-sql-connector"));
4
- const google_auth_library = require_rolldown_runtime.__toESM(require("google-auth-library"));
5
- const knex = require_rolldown_runtime.__toESM(require("knex"));
6
-
1
+ const require_runtime = require("./_virtual/_rolldown/runtime.cjs");
2
+ const require_utils = require("./utils/utils.cjs");
3
+ let _google_cloud_cloud_sql_connector = require("@google-cloud/cloud-sql-connector");
4
+ let google_auth_library = require("google-auth-library");
5
+ let knex = require("knex");
6
+ knex = require_runtime.__toESM(knex);
7
7
  //#region src/engine.ts
8
8
  var Column = class {
9
9
  name;
@@ -70,7 +70,7 @@ var PostgresEngine = class PostgresEngine {
70
70
  * @param iamAccountEmail Optional - IAM service account email. Defaults to undefined
71
71
  * @returns PostgresEngine instance
72
72
  */
73
- static async fromInstance(projectId, region, instance, database, { ipType = __google_cloud_cloud_sql_connector.IpAddressTypes.PUBLIC, user, password, iamAccountEmail } = {}) {
73
+ static async fromInstance(projectId, region, instance, database, { ipType = _google_cloud_cloud_sql_connector.IpAddressTypes.PUBLIC, user, password, iamAccountEmail } = {}) {
74
74
  let dbUser;
75
75
  let enableIAMAuth;
76
76
  if (!user && password || user && !password) throw Error("Only one of 'user' or 'password' were specified. Either both should be specified to use basic user/password authentication or neither for IAM DB authentication.");
@@ -80,27 +80,22 @@ var PostgresEngine = class PostgresEngine {
80
80
  } else {
81
81
  enableIAMAuth = true;
82
82
  if (iamAccountEmail !== void 0) dbUser = iamAccountEmail;
83
- else {
84
- const auth = new google_auth_library.GoogleAuth({ scopes: "https://www.googleapis.com/auth/cloud-platform" });
85
- dbUser = await require_utils.getIAMPrincipalEmail(auth);
86
- }
83
+ else dbUser = await require_utils.getIAMPrincipalEmail(new google_auth_library.GoogleAuth({ scopes: "https://www.googleapis.com/auth/cloud-platform" }));
87
84
  }
88
- PostgresEngine.connector = new __google_cloud_cloud_sql_connector.Connector({ userAgent: USER_AGENT });
89
- const clientOpts = await PostgresEngine.connector.getOptions({
90
- instanceConnectionName: `${projectId}:${region}:${instance}`,
91
- ipType,
92
- authType: enableIAMAuth ? __google_cloud_cloud_sql_connector.AuthTypes.IAM : __google_cloud_cloud_sql_connector.AuthTypes.PASSWORD
93
- });
94
- const dbConfig = {
85
+ PostgresEngine.connector = new _google_cloud_cloud_sql_connector.Connector({ userAgent: USER_AGENT });
86
+ const engine = (0, knex.default)({
95
87
  client: "pg",
96
88
  connection: {
97
- ...clientOpts,
89
+ ...await PostgresEngine.connector.getOptions({
90
+ instanceConnectionName: `${projectId}:${region}:${instance}`,
91
+ ipType,
92
+ authType: enableIAMAuth ? _google_cloud_cloud_sql_connector.AuthTypes.IAM : _google_cloud_cloud_sql_connector.AuthTypes.PASSWORD
93
+ }),
98
94
  ...password ? { password } : {},
99
95
  user: dbUser,
100
96
  database
101
97
  }
102
- };
103
- const engine = (0, knex.default)(dbConfig);
98
+ });
104
99
  return new PostgresEngine(PostgresEngine._createKey, engine);
105
100
  }
106
101
  /**
@@ -120,9 +115,8 @@ var PostgresEngine = class PostgresEngine {
120
115
  * @returns PostgresEngine instance
121
116
  */
122
117
  static async fromConnectionString(url, poolConfig) {
123
- const driver = "postgresql+asyncpg";
124
- if (typeof url === "string" && !url.startsWith(driver)) throw Error("Driver must be type 'postgresql+asyncpg'");
125
- const dbConfig = {
118
+ if (typeof url === "string" && !url.startsWith("postgresql+asyncpg")) throw Error("Driver must be type 'postgresql+asyncpg'");
119
+ const engine = (0, knex.default)({
126
120
  client: "pg",
127
121
  connection: url,
128
122
  acquireConnectionTimeout: 1e6,
@@ -130,8 +124,7 @@ var PostgresEngine = class PostgresEngine {
130
124
  ...poolConfig,
131
125
  acquireTimeoutMillis: 6e5
132
126
  }
133
- };
134
- const engine = (0, knex.default)(dbConfig);
127
+ });
135
128
  return new PostgresEngine(PostgresEngine._createKey, engine);
136
129
  }
137
130
  /**
@@ -153,9 +146,8 @@ var PostgresEngine = class PostgresEngine {
153
146
  await this.pool.raw("CREATE EXTENSION IF NOT EXISTS vector");
154
147
  if (overwriteExisting) await this.pool.schema.withSchema(schemaName).dropTableIfExists(tableName);
155
148
  const idDataType = typeof idColumn === "string" ? "UUID" : idColumn.dataType;
156
- const idColumnName = typeof idColumn === "string" ? idColumn : idColumn.name;
157
149
  let query = `CREATE TABLE ${schemaName}.${tableName}(
158
- ${idColumnName} ${idDataType} PRIMARY KEY,
150
+ ${typeof idColumn === "string" ? idColumn : idColumn.name} ${idDataType} PRIMARY KEY,
159
151
  ${contentColumn} TEXT NOT NULL,
160
152
  ${embeddingColumn} ${embeddingColumnType}(${vectorSize}) NOT NULL`;
161
153
  for (const column of metadataColumns) {
@@ -187,12 +179,11 @@ var PostgresEngine = class PostgresEngine {
187
179
  if (PostgresEngine.connector !== void 0) PostgresEngine.connector.close();
188
180
  }
189
181
  testConnection() {
190
- const now = this.pool.raw("SELECT NOW() as currentTimestamp");
191
- return now;
182
+ return this.pool.raw("SELECT NOW() as currentTimestamp");
192
183
  }
193
184
  };
194
-
195
185
  //#endregion
196
186
  exports.Column = Column;
197
- exports.PostgresEngine = PostgresEngine;
187
+ exports.default = PostgresEngine;
188
+
198
189
  //# sourceMappingURL=engine.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"engine.cjs","names":["name: string","dataType: string","nullable: boolean","key: symbol","pool: knex.Knex","projectId: string","region: string","instance: string","database: string","IpAddressTypes","dbUser: string","enableIAMAuth: boolean","GoogleAuth","getIAMPrincipalEmail","Connector","AuthTypes","dbConfig: knex.Knex.Config","engine: knex.Knex","url: string | knex.Knex.StaticConnectionConfig","poolConfig?: knex.Knex.PoolConfig","tableName: string","vectorSize: number","schemaName: string"],"sources":["../src/engine.ts"],"sourcesContent":["import {\n AuthTypes,\n Connector,\n IpAddressTypes,\n} from \"@google-cloud/cloud-sql-connector\";\nimport { GoogleAuth } from \"google-auth-library\";\nimport knex from \"knex\";\nimport { getIAMPrincipalEmail } from \"./utils/utils.js\";\n\nexport interface PostgresEngineArgs {\n ipType?: IpAddressTypes;\n user?: string;\n password?: string;\n iamAccountEmail?: string;\n}\n\nexport interface VectorStoreTableArgs {\n schemaName?: string;\n contentColumn?: string;\n embeddingColumn?: string;\n embeddingColumnType?: \"vector\" | \"halfvec\" | \"bit\" | \"sparsevec\";\n metadataColumns?: Column[];\n metadataJsonColumn?: string;\n idColumn?: string | Column;\n overwriteExisting?: boolean;\n storeMetadata?: boolean;\n}\n\nexport class Column {\n name: string;\n\n dataType: string;\n\n nullable: boolean;\n\n constructor(name: string, dataType: string, nullable: boolean = true) {\n this.name = name;\n this.dataType = dataType;\n this.nullable = nullable;\n\n this.postInitilization();\n }\n\n private postInitilization() {\n if (typeof this.name !== \"string\") {\n throw Error(\"Column name must be type string\");\n }\n\n if (typeof this.dataType !== \"string\") {\n throw Error(\"Column data_type must be type string\");\n }\n }\n}\n\nconst USER_AGENT = \"langchain-google-cloud-sql-pg-js\";\n\n/**\n * Cloud SQL shared connection pool\n *\n * Setup:\n * Install `@langchain/google-cloud-sql-pg`\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { Column, PostgresEngine, PostgresEngineArgs } from \"@langchain/google-cloud-sql-pg\";\n *\n * const pgArgs: PostgresEngineArgs = {\n * user: \"db-user\",\n * password: \"password\"\n *}\n *\n * const engine: PostgresEngine = await PostgresEngine.fromInstance(\n * \"project-id\",\n * \"region\",\n * \"instance-name\",\n * \"database-name\",\n * pgArgs\n * );\n * ```\n * </details>\n *\n * <br />\n *\n */\nexport class PostgresEngine {\n private static _createKey = Symbol(\"key\");\n\n pool: knex.Knex;\n\n static connector: Connector;\n\n constructor(key: symbol, pool: knex.Knex) {\n if (key !== PostgresEngine._createKey) {\n throw Error(\"Only create class through 'create' method!\");\n }\n this.pool = pool;\n }\n\n /**\n * @param projectId Required - GCP Project ID\n * @param region Required - Postgres Instance Region\n * @param instance Required - Postgres Instance name\n * @param database Required - Database name\n * @param ipType Optional - IP address type. Defaults to IPAddressType.PUBLIC\n * @param user Optional - Postgres user name. Defaults to undefined\n * @param password Optional - Postgres user password. Defaults to undefined\n * @param iamAccountEmail Optional - IAM service account email. Defaults to undefined\n * @returns PostgresEngine instance\n */\n\n static async fromInstance(\n projectId: string,\n region: string,\n instance: string,\n database: string,\n {\n ipType = IpAddressTypes.PUBLIC,\n user,\n password,\n iamAccountEmail,\n }: PostgresEngineArgs = {}\n ): Promise<PostgresEngine> {\n let dbUser: string;\n let enableIAMAuth: boolean;\n\n if ((!user && password) || (user && !password)) {\n // XOR for strings\n throw Error(\n \"Only one of 'user' or 'password' were specified. Either \" +\n \"both should be specified to use basic user/password \" +\n \"authentication or neither for IAM DB authentication.\"\n );\n }\n\n // User and password are given so we use the basic auth\n if (user !== undefined && password !== undefined) {\n enableIAMAuth = false;\n dbUser = user!;\n } else {\n enableIAMAuth = true;\n if (iamAccountEmail !== undefined) {\n dbUser = iamAccountEmail;\n } else {\n // Get application default credentials\n const auth = new GoogleAuth({\n scopes: \"https://www.googleapis.com/auth/cloud-platform\",\n });\n // dbUser should be the iam principal email by passing the credentials obtained\n dbUser = await getIAMPrincipalEmail(auth);\n }\n }\n\n PostgresEngine.connector = new Connector({ userAgent: USER_AGENT });\n const clientOpts = await PostgresEngine.connector.getOptions({\n instanceConnectionName: `${projectId}:${region}:${instance}`,\n ipType,\n authType: enableIAMAuth ? AuthTypes.IAM : AuthTypes.PASSWORD,\n });\n\n const dbConfig: knex.Knex.Config = {\n client: \"pg\",\n connection: {\n ...clientOpts,\n ...(password ? { password } : {}),\n user: dbUser,\n database,\n },\n };\n\n const engine = knex(dbConfig);\n\n return new PostgresEngine(PostgresEngine._createKey, engine);\n }\n\n /**\n * Create a PostgresEngine instance from an Knex instance.\n *\n * @param engine knex instance\n * @returns PostgresEngine instance from a knex instance\n */\n static async fromPool(engine: knex.Knex) {\n return new PostgresEngine(PostgresEngine._createKey, engine);\n }\n\n /**\n * Create a PostgresEngine instance from arguments.\n *\n * @param url URL use to connect to a database\n * @param poolConfig Optional - Configuration pool to use in the Knex configuration\n * @returns PostgresEngine instance\n */\n static async fromConnectionString(\n url: string | knex.Knex.StaticConnectionConfig,\n poolConfig?: knex.Knex.PoolConfig\n ) {\n const driver = \"postgresql+asyncpg\";\n\n if (typeof url === \"string\" && !url.startsWith(driver)) {\n throw Error(\"Driver must be type 'postgresql+asyncpg'\");\n }\n\n const dbConfig: knex.Knex.Config = {\n client: \"pg\",\n connection: url,\n acquireConnectionTimeout: 1000000,\n pool: {\n ...poolConfig,\n acquireTimeoutMillis: 600000,\n },\n };\n\n const engine = knex(dbConfig);\n\n return new PostgresEngine(PostgresEngine._createKey, engine);\n }\n\n /**\n * Create a table for saving of vectors to be used with PostgresVectorStore.\n *\n * @param tableName Postgres database table name. Parameter is not escaped. Do not use with end user input.\n * @param vectorSize Vector size for the embedding model to be used.\n * @param schemaName The schema name to store Postgres database table. Default: \"public\". Parameter is not escaped. Do not use with end user input.\n * @param contentColumn Name of the column to store document content. Default: \"content\".\n * @param embeddingColumn Name of the column to store vector embeddings. Default: \"embedding\".\n * @param embeddingColumnType Type of the embedding column (\"vector\" | \"halfvec\" | \"bit\" | \"sparsevec\"). Default: \"vector\". More info on HNSW-supported types: https://github.com/pgvector/pgvector#hnsw\n * @param metadataColumns Optional - A list of Columns to create for custom metadata. Default: [].\n * @param metadataJsonColumn Optional - The column to store extra metadata in JSON format. Default: \"langchain_metadata\".\n * @param idColumn Optional - Column to store ids. Default: \"langchain_id\" column name with data type UUID.\n * @param overwriteExisting Whether to drop existing table. Default: False.\n * @param storeMetadata Whether to store metadata in the table. Default: True.\n */\n async initVectorstoreTable(\n tableName: string,\n vectorSize: number,\n {\n schemaName = \"public\",\n contentColumn = \"content\",\n embeddingColumn = \"embedding\",\n embeddingColumnType = \"vector\",\n metadataColumns = [],\n metadataJsonColumn = \"langchain_metadata\",\n idColumn = \"langchain_id\",\n overwriteExisting = false,\n storeMetadata = true,\n }: VectorStoreTableArgs = {}\n ): Promise<void> {\n await this.pool.raw(\"CREATE EXTENSION IF NOT EXISTS vector\");\n\n if (overwriteExisting) {\n await this.pool.schema\n .withSchema(schemaName)\n .dropTableIfExists(tableName);\n }\n\n const idDataType =\n typeof idColumn === \"string\" ? \"UUID\" : idColumn.dataType;\n const idColumnName =\n typeof idColumn === \"string\" ? idColumn : idColumn.name;\n\n let query = `CREATE TABLE ${schemaName}.${tableName}(\n ${idColumnName} ${idDataType} PRIMARY KEY,\n ${contentColumn} TEXT NOT NULL,\n ${embeddingColumn} ${embeddingColumnType}(${vectorSize}) NOT NULL`;\n\n for (const column of metadataColumns) {\n const nullable = !column.nullable ? \"NOT NULL\" : \"\";\n query += `,\\n ${column.name} ${column.dataType} ${nullable}`;\n }\n\n if (storeMetadata) {\n query += `,\\n${metadataJsonColumn} JSON`;\n }\n\n query += `\\n);`;\n\n await this.pool.raw(query);\n }\n\n /**\n * Create a Cloud SQL table to store chat history.\n *\n * @param tableName Table name to store chat history\n * @param schemaName Schema name to store chat history table\n */\n\n async initChatHistoryTable(\n tableName: string,\n schemaName: string = \"public\"\n ): Promise<void> {\n await this.pool.raw(\n `CREATE TABLE IF NOT EXISTS ${schemaName}.${tableName}(\n id SERIAL PRIMARY KEY,\n session_id TEXT NOT NULL,\n data JSONB NOT NULL,\n type TEXT NOT NULL);`\n );\n }\n\n /**\n * Dispose of connection pool\n */\n async closeConnection(): Promise<void> {\n await this.pool.destroy();\n if (PostgresEngine.connector !== undefined) {\n PostgresEngine.connector.close();\n }\n }\n\n // Just to test the connection to the database\n testConnection() {\n const now = this.pool.raw(\"SELECT NOW() as currentTimestamp\");\n return now;\n }\n}\n\nexport default PostgresEngine;\n"],"mappings":";;;;;;;AA4BA,IAAa,SAAb,MAAoB;CAClB;CAEA;CAEA;CAEA,YAAYA,MAAcC,UAAkBC,WAAoB,MAAM;EACpE,KAAK,OAAO;EACZ,KAAK,WAAW;EAChB,KAAK,WAAW;EAEhB,KAAK,mBAAmB;CACzB;CAED,AAAQ,oBAAoB;AAC1B,MAAI,OAAO,KAAK,SAAS,SACvB,OAAM,MAAM,kCAAkC;AAGhD,MAAI,OAAO,KAAK,aAAa,SAC3B,OAAM,MAAM,uCAAuC;CAEtD;AACF;AAED,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCnB,IAAa,iBAAb,MAAa,eAAe;CAC1B,OAAe,aAAa,OAAO,MAAM;CAEzC;CAEA,OAAO;CAEP,YAAYC,KAAaC,MAAiB;AACxC,MAAI,QAAQ,eAAe,WACzB,OAAM,MAAM,6CAA6C;EAE3D,KAAK,OAAO;CACb;;;;;;;;;;;;CAcD,aAAa,aACXC,WACAC,QACAC,UACAC,UACA,EACE,SAASC,kDAAe,QACxB,MACA,UACA,iBACmB,GAAG,CAAE,GACD;EACzB,IAAIC;EACJ,IAAIC;AAEJ,MAAK,CAAC,QAAQ,YAAc,QAAQ,CAAC,SAEnC,OAAM,MACJ,mKAGD;AAIH,MAAI,SAAS,UAAa,aAAa,QAAW;GAChD,gBAAgB;GAChB,SAAS;EACV,OAAM;GACL,gBAAgB;AAChB,OAAI,oBAAoB,QACtB,SAAS;QACJ;IAEL,MAAM,OAAO,IAAIC,+BAAW,EAC1B,QAAQ,iDACT;IAED,SAAS,MAAMC,mCAAqB,KAAK;GAC1C;EACF;EAED,eAAe,YAAY,IAAIC,6CAAU,EAAE,WAAW,WAAY;EAClE,MAAM,aAAa,MAAM,eAAe,UAAU,WAAW;GAC3D,wBAAwB,GAAG,UAAU,CAAC,EAAE,OAAO,CAAC,EAAE,UAAU;GAC5D;GACA,UAAU,gBAAgBC,6CAAU,MAAMA,6CAAU;EACrD,EAAC;EAEF,MAAMC,WAA6B;GACjC,QAAQ;GACR,YAAY;IACV,GAAG;IACH,GAAI,WAAW,EAAE,SAAU,IAAG,CAAE;IAChC,MAAM;IACN;GACD;EACF;EAED,MAAM,2BAAc,SAAS;AAE7B,SAAO,IAAI,eAAe,eAAe,YAAY;CACtD;;;;;;;CAQD,aAAa,SAASC,QAAmB;AACvC,SAAO,IAAI,eAAe,eAAe,YAAY;CACtD;;;;;;;;CASD,aAAa,qBACXC,KACAC,YACA;EACA,MAAM,SAAS;AAEf,MAAI,OAAO,QAAQ,YAAY,CAAC,IAAI,WAAW,OAAO,CACpD,OAAM,MAAM,2CAA2C;EAGzD,MAAMH,WAA6B;GACjC,QAAQ;GACR,YAAY;GACZ,0BAA0B;GAC1B,MAAM;IACJ,GAAG;IACH,sBAAsB;GACvB;EACF;EAED,MAAM,2BAAc,SAAS;AAE7B,SAAO,IAAI,eAAe,eAAe,YAAY;CACtD;;;;;;;;;;;;;;;;CAiBD,MAAM,qBACJI,WACAC,YACA,EACE,aAAa,UACb,gBAAgB,WAChB,kBAAkB,aAClB,sBAAsB,UACtB,kBAAkB,CAAE,GACpB,qBAAqB,sBACrB,WAAW,gBACX,oBAAoB,OACpB,gBAAgB,MACK,GAAG,CAAE,GACb;EACf,MAAM,KAAK,KAAK,IAAI,wCAAwC;AAE5D,MAAI,mBACF,MAAM,KAAK,KAAK,OACb,WAAW,WAAW,CACtB,kBAAkB,UAAU;EAGjC,MAAM,aACJ,OAAO,aAAa,WAAW,SAAS,SAAS;EACnD,MAAM,eACJ,OAAO,aAAa,WAAW,WAAW,SAAS;EAErD,IAAI,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE,UAAU;MAClD,EAAE,aAAa,CAAC,EAAE,WAAW;MAC7B,EAAE,cAAc;MAChB,EAAE,gBAAgB,CAAC,EAAE,oBAAoB,CAAC,EAAE,WAAW,UAAU,CAAC;AAEpE,OAAK,MAAM,UAAU,iBAAiB;GACpC,MAAM,WAAW,CAAC,OAAO,WAAW,aAAa;GACjD,SAAS,CAAC,IAAI,EAAE,OAAO,KAAK,CAAC,EAAE,OAAO,SAAS,CAAC,EAAE,UAAU;EAC7D;AAED,MAAI,eACF,SAAS,CAAC,GAAG,EAAE,mBAAmB,KAAK,CAAC;EAG1C,SAAS,CAAC,IAAI,CAAC;EAEf,MAAM,KAAK,KAAK,IAAI,MAAM;CAC3B;;;;;;;CASD,MAAM,qBACJD,WACAE,aAAqB,UACN;EACf,MAAM,KAAK,KAAK,IACd,CAAC,2BAA2B,EAAE,WAAW,CAAC,EAAE,UAAU;;;;0BAIlC,CAAC,CACtB;CACF;;;;CAKD,MAAM,kBAAiC;EACrC,MAAM,KAAK,KAAK,SAAS;AACzB,MAAI,eAAe,cAAc,QAC/B,eAAe,UAAU,OAAO;CAEnC;CAGD,iBAAiB;EACf,MAAM,MAAM,KAAK,KAAK,IAAI,mCAAmC;AAC7D,SAAO;CACR;AACF"}
1
+ {"version":3,"file":"engine.cjs","names":["IpAddressTypes","getIAMPrincipalEmail","GoogleAuth","Connector","AuthTypes"],"sources":["../src/engine.ts"],"sourcesContent":["import {\n AuthTypes,\n Connector,\n IpAddressTypes,\n} from \"@google-cloud/cloud-sql-connector\";\nimport { GoogleAuth } from \"google-auth-library\";\nimport knex from \"knex\";\nimport { getIAMPrincipalEmail } from \"./utils/utils.js\";\n\nexport interface PostgresEngineArgs {\n ipType?: IpAddressTypes;\n user?: string;\n password?: string;\n iamAccountEmail?: string;\n}\n\nexport interface VectorStoreTableArgs {\n schemaName?: string;\n contentColumn?: string;\n embeddingColumn?: string;\n embeddingColumnType?: \"vector\" | \"halfvec\" | \"bit\" | \"sparsevec\";\n metadataColumns?: Column[];\n metadataJsonColumn?: string;\n idColumn?: string | Column;\n overwriteExisting?: boolean;\n storeMetadata?: boolean;\n}\n\nexport class Column {\n name: string;\n\n dataType: string;\n\n nullable: boolean;\n\n constructor(name: string, dataType: string, nullable: boolean = true) {\n this.name = name;\n this.dataType = dataType;\n this.nullable = nullable;\n\n this.postInitilization();\n }\n\n private postInitilization() {\n if (typeof this.name !== \"string\") {\n throw Error(\"Column name must be type string\");\n }\n\n if (typeof this.dataType !== \"string\") {\n throw Error(\"Column data_type must be type string\");\n }\n }\n}\n\nconst USER_AGENT = \"langchain-google-cloud-sql-pg-js\";\n\n/**\n * Cloud SQL shared connection pool\n *\n * Setup:\n * Install `@langchain/google-cloud-sql-pg`\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { Column, PostgresEngine, PostgresEngineArgs } from \"@langchain/google-cloud-sql-pg\";\n *\n * const pgArgs: PostgresEngineArgs = {\n * user: \"db-user\",\n * password: \"password\"\n *}\n *\n * const engine: PostgresEngine = await PostgresEngine.fromInstance(\n * \"project-id\",\n * \"region\",\n * \"instance-name\",\n * \"database-name\",\n * pgArgs\n * );\n * ```\n * </details>\n *\n * <br />\n *\n */\nexport class PostgresEngine {\n private static _createKey = Symbol(\"key\");\n\n pool: knex.Knex;\n\n static connector: Connector;\n\n constructor(key: symbol, pool: knex.Knex) {\n if (key !== PostgresEngine._createKey) {\n throw Error(\"Only create class through 'create' method!\");\n }\n this.pool = pool;\n }\n\n /**\n * @param projectId Required - GCP Project ID\n * @param region Required - Postgres Instance Region\n * @param instance Required - Postgres Instance name\n * @param database Required - Database name\n * @param ipType Optional - IP address type. Defaults to IPAddressType.PUBLIC\n * @param user Optional - Postgres user name. Defaults to undefined\n * @param password Optional - Postgres user password. Defaults to undefined\n * @param iamAccountEmail Optional - IAM service account email. Defaults to undefined\n * @returns PostgresEngine instance\n */\n\n static async fromInstance(\n projectId: string,\n region: string,\n instance: string,\n database: string,\n {\n ipType = IpAddressTypes.PUBLIC,\n user,\n password,\n iamAccountEmail,\n }: PostgresEngineArgs = {}\n ): Promise<PostgresEngine> {\n let dbUser: string;\n let enableIAMAuth: boolean;\n\n if ((!user && password) || (user && !password)) {\n // XOR for strings\n throw Error(\n \"Only one of 'user' or 'password' were specified. Either \" +\n \"both should be specified to use basic user/password \" +\n \"authentication or neither for IAM DB authentication.\"\n );\n }\n\n // User and password are given so we use the basic auth\n if (user !== undefined && password !== undefined) {\n enableIAMAuth = false;\n dbUser = user!;\n } else {\n enableIAMAuth = true;\n if (iamAccountEmail !== undefined) {\n dbUser = iamAccountEmail;\n } else {\n // Get application default credentials\n const auth = new GoogleAuth({\n scopes: \"https://www.googleapis.com/auth/cloud-platform\",\n });\n // dbUser should be the iam principal email by passing the credentials obtained\n dbUser = await getIAMPrincipalEmail(auth);\n }\n }\n\n PostgresEngine.connector = new Connector({ userAgent: USER_AGENT });\n const clientOpts = await PostgresEngine.connector.getOptions({\n instanceConnectionName: `${projectId}:${region}:${instance}`,\n ipType,\n authType: enableIAMAuth ? AuthTypes.IAM : AuthTypes.PASSWORD,\n });\n\n const dbConfig: knex.Knex.Config = {\n client: \"pg\",\n connection: {\n ...clientOpts,\n ...(password ? { password } : {}),\n user: dbUser,\n database,\n },\n };\n\n const engine = knex(dbConfig);\n\n return new PostgresEngine(PostgresEngine._createKey, engine);\n }\n\n /**\n * Create a PostgresEngine instance from an Knex instance.\n *\n * @param engine knex instance\n * @returns PostgresEngine instance from a knex instance\n */\n static async fromPool(engine: knex.Knex) {\n return new PostgresEngine(PostgresEngine._createKey, engine);\n }\n\n /**\n * Create a PostgresEngine instance from arguments.\n *\n * @param url URL use to connect to a database\n * @param poolConfig Optional - Configuration pool to use in the Knex configuration\n * @returns PostgresEngine instance\n */\n static async fromConnectionString(\n url: string | knex.Knex.StaticConnectionConfig,\n poolConfig?: knex.Knex.PoolConfig\n ) {\n const driver = \"postgresql+asyncpg\";\n\n if (typeof url === \"string\" && !url.startsWith(driver)) {\n throw Error(\"Driver must be type 'postgresql+asyncpg'\");\n }\n\n const dbConfig: knex.Knex.Config = {\n client: \"pg\",\n connection: url,\n acquireConnectionTimeout: 1000000,\n pool: {\n ...poolConfig,\n acquireTimeoutMillis: 600000,\n },\n };\n\n const engine = knex(dbConfig);\n\n return new PostgresEngine(PostgresEngine._createKey, engine);\n }\n\n /**\n * Create a table for saving of vectors to be used with PostgresVectorStore.\n *\n * @param tableName Postgres database table name. Parameter is not escaped. Do not use with end user input.\n * @param vectorSize Vector size for the embedding model to be used.\n * @param schemaName The schema name to store Postgres database table. Default: \"public\". Parameter is not escaped. Do not use with end user input.\n * @param contentColumn Name of the column to store document content. Default: \"content\".\n * @param embeddingColumn Name of the column to store vector embeddings. Default: \"embedding\".\n * @param embeddingColumnType Type of the embedding column (\"vector\" | \"halfvec\" | \"bit\" | \"sparsevec\"). Default: \"vector\". More info on HNSW-supported types: https://github.com/pgvector/pgvector#hnsw\n * @param metadataColumns Optional - A list of Columns to create for custom metadata. Default: [].\n * @param metadataJsonColumn Optional - The column to store extra metadata in JSON format. Default: \"langchain_metadata\".\n * @param idColumn Optional - Column to store ids. Default: \"langchain_id\" column name with data type UUID.\n * @param overwriteExisting Whether to drop existing table. Default: False.\n * @param storeMetadata Whether to store metadata in the table. Default: True.\n */\n async initVectorstoreTable(\n tableName: string,\n vectorSize: number,\n {\n schemaName = \"public\",\n contentColumn = \"content\",\n embeddingColumn = \"embedding\",\n embeddingColumnType = \"vector\",\n metadataColumns = [],\n metadataJsonColumn = \"langchain_metadata\",\n idColumn = \"langchain_id\",\n overwriteExisting = false,\n storeMetadata = true,\n }: VectorStoreTableArgs = {}\n ): Promise<void> {\n await this.pool.raw(\"CREATE EXTENSION IF NOT EXISTS vector\");\n\n if (overwriteExisting) {\n await this.pool.schema\n .withSchema(schemaName)\n .dropTableIfExists(tableName);\n }\n\n const idDataType =\n typeof idColumn === \"string\" ? \"UUID\" : idColumn.dataType;\n const idColumnName =\n typeof idColumn === \"string\" ? idColumn : idColumn.name;\n\n let query = `CREATE TABLE ${schemaName}.${tableName}(\n ${idColumnName} ${idDataType} PRIMARY KEY,\n ${contentColumn} TEXT NOT NULL,\n ${embeddingColumn} ${embeddingColumnType}(${vectorSize}) NOT NULL`;\n\n for (const column of metadataColumns) {\n const nullable = !column.nullable ? \"NOT NULL\" : \"\";\n query += `,\\n ${column.name} ${column.dataType} ${nullable}`;\n }\n\n if (storeMetadata) {\n query += `,\\n${metadataJsonColumn} JSON`;\n }\n\n query += `\\n);`;\n\n await this.pool.raw(query);\n }\n\n /**\n * Create a Cloud SQL table to store chat history.\n *\n * @param tableName Table name to store chat history\n * @param schemaName Schema name to store chat history table\n */\n\n async initChatHistoryTable(\n tableName: string,\n schemaName: string = \"public\"\n ): Promise<void> {\n await this.pool.raw(\n `CREATE TABLE IF NOT EXISTS ${schemaName}.${tableName}(\n id SERIAL PRIMARY KEY,\n session_id TEXT NOT NULL,\n data JSONB NOT NULL,\n type TEXT NOT NULL);`\n );\n }\n\n /**\n * Dispose of connection pool\n */\n async closeConnection(): Promise<void> {\n await this.pool.destroy();\n if (PostgresEngine.connector !== undefined) {\n PostgresEngine.connector.close();\n }\n }\n\n // Just to test the connection to the database\n testConnection() {\n const now = this.pool.raw(\"SELECT NOW() as currentTimestamp\");\n return now;\n }\n}\n\nexport default PostgresEngine;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.cts","names":["Connector","IpAddressTypes","knex","PostgresEngineArgs","VectorStoreTableArgs","Column","PostgresEngine","Knex","ipType","user","password","iamAccountEmail","Promise","StaticConnectionConfig","PoolConfig","schemaName","contentColumn","embeddingColumn","embeddingColumnType","metadataColumns","metadataJsonColumn","idColumn","overwriteExisting","storeMetadata","Raw","default"],"sources":["../src/engine.d.ts"],"sourcesContent":["import { Connector, IpAddressTypes } from \"@google-cloud/cloud-sql-connector\";\nimport knex from \"knex\";\nexport interface PostgresEngineArgs {\n ipType?: IpAddressTypes;\n user?: string;\n password?: string;\n iamAccountEmail?: string;\n}\nexport interface VectorStoreTableArgs {\n schemaName?: string;\n contentColumn?: string;\n embeddingColumn?: string;\n embeddingColumnType?: \"vector\" | \"halfvec\" | \"bit\" | \"sparsevec\";\n metadataColumns?: Column[];\n metadataJsonColumn?: string;\n idColumn?: string | Column;\n overwriteExisting?: boolean;\n storeMetadata?: boolean;\n}\nexport declare class Column {\n name: string;\n dataType: string;\n nullable: boolean;\n constructor(name: string, dataType: string, nullable?: boolean);\n private postInitilization;\n}\n/**\n * Cloud SQL shared connection pool\n *\n * Setup:\n * Install `@langchain/google-cloud-sql-pg`\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { Column, PostgresEngine, PostgresEngineArgs } from \"@langchain/google-cloud-sql-pg\";\n *\n * const pgArgs: PostgresEngineArgs = {\n * user: \"db-user\",\n * password: \"password\"\n *}\n *\n * const engine: PostgresEngine = await PostgresEngine.fromInstance(\n * \"project-id\",\n * \"region\",\n * \"instance-name\",\n * \"database-name\",\n * pgArgs\n * );\n * ```\n * </details>\n *\n * <br />\n *\n */\nexport declare class PostgresEngine {\n private static _createKey;\n pool: knex.Knex;\n static connector: Connector;\n constructor(key: symbol, pool: knex.Knex);\n /**\n * @param projectId Required - GCP Project ID\n * @param region Required - Postgres Instance Region\n * @param instance Required - Postgres Instance name\n * @param database Required - Database name\n * @param ipType Optional - IP address type. Defaults to IPAddressType.PUBLIC\n * @param user Optional - Postgres user name. Defaults to undefined\n * @param password Optional - Postgres user password. Defaults to undefined\n * @param iamAccountEmail Optional - IAM service account email. Defaults to undefined\n * @returns PostgresEngine instance\n */\n static fromInstance(projectId: string, region: string, instance: string, database: string, { ipType, user, password, iamAccountEmail }?: PostgresEngineArgs): Promise<PostgresEngine>;\n /**\n * Create a PostgresEngine instance from an Knex instance.\n *\n * @param engine knex instance\n * @returns PostgresEngine instance from a knex instance\n */\n static fromPool(engine: knex.Knex): Promise<PostgresEngine>;\n /**\n * Create a PostgresEngine instance from arguments.\n *\n * @param url URL use to connect to a database\n * @param poolConfig Optional - Configuration pool to use in the Knex configuration\n * @returns PostgresEngine instance\n */\n static fromConnectionString(url: string | knex.Knex.StaticConnectionConfig, poolConfig?: knex.Knex.PoolConfig): Promise<PostgresEngine>;\n /**\n * Create a table for saving of vectors to be used with PostgresVectorStore.\n *\n * @param tableName Postgres database table name. Parameter is not escaped. Do not use with end user input.\n * @param vectorSize Vector size for the embedding model to be used.\n * @param schemaName The schema name to store Postgres database table. Default: \"public\". Parameter is not escaped. Do not use with end user input.\n * @param contentColumn Name of the column to store document content. Default: \"content\".\n * @param embeddingColumn Name of the column to store vector embeddings. Default: \"embedding\".\n * @param embeddingColumnType Type of the embedding column (\"vector\" | \"halfvec\" | \"bit\" | \"sparsevec\"). Default: \"vector\". More info on HNSW-supported types: https://github.com/pgvector/pgvector#hnsw\n * @param metadataColumns Optional - A list of Columns to create for custom metadata. Default: [].\n * @param metadataJsonColumn Optional - The column to store extra metadata in JSON format. Default: \"langchain_metadata\".\n * @param idColumn Optional - Column to store ids. Default: \"langchain_id\" column name with data type UUID.\n * @param overwriteExisting Whether to drop existing table. Default: False.\n * @param storeMetadata Whether to store metadata in the table. Default: True.\n */\n initVectorstoreTable(tableName: string, vectorSize: number, { schemaName, contentColumn, embeddingColumn, embeddingColumnType, metadataColumns, metadataJsonColumn, idColumn, overwriteExisting, storeMetadata }?: VectorStoreTableArgs): Promise<void>;\n /**\n * Create a Cloud SQL table to store chat history.\n *\n * @param tableName Table name to store chat history\n * @param schemaName Schema name to store chat history table\n */\n initChatHistoryTable(tableName: string, schemaName?: string): Promise<void>;\n /**\n * Dispose of connection pool\n */\n closeConnection(): Promise<void>;\n testConnection(): knex.Knex.Raw<any>;\n}\nexport default PostgresEngine;\n//# sourceMappingURL=engine.d.ts.map"],"mappings":";;;;UAEiBG,kBAAAA;WACJF;EADIE,IAAAA,CAAAA,EAAAA,MAAAA;EAMAC,QAAAA,CAAAA,EAAAA,MAAAA;EAWIC,eAAM,CAAA,EAAA,MAAA;AAqC3B;AAEeE,UAlDEH,oBAAAA,CAkDFG;EACOP,UAAAA,CAAAA,EAAAA,MAAAA;EACaE,aAAKK,CAAAA,EAAAA,MAAAA;EAYyDC,eAAAA,CAAAA,EAAAA,MAAAA;EAAQC,mBAAAA,CAAAA,EAAAA,QAAAA,GAAAA,SAAAA,GAAAA,KAAAA,GAAAA,WAAAA;EAAMC,eAAAA,CAAAA,EA3DzFL,MA2DyFK,EAAAA;EAAUC,kBAAAA,CAAAA,EAAAA,MAAAA;EAAoBR,QAAAA,CAAAA,EAAAA,MAAAA,GAzDrHE,MAyDqHF;EAA6BG,iBAAAA,CAAAA,EAAAA,OAAAA;EAARM,aAAAA,CAAAA,EAAAA,OAAAA;;AAOlHN,cA5D3BD,MAAAA,CA4D2BC;EAARM,IAAAA,EAAAA,MAAAA;EAQMV,QAAUW,EAAAA,MAAAA;EAAqCX,QAAUY,EAAAA,OAAAA;EAAqBR,WAAAA,CAAAA,IAAAA,EAAAA,MAAAA,EAAAA,QAAAA,EAAAA,MAAAA,EAAAA,QAAAA,CAAAA,EAAAA,OAAAA;EAARM,QAAAA,iBAAAA;;;;;;;;;;;;;;;AA4BjF;;;;;;;;;;;;;;;;;cA3DdN,cAAAA;;QAEXJ,IAAAA,CAAKK;oBACOP;iCACaE,IAAAA,CAAKK;;;;;;;;;;;;;;;;;MAYqGJ,qBAAqBS,QAAQN;;;;;;;0BAO9IJ,IAAAA,CAAKK,OAAOK,QAAQN;;;;;;;;4CAQFJ,IAAAA,CAAKK,IAAAA,CAAKM,qCAAqCX,IAAAA,CAAKK,IAAAA,CAAKO,aAAaF,QAAQN;;;;;;;;;;;;;;;;;;;;;;;;;;MAgB2FF,uBAAuBQ;;;;;;;gEAO5KA;;;;qBAI3CA;oBACDV,IAAAA,CAAKK,IAAAA,CAAKiB"}
1
+ {"version":3,"file":"engine.d.cts","names":[],"sources":["../src/engine.ts"],"mappings":";;;;UASiB,kBAAA;EACf,MAAA,GAAS,cAAA;EACT,IAAA;EACA,QAAA;EACA,eAAA;AAAA;AAAA,UAGe,oBAAA;EACf,UAAA;EACA,aAAA;EACA,eAAA;EACA,mBAAA;EACA,eAAA,GAAkB,MAAA;EAClB,kBAAA;EACA,QAAA,YAAoB,MAAA;EACpB,iBAAA;EACA,aAAA;AAAA;AAAA,cAGW,MAAA;EACX,IAAA;EAEA,QAAA;EAEA,QAAA;EAEA,WAAA,CAAY,IAAA,UAAc,QAAA,UAAkB,QAAA;EAAA,QAQpC,iBAAA;AAAA;;;;;;;AAfV;;;;;;;;;;;;;;AA0DA;;;;;;;;;;cAAa,cAAA;EAAA,eACI,UAAA;EAEf,IAAA,EAAM,IAAA,CAAK,IAAA;EAAA,OAEJ,SAAA,EAAW,SAAA;EAElB,WAAA,CAAY,GAAA,UAAa,IAAA,EAAM,IAAA,CAAK,IAAA;EAyFG;;;;;;;;;;;EAAA,OAtE1B,YAAA,CACX,SAAA,UACA,MAAA,UACA,QAAA,UACA,QAAA;IAEE,MAAA;IACA,IAAA;IACA,QAAA;IACA;EAAA,IACC,kBAAA,GACF,OAAA,CAAQ,cAAA;EAyHP;;;;;;EAAA,OA9DS,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,IAAA,GAAI,OAAA,CAAA,cAAA;EAiIzB;;;;;;;EAAA,OAtHD,oBAAA,CACX,GAAA,WAAc,IAAA,CAAK,IAAA,CAAK,sBAAA,EACxB,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,UAAA,GAAU,OAAA,CAAA,cAAA;EAtGnC;;;;;;;;;;;;;;;EA4IM,oBAAA,CACJ,SAAA,UACA,UAAA;IAEE,UAAA;IACA,aAAA;IACA,eAAA;IACA,mBAAA;IACA,eAAA;IACA,kBAAA;IACA,QAAA;IACA,iBAAA;IACA;EAAA,IACC,oBAAA,GACF,OAAA;EA9HC;;;;;;EAsKE,oBAAA,CACJ,SAAA,UACA,UAAA,YACC,OAAA;EA5GgC;;;EAyH7B,eAAA,CAAA,GAAmB,OAAA;EAQzB,cAAA,CAAA,GAAc,IAAA,CAAA,IAAA,CAAA,GAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","names":["Connector","IpAddressTypes","knex","PostgresEngineArgs","VectorStoreTableArgs","Column","PostgresEngine","Knex","ipType","user","password","iamAccountEmail","Promise","StaticConnectionConfig","PoolConfig","schemaName","contentColumn","embeddingColumn","embeddingColumnType","metadataColumns","metadataJsonColumn","idColumn","overwriteExisting","storeMetadata","Raw","default"],"sources":["../src/engine.d.ts"],"sourcesContent":["import { Connector, IpAddressTypes } from \"@google-cloud/cloud-sql-connector\";\nimport knex from \"knex\";\nexport interface PostgresEngineArgs {\n ipType?: IpAddressTypes;\n user?: string;\n password?: string;\n iamAccountEmail?: string;\n}\nexport interface VectorStoreTableArgs {\n schemaName?: string;\n contentColumn?: string;\n embeddingColumn?: string;\n embeddingColumnType?: \"vector\" | \"halfvec\" | \"bit\" | \"sparsevec\";\n metadataColumns?: Column[];\n metadataJsonColumn?: string;\n idColumn?: string | Column;\n overwriteExisting?: boolean;\n storeMetadata?: boolean;\n}\nexport declare class Column {\n name: string;\n dataType: string;\n nullable: boolean;\n constructor(name: string, dataType: string, nullable?: boolean);\n private postInitilization;\n}\n/**\n * Cloud SQL shared connection pool\n *\n * Setup:\n * Install `@langchain/google-cloud-sql-pg`\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { Column, PostgresEngine, PostgresEngineArgs } from \"@langchain/google-cloud-sql-pg\";\n *\n * const pgArgs: PostgresEngineArgs = {\n * user: \"db-user\",\n * password: \"password\"\n *}\n *\n * const engine: PostgresEngine = await PostgresEngine.fromInstance(\n * \"project-id\",\n * \"region\",\n * \"instance-name\",\n * \"database-name\",\n * pgArgs\n * );\n * ```\n * </details>\n *\n * <br />\n *\n */\nexport declare class PostgresEngine {\n private static _createKey;\n pool: knex.Knex;\n static connector: Connector;\n constructor(key: symbol, pool: knex.Knex);\n /**\n * @param projectId Required - GCP Project ID\n * @param region Required - Postgres Instance Region\n * @param instance Required - Postgres Instance name\n * @param database Required - Database name\n * @param ipType Optional - IP address type. Defaults to IPAddressType.PUBLIC\n * @param user Optional - Postgres user name. Defaults to undefined\n * @param password Optional - Postgres user password. Defaults to undefined\n * @param iamAccountEmail Optional - IAM service account email. Defaults to undefined\n * @returns PostgresEngine instance\n */\n static fromInstance(projectId: string, region: string, instance: string, database: string, { ipType, user, password, iamAccountEmail }?: PostgresEngineArgs): Promise<PostgresEngine>;\n /**\n * Create a PostgresEngine instance from an Knex instance.\n *\n * @param engine knex instance\n * @returns PostgresEngine instance from a knex instance\n */\n static fromPool(engine: knex.Knex): Promise<PostgresEngine>;\n /**\n * Create a PostgresEngine instance from arguments.\n *\n * @param url URL use to connect to a database\n * @param poolConfig Optional - Configuration pool to use in the Knex configuration\n * @returns PostgresEngine instance\n */\n static fromConnectionString(url: string | knex.Knex.StaticConnectionConfig, poolConfig?: knex.Knex.PoolConfig): Promise<PostgresEngine>;\n /**\n * Create a table for saving of vectors to be used with PostgresVectorStore.\n *\n * @param tableName Postgres database table name. Parameter is not escaped. Do not use with end user input.\n * @param vectorSize Vector size for the embedding model to be used.\n * @param schemaName The schema name to store Postgres database table. Default: \"public\". Parameter is not escaped. Do not use with end user input.\n * @param contentColumn Name of the column to store document content. Default: \"content\".\n * @param embeddingColumn Name of the column to store vector embeddings. Default: \"embedding\".\n * @param embeddingColumnType Type of the embedding column (\"vector\" | \"halfvec\" | \"bit\" | \"sparsevec\"). Default: \"vector\". More info on HNSW-supported types: https://github.com/pgvector/pgvector#hnsw\n * @param metadataColumns Optional - A list of Columns to create for custom metadata. Default: [].\n * @param metadataJsonColumn Optional - The column to store extra metadata in JSON format. Default: \"langchain_metadata\".\n * @param idColumn Optional - Column to store ids. Default: \"langchain_id\" column name with data type UUID.\n * @param overwriteExisting Whether to drop existing table. Default: False.\n * @param storeMetadata Whether to store metadata in the table. Default: True.\n */\n initVectorstoreTable(tableName: string, vectorSize: number, { schemaName, contentColumn, embeddingColumn, embeddingColumnType, metadataColumns, metadataJsonColumn, idColumn, overwriteExisting, storeMetadata }?: VectorStoreTableArgs): Promise<void>;\n /**\n * Create a Cloud SQL table to store chat history.\n *\n * @param tableName Table name to store chat history\n * @param schemaName Schema name to store chat history table\n */\n initChatHistoryTable(tableName: string, schemaName?: string): Promise<void>;\n /**\n * Dispose of connection pool\n */\n closeConnection(): Promise<void>;\n testConnection(): knex.Knex.Raw<any>;\n}\nexport default PostgresEngine;\n//# sourceMappingURL=engine.d.ts.map"],"mappings":";;;;UAEiBG,kBAAAA;WACJF;EADIE,IAAAA,CAAAA,EAAAA,MAAAA;EAMAC,QAAAA,CAAAA,EAAAA,MAAAA;EAWIC,eAAM,CAAA,EAAA,MAAA;AAqC3B;AAEeE,UAlDEH,oBAAAA,CAkDFG;EACOP,UAAAA,CAAAA,EAAAA,MAAAA;EACaE,aAAKK,CAAAA,EAAAA,MAAAA;EAYyDC,eAAAA,CAAAA,EAAAA,MAAAA;EAAQC,mBAAAA,CAAAA,EAAAA,QAAAA,GAAAA,SAAAA,GAAAA,KAAAA,GAAAA,WAAAA;EAAMC,eAAAA,CAAAA,EA3DzFL,MA2DyFK,EAAAA;EAAUC,kBAAAA,CAAAA,EAAAA,MAAAA;EAAoBR,QAAAA,CAAAA,EAAAA,MAAAA,GAzDrHE,MAyDqHF;EAA6BG,iBAAAA,CAAAA,EAAAA,OAAAA;EAARM,aAAAA,CAAAA,EAAAA,OAAAA;;AAOlHN,cA5D3BD,MAAAA,CA4D2BC;EAARM,IAAAA,EAAAA,MAAAA;EAQMV,QAAUW,EAAAA,MAAAA;EAAqCX,QAAUY,EAAAA,OAAAA;EAAqBR,WAAAA,CAAAA,IAAAA,EAAAA,MAAAA,EAAAA,QAAAA,EAAAA,MAAAA,EAAAA,QAAAA,CAAAA,EAAAA,OAAAA;EAARM,QAAAA,iBAAAA;;;;;;;;;;;;;;;AA4BjF;;;;;;;;;;;;;;;;;cA3DdN,cAAAA;;QAEXJ,IAAAA,CAAKK;oBACOP;iCACaE,IAAAA,CAAKK;;;;;;;;;;;;;;;;;MAYqGJ,qBAAqBS,QAAQN;;;;;;;0BAO9IJ,IAAAA,CAAKK,OAAOK,QAAQN;;;;;;;;4CAQFJ,IAAAA,CAAKK,IAAAA,CAAKM,qCAAqCX,IAAAA,CAAKK,IAAAA,CAAKO,aAAaF,QAAQN;;;;;;;;;;;;;;;;;;;;;;;;;;MAgB2FF,uBAAuBQ;;;;;;;gEAO5KA;;;;qBAI3CA;oBACDV,IAAAA,CAAKK,IAAAA,CAAKiB"}
1
+ {"version":3,"file":"engine.d.ts","names":[],"sources":["../src/engine.ts"],"mappings":";;;;UASiB,kBAAA;EACf,MAAA,GAAS,cAAA;EACT,IAAA;EACA,QAAA;EACA,eAAA;AAAA;AAAA,UAGe,oBAAA;EACf,UAAA;EACA,aAAA;EACA,eAAA;EACA,mBAAA;EACA,eAAA,GAAkB,MAAA;EAClB,kBAAA;EACA,QAAA,YAAoB,MAAA;EACpB,iBAAA;EACA,aAAA;AAAA;AAAA,cAGW,MAAA;EACX,IAAA;EAEA,QAAA;EAEA,QAAA;EAEA,WAAA,CAAY,IAAA,UAAc,QAAA,UAAkB,QAAA;EAAA,QAQpC,iBAAA;AAAA;;;;;;;AAfV;;;;;;;;;;;;;;AA0DA;;;;;;;;;;cAAa,cAAA;EAAA,eACI,UAAA;EAEf,IAAA,EAAM,IAAA,CAAK,IAAA;EAAA,OAEJ,SAAA,EAAW,SAAA;EAElB,WAAA,CAAY,GAAA,UAAa,IAAA,EAAM,IAAA,CAAK,IAAA;EAyFG;;;;;;;;;;;EAAA,OAtE1B,YAAA,CACX,SAAA,UACA,MAAA,UACA,QAAA,UACA,QAAA;IAEE,MAAA;IACA,IAAA;IACA,QAAA;IACA;EAAA,IACC,kBAAA,GACF,OAAA,CAAQ,cAAA;EAyHP;;;;;;EAAA,OA9DS,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,IAAA,GAAI,OAAA,CAAA,cAAA;EAiIzB;;;;;;;EAAA,OAtHD,oBAAA,CACX,GAAA,WAAc,IAAA,CAAK,IAAA,CAAK,sBAAA,EACxB,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,UAAA,GAAU,OAAA,CAAA,cAAA;EAtGnC;;;;;;;;;;;;;;;EA4IM,oBAAA,CACJ,SAAA,UACA,UAAA;IAEE,UAAA;IACA,aAAA;IACA,eAAA;IACA,mBAAA;IACA,eAAA;IACA,kBAAA;IACA,QAAA;IACA,iBAAA;IACA;EAAA,IACC,oBAAA,GACF,OAAA;EA9HC;;;;;;EAsKE,oBAAA,CACJ,SAAA,UACA,UAAA,YACC,OAAA;EA5GgC;;;EAyH7B,eAAA,CAAA,GAAmB,OAAA;EAQzB,cAAA,CAAA,GAAc,IAAA,CAAA,IAAA,CAAA,GAAA;AAAA"}