@n8n/ai-utilities 0.2.1 → 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/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 +6 -5
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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"}
|