n8n-nodes-simple 4.3.0 → 4.3.2
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.
|
@@ -11,17 +11,15 @@ class LimitedPostgresChatMessageHistory extends chat_history_1.BaseListChatMessa
|
|
|
11
11
|
constructor(fields) {
|
|
12
12
|
super();
|
|
13
13
|
this.lc_namespace = ['langchain', 'stores', 'message', 'postgres'];
|
|
14
|
-
this.tableReady = false;
|
|
15
14
|
this.pool = fields.pool;
|
|
16
15
|
this.sessionId = fields.sessionId;
|
|
17
16
|
this.tableName = fields.tableName;
|
|
18
17
|
this.limit = fields.limit;
|
|
19
18
|
this.readOnly = fields.readOnly;
|
|
20
|
-
this.
|
|
19
|
+
this.summaryPrefix = fields.summaryPrefix;
|
|
20
|
+
this.keepMessagesBeforePrefix = fields.keepMessagesBeforePrefix;
|
|
21
21
|
}
|
|
22
22
|
async ensureTable() {
|
|
23
|
-
if (this.tableReady)
|
|
24
|
-
return;
|
|
25
23
|
await this.pool.query(`
|
|
26
24
|
CREATE TABLE IF NOT EXISTS ${this.tableName} (
|
|
27
25
|
id SERIAL PRIMARY KEY,
|
|
@@ -34,21 +32,30 @@ class LimitedPostgresChatMessageHistory extends chat_history_1.BaseListChatMessa
|
|
|
34
32
|
CREATE INDEX IF NOT EXISTS ${this.tableName}_session_id_idx
|
|
35
33
|
ON ${this.tableName} (session_id, id DESC)
|
|
36
34
|
`);
|
|
37
|
-
|
|
35
|
+
}
|
|
36
|
+
async withTableAutoCreate(op) {
|
|
37
|
+
try {
|
|
38
|
+
return await op();
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
if ((err === null || err === void 0 ? void 0 : err.code) !== '42P01')
|
|
42
|
+
throw err;
|
|
43
|
+
await this.ensureTable();
|
|
44
|
+
return await op();
|
|
45
|
+
}
|
|
38
46
|
}
|
|
39
47
|
async getMessages() {
|
|
40
|
-
await this.
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
ORDER BY id ASC`, [this.sessionId, this.limit]);
|
|
48
|
+
const result = await this.withTableAutoCreate(() => this.pool.query(`SELECT id, message FROM (
|
|
49
|
+
SELECT id, message
|
|
50
|
+
FROM ${this.tableName}
|
|
51
|
+
WHERE session_id = $1
|
|
52
|
+
ORDER BY id DESC
|
|
53
|
+
LIMIT $2
|
|
54
|
+
) sub
|
|
55
|
+
ORDER BY id ASC`, [this.sessionId, this.limit]));
|
|
49
56
|
const storedMessages = result.rows.map((row) => row.message);
|
|
50
57
|
const messages = (0, messages_1.mapStoredMessagesToChatMessages)(storedMessages);
|
|
51
|
-
if (this.
|
|
58
|
+
if (this.summaryPrefix) {
|
|
52
59
|
for (let i = messages.length - 1; i >= 0; i--) {
|
|
53
60
|
const m = messages[i];
|
|
54
61
|
const type = m.constructor.name;
|
|
@@ -56,8 +63,9 @@ class LimitedPostgresChatMessageHistory extends chat_history_1.BaseListChatMessa
|
|
|
56
63
|
continue;
|
|
57
64
|
if (typeof m.content !== 'string')
|
|
58
65
|
continue;
|
|
59
|
-
if (m.content.startsWith(this.
|
|
60
|
-
|
|
66
|
+
if (m.content.startsWith(this.summaryPrefix)) {
|
|
67
|
+
const start = Math.max(0, i - this.keepMessagesBeforePrefix);
|
|
68
|
+
return messages.slice(start);
|
|
61
69
|
}
|
|
62
70
|
}
|
|
63
71
|
}
|
|
@@ -66,17 +74,47 @@ class LimitedPostgresChatMessageHistory extends chat_history_1.BaseListChatMessa
|
|
|
66
74
|
async addMessage(message) {
|
|
67
75
|
if (this.readOnly)
|
|
68
76
|
return;
|
|
69
|
-
await this.ensureTable();
|
|
70
77
|
const [stored] = (0, messages_1.mapChatMessagesToStoredMessages)([message]);
|
|
71
|
-
await this.pool.query(`INSERT INTO ${this.tableName} (session_id, message) VALUES ($1, $2)`, [this.sessionId, JSON.stringify(stored)]);
|
|
78
|
+
await this.withTableAutoCreate(() => this.pool.query(`INSERT INTO ${this.tableName} (session_id, message) VALUES ($1, $2)`, [this.sessionId, JSON.stringify(stored)]));
|
|
72
79
|
}
|
|
73
80
|
async clear() {
|
|
74
|
-
await this.
|
|
75
|
-
await this.pool.query(`DELETE FROM ${this.tableName} WHERE session_id = $1`, [
|
|
76
|
-
this.sessionId,
|
|
77
|
-
]);
|
|
81
|
+
await this.withTableAutoCreate(() => this.pool.query(`DELETE FROM ${this.tableName} WHERE session_id = $1`, [this.sessionId]));
|
|
78
82
|
}
|
|
79
83
|
}
|
|
84
|
+
const poolCache = new Map();
|
|
85
|
+
function getSharedPool(config) {
|
|
86
|
+
const identityKey = JSON.stringify({
|
|
87
|
+
host: config.host,
|
|
88
|
+
port: config.port,
|
|
89
|
+
database: config.database,
|
|
90
|
+
user: config.user,
|
|
91
|
+
});
|
|
92
|
+
const configKey = JSON.stringify({
|
|
93
|
+
host: config.host,
|
|
94
|
+
port: config.port,
|
|
95
|
+
database: config.database,
|
|
96
|
+
user: config.user,
|
|
97
|
+
password: config.password,
|
|
98
|
+
ssl: config.ssl,
|
|
99
|
+
});
|
|
100
|
+
const cached = poolCache.get(identityKey);
|
|
101
|
+
if (cached) {
|
|
102
|
+
if (cached.configKey === configKey)
|
|
103
|
+
return cached.pool;
|
|
104
|
+
void cached.pool.end().catch(() => { });
|
|
105
|
+
}
|
|
106
|
+
const pool = new pg_1.Pool({
|
|
107
|
+
...config,
|
|
108
|
+
max: 20,
|
|
109
|
+
idleTimeoutMillis: 30000,
|
|
110
|
+
connectionTimeoutMillis: 10000,
|
|
111
|
+
});
|
|
112
|
+
pool.on('error', (err) => {
|
|
113
|
+
console.error('MemoryPostgresChat shared pool error:', err.message);
|
|
114
|
+
});
|
|
115
|
+
poolCache.set(identityKey, { pool, configKey });
|
|
116
|
+
return pool;
|
|
117
|
+
}
|
|
80
118
|
class MemoryPostgresChat {
|
|
81
119
|
constructor() {
|
|
82
120
|
this.description = {
|
|
@@ -131,12 +169,22 @@ class MemoryPostgresChat {
|
|
|
131
169
|
},
|
|
132
170
|
},
|
|
133
171
|
{
|
|
134
|
-
displayName: '
|
|
135
|
-
name: '
|
|
172
|
+
displayName: 'Summary Prefix',
|
|
173
|
+
name: 'summaryPrefix',
|
|
136
174
|
type: 'string',
|
|
137
175
|
default: '<summary>',
|
|
138
176
|
description: 'If set, skips all messages before the most recent user or system message whose content starts with this string. Useful for anchoring a compacted-context summary inserted into chat history. Leave empty to disable.',
|
|
139
177
|
},
|
|
178
|
+
{
|
|
179
|
+
displayName: 'Keep Messages Before Prefix',
|
|
180
|
+
name: 'keepMessagesBeforePrefix',
|
|
181
|
+
type: 'number',
|
|
182
|
+
default: 2,
|
|
183
|
+
description: 'Number of messages immediately before the matched prefix message to retain. Only applies when Summary Prefix is set and matches. Set to 0 to drop everything before the prefix.',
|
|
184
|
+
typeOptions: {
|
|
185
|
+
minValue: 0,
|
|
186
|
+
},
|
|
187
|
+
},
|
|
140
188
|
{
|
|
141
189
|
displayName: 'Read Only',
|
|
142
190
|
name: 'readOnly',
|
|
@@ -150,9 +198,13 @@ class MemoryPostgresChat {
|
|
|
150
198
|
async supplyData(itemIndex) {
|
|
151
199
|
const credentials = await this.getCredentials('postgres');
|
|
152
200
|
const tableName = this.getNodeParameter('tableName', itemIndex, 'chat_memory');
|
|
201
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(tableName)) {
|
|
202
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Invalid table name "${tableName}". Use only letters, digits, and underscores, starting with a letter or underscore.`, { itemIndex });
|
|
203
|
+
}
|
|
153
204
|
const contextWindowLength = this.getNodeParameter('contextWindowLength', itemIndex, 10);
|
|
154
205
|
const readOnly = this.getNodeParameter('readOnly', itemIndex, false);
|
|
155
|
-
const
|
|
206
|
+
const summaryPrefix = this.getNodeParameter('summaryPrefix', itemIndex, '');
|
|
207
|
+
const keepMessagesBeforePrefix = this.getNodeParameter('keepMessagesBeforePrefix', itemIndex, 2);
|
|
156
208
|
let sessionId = this.getNodeParameter('sessionKey', itemIndex, '');
|
|
157
209
|
if (!sessionId) {
|
|
158
210
|
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Session Key must not be empty.', {
|
|
@@ -169,14 +221,13 @@ class MemoryPostgresChat {
|
|
|
169
221
|
else {
|
|
170
222
|
sslConfig = { rejectUnauthorized: true };
|
|
171
223
|
}
|
|
172
|
-
const pool =
|
|
224
|
+
const pool = getSharedPool({
|
|
173
225
|
host: credentials.host,
|
|
174
226
|
port: credentials.port,
|
|
175
227
|
database: credentials.database,
|
|
176
228
|
user: credentials.user,
|
|
177
229
|
password: credentials.password,
|
|
178
230
|
ssl: sslConfig,
|
|
179
|
-
max: 5,
|
|
180
231
|
});
|
|
181
232
|
const chatHistory = new LimitedPostgresChatMessageHistory({
|
|
182
233
|
pool,
|
|
@@ -184,7 +235,8 @@ class MemoryPostgresChat {
|
|
|
184
235
|
tableName,
|
|
185
236
|
limit: contextWindowLength,
|
|
186
237
|
readOnly,
|
|
187
|
-
|
|
238
|
+
summaryPrefix,
|
|
239
|
+
keepMessagesBeforePrefix,
|
|
188
240
|
});
|
|
189
241
|
const memory = new memory_1.BufferMemory({
|
|
190
242
|
memoryKey: 'chat_history',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryPostgresChat.node.js","sourceRoot":"","sources":["../../../nodes/MemoryPostgresChat/MemoryPostgresChat.node.ts"],"names":[],"mappings":";;;AAAA,+DAA0E;AAC1E,uDAIkC;AAClC,6CAAgD;AAChD,6CAA0C;AAC1C,2BAA2C;AAE3C,+CAAuE;AAMvE,MAAM,iCAAkC,SAAQ,yCAA0B;IAWzE,YAAY,
|
|
1
|
+
{"version":3,"file":"MemoryPostgresChat.node.js","sourceRoot":"","sources":["../../../nodes/MemoryPostgresChat/MemoryPostgresChat.node.ts"],"names":[],"mappings":"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"}
|