@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,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseChatHistory = void 0;
4
+ class BaseChatHistory {
5
+ async addMessages(messages) {
6
+ for (const msg of messages) {
7
+ await this.addMessage(msg);
8
+ }
9
+ }
10
+ }
11
+ exports.BaseChatHistory = BaseChatHistory;
12
+ //# sourceMappingURL=base-chat-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-chat-history.js","sourceRoot":"","sources":["../../src/memory/base-chat-history.ts"],"names":[],"mappings":";;;AAGA,MAAsB,eAAe;IAKpC,KAAK,CAAC,WAAW,CAAC,QAAmB;QACpC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACF,CAAC;CAGD;AAZD,0CAYC"}
@@ -0,0 +1,8 @@
1
+ import type { ChatHistory, ChatMemory } from '../types/memory';
2
+ import type { Message } from '../types/message';
3
+ export declare abstract class BaseChatMemory implements ChatMemory {
4
+ abstract readonly chatHistory: ChatHistory;
5
+ abstract loadMessages(): Promise<Message[]>;
6
+ abstract saveTurn(input: string, output: string): Promise<void>;
7
+ abstract clear(): Promise<void>;
8
+ }
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseChatMemory = void 0;
4
+ class BaseChatMemory {
5
+ }
6
+ exports.BaseChatMemory = BaseChatMemory;
7
+ //# sourceMappingURL=base-chat-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-chat-memory.js","sourceRoot":"","sources":["../../src/memory/base-chat-memory.ts"],"names":[],"mappings":";;;AAGA,MAAsB,cAAc;CAQnC;AARD,wCAQC"}
@@ -0,0 +1,14 @@
1
+ import { BaseChatMemory } from './base-chat-memory';
2
+ import type { ChatHistory } from '../types/memory';
3
+ import type { Message } from '../types/message';
4
+ export interface WindowedChatMemoryConfig {
5
+ windowSize?: number;
6
+ }
7
+ export declare class WindowedChatMemory extends BaseChatMemory {
8
+ readonly chatHistory: ChatHistory;
9
+ private readonly windowSize;
10
+ constructor(chatHistory: ChatHistory, config?: WindowedChatMemoryConfig);
11
+ loadMessages(): Promise<Message[]>;
12
+ saveTurn(input: string, output: string): Promise<void>;
13
+ clear(): Promise<void>;
14
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WindowedChatMemory = void 0;
4
+ const base_chat_memory_1 = require("./base-chat-memory");
5
+ class WindowedChatMemory extends base_chat_memory_1.BaseChatMemory {
6
+ constructor(chatHistory, config) {
7
+ super();
8
+ this.chatHistory = chatHistory;
9
+ this.windowSize = config?.windowSize ?? 10;
10
+ }
11
+ async loadMessages() {
12
+ const allMessages = await this.chatHistory.getMessages();
13
+ if (allMessages.length === 0) {
14
+ return [];
15
+ }
16
+ const maxMessages = this.windowSize * 2;
17
+ if (allMessages.length <= maxMessages) {
18
+ return allMessages;
19
+ }
20
+ return allMessages.slice(-maxMessages);
21
+ }
22
+ async saveTurn(input, output) {
23
+ const humanMessage = {
24
+ role: 'human',
25
+ content: [{ type: 'text', text: input }],
26
+ };
27
+ const aiMessage = {
28
+ role: 'ai',
29
+ content: [{ type: 'text', text: output }],
30
+ };
31
+ await this.chatHistory.addMessages([humanMessage, aiMessage]);
32
+ }
33
+ async clear() {
34
+ await this.chatHistory.clear();
35
+ }
36
+ }
37
+ exports.WindowedChatMemory = WindowedChatMemory;
38
+ //# sourceMappingURL=windowed-chat-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windowed-chat-memory.js","sourceRoot":"","sources":["../../src/memory/windowed-chat-memory.ts"],"names":[],"mappings":";;;AAAA,yDAAoD;AASpD,MAAa,kBAAmB,SAAQ,iCAAc;IAIrD,YAAY,WAAwB,EAAE,MAAiC;QACtE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,MAAM,EAAE,UAAU,IAAI,EAAE,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,YAAY;QACjB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;QAEzD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,EAAE,CAAC;QACX,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QAExC,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;YACvC,OAAO,WAAW,CAAC;QACpB,CAAC;QAED,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAa,EAAE,MAAc;QAC3C,MAAM,YAAY,GAAY;YAC7B,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;SACxC,CAAC;QAEF,MAAM,SAAS,GAAY;YAC1B,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACzC,CAAC;QAEF,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,KAAK;QACV,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAChC,CAAC;CACD;AA3CD,gDA2CC"}
@@ -0,0 +1,6 @@
1
+ import type { ISupplyDataFunctions, SupplyData } from 'n8n-workflow';
2
+ import type { ChatMemory } from '../types/memory';
3
+ export interface SupplyMemoryOptions {
4
+ closeFunction?: () => Promise<void>;
5
+ }
6
+ export declare function supplyMemory(context: ISupplyDataFunctions, memory: ChatMemory, options?: SupplyMemoryOptions): SupplyData;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.supplyMemory = supplyMemory;
4
+ const langchain_memory_1 = require("../adapters/langchain-memory");
5
+ const log_wrapper_1 = require("../utils/log-wrapper");
6
+ function supplyMemory(context, memory, options) {
7
+ const adapter = new langchain_memory_1.LangchainMemoryAdapter(memory);
8
+ const wrappedAdapter = (0, log_wrapper_1.logWrapper)(adapter, context);
9
+ return {
10
+ response: wrappedAdapter,
11
+ closeFunction: options?.closeFunction,
12
+ };
13
+ }
14
+ //# sourceMappingURL=supplyMemory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supplyMemory.js","sourceRoot":"","sources":["../../src/suppliers/supplyMemory.ts"],"names":[],"mappings":";;AAUA,oCAYC;AApBD,mEAAsE;AAEtE,sDAAkD;AAMlD,SAAgB,YAAY,CAC3B,OAA6B,EAC7B,MAAkB,EAClB,OAA6B;IAE7B,MAAM,OAAO,GAAG,IAAI,yCAAsB,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,cAAc,GAAG,IAAA,wBAAU,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEpD,OAAO;QACN,QAAQ,EAAE,cAAc;QACxB,aAAa,EAAE,OAAO,EAAE,aAAa;KACrC,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { ChatOpenAI } from '@langchain/openai';
2
+ import type { ISupplyDataFunctions } from 'n8n-workflow';
3
+ import { LangchainAdapter } from '../adapters/langchain-chat-model';
4
+ import type { ChatModel } from '../types/chat-model';
5
+ import type { OpenAIModelOptions } from '../types/openai';
6
+ type OpenAiModel = OpenAIModelOptions & {
7
+ type: 'openai';
8
+ };
9
+ type ModelOptions = ChatModel | OpenAiModel;
10
+ export declare function supplyModel(ctx: ISupplyDataFunctions, model: ModelOptions): {
11
+ response: ChatOpenAI<import("@langchain/openai").ChatOpenAICallOptions>;
12
+ } | {
13
+ response: LangchainAdapter<import("../types/chat-model").ChatModelConfig>;
14
+ };
15
+ export {};
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.supplyModel = supplyModel;
4
+ const openai_1 = require("@langchain/openai");
5
+ const langchain_chat_model_1 = require("../adapters/langchain-chat-model");
6
+ const base_1 = require("../chat-model/base");
7
+ const n8nLlmFailedAttemptHandler_1 = require("../utils/failed-attempt-handler/n8nLlmFailedAttemptHandler");
8
+ const http_proxy_agent_1 = require("../utils/http-proxy-agent");
9
+ const n8n_llm_tracing_1 = require("../utils/n8n-llm-tracing");
10
+ function isOpenAiModel(model) {
11
+ return 'type' in model && model.type === 'openai' && !(model instanceof base_1.BaseChatModel);
12
+ }
13
+ function getOpenAiModel(ctx, model) {
14
+ const clientConfiguration = {
15
+ baseURL: model.baseUrl,
16
+ };
17
+ if (model.defaultHeaders) {
18
+ clientConfiguration.defaultHeaders = model.defaultHeaders;
19
+ }
20
+ const timeout = model.timeout;
21
+ clientConfiguration.fetchOptions = {
22
+ dispatcher: (0, http_proxy_agent_1.getProxyAgent)(model.baseUrl, {
23
+ headersTimeout: timeout,
24
+ bodyTimeout: timeout,
25
+ }),
26
+ };
27
+ const openAiModel = new openai_1.ChatOpenAI({
28
+ configuration: clientConfiguration,
29
+ model: model.model,
30
+ apiKey: model.apiKey,
31
+ useResponsesApi: model.useResponsesApi,
32
+ logprobs: model.logprobs,
33
+ topLogprobs: model.topLogprobs,
34
+ supportsStrictToolCalling: model.supportsStrictToolCalling,
35
+ reasoning: model.reasoning,
36
+ zdrEnabled: model.zdrEnabled,
37
+ service_tier: model.service_tier,
38
+ promptCacheKey: model.promptCacheKey,
39
+ temperature: model.temperature,
40
+ topP: model.topP,
41
+ frequencyPenalty: model.frequencyPenalty,
42
+ presencePenalty: model.presencePenalty,
43
+ stopSequences: model.stopSequences,
44
+ maxRetries: model.maxRetries,
45
+ modelKwargs: model.additionalParams,
46
+ verbosity: model.verbosity,
47
+ streaming: model.streaming,
48
+ streamUsage: model.streamUsage,
49
+ stop: model.stop,
50
+ maxTokens: model.maxTokens,
51
+ maxCompletionTokens: model.maxCompletionTokens,
52
+ callbacks: [new n8n_llm_tracing_1.N8nLlmTracing(ctx)],
53
+ onFailedAttempt: (0, n8nLlmFailedAttemptHandler_1.makeN8nLlmFailedAttemptHandler)(ctx, model.onFailedAttempt),
54
+ });
55
+ if (model.providerTools?.length) {
56
+ openAiModel.metadata = {
57
+ ...openAiModel.metadata,
58
+ tools: model.providerTools.map((tool) => ({
59
+ type: tool.name,
60
+ ...tool.args,
61
+ })),
62
+ };
63
+ }
64
+ return openAiModel;
65
+ }
66
+ function supplyModel(ctx, model) {
67
+ if (isOpenAiModel(model)) {
68
+ const openAiModel = getOpenAiModel(ctx, model);
69
+ return {
70
+ response: openAiModel,
71
+ };
72
+ }
73
+ const adapter = new langchain_chat_model_1.LangchainAdapter(model, ctx);
74
+ return {
75
+ response: adapter,
76
+ };
77
+ }
78
+ //# sourceMappingURL=supplyModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supplyModel.js","sourceRoot":"","sources":["../../src/suppliers/supplyModel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { Message } from './message';
2
+ import type { GenerateResult, StreamChunk } from './output';
3
+ import type { Tool } from './tool';
4
+ export interface ChatModelConfig {
5
+ maxTokens?: number;
6
+ temperature?: number;
7
+ topP?: number;
8
+ topK?: number;
9
+ presencePenalty?: number;
10
+ frequencyPenalty?: number;
11
+ stopSequences?: string[];
12
+ seed?: number;
13
+ maxRetries?: number;
14
+ timeout?: number;
15
+ abortSignal?: AbortSignal;
16
+ headers?: Record<string, string | undefined>;
17
+ }
18
+ export interface ChatModel<TConfig extends ChatModelConfig = ChatModelConfig> {
19
+ provider: string;
20
+ modelId: string;
21
+ defaultConfig?: TConfig;
22
+ generate(messages: Message[], config?: TConfig): Promise<GenerateResult>;
23
+ stream(messages: Message[], config?: TConfig): AsyncIterable<StreamChunk>;
24
+ withTools(tools: Tool[]): ChatModel<TConfig>;
25
+ withStructuredOutput?(schema: Record<string, unknown>): ChatModel<TConfig>;
26
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=chat-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-model.js","sourceRoot":"","sources":["../../src/types/chat-model.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export type JSONValue = null | string | number | boolean | JSONObject | JSONArray;
2
+ export type JSONObject = {
3
+ [key: string]: JSONValue | undefined;
4
+ };
5
+ export type JSONArray = JSONValue[];
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/types/json.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import type { Message } from './message';
2
+ export interface ChatHistory {
3
+ getMessages(): Promise<Message[]>;
4
+ addMessage(message: Message): Promise<void>;
5
+ addMessages(messages: Message[]): Promise<void>;
6
+ clear(): Promise<void>;
7
+ }
8
+ export interface ChatMemory {
9
+ loadMessages(): Promise<Message[]>;
10
+ saveTurn(input: string, output: string): Promise<void>;
11
+ clear(): Promise<void>;
12
+ readonly chatHistory: ChatHistory;
13
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/types/memory.ts"],"names":[],"mappings":""}
@@ -0,0 +1,49 @@
1
+ export type MessageRole = 'system' | 'human' | 'ai' | 'tool';
2
+ export type MessageContent = ContentText | ContentToolCall | ContentToolResult | ContentReasoning | ContentFile | ContentCitation | ContentProvider;
3
+ export interface ContentMetadata {
4
+ providerMetadata?: Record<string, unknown>;
5
+ }
6
+ export type ContentCitation = ContentMetadata & {
7
+ type: 'citation';
8
+ source?: string;
9
+ url?: string;
10
+ title?: string;
11
+ startIndex?: number;
12
+ endIndex?: number;
13
+ text?: string;
14
+ };
15
+ export type ContentText = ContentMetadata & {
16
+ type: 'text';
17
+ text: string;
18
+ };
19
+ export type ContentReasoning = ContentMetadata & {
20
+ type: 'reasoning';
21
+ text: string;
22
+ };
23
+ export type ContentFile = ContentMetadata & {
24
+ type: 'file';
25
+ mediaType?: string;
26
+ data: string | Uint8Array;
27
+ };
28
+ export type ContentToolCall = ContentMetadata & {
29
+ type: 'tool-call';
30
+ toolCallId?: string;
31
+ toolName: string;
32
+ input: string;
33
+ };
34
+ export type ContentToolResult = ContentMetadata & {
35
+ type: 'tool-result';
36
+ toolCallId: string;
37
+ result: any;
38
+ isError?: boolean;
39
+ };
40
+ export type ContentProvider = ContentMetadata & {
41
+ type: 'provider';
42
+ value: Record<string, unknown>;
43
+ };
44
+ export interface Message {
45
+ role: MessageRole;
46
+ content: MessageContent[];
47
+ name?: string;
48
+ id?: string;
49
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/types/message.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ import type { ProviderTool } from './tool';
2
+ export type ReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high' | null;
3
+ export type VerbosityParam = 'low' | 'medium' | 'high' | null;
4
+ export interface OpenAIModelOptions {
5
+ baseUrl: string;
6
+ model: string;
7
+ apiKey: string;
8
+ providerTools?: ProviderTool[];
9
+ defaultHeaders?: Record<string, string>;
10
+ useResponsesApi?: boolean;
11
+ logprobs?: boolean;
12
+ topLogprobs?: number;
13
+ supportsStrictToolCalling?: boolean;
14
+ reasoning?: {
15
+ effort?: ReasoningEffort | null;
16
+ summary?: 'auto' | 'concise' | 'detailed' | null;
17
+ };
18
+ zdrEnabled?: boolean;
19
+ service_tier?: 'auto' | 'default' | 'flex' | 'scale' | 'priority' | null;
20
+ promptCacheKey?: string;
21
+ temperature?: number;
22
+ maxTokens?: number;
23
+ maxCompletionTokens?: number;
24
+ topP?: number;
25
+ frequencyPenalty?: number;
26
+ presencePenalty?: number;
27
+ n?: number;
28
+ logitBias?: Record<string, number>;
29
+ user?: string;
30
+ streaming?: boolean;
31
+ streamUsage?: boolean;
32
+ additionalParams?: Record<string, unknown>;
33
+ stop?: string[];
34
+ stopSequences?: string[];
35
+ timeout?: number;
36
+ verbosity?: VerbosityParam;
37
+ maxRetries?: number;
38
+ onFailedAttempt?: (error: unknown) => void;
39
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/types/openai.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import type { Message } from './message';
2
+ import type { ToolCall } from './tool';
3
+ export type FinishReason = 'stop' | 'length' | 'content-filter' | 'tool-calls' | 'error' | 'other';
4
+ export type TokenUsage<T extends Record<string, unknown> = Record<string, unknown>> = {
5
+ promptTokens: number;
6
+ completionTokens: number;
7
+ totalTokens: number;
8
+ inputTokenDetails?: {
9
+ cacheRead?: number;
10
+ };
11
+ outputTokenDetails?: {
12
+ reasoning?: number;
13
+ };
14
+ additionalMetadata?: T;
15
+ };
16
+ export interface GenerateResult {
17
+ id?: string;
18
+ text: string;
19
+ finishReason?: FinishReason;
20
+ usage?: TokenUsage;
21
+ toolCalls?: ToolCall[];
22
+ message?: Message;
23
+ providerMetadata?: Record<string, unknown>;
24
+ rawResponse?: unknown;
25
+ }
26
+ export interface StreamChunk {
27
+ type: 'text-delta' | 'tool-call-delta' | 'finish' | 'error';
28
+ textDelta?: string;
29
+ toolCallDelta?: {
30
+ id?: string;
31
+ name?: string;
32
+ argumentsDelta?: string;
33
+ };
34
+ finishReason?: FinishReason;
35
+ usage?: TokenUsage;
36
+ error?: unknown;
37
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/types/output.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import type { JSONSchema7 } from 'json-schema';
2
+ import type { ZodTypeAny, ZodEffects, ZodSchema } from 'zod';
3
+ export interface FunctionTool {
4
+ type: 'function';
5
+ name: string;
6
+ description?: string;
7
+ inputSchema: JSONSchema7 | ZodSchema<any> | ZodEffects<ZodTypeAny>;
8
+ strict?: boolean;
9
+ providerOptions?: Record<string, unknown>;
10
+ }
11
+ export interface ProviderTool<TArgs extends Record<string, unknown> = Record<string, unknown>> {
12
+ type: 'provider';
13
+ name: string;
14
+ args?: TArgs;
15
+ }
16
+ export type Tool = FunctionTool | ProviderTool;
17
+ export interface ToolCall {
18
+ id: string;
19
+ name: string;
20
+ arguments: Record<string, unknown>;
21
+ argumentsRaw?: string;
22
+ }
23
+ export interface ToolResult {
24
+ toolCallId: string;
25
+ toolName: string;
26
+ result: unknown;
27
+ status: 'success' | 'error';
28
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/types/tool.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { INode } from 'n8n-workflow';
2
+ export declare function validateEmbedQueryInput(query: unknown, node: INode): string;
3
+ export declare function validateEmbedDocumentsInput(documents: unknown, node: INode): string[];
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateEmbedQueryInput = validateEmbedQueryInput;
4
+ exports.validateEmbedDocumentsInput = validateEmbedDocumentsInput;
5
+ const n8n_workflow_1 = require("n8n-workflow");
6
+ function validateEmbedQueryInput(query, node) {
7
+ if (typeof query !== 'string' || query === '') {
8
+ throw new n8n_workflow_1.NodeOperationError(node, 'Cannot embed empty or undefined text', {
9
+ description: 'The text provided for embedding is empty or undefined. This can happen when: the input expression evaluates to undefined, the AI agent calls a tool without proper arguments, or a required field is missing.',
10
+ });
11
+ }
12
+ return query;
13
+ }
14
+ function validateEmbedDocumentsInput(documents, node) {
15
+ if (!Array.isArray(documents)) {
16
+ throw new n8n_workflow_1.NodeOperationError(node, 'Documents must be an array', {
17
+ description: 'Expected an array of strings to embed.',
18
+ });
19
+ }
20
+ const invalidIndex = documents.findIndex((doc) => doc === undefined || doc === null || doc === '');
21
+ if (invalidIndex !== -1) {
22
+ throw new n8n_workflow_1.NodeOperationError(node, `Invalid document at index ${invalidIndex}`, {
23
+ description: `Document at index ${invalidIndex} is empty or undefined. All documents must be non-empty strings.`,
24
+ });
25
+ }
26
+ return documents;
27
+ }
28
+ //# sourceMappingURL=embeddings-input-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings-input-validation.js","sourceRoot":"","sources":["../../src/utils/embeddings-input-validation.ts"],"names":[],"mappings":";;AAYA,0DAQC;AAWD,kEAkBC;AAhDD,+CAAkD;AAWlD,SAAgB,uBAAuB,CAAC,KAAc,EAAE,IAAW;IAClE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QAC/C,MAAM,IAAI,iCAAkB,CAAC,IAAI,EAAE,sCAAsC,EAAE;YAC1E,WAAW,EACV,+MAA+M;SAChN,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAWD,SAAgB,2BAA2B,CAAC,SAAkB,EAAE,IAAW;IAC1E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,iCAAkB,CAAC,IAAI,EAAE,4BAA4B,EAAE;YAChE,WAAW,EAAE,wCAAwC;SACrD,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,SAAS,CAAC,SAAS,CACvC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE,CACxD,CAAC;IAEF,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,iCAAkB,CAAC,IAAI,EAAE,6BAA6B,YAAY,EAAE,EAAE;YAC/E,WAAW,EAAE,qBAAqB,YAAY,kEAAkE;SAChH,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const n8nDefaultFailedAttemptHandler: (error: any) => void;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.n8nDefaultFailedAttemptHandler = void 0;
4
+ const STATUS_NO_RETRY = [
5
+ 400,
6
+ 401,
7
+ 402,
8
+ 403,
9
+ 404,
10
+ 405,
11
+ 406,
12
+ 407,
13
+ 409,
14
+ ];
15
+ const n8nDefaultFailedAttemptHandler = (error) => {
16
+ if (error?.message?.startsWith?.('Cancel') ||
17
+ error?.message?.startsWith?.('AbortError') ||
18
+ error?.name === 'AbortError') {
19
+ throw error;
20
+ }
21
+ if (error?.code === 'ECONNABORTED') {
22
+ throw error;
23
+ }
24
+ const status = error?.response?.status ?? error?.status;
25
+ if (status && STATUS_NO_RETRY.includes(+status)) {
26
+ throw error;
27
+ }
28
+ };
29
+ exports.n8nDefaultFailedAttemptHandler = n8nDefaultFailedAttemptHandler;
30
+ //# sourceMappingURL=n8nDefaultFailedAttemptHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"n8nDefaultFailedAttemptHandler.js","sourceRoot":"","sources":["../../../src/utils/failed-attempt-handler/n8nDefaultFailedAttemptHandler.ts"],"names":[],"mappings":";;;AAAA,MAAM,eAAe,GAAG;IACvB,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;CACH,CAAC;AASK,MAAM,8BAA8B,GAAG,CAAC,KAAU,EAAE,EAAE;IAC5D,IAEC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC;QACtC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,YAAY,CAAC;QAC1C,KAAK,EAAE,IAAI,KAAK,YAAY,EAC3B,CAAC;QACF,MAAM,KAAK,CAAC;IACb,CAAC;IAGD,IAAI,KAAK,EAAE,IAAI,KAAK,cAAc,EAAE,CAAC;QACpC,MAAM,KAAK,CAAC;IACb,CAAC;IAED,MAAM,MAAM,GAEX,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,EAAE,MAAM,CAAC;IAC1C,IAAI,MAAM,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACjD,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC,CAAC;AArBW,QAAA,8BAA8B,kCAqBzC"}
@@ -0,0 +1,3 @@
1
+ import type { FailedAttemptHandler } from '@langchain/core/dist/utils/async_caller';
2
+ import type { ISupplyDataFunctions } from 'n8n-workflow';
3
+ export declare const makeN8nLlmFailedAttemptHandler: (ctx: ISupplyDataFunctions, handler?: FailedAttemptHandler) => FailedAttemptHandler;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeN8nLlmFailedAttemptHandler = void 0;
4
+ const n8n_workflow_1 = require("n8n-workflow");
5
+ const n8nDefaultFailedAttemptHandler_1 = require("./n8nDefaultFailedAttemptHandler");
6
+ const makeN8nLlmFailedAttemptHandler = (ctx, handler) => {
7
+ return (error) => {
8
+ try {
9
+ handler?.(error);
10
+ (0, n8nDefaultFailedAttemptHandler_1.n8nDefaultFailedAttemptHandler)(error);
11
+ }
12
+ catch (e) {
13
+ const apiError = new n8n_workflow_1.NodeApiError(ctx.getNode(), e, {
14
+ functionality: 'configuration-node',
15
+ });
16
+ throw apiError;
17
+ }
18
+ if (error?.retriesLeft > 0) {
19
+ return;
20
+ }
21
+ const apiError = new n8n_workflow_1.NodeApiError(ctx.getNode(), error, {
22
+ functionality: 'configuration-node',
23
+ });
24
+ throw apiError;
25
+ };
26
+ };
27
+ exports.makeN8nLlmFailedAttemptHandler = makeN8nLlmFailedAttemptHandler;
28
+ //# sourceMappingURL=n8nLlmFailedAttemptHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"n8nLlmFailedAttemptHandler.js","sourceRoot":"","sources":["../../../src/utils/failed-attempt-handler/n8nLlmFailedAttemptHandler.ts"],"names":[],"mappings":";;;AAEA,+CAA4C;AAE5C,qFAAkF;AAQ3E,MAAM,8BAA8B,GAAG,CAC7C,GAAyB,EACzB,OAA8B,EACP,EAAE;IACzB,OAAO,CAAC,KAAU,EAAE,EAAE;QACrB,IAAI,CAAC;YAEJ,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;YAGjB,IAAA,+DAA8B,EAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YAEZ,MAAM,QAAQ,GAAG,IAAI,2BAAY,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAe,EAAE;gBACjE,aAAa,EAAE,oBAAoB;aACnC,CAAC,CAAC;YAEH,MAAM,QAAQ,CAAC;QAChB,CAAC;QAID,IAAI,KAAK,EAAE,WAAW,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO;QACR,CAAC;QAGD,MAAM,QAAQ,GAAG,IAAI,2BAAY,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,KAA8B,EAAE;YAChF,aAAa,EAAE,oBAAoB;SACnC,CAAC,CAAC;QAEH,MAAM,QAAQ,CAAC;IAChB,CAAC,CAAC;AACH,CAAC,CAAC;AAjCW,QAAA,8BAA8B,kCAiCzC"}
@@ -0,0 +1,3 @@
1
+ import type { IExecuteFunctions, ISupplyDataFunctions } from 'n8n-workflow';
2
+ export declare function getMetadataFiltersValues(ctx: IExecuteFunctions | ISupplyDataFunctions, itemIndex: number): Record<string, never> | undefined;
3
+ export declare function hasLongSequentialRepeat(text: string, threshold?: number): boolean;