@n8n/ai-utilities 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE_EE.md +27 -0
- package/README.md +21 -7
- package/dist/adapters/langchain-chat-model.js +61 -50
- package/dist/adapters/langchain-chat-model.js.map +1 -1
- package/dist/build.tsbuildinfo +1 -1
- package/dist/converters/message.d.ts +1 -0
- package/dist/converters/message.js +17 -15
- package/dist/converters/message.js.map +1 -1
- package/dist/memory/windowed-chat-memory.js +2 -2
- package/dist/memory/windowed-chat-memory.js.map +1 -1
- package/dist/suppliers/supplyModel.js +1 -0
- package/dist/suppliers/supplyModel.js.map +1 -1
- package/dist/types/message.d.ts +1 -1
- package/dist/types/output.d.ts +26 -16
- package/package.json +18 -5
package/LICENSE_EE.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# The n8n Enterprise License (the “Enterprise License”)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2022-present n8n GmbH.
|
|
4
|
+
|
|
5
|
+
With regard to the n8n Software:
|
|
6
|
+
|
|
7
|
+
This software and associated documentation files (the "Software") may only be used in production, if
|
|
8
|
+
you (and any entity that you represent) hold a valid n8n Enterprise license corresponding to your
|
|
9
|
+
usage. Subject to the foregoing sentence, you are free to modify this Software and publish patches
|
|
10
|
+
to the Software. You agree that n8n and/or its licensors (as applicable) retain all right, title and
|
|
11
|
+
interest in and to all such modifications and/or patches, and all such modifications and/or patches
|
|
12
|
+
may only be used, copied, modified, displayed, distributed, or otherwise exploited with a valid n8n
|
|
13
|
+
Enterprise license for the corresponding usage. Notwithstanding the foregoing, you may copy and
|
|
14
|
+
modify the Software for development and testing purposes, without requiring a subscription. You
|
|
15
|
+
agree that n8n and/or its licensors (as applicable) retain all right, title and interest in and to
|
|
16
|
+
all such modifications. You are not granted any other rights beyond what is expressly stated herein.
|
|
17
|
+
Subject to the foregoing, it is forbidden to copy, merge, publish, distribute, sublicense, and/or
|
|
18
|
+
sell the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
|
21
|
+
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
22
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
|
|
23
|
+
OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
24
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
25
|
+
|
|
26
|
+
For all third party components incorporated into the n8n Software, those components are licensed
|
|
27
|
+
under the original license provided by the owner of the applicable component.
|
package/README.md
CHANGED
|
@@ -19,7 +19,21 @@ pnpm test
|
|
|
19
19
|
pnpm dev
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
## Running examples
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
pnpm build:examples
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Update your env file with:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
N8N_CUSTOM_EXTENSIONS="<PATH_TO_N8N>/packages/@n8n/ai-utilities/dist_examples/examples/nodes"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Start n8n and add "OpenAI Simple" or "OpenAI Custom" to workflows
|
|
35
|
+
|
|
36
|
+
# Chat model SDK
|
|
23
37
|
|
|
24
38
|
## Core Pattern
|
|
25
39
|
|
|
@@ -145,7 +159,7 @@ class ImaginaryLlmChatModel extends BaseChatModel {
|
|
|
145
159
|
async generate(messages: Message[], config?: ChatModelConfig): Promise<GenerateResult> {
|
|
146
160
|
// Convert n8n messages to provider format
|
|
147
161
|
const providerMessages = messages.map(m => ({
|
|
148
|
-
speaker: m.role === '
|
|
162
|
+
speaker: m.role === 'user' ? 'user' : m.role === 'assistant' ? 'bot' : m.role,
|
|
149
163
|
text: m.content.find(c => c.type === 'text')?.text ?? '',
|
|
150
164
|
}));
|
|
151
165
|
|
|
@@ -310,8 +324,8 @@ class MyCustomChatMemory extends BaseChatMemory {
|
|
|
310
324
|
|
|
311
325
|
async saveTurn(input: string, output: string): Promise<void> {
|
|
312
326
|
await this.chatHistory.addMessages([
|
|
313
|
-
{ role: '
|
|
314
|
-
{ role: '
|
|
327
|
+
{ role: 'user', content: [{ type: 'text', text: input }] },
|
|
328
|
+
{ role: 'assistant', content: [{ type: 'text', text: output }] },
|
|
315
329
|
]);
|
|
316
330
|
}
|
|
317
331
|
|
|
@@ -367,7 +381,7 @@ class ImaginaryDbChatHistory extends BaseChatHistory {
|
|
|
367
381
|
|
|
368
382
|
// Convert from provider format to n8n Message format
|
|
369
383
|
return data.messages.map((m: any) => ({
|
|
370
|
-
role: m.speaker === 'user' ? '
|
|
384
|
+
role: m.speaker === 'user' ? 'user' : m.speaker === 'bot' ? 'assistant' : m.speaker,
|
|
371
385
|
content: [{ type: 'text', text: m.text }],
|
|
372
386
|
}));
|
|
373
387
|
}
|
|
@@ -379,7 +393,7 @@ class ImaginaryDbChatHistory extends BaseChatHistory {
|
|
|
379
393
|
url: `${this.baseUrl}/sessions/${this.sessionId}/messages`,
|
|
380
394
|
headers: { Authorization: `Bearer ${this.apiKey}` },
|
|
381
395
|
body: {
|
|
382
|
-
speaker: message.role === '
|
|
396
|
+
speaker: message.role === 'user' ? 'user' : message.role === 'assistant' ? 'bot' : message.role,
|
|
383
397
|
text,
|
|
384
398
|
},
|
|
385
399
|
json: true,
|
|
@@ -405,7 +419,7 @@ export class MemoryImaginaryDb implements INodeType {
|
|
|
405
419
|
version: 1,
|
|
406
420
|
description: 'Use ImaginaryDB for chat memory storage',
|
|
407
421
|
defaults: { name: 'ImaginaryDB Memory' },
|
|
408
|
-
codex: { categories: ['
|
|
422
|
+
codex: { categories: ['assistant'], subcategories: { AI: ['Memory'] } },
|
|
409
423
|
inputs: [],
|
|
410
424
|
outputs: [NodeConnectionTypes.AiMemory],
|
|
411
425
|
outputNames: ['Memory'],
|
|
@@ -41,13 +41,7 @@ class LangchainAdapter extends chat_models_1.BaseChatModel {
|
|
|
41
41
|
async _generate(messages, options) {
|
|
42
42
|
const transformedMessages = messages.map(message_1.fromLcMessage);
|
|
43
43
|
const result = await this.chatModel.generate(transformedMessages, options);
|
|
44
|
-
const
|
|
45
|
-
if (result.text) {
|
|
46
|
-
content.push({
|
|
47
|
-
type: 'text',
|
|
48
|
-
text: result.text,
|
|
49
|
-
});
|
|
50
|
-
}
|
|
44
|
+
const lcMessage = (0, message_1.toLcMessage)(result.message);
|
|
51
45
|
const usage_metadata = result.usage
|
|
52
46
|
? {
|
|
53
47
|
input_tokens: result.usage.promptTokens ?? 0,
|
|
@@ -65,28 +59,19 @@ class LangchainAdapter extends chat_models_1.BaseChatModel {
|
|
|
65
59
|
: undefined,
|
|
66
60
|
}
|
|
67
61
|
: undefined;
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
usage_metadata,
|
|
77
|
-
response_metadata: {
|
|
78
|
-
...result.providerMetadata,
|
|
79
|
-
model: this.chatModel.modelId,
|
|
80
|
-
provider: this.chatModel.provider,
|
|
81
|
-
},
|
|
82
|
-
id: result.id,
|
|
83
|
-
tool_calls,
|
|
84
|
-
});
|
|
62
|
+
if (messages_1.AIMessage.isInstance(lcMessage)) {
|
|
63
|
+
lcMessage.usage_metadata = usage_metadata;
|
|
64
|
+
}
|
|
65
|
+
lcMessage.response_metadata = {
|
|
66
|
+
...result.providerMetadata,
|
|
67
|
+
model: this.chatModel.modelId,
|
|
68
|
+
provider: this.chatModel.provider,
|
|
69
|
+
};
|
|
85
70
|
return {
|
|
86
71
|
generations: [
|
|
87
72
|
{
|
|
88
|
-
text:
|
|
89
|
-
message:
|
|
73
|
+
text: lcMessage.text,
|
|
74
|
+
message: lcMessage,
|
|
90
75
|
},
|
|
91
76
|
],
|
|
92
77
|
llmOutput: {
|
|
@@ -99,50 +84,38 @@ class LangchainAdapter extends chat_models_1.BaseChatModel {
|
|
|
99
84
|
const genericMessages = messages.map(message_1.fromLcMessage);
|
|
100
85
|
const stream = this.chatModel.stream(genericMessages, options);
|
|
101
86
|
for await (const chunk of stream) {
|
|
102
|
-
|
|
87
|
+
let lcChunk = undefined;
|
|
88
|
+
if (chunk.type === 'text-delta') {
|
|
103
89
|
const content = [
|
|
104
90
|
{
|
|
105
91
|
type: 'text',
|
|
106
|
-
text: chunk.
|
|
92
|
+
text: chunk.delta,
|
|
107
93
|
},
|
|
108
94
|
];
|
|
109
|
-
|
|
95
|
+
lcChunk = new outputs_1.ChatGenerationChunk({
|
|
110
96
|
message: new messages_1.AIMessageChunk({
|
|
111
97
|
content,
|
|
112
|
-
usage_metadata: chunk.usage
|
|
113
|
-
? {
|
|
114
|
-
input_tokens: chunk.usage.promptTokens ?? 0,
|
|
115
|
-
output_tokens: chunk.usage.completionTokens ?? 0,
|
|
116
|
-
total_tokens: chunk.usage.totalTokens ?? 0,
|
|
117
|
-
}
|
|
118
|
-
: undefined,
|
|
119
98
|
}),
|
|
120
|
-
text: chunk.
|
|
99
|
+
text: chunk.delta,
|
|
121
100
|
});
|
|
122
|
-
yield chunkResult;
|
|
123
|
-
await runManager?.handleLLMNewToken(chunkResult.text ?? '', {
|
|
124
|
-
prompt: 0,
|
|
125
|
-
completion: 0,
|
|
126
|
-
}, undefined, undefined, undefined, { chunk: chunkResult });
|
|
127
101
|
}
|
|
128
|
-
else if (chunk.type === 'tool-call-delta'
|
|
102
|
+
else if (chunk.type === 'tool-call-delta') {
|
|
129
103
|
const tool_call_chunks = [
|
|
130
104
|
{
|
|
131
105
|
type: 'tool_call_chunk',
|
|
132
|
-
id: chunk.
|
|
133
|
-
name: chunk.
|
|
134
|
-
args: chunk.
|
|
106
|
+
id: chunk.id,
|
|
107
|
+
name: chunk.name,
|
|
108
|
+
args: chunk.argumentsDelta,
|
|
135
109
|
index: 0,
|
|
136
110
|
},
|
|
137
111
|
];
|
|
138
|
-
|
|
112
|
+
lcChunk = new outputs_1.ChatGenerationChunk({
|
|
139
113
|
message: new messages_1.AIMessageChunk({
|
|
140
114
|
content: '',
|
|
141
115
|
tool_call_chunks,
|
|
142
116
|
}),
|
|
143
117
|
text: '',
|
|
144
118
|
});
|
|
145
|
-
yield chunkResult;
|
|
146
119
|
}
|
|
147
120
|
else if (chunk.type === 'finish') {
|
|
148
121
|
const usage_metadata = chunk.usage
|
|
@@ -152,7 +125,7 @@ class LangchainAdapter extends chat_models_1.BaseChatModel {
|
|
|
152
125
|
total_tokens: chunk.usage.totalTokens ?? 0,
|
|
153
126
|
}
|
|
154
127
|
: undefined;
|
|
155
|
-
|
|
128
|
+
lcChunk = new outputs_1.ChatGenerationChunk({
|
|
156
129
|
message: new messages_1.AIMessageChunk({
|
|
157
130
|
content: '',
|
|
158
131
|
usage_metadata,
|
|
@@ -165,7 +138,45 @@ class LangchainAdapter extends chat_models_1.BaseChatModel {
|
|
|
165
138
|
finish_reason: chunk.finishReason,
|
|
166
139
|
},
|
|
167
140
|
});
|
|
168
|
-
|
|
141
|
+
}
|
|
142
|
+
else if (chunk.type === 'error') {
|
|
143
|
+
lcChunk = new outputs_1.ChatGenerationChunk({
|
|
144
|
+
message: new messages_1.AIMessageChunk({
|
|
145
|
+
content: '',
|
|
146
|
+
response_metadata: {
|
|
147
|
+
finish_reason: 'error',
|
|
148
|
+
error: chunk.error,
|
|
149
|
+
},
|
|
150
|
+
}),
|
|
151
|
+
text: '',
|
|
152
|
+
generationInfo: {
|
|
153
|
+
finish_reason: 'error',
|
|
154
|
+
error: chunk.error,
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
else if (chunk.type === 'content') {
|
|
159
|
+
const lcMessage = (0, message_1.toLcMessage)({
|
|
160
|
+
role: 'assistant',
|
|
161
|
+
content: [chunk.content],
|
|
162
|
+
id: chunk.id,
|
|
163
|
+
});
|
|
164
|
+
const lcMessageChunk = new messages_1.AIMessageChunk({
|
|
165
|
+
content: lcMessage.content,
|
|
166
|
+
id: lcMessage.id,
|
|
167
|
+
name: lcMessage.name,
|
|
168
|
+
});
|
|
169
|
+
lcChunk = new outputs_1.ChatGenerationChunk({
|
|
170
|
+
message: lcMessageChunk,
|
|
171
|
+
text: lcMessage.text,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
if (lcChunk) {
|
|
175
|
+
yield lcChunk;
|
|
176
|
+
await runManager?.handleLLMNewToken(lcChunk.text ?? '', {
|
|
177
|
+
prompt: 0,
|
|
178
|
+
completion: 0,
|
|
179
|
+
}, undefined, undefined, undefined, { chunk: lcChunk });
|
|
169
180
|
}
|
|
170
181
|
}
|
|
171
182
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"langchain-chat-model.js","sourceRoot":"","sources":["../../src/adapters/langchain-chat-model.ts"],"names":[],"mappings":";;;AAGA,6EAA4E;AAE5E,uDAAqE;AAErE,qDAA8D;AAI9D,
|
|
1
|
+
{"version":3,"file":"langchain-chat-model.js","sourceRoot":"","sources":["../../src/adapters/langchain-chat-model.ts"],"names":[],"mappings":"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"}
|