@n8n/ai-utilities 0.2.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.
Files changed (105) hide show
  1. package/LICENSE.md +88 -0
  2. package/README.md +468 -0
  3. package/dist/adapters/langchain-chat-model.d.ts +20 -0
  4. package/dist/adapters/langchain-chat-model.js +180 -0
  5. package/dist/adapters/langchain-chat-model.js.map +1 -0
  6. package/dist/adapters/langchain-history.d.ts +12 -0
  7. package/dist/adapters/langchain-history.js +27 -0
  8. package/dist/adapters/langchain-history.js.map +1 -0
  9. package/dist/adapters/langchain-memory.d.ts +11 -0
  10. package/dist/adapters/langchain-memory.js +36 -0
  11. package/dist/adapters/langchain-memory.js.map +1 -0
  12. package/dist/build.tsbuildinfo +1 -0
  13. package/dist/chat-model/base.d.ts +15 -0
  14. package/dist/chat-model/base.js +25 -0
  15. package/dist/chat-model/base.js.map +1 -0
  16. package/dist/converters/message.d.ts +5 -0
  17. package/dist/converters/message.js +365 -0
  18. package/dist/converters/message.js.map +1 -0
  19. package/dist/converters/tool.d.ts +5 -0
  20. package/dist/converters/tool.js +59 -0
  21. package/dist/converters/tool.js.map +1 -0
  22. package/dist/guards.d.ts +8 -0
  23. package/dist/guards.js +27 -0
  24. package/dist/guards.js.map +1 -0
  25. package/dist/index.d.ts +28 -0
  26. package/dist/index.js +56 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/memory/base-chat-history.d.ts +8 -0
  29. package/dist/memory/base-chat-history.js +12 -0
  30. package/dist/memory/base-chat-history.js.map +1 -0
  31. package/dist/memory/base-chat-memory.d.ts +8 -0
  32. package/dist/memory/base-chat-memory.js +7 -0
  33. package/dist/memory/base-chat-memory.js.map +1 -0
  34. package/dist/memory/windowed-chat-memory.d.ts +14 -0
  35. package/dist/memory/windowed-chat-memory.js +38 -0
  36. package/dist/memory/windowed-chat-memory.js.map +1 -0
  37. package/dist/suppliers/supplyMemory.d.ts +6 -0
  38. package/dist/suppliers/supplyMemory.js +14 -0
  39. package/dist/suppliers/supplyMemory.js.map +1 -0
  40. package/dist/suppliers/supplyModel.d.ts +15 -0
  41. package/dist/suppliers/supplyModel.js +78 -0
  42. package/dist/suppliers/supplyModel.js.map +1 -0
  43. package/dist/types/chat-model.d.ts +26 -0
  44. package/dist/types/chat-model.js +3 -0
  45. package/dist/types/chat-model.js.map +1 -0
  46. package/dist/types/json.d.ts +5 -0
  47. package/dist/types/json.js +3 -0
  48. package/dist/types/json.js.map +1 -0
  49. package/dist/types/memory.d.ts +13 -0
  50. package/dist/types/memory.js +3 -0
  51. package/dist/types/memory.js.map +1 -0
  52. package/dist/types/message.d.ts +49 -0
  53. package/dist/types/message.js +3 -0
  54. package/dist/types/message.js.map +1 -0
  55. package/dist/types/openai.d.ts +39 -0
  56. package/dist/types/openai.js +3 -0
  57. package/dist/types/openai.js.map +1 -0
  58. package/dist/types/output.d.ts +37 -0
  59. package/dist/types/output.js +3 -0
  60. package/dist/types/output.js.map +1 -0
  61. package/dist/types/tool.d.ts +28 -0
  62. package/dist/types/tool.js +3 -0
  63. package/dist/types/tool.js.map +1 -0
  64. package/dist/utils/embeddings-input-validation.d.ts +3 -0
  65. package/dist/utils/embeddings-input-validation.js +28 -0
  66. package/dist/utils/embeddings-input-validation.js.map +1 -0
  67. package/dist/utils/failed-attempt-handler/n8nDefaultFailedAttemptHandler.d.ts +1 -0
  68. package/dist/utils/failed-attempt-handler/n8nDefaultFailedAttemptHandler.js +30 -0
  69. package/dist/utils/failed-attempt-handler/n8nDefaultFailedAttemptHandler.js.map +1 -0
  70. package/dist/utils/failed-attempt-handler/n8nLlmFailedAttemptHandler.d.ts +3 -0
  71. package/dist/utils/failed-attempt-handler/n8nLlmFailedAttemptHandler.js +28 -0
  72. package/dist/utils/failed-attempt-handler/n8nLlmFailedAttemptHandler.js.map +1 -0
  73. package/dist/utils/helpers.d.ts +3 -0
  74. package/dist/utils/helpers.js +53 -0
  75. package/dist/utils/helpers.js.map +1 -0
  76. package/dist/utils/http-proxy-agent.d.ts +10 -0
  77. package/dist/utils/http-proxy-agent.js +48 -0
  78. package/dist/utils/http-proxy-agent.js.map +1 -0
  79. package/dist/utils/log-ai-event.d.ts +2 -0
  80. package/dist/utils/log-ai-event.js +13 -0
  81. package/dist/utils/log-ai-event.js.map +1 -0
  82. package/dist/utils/log-wrapper.d.ts +28 -0
  83. package/dist/utils/log-wrapper.js +329 -0
  84. package/dist/utils/log-wrapper.js.map +1 -0
  85. package/dist/utils/n8n-binary-loader.d.ts +18 -0
  86. package/dist/utils/n8n-binary-loader.js +159 -0
  87. package/dist/utils/n8n-binary-loader.js.map +1 -0
  88. package/dist/utils/n8n-json-loader.d.ts +11 -0
  89. package/dist/utils/n8n-json-loader.js +66 -0
  90. package/dist/utils/n8n-json-loader.js.map +1 -0
  91. package/dist/utils/n8n-llm-tracing.d.ts +46 -0
  92. package/dist/utils/n8n-llm-tracing.js +157 -0
  93. package/dist/utils/n8n-llm-tracing.js.map +1 -0
  94. package/dist/utils/sse.d.ts +8 -0
  95. package/dist/utils/sse.js +107 -0
  96. package/dist/utils/sse.js.map +1 -0
  97. package/dist/utils/tokenizer/cl100k_base.json +1 -0
  98. package/dist/utils/tokenizer/o200k_base.json +1 -0
  99. package/dist/utils/tokenizer/tiktoken.d.ts +4 -0
  100. package/dist/utils/tokenizer/tiktoken.js +40 -0
  101. package/dist/utils/tokenizer/tiktoken.js.map +1 -0
  102. package/dist/utils/tokenizer/token-estimator.d.ts +4 -0
  103. package/dist/utils/tokenizer/token-estimator.js +98 -0
  104. package/dist/utils/tokenizer/token-estimator.js.map +1 -0
  105. package/package.json +51 -0
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.N8nBinaryLoader = void 0;
4
+ const json_1 = require("@langchain/classic/document_loaders/fs/json");
5
+ const text_1 = require("@langchain/classic/document_loaders/fs/text");
6
+ const csv_1 = require("@langchain/community/document_loaders/fs/csv");
7
+ const docx_1 = require("@langchain/community/document_loaders/fs/docx");
8
+ const epub_1 = require("@langchain/community/document_loaders/fs/epub");
9
+ const pdf_1 = require("@langchain/community/document_loaders/fs/pdf");
10
+ const fs_1 = require("fs");
11
+ const n8n_workflow_1 = require("n8n-workflow");
12
+ const promises_1 = require("stream/promises");
13
+ const tmp_promise_1 = require("tmp-promise");
14
+ const helpers_1 = require("./helpers");
15
+ const SUPPORTED_MIME_TYPES = {
16
+ auto: ['*/*'],
17
+ pdfLoader: ['application/pdf'],
18
+ csvLoader: ['text/csv'],
19
+ epubLoader: ['application/epub+zip'],
20
+ docxLoader: ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'],
21
+ textLoader: ['text/plain', 'text/mdx', 'text/md', 'text/markdown'],
22
+ jsonLoader: ['application/json'],
23
+ };
24
+ class N8nBinaryLoader {
25
+ constructor(context, optionsPrefix = '', binaryDataKey = '', textSplitter) {
26
+ this.context = context;
27
+ this.optionsPrefix = optionsPrefix;
28
+ this.binaryDataKey = binaryDataKey;
29
+ this.textSplitter = textSplitter;
30
+ }
31
+ async processAll(items) {
32
+ const docs = [];
33
+ if (!items)
34
+ return [];
35
+ for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {
36
+ const processedDocuments = await this.processItem(items[itemIndex], itemIndex);
37
+ docs.push(...processedDocuments);
38
+ }
39
+ return docs;
40
+ }
41
+ async validateMimeType(mimeType, selectedLoader) {
42
+ if (selectedLoader !== 'auto' && !SUPPORTED_MIME_TYPES[selectedLoader].includes(mimeType)) {
43
+ const neededLoader = Object.keys(SUPPORTED_MIME_TYPES).find((loader) => SUPPORTED_MIME_TYPES[loader].includes(mimeType));
44
+ throw new n8n_workflow_1.NodeOperationError(this.context.getNode(), `Mime type doesn't match selected loader. Please select under "Loader Type": ${neededLoader}`);
45
+ }
46
+ if (!Object.values(SUPPORTED_MIME_TYPES).flat().includes(mimeType)) {
47
+ throw new n8n_workflow_1.NodeOperationError(this.context.getNode(), `Unsupported mime type: ${mimeType}`);
48
+ }
49
+ if (!SUPPORTED_MIME_TYPES[selectedLoader].includes(mimeType) &&
50
+ selectedLoader !== 'textLoader' &&
51
+ selectedLoader !== 'auto') {
52
+ throw new n8n_workflow_1.NodeOperationError(this.context.getNode(), `Unsupported mime type: ${mimeType} for selected loader: ${selectedLoader}`);
53
+ }
54
+ }
55
+ async getFilePathOrBlob(binaryData, mimeType) {
56
+ if (binaryData.id) {
57
+ const binaryBuffer = await this.context.helpers.binaryToBuffer(await this.context.helpers.getBinaryStream(binaryData.id));
58
+ return new Blob([binaryBuffer], {
59
+ type: mimeType,
60
+ });
61
+ }
62
+ else {
63
+ return new Blob([Buffer.from(binaryData.data, n8n_workflow_1.BINARY_ENCODING)], {
64
+ type: mimeType,
65
+ });
66
+ }
67
+ }
68
+ async getLoader(mimeType, filePathOrBlob, itemIndex) {
69
+ switch (mimeType) {
70
+ case 'application/pdf':
71
+ const splitPages = this.context.getNodeParameter(`${this.optionsPrefix}splitPages`, itemIndex, false);
72
+ return new pdf_1.PDFLoader(filePathOrBlob, { splitPages });
73
+ case 'text/csv':
74
+ const column = this.context.getNodeParameter(`${this.optionsPrefix}column`, itemIndex, null);
75
+ const separator = this.context.getNodeParameter(`${this.optionsPrefix}separator`, itemIndex, ',');
76
+ return new csv_1.CSVLoader(filePathOrBlob, { column: column ?? undefined, separator });
77
+ case 'application/epub+zip':
78
+ let filePath;
79
+ if (filePathOrBlob instanceof Blob) {
80
+ const tmpFileData = await (0, tmp_promise_1.file)({ prefix: 'epub-loader-' });
81
+ const bufferData = await filePathOrBlob.arrayBuffer();
82
+ await (0, promises_1.pipeline)([new Uint8Array(bufferData)], (0, fs_1.createWriteStream)(tmpFileData.path));
83
+ return new epub_1.EPubLoader(tmpFileData.path);
84
+ }
85
+ else {
86
+ filePath = filePathOrBlob;
87
+ }
88
+ return new epub_1.EPubLoader(filePath);
89
+ case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':
90
+ return new docx_1.DocxLoader(filePathOrBlob);
91
+ case 'text/plain':
92
+ return new text_1.TextLoader(filePathOrBlob);
93
+ case 'application/json':
94
+ const pointers = this.context.getNodeParameter(`${this.optionsPrefix}pointers`, itemIndex, '');
95
+ const pointersArray = pointers.split(',').map((pointer) => pointer.trim());
96
+ return new json_1.JSONLoader(filePathOrBlob, pointersArray);
97
+ default:
98
+ return new text_1.TextLoader(filePathOrBlob);
99
+ }
100
+ }
101
+ async loadDocuments(loader) {
102
+ return this.textSplitter
103
+ ? await this.textSplitter.splitDocuments(await loader.load())
104
+ : await loader.load();
105
+ }
106
+ async cleanupTmpFileIfNeeded(cleanupTmpFile) {
107
+ if (cleanupTmpFile) {
108
+ await cleanupTmpFile();
109
+ }
110
+ }
111
+ async processItem(item, itemIndex) {
112
+ const docs = [];
113
+ const binaryMode = this.context.getNodeParameter('binaryMode', itemIndex, 'allInputData');
114
+ if (binaryMode === 'allInputData') {
115
+ const binaryData = this.context.getInputData();
116
+ for (const data of binaryData) {
117
+ if (data.binary) {
118
+ const binaryDataKeys = Object.keys(data.binary);
119
+ for (const fileKey of binaryDataKeys) {
120
+ const processedDocuments = await this.processItemByKey(item, itemIndex, fileKey);
121
+ docs.push(...processedDocuments);
122
+ }
123
+ }
124
+ }
125
+ }
126
+ else {
127
+ const processedDocuments = await this.processItemByKey(item, itemIndex, this.binaryDataKey);
128
+ docs.push(...processedDocuments);
129
+ }
130
+ return docs;
131
+ }
132
+ async processItemByKey(item, itemIndex, binaryKey) {
133
+ const selectedLoader = this.context.getNodeParameter('loader', itemIndex, 'auto');
134
+ const docs = [];
135
+ const metadata = (0, helpers_1.getMetadataFiltersValues)(this.context, itemIndex);
136
+ if (!item)
137
+ return [];
138
+ const binaryData = this.context.helpers.assertBinaryData(itemIndex, binaryKey);
139
+ const { mimeType } = binaryData;
140
+ await this.validateMimeType(mimeType, selectedLoader);
141
+ const filePathOrBlob = await this.getFilePathOrBlob(binaryData, mimeType);
142
+ const cleanupTmpFile = undefined;
143
+ const loader = await this.getLoader(mimeType, filePathOrBlob, itemIndex);
144
+ const loadedDoc = await this.loadDocuments(loader);
145
+ docs.push(...loadedDoc);
146
+ if (metadata) {
147
+ docs.forEach((document) => {
148
+ document.metadata = {
149
+ ...document.metadata,
150
+ ...metadata,
151
+ };
152
+ });
153
+ }
154
+ await this.cleanupTmpFileIfNeeded(cleanupTmpFile);
155
+ return docs;
156
+ }
157
+ }
158
+ exports.N8nBinaryLoader = N8nBinaryLoader;
159
+ //# sourceMappingURL=n8n-binary-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"n8n-binary-loader.js","sourceRoot":"","sources":["../../src/utils/n8n-binary-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Document } from '@langchain/core/documents';
2
+ import type { TextSplitter } from '@langchain/textsplitters';
3
+ import { type IExecuteFunctions, type INodeExecutionData, type ISupplyDataFunctions } from 'n8n-workflow';
4
+ export declare class N8nJsonLoader {
5
+ private context;
6
+ private optionsPrefix;
7
+ private textSplitter?;
8
+ constructor(context: IExecuteFunctions | ISupplyDataFunctions, optionsPrefix?: string, textSplitter?: TextSplitter | undefined);
9
+ processAll(items?: INodeExecutionData[]): Promise<Document[]>;
10
+ processItem(item: INodeExecutionData, itemIndex: number): Promise<Document[]>;
11
+ }
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.N8nJsonLoader = void 0;
4
+ const json_1 = require("@langchain/classic/document_loaders/fs/json");
5
+ const text_1 = require("@langchain/classic/document_loaders/fs/text");
6
+ const n8n_workflow_1 = require("n8n-workflow");
7
+ const helpers_1 = require("./helpers");
8
+ class N8nJsonLoader {
9
+ constructor(context, optionsPrefix = '', textSplitter) {
10
+ this.context = context;
11
+ this.optionsPrefix = optionsPrefix;
12
+ this.textSplitter = textSplitter;
13
+ }
14
+ async processAll(items) {
15
+ const docs = [];
16
+ if (!items)
17
+ return [];
18
+ for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {
19
+ const processedDocuments = await this.processItem(items[itemIndex], itemIndex);
20
+ docs.push(...processedDocuments);
21
+ }
22
+ return docs;
23
+ }
24
+ async processItem(item, itemIndex) {
25
+ const mode = this.context.getNodeParameter('jsonMode', itemIndex, 'allInputData');
26
+ const pointers = this.context.getNodeParameter(`${this.optionsPrefix}pointers`, itemIndex, '');
27
+ const pointersArray = pointers.split(',').map((pointer) => pointer.trim());
28
+ const metadata = (0, helpers_1.getMetadataFiltersValues)(this.context, itemIndex) ?? [];
29
+ if (!item)
30
+ return [];
31
+ let documentLoader = null;
32
+ if (mode === 'allInputData') {
33
+ const itemString = JSON.stringify(item.json);
34
+ const itemBlob = new Blob([itemString], { type: 'application/json' });
35
+ documentLoader = new json_1.JSONLoader(itemBlob, pointersArray);
36
+ }
37
+ if (mode === 'expressionData') {
38
+ const dataString = this.context.getNodeParameter('jsonData', itemIndex);
39
+ if (typeof dataString === 'object') {
40
+ const itemBlob = new Blob([JSON.stringify(dataString)], { type: 'application/json' });
41
+ documentLoader = new json_1.JSONLoader(itemBlob, pointersArray);
42
+ }
43
+ if (typeof dataString === 'string') {
44
+ const itemBlob = new Blob([dataString], { type: 'text/plain' });
45
+ documentLoader = new text_1.TextLoader(itemBlob);
46
+ }
47
+ }
48
+ if (documentLoader === null) {
49
+ throw new n8n_workflow_1.NodeOperationError(this.context.getNode(), 'Document loader is not initialized');
50
+ }
51
+ const docs = this.textSplitter
52
+ ? await this.textSplitter.splitDocuments(await documentLoader.load())
53
+ : await documentLoader.load();
54
+ if (metadata) {
55
+ docs.forEach((doc) => {
56
+ doc.metadata = {
57
+ ...doc.metadata,
58
+ ...metadata,
59
+ };
60
+ });
61
+ }
62
+ return docs;
63
+ }
64
+ }
65
+ exports.N8nJsonLoader = N8nJsonLoader;
66
+ //# sourceMappingURL=n8n-json-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"n8n-json-loader.js","sourceRoot":"","sources":["../../src/utils/n8n-json-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { BaseCallbackHandler } from '@langchain/core/callbacks/base';
2
+ import type { SerializedFields } from '@langchain/core/dist/load/map_keys';
3
+ import type { Serialized, SerializedNotImplemented, SerializedSecret } from '@langchain/core/load/serializable';
4
+ import type { BaseMessage } from '@langchain/core/messages';
5
+ import type { LLMResult } from '@langchain/core/outputs';
6
+ import type { IDataObject, ISupplyDataFunctions } from 'n8n-workflow';
7
+ import { NodeError } from 'n8n-workflow';
8
+ type TokensUsageParser = (result: LLMResult) => {
9
+ completionTokens: number;
10
+ promptTokens: number;
11
+ totalTokens: number;
12
+ };
13
+ type RunDetail = {
14
+ index: number;
15
+ messages: BaseMessage[] | string[] | string;
16
+ options: SerializedSecret | SerializedNotImplemented | SerializedFields;
17
+ };
18
+ export declare class N8nLlmTracing extends BaseCallbackHandler {
19
+ #private;
20
+ private executionFunctions;
21
+ name: string;
22
+ awaitHandlers: boolean;
23
+ connectionType: "ai_languageModel";
24
+ promptTokensEstimate: number;
25
+ completionTokensEstimate: number;
26
+ runsMap: Record<string, RunDetail>;
27
+ options: {
28
+ tokensUsageParser: (result: LLMResult) => {
29
+ completionTokens: number;
30
+ promptTokens: number;
31
+ totalTokens: number;
32
+ };
33
+ errorDescriptionMapper: (error: NodeError) => string | null | undefined;
34
+ };
35
+ constructor(executionFunctions: ISupplyDataFunctions, options?: {
36
+ tokensUsageParser?: TokensUsageParser;
37
+ errorDescriptionMapper?: (error: NodeError) => string;
38
+ });
39
+ estimateTokensFromGeneration(generations: LLMResult['generations']): Promise<number>;
40
+ estimateTokensFromStringList(list: string[]): Promise<number>;
41
+ handleLLMEnd(output: LLMResult, runId: string): Promise<void>;
42
+ handleLLMStart(llm: Serialized, prompts: string[], runId: string): Promise<void>;
43
+ handleLLMError(error: IDataObject | Error, runId: string, parentRunId?: string): Promise<void>;
44
+ setParentRunIndex(runIndex: number): void;
45
+ }
46
+ export {};
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
+ };
7
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
8
+ if (kind === "m") throw new TypeError("Private method is not writable");
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
11
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ var _N8nLlmTracing_parentRunIndex;
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.N8nLlmTracing = void 0;
19
+ const base_1 = require("@langchain/core/callbacks/base");
20
+ const base_2 = require("@langchain/core/language_models/base");
21
+ const pick_1 = __importDefault(require("lodash/pick"));
22
+ const n8n_workflow_1 = require("n8n-workflow");
23
+ const log_ai_event_1 = require("./log-ai-event");
24
+ const token_estimator_1 = require("./tokenizer/token-estimator");
25
+ const TIKTOKEN_ESTIMATE_MODEL = 'gpt-4o';
26
+ class N8nLlmTracing extends base_1.BaseCallbackHandler {
27
+ constructor(executionFunctions, options) {
28
+ super();
29
+ this.executionFunctions = executionFunctions;
30
+ this.name = 'N8nLlmTracing';
31
+ this.awaitHandlers = true;
32
+ this.connectionType = n8n_workflow_1.NodeConnectionTypes.AiLanguageModel;
33
+ this.promptTokensEstimate = 0;
34
+ this.completionTokensEstimate = 0;
35
+ _N8nLlmTracing_parentRunIndex.set(this, void 0);
36
+ this.runsMap = {};
37
+ this.options = {
38
+ tokensUsageParser: (result) => {
39
+ const completionTokens = result?.llmOutput?.tokenUsage?.completionTokens ?? 0;
40
+ const promptTokens = result?.llmOutput?.tokenUsage?.promptTokens ?? 0;
41
+ return {
42
+ completionTokens,
43
+ promptTokens,
44
+ totalTokens: completionTokens + promptTokens,
45
+ };
46
+ },
47
+ errorDescriptionMapper: (error) => error.description,
48
+ };
49
+ this.options = { ...this.options, ...options };
50
+ }
51
+ async estimateTokensFromGeneration(generations) {
52
+ const messages = generations.flatMap((gen) => gen.map((g) => g.text));
53
+ return await this.estimateTokensFromStringList(messages);
54
+ }
55
+ async estimateTokensFromStringList(list) {
56
+ const embeddingModel = (0, base_2.getModelNameForTiktoken)(TIKTOKEN_ESTIMATE_MODEL);
57
+ return await (0, token_estimator_1.estimateTokensFromStringList)(list, embeddingModel);
58
+ }
59
+ async handleLLMEnd(output, runId) {
60
+ const runDetails = this.runsMap[runId] ?? { index: Object.keys(this.runsMap).length };
61
+ output.generations = output.generations.map((gen) => gen.map((g) => (0, pick_1.default)(g, ['text', 'generationInfo'])));
62
+ const tokenUsageEstimate = {
63
+ completionTokens: 0,
64
+ promptTokens: 0,
65
+ totalTokens: 0,
66
+ };
67
+ const tokenUsage = this.options.tokensUsageParser(output);
68
+ if (output.generations.length > 0) {
69
+ tokenUsageEstimate.completionTokens = await this.estimateTokensFromGeneration(output.generations);
70
+ tokenUsageEstimate.promptTokens = this.promptTokensEstimate;
71
+ tokenUsageEstimate.totalTokens =
72
+ tokenUsageEstimate.completionTokens + this.promptTokensEstimate;
73
+ }
74
+ const response = {
75
+ response: { generations: output.generations },
76
+ };
77
+ if (tokenUsage.completionTokens > 0) {
78
+ response.tokenUsage = tokenUsage;
79
+ }
80
+ else {
81
+ response.tokenUsageEstimate = tokenUsageEstimate;
82
+ }
83
+ const parsedMessages = typeof runDetails.messages === 'string'
84
+ ? runDetails.messages
85
+ : runDetails.messages.map((message) => {
86
+ if (typeof message === 'string')
87
+ return message;
88
+ if (typeof message?.toJSON === 'function')
89
+ return message.toJSON();
90
+ return message;
91
+ });
92
+ const sourceNodeRunIndex = __classPrivateFieldGet(this, _N8nLlmTracing_parentRunIndex, "f") !== undefined ? __classPrivateFieldGet(this, _N8nLlmTracing_parentRunIndex, "f") + runDetails.index : undefined;
93
+ this.executionFunctions.addOutputData(this.connectionType, runDetails.index, [[{ json: { ...response } }]], undefined, sourceNodeRunIndex);
94
+ (0, log_ai_event_1.logAiEvent)(this.executionFunctions, 'ai-llm-generated-output', {
95
+ messages: parsedMessages,
96
+ options: runDetails.options,
97
+ response,
98
+ });
99
+ }
100
+ async handleLLMStart(llm, prompts, runId) {
101
+ const estimatedTokens = await this.estimateTokensFromStringList(prompts);
102
+ const sourceNodeRunIndex = __classPrivateFieldGet(this, _N8nLlmTracing_parentRunIndex, "f") !== undefined
103
+ ? __classPrivateFieldGet(this, _N8nLlmTracing_parentRunIndex, "f") + this.executionFunctions.getNextRunIndex()
104
+ : undefined;
105
+ const options = llm.type === 'constructor' ? llm.kwargs : llm;
106
+ const { index } = this.executionFunctions.addInputData(this.connectionType, [
107
+ [
108
+ {
109
+ json: {
110
+ messages: prompts,
111
+ estimatedTokens,
112
+ options,
113
+ },
114
+ },
115
+ ],
116
+ ], sourceNodeRunIndex);
117
+ this.runsMap[runId] = {
118
+ index,
119
+ options,
120
+ messages: prompts,
121
+ };
122
+ this.promptTokensEstimate = estimatedTokens;
123
+ }
124
+ async handleLLMError(error, runId, parentRunId) {
125
+ const runDetails = this.runsMap[runId] ?? { index: Object.keys(this.runsMap).length };
126
+ if (typeof error === 'object' && error?.hasOwnProperty('headers')) {
127
+ const errorWithHeaders = error;
128
+ Object.keys(errorWithHeaders.headers).forEach((key) => {
129
+ if (!key.startsWith('x-')) {
130
+ delete errorWithHeaders.headers[key];
131
+ }
132
+ });
133
+ }
134
+ if (error instanceof n8n_workflow_1.NodeError) {
135
+ if (this.options.errorDescriptionMapper) {
136
+ error.description = this.options.errorDescriptionMapper(error);
137
+ }
138
+ this.executionFunctions.addOutputData(this.connectionType, runDetails.index, error);
139
+ }
140
+ else {
141
+ this.executionFunctions.addOutputData(this.connectionType, runDetails.index, new n8n_workflow_1.NodeOperationError(this.executionFunctions.getNode(), error, {
142
+ functionality: 'configuration-node',
143
+ }));
144
+ }
145
+ (0, log_ai_event_1.logAiEvent)(this.executionFunctions, 'ai-llm-errored', {
146
+ error: Object.keys(error).length === 0 ? error.toString() : error,
147
+ runId,
148
+ parentRunId,
149
+ });
150
+ }
151
+ setParentRunIndex(runIndex) {
152
+ __classPrivateFieldSet(this, _N8nLlmTracing_parentRunIndex, runIndex, "f");
153
+ }
154
+ }
155
+ exports.N8nLlmTracing = N8nLlmTracing;
156
+ _N8nLlmTracing_parentRunIndex = new WeakMap();
157
+ //# sourceMappingURL=n8n-llm-tracing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"n8n-llm-tracing.js","sourceRoot":"","sources":["../../src/utils/n8n-llm-tracing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface ServerSentEventMessage {
2
+ comment?: string;
3
+ event?: string;
4
+ data?: string;
5
+ id?: string | number;
6
+ retry?: number;
7
+ }
8
+ export declare function parseSSEStream(body: ReadableStream<Uint8Array>): AsyncIterable<ServerSentEventMessage>;
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseSSEStream = parseSSEStream;
4
+ async function* parseSSEStream(body) {
5
+ const reader = body.getReader();
6
+ const decoder = new TextDecoder();
7
+ let buffer = '';
8
+ let currentEvent = {};
9
+ let dataLines = [];
10
+ try {
11
+ while (true) {
12
+ const { done, value } = await reader.read();
13
+ if (done) {
14
+ buffer += decoder.decode();
15
+ if (buffer !== '') {
16
+ const event = processLine(buffer);
17
+ if (event) {
18
+ yield event;
19
+ }
20
+ }
21
+ if (hasEventContent()) {
22
+ yield finalizeEvent();
23
+ }
24
+ break;
25
+ }
26
+ buffer += decoder.decode(value, { stream: true });
27
+ const lines = buffer.split(/\r\n|\r|\n/);
28
+ buffer = lines.pop() ?? '';
29
+ for (const line of lines) {
30
+ const event = processLine(line);
31
+ if (event) {
32
+ yield event;
33
+ }
34
+ }
35
+ }
36
+ }
37
+ finally {
38
+ reader.releaseLock();
39
+ }
40
+ function processLine(line) {
41
+ if (line === '') {
42
+ if (hasEventContent()) {
43
+ const event = finalizeEvent();
44
+ currentEvent = {};
45
+ dataLines = [];
46
+ return event;
47
+ }
48
+ return null;
49
+ }
50
+ if (line.startsWith(':')) {
51
+ currentEvent.comment = line.slice(1).trimStart();
52
+ return null;
53
+ }
54
+ const colonIndex = line.indexOf(':');
55
+ if (colonIndex === -1) {
56
+ processField(line, '');
57
+ return null;
58
+ }
59
+ const fieldName = line.slice(0, colonIndex);
60
+ let fieldValue = line.slice(colonIndex + 1);
61
+ if (fieldValue.startsWith(' ')) {
62
+ fieldValue = fieldValue.slice(1);
63
+ }
64
+ processField(fieldName, fieldValue);
65
+ return null;
66
+ }
67
+ function processField(name, value) {
68
+ switch (name) {
69
+ case 'event': {
70
+ currentEvent.event = value;
71
+ break;
72
+ }
73
+ case 'data': {
74
+ dataLines.push(value);
75
+ break;
76
+ }
77
+ case 'id': {
78
+ if (value) {
79
+ const numId = Number(value);
80
+ currentEvent.id = Number.isNaN(numId) ? value : numId;
81
+ }
82
+ break;
83
+ }
84
+ case 'retry': {
85
+ const retryValue = Number.parseInt(value, 10);
86
+ if (!Number.isNaN(retryValue) && retryValue >= 0) {
87
+ currentEvent.retry = retryValue;
88
+ }
89
+ break;
90
+ }
91
+ default: {
92
+ break;
93
+ }
94
+ }
95
+ }
96
+ function hasEventContent() {
97
+ return !!(currentEvent.event || dataLines.length > 0 || currentEvent.id || currentEvent.retry);
98
+ }
99
+ function finalizeEvent() {
100
+ const finalData = dataLines.join('\n');
101
+ return {
102
+ ...currentEvent,
103
+ data: finalData ? finalData : undefined,
104
+ };
105
+ }
106
+ }
107
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/utils/sse.ts"],"names":[],"mappings":"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"}