@n8n/ai-utilities 0.2.1 → 0.3.1

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 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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"}