@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 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
- # Model SDK
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 === 'human' ? 'user' : m.role === 'ai' ? 'bot' : 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: 'human', content: [{ type: 'text', text: input }] },
314
- { role: 'ai', content: [{ type: 'text', text: output }] },
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' ? 'human' : m.speaker === 'bot' ? 'ai' : m.speaker,
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 === 'human' ? 'user' : message.role === 'ai' ? 'bot' : 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: ['AI'], subcategories: { AI: ['Memory'] } },
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 content = [];
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
- const tool_calls = result.toolCalls?.map((tc) => ({
69
- id: tc.id,
70
- name: tc.name,
71
- args: tc.arguments,
72
- type: 'tool_call',
73
- })) ?? [];
74
- const aiMessage = new messages_1.AIMessage({
75
- content,
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: result.text,
89
- message: aiMessage,
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
- if (chunk.type === 'text-delta' && chunk.textDelta) {
87
+ let lcChunk = undefined;
88
+ if (chunk.type === 'text-delta') {
103
89
  const content = [
104
90
  {
105
91
  type: 'text',
106
- text: chunk.textDelta,
92
+ text: chunk.delta,
107
93
  },
108
94
  ];
109
- const chunkResult = new outputs_1.ChatGenerationChunk({
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.textDelta,
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' && chunk.toolCallDelta) {
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.toolCallDelta.id,
133
- name: chunk.toolCallDelta.name,
134
- args: chunk.toolCallDelta.argumentsDelta,
106
+ id: chunk.id,
107
+ name: chunk.name,
108
+ args: chunk.argumentsDelta,
135
109
  index: 0,
136
110
  },
137
111
  ];
138
- const chunkResult = new outputs_1.ChatGenerationChunk({
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
- const chunkResult = new outputs_1.ChatGenerationChunk({
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
- yield chunkResult;
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":"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"}
1
+ {"version":3,"file":"langchain-chat-model.js","sourceRoot":"","sources":["../../src/adapters/langchain-chat-model.ts"],"names":[],"mappings":"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"}