@n8n/n8n-nodes-langchain 2.43.2 → 2.44.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 (92) hide show
  1. package/dist/credentials/AzureEntraCognitiveServicesOAuth2Api.credentials.js +4 -4
  2. package/dist/credentials/AzureEntraCognitiveServicesOAuth2Api.credentials.js.map +1 -1
  3. package/dist/credentials/AzureOpenAiApi.credentials.js +4 -4
  4. package/dist/credentials/AzureOpenAiApi.credentials.js.map +1 -1
  5. package/dist/credentials/GoogleVertexAiApi.credentials.d.ts +15 -0
  6. package/dist/credentials/GoogleVertexAiApi.credentials.js +83 -0
  7. package/dist/credentials/GoogleVertexAiApi.credentials.js.map +1 -0
  8. package/dist/credentials/icons/google.svg +1 -0
  9. package/dist/known/credentials.json +12 -0
  10. package/dist/known/nodes.json +4 -0
  11. package/dist/node-definitions/.nodes-hash +1 -1
  12. package/dist/node-definitions/nodes/n8n-nodes-langchain/embeddingsAzureOpenAi/index.ts +1 -1
  13. package/dist/node-definitions/nodes/n8n-nodes-langchain/embeddingsAzureOpenAi/v1.schema.js +2 -1
  14. package/dist/node-definitions/nodes/n8n-nodes-langchain/embeddingsAzureOpenAi/v1.ts +4 -2
  15. package/dist/node-definitions/nodes/n8n-nodes-langchain/embeddingsGoogleVertex/v1.schema.js +3 -2
  16. package/dist/node-definitions/nodes/n8n-nodes-langchain/embeddingsGoogleVertex/v1.ts +3 -0
  17. package/dist/node-definitions/nodes/n8n-nodes-langchain/lmChatAzureOpenAi/index.ts +1 -1
  18. package/dist/node-definitions/nodes/n8n-nodes-langchain/lmChatAzureOpenAi/v1.schema.js +2 -1
  19. package/dist/node-definitions/nodes/n8n-nodes-langchain/lmChatAzureOpenAi/v1.ts +11 -2
  20. package/dist/node-definitions/nodes/n8n-nodes-langchain/lmChatAzureOpenAi/v11.schema.js +3 -2
  21. package/dist/node-definitions/nodes/n8n-nodes-langchain/lmChatAzureOpenAi/v11.ts +15 -5
  22. package/dist/node-definitions/nodes/n8n-nodes-langchain/lmChatGoogleGemini/v1.ts +1 -1
  23. package/dist/node-definitions/nodes/n8n-nodes-langchain/lmChatGoogleGemini/v11.ts +1 -1
  24. package/dist/node-definitions/nodes/n8n-nodes-langchain/lmChatGoogleGemini/v12.ts +1 -1
  25. package/dist/node-definitions/nodes/n8n-nodes-langchain/lmChatGoogleVertex/v1.schema.js +3 -2
  26. package/dist/node-definitions/nodes/n8n-nodes-langchain/lmChatGoogleVertex/v1.ts +3 -0
  27. package/dist/nodes/agents/Agent/agents/ToolsAgent/V2/execute.d.ts +6 -1
  28. package/dist/nodes/agents/Agent/agents/ToolsAgent/V2/execute.js +23 -7
  29. package/dist/nodes/agents/Agent/agents/ToolsAgent/V2/execute.js.map +1 -1
  30. package/dist/nodes/embeddings/EmbeddingsAzureOpenAi/EmbeddingsAzureOpenAi.node.js +102 -16
  31. package/dist/nodes/embeddings/EmbeddingsAzureOpenAi/EmbeddingsAzureOpenAi.node.js.map +1 -1
  32. package/dist/nodes/embeddings/EmbeddingsDatabricks/EmbeddingsDatabricks.node.js +1 -0
  33. package/dist/nodes/embeddings/EmbeddingsDatabricks/EmbeddingsDatabricks.node.js.map +1 -1
  34. package/dist/nodes/embeddings/EmbeddingsGoogleVertex/EmbeddingsGoogleVertex.node.d.ts +5 -6
  35. package/dist/nodes/embeddings/EmbeddingsGoogleVertex/EmbeddingsGoogleVertex.node.js +9 -41
  36. package/dist/nodes/embeddings/EmbeddingsGoogleVertex/EmbeddingsGoogleVertex.node.js.map +1 -1
  37. package/dist/nodes/llms/LMChatAnthropic/LmChatAnthropic.node.js +1 -15
  38. package/dist/nodes/llms/LMChatAnthropic/LmChatAnthropic.node.js.map +1 -1
  39. package/dist/nodes/llms/LmChatAzureOpenAi/LmChatAzureOpenAi.node.js +59 -8
  40. package/dist/nodes/llms/LmChatAzureOpenAi/LmChatAzureOpenAi.node.js.map +1 -1
  41. package/dist/nodes/llms/LmChatAzureOpenAi/credentials/api-key.js +1 -1
  42. package/dist/nodes/llms/LmChatAzureOpenAi/credentials/api-key.js.map +1 -1
  43. package/dist/nodes/llms/LmChatAzureOpenAi/credentials/oauth2.js +1 -2
  44. package/dist/nodes/llms/LmChatAzureOpenAi/credentials/oauth2.js.map +1 -1
  45. package/dist/nodes/llms/LmChatAzureOpenAi/credentials/requireFoundryEndpoint.js +1 -1
  46. package/dist/nodes/llms/LmChatAzureOpenAi/credentials/requireFoundryEndpoint.js.map +1 -1
  47. package/dist/nodes/llms/LmChatAzureOpenAi/credentials/requireTenantId.js +1 -1
  48. package/dist/nodes/llms/LmChatAzureOpenAi/credentials/requireTenantId.js.map +1 -1
  49. package/dist/nodes/llms/LmChatAzureOpenAi/error-handling.d.ts +1 -1
  50. package/dist/nodes/llms/LmChatAzureOpenAi/error-handling.js +12 -6
  51. package/dist/nodes/llms/LmChatAzureOpenAi/error-handling.js.map +1 -1
  52. package/dist/nodes/llms/LmChatAzureOpenAi/methods/searchModels.js +1 -1
  53. package/dist/nodes/llms/LmChatAzureOpenAi/methods/searchModels.js.map +1 -1
  54. package/dist/nodes/llms/LmChatAzureOpenAi/properties.js +29 -4
  55. package/dist/nodes/llms/LmChatAzureOpenAi/properties.js.map +1 -1
  56. package/dist/nodes/llms/LmChatAzureOpenAi/types.d.ts +1 -0
  57. package/dist/nodes/llms/LmChatAzureOpenAi/types.js +2 -1
  58. package/dist/nodes/llms/LmChatAzureOpenAi/types.js.map +1 -1
  59. package/dist/nodes/llms/LmChatGoogleGemini/LmChatGoogleGemini.node.js +2 -1
  60. package/dist/nodes/llms/LmChatGoogleGemini/LmChatGoogleGemini.node.js.map +1 -1
  61. package/dist/nodes/llms/LmChatGoogleVertex/LmChatGoogleVertex.node.d.ts +5 -6
  62. package/dist/nodes/llms/LmChatGoogleVertex/LmChatGoogleVertex.node.js +9 -41
  63. package/dist/nodes/llms/LmChatGoogleVertex/LmChatGoogleVertex.node.js.map +1 -1
  64. package/dist/nodes/vector_store/VectorStoreDatabricks/DatabricksVectorStore.d.ts +1 -0
  65. package/dist/nodes/vector_store/VectorStoreDatabricks/DatabricksVectorStore.js +19 -5
  66. package/dist/nodes/vector_store/VectorStoreDatabricks/DatabricksVectorStore.js.map +1 -1
  67. package/dist/nodes/vector_store/VectorStoreDatabricks/VectorStoreDatabricks.node.js +4 -1
  68. package/dist/nodes/vector_store/VectorStoreDatabricks/VectorStoreDatabricks.node.js.map +1 -1
  69. package/dist/nodes/vendors/Databricks/DatabricksAiAgent.node.d.ts +5 -0
  70. package/dist/nodes/vendors/Databricks/DatabricksAiAgent.node.js +170 -0
  71. package/dist/nodes/vendors/Databricks/DatabricksAiAgent.node.js.map +1 -0
  72. package/dist/nodes/vendors/Databricks/databricks.dark.svg +19 -0
  73. package/dist/nodes/vendors/Databricks/databricks.svg +19 -0
  74. package/dist/nodes/vendors/Databricks/mlflow/span-collector.d.ts +48 -0
  75. package/dist/nodes/vendors/Databricks/mlflow/span-collector.js +378 -0
  76. package/dist/nodes/vendors/Databricks/mlflow/span-collector.js.map +1 -0
  77. package/dist/nodes/vendors/Databricks/mlflow/trace-writer.d.ts +41 -0
  78. package/dist/nodes/vendors/Databricks/mlflow/trace-writer.js +129 -0
  79. package/dist/nodes/vendors/Databricks/mlflow/trace-writer.js.map +1 -0
  80. package/dist/nodes/vendors/Databricks/mlflow/transport.d.ts +7 -0
  81. package/dist/nodes/vendors/Databricks/mlflow/transport.js +72 -0
  82. package/dist/nodes/vendors/Databricks/mlflow/transport.js.map +1 -0
  83. package/dist/nodes/vendors/Databricks/mlflow/types.d.ts +54 -0
  84. package/dist/nodes/vendors/Databricks/mlflow/types.js +23 -0
  85. package/dist/nodes/vendors/Databricks/mlflow/types.js.map +1 -0
  86. package/dist/typecheck.tsbuildinfo +1 -1
  87. package/dist/types/credentials.json +3 -2
  88. package/dist/types/nodes.json +6 -5
  89. package/dist/utils/google-vertex.d.ts +14 -0
  90. package/dist/utils/google-vertex.js +130 -0
  91. package/dist/utils/google-vertex.js.map +1 -0
  92. package/package.json +14 -12
@@ -0,0 +1,378 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MlflowSpanCollector = void 0;
4
+ const base_1 = require("@langchain/core/callbacks/base");
5
+ const messages_1 = require("@langchain/core/messages");
6
+ const is_record_1 = require("@n8n/utils/is-record");
7
+ const sanitize_error_detail_1 = require("@n8n/utils/redaction/sanitize-error-detail");
8
+ const scrub_secrets_1 = require("@n8n/utils/scrub-secrets");
9
+ const node_crypto_1 = require("node:crypto");
10
+ const types_1 = require("./types");
11
+ const MAX_ATTRIBUTE_CHARS = 100_000;
12
+ const MAX_STRING_CHARS = 4_000;
13
+ const MAX_ERROR_CHARS = 2_000;
14
+ const TRACE_ID_BYTES = 16;
15
+ const SPAN_ID_BYTES = 8;
16
+ const UNINTERESTING_INPUT_KEYS = [
17
+ 'formatting_instructions',
18
+ 'agent_scratchpad',
19
+ 'chat_history',
20
+ 'steps',
21
+ ];
22
+ const ECHOED_OUTPUT_KEYS = [...UNINTERESTING_INPUT_KEYS, 'input', 'system_message'];
23
+ function randomTraceId() {
24
+ const raw = (0, node_crypto_1.randomBytes)(TRACE_ID_BYTES);
25
+ return { traceId: `tr-${raw.toString('hex')}`, spanTraceId: raw.toString('base64') };
26
+ }
27
+ function randomSpanId() {
28
+ return (0, node_crypto_1.randomBytes)(SPAN_ID_BYTES).toString('base64');
29
+ }
30
+ function toNanos(ms) {
31
+ return `${ms}000000`;
32
+ }
33
+ function serializedName(serialized, fallback) {
34
+ const id = serialized?.id;
35
+ return (Array.isArray(id) ? id.at(-1) : undefined) ?? fallback;
36
+ }
37
+ function stringifySafely(value) {
38
+ const ancestors = [];
39
+ const json = JSON.stringify(value, function (_key, raw) {
40
+ if (raw === null || typeof raw !== 'object')
41
+ return raw;
42
+ while (ancestors.length > 0 && ancestors.at(-1) !== this)
43
+ ancestors.pop();
44
+ if (ancestors.includes(raw))
45
+ return '[circular]';
46
+ ancestors.push(raw);
47
+ return raw;
48
+ });
49
+ return json ?? 'null';
50
+ }
51
+ function capStrings(value, seen) {
52
+ if (typeof value === 'string') {
53
+ return value.length > MAX_STRING_CHARS
54
+ ? `${value.slice(0, MAX_STRING_CHARS)}…[truncated ${value.length} chars]`
55
+ : value;
56
+ }
57
+ if (value === null || typeof value !== 'object')
58
+ return value;
59
+ if (seen.has(value))
60
+ return '[circular]';
61
+ seen.add(value);
62
+ try {
63
+ if (Array.isArray(value))
64
+ return value.map((entry) => capStrings(entry, seen));
65
+ return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, capStrings(entry, seen)]));
66
+ }
67
+ finally {
68
+ seen.delete(value);
69
+ }
70
+ }
71
+ function toAttributeJson(value) {
72
+ const full = (0, scrub_secrets_1.scrubSecretsInText)(stringifySafely(value));
73
+ if (full.length <= MAX_ATTRIBUTE_CHARS)
74
+ return full;
75
+ const capped = (0, scrub_secrets_1.scrubSecretsInText)(stringifySafely(capStrings(value, new Set())));
76
+ if (capped.length <= MAX_ATTRIBUTE_CHARS)
77
+ return capped;
78
+ return JSON.stringify({ truncated: true, original_size_chars: full.length });
79
+ }
80
+ function errorMessage(error) {
81
+ const raw = error instanceof Error ? error.message : String(error);
82
+ return (0, sanitize_error_detail_1.sanitizeErrorDetail)(raw, MAX_ERROR_CHARS);
83
+ }
84
+ function firstNumber(...candidates) {
85
+ return candidates.find((c) => typeof c === 'number' && Number.isFinite(c));
86
+ }
87
+ function readUsage(raw) {
88
+ if (!(0, is_record_1.isRecord)(raw))
89
+ return undefined;
90
+ const input = firstNumber(raw.promptTokens, raw.input_tokens, raw.prompt_tokens);
91
+ const output = firstNumber(raw.completionTokens, raw.output_tokens, raw.completion_tokens);
92
+ if (input === undefined && output === undefined)
93
+ return undefined;
94
+ const inputTokens = input ?? 0;
95
+ const outputTokens = output ?? 0;
96
+ return {
97
+ inputTokens,
98
+ outputTokens,
99
+ totalTokens: firstNumber(raw.totalTokens, raw.total_tokens) ?? inputTokens + outputTokens,
100
+ };
101
+ }
102
+ function extractTokenUsage(output) {
103
+ const fromLlmOutput = readUsage(output.llmOutput?.tokenUsage) ?? readUsage(output.llmOutput?.usage);
104
+ if (fromLlmOutput)
105
+ return fromLlmOutput;
106
+ for (const generation of output.generations.flat()) {
107
+ const usage = readUsage(generation.generationInfo?.usage);
108
+ if (usage)
109
+ return usage;
110
+ }
111
+ return undefined;
112
+ }
113
+ function toOpenAiRole(type) {
114
+ switch (type) {
115
+ case 'human':
116
+ return 'user';
117
+ case 'ai':
118
+ return 'assistant';
119
+ default:
120
+ return type;
121
+ }
122
+ }
123
+ function toChatMessage(message) {
124
+ const converted = {
125
+ role: toOpenAiRole(message.type),
126
+ content: message.content,
127
+ };
128
+ if ('tool_calls' in message && Array.isArray(message.tool_calls)) {
129
+ converted.tool_calls = message.tool_calls.map((call) => ({
130
+ id: call.id,
131
+ type: 'function',
132
+ function: { name: call.name, arguments: JSON.stringify(call.args ?? {}) },
133
+ }));
134
+ }
135
+ if ('tool_call_id' in message && typeof message.tool_call_id === 'string') {
136
+ converted.tool_call_id = message.tool_call_id;
137
+ }
138
+ return converted;
139
+ }
140
+ function toChatCompletion(output) {
141
+ return {
142
+ choices: output.generations.flat().map((generation) => {
143
+ const message = (0, is_record_1.isRecord)(generation) ? generation.message : undefined;
144
+ return {
145
+ message: messages_1.BaseMessage.isInstance(message)
146
+ ? toChatMessage(message)
147
+ : { role: 'assistant', content: generation.text },
148
+ finish_reason: generation.generationInfo?.finish_reason,
149
+ };
150
+ }),
151
+ };
152
+ }
153
+ function withoutKeys(values, drop) {
154
+ return Object.fromEntries(Object.entries(values).filter(([key]) => !drop.includes(key)));
155
+ }
156
+ class MlflowSpanCollector extends base_1.BaseCallbackHandler {
157
+ constructor() {
158
+ super();
159
+ this.name = 'MlflowSpanCollector';
160
+ this.awaitHandlers = true;
161
+ this.spans = new Map();
162
+ this.parentOf = new Map();
163
+ this.runOrder = [];
164
+ this.openRuns = new Set();
165
+ this.lastActivityMs = 0;
166
+ const ids = randomTraceId();
167
+ this.traceId = ids.traceId;
168
+ this.spanTraceId = ids.spanTraceId;
169
+ }
170
+ nearestKeptAncestor(runId) {
171
+ let cursor = runId;
172
+ const guard = new Set();
173
+ while (cursor !== undefined && !guard.has(cursor)) {
174
+ guard.add(cursor);
175
+ const span = this.spans.get(cursor);
176
+ if (span)
177
+ return span;
178
+ cursor = this.parentOf.get(cursor);
179
+ }
180
+ return undefined;
181
+ }
182
+ captureRunMetadata(metadata) {
183
+ if (!(0, is_record_1.isRecord)(metadata))
184
+ return;
185
+ if (typeof metadata.execution_id === 'string')
186
+ this.executionId ??= metadata.execution_id;
187
+ if (typeof metadata.node === 'string')
188
+ this.nodeName ??= metadata.node;
189
+ if ((0, is_record_1.isRecord)(metadata.workflow) && typeof metadata.workflow.id === 'string') {
190
+ this.workflowId ??= metadata.workflow.id;
191
+ }
192
+ }
193
+ startSpan(params) {
194
+ const { runId, parentRunId, name, spanType, inputs } = params;
195
+ if (this.spans.has(runId))
196
+ return;
197
+ const startTimeMs = Date.now();
198
+ this.startedAtMs ??= startTimeMs;
199
+ this.lastActivityMs = startTimeMs;
200
+ const span = {
201
+ trace_id: this.spanTraceId,
202
+ span_id: randomSpanId(),
203
+ parent_span_id: this.nearestKeptAncestor(parentRunId)?.span_id,
204
+ name,
205
+ start_time_unix_nano: toNanos(startTimeMs),
206
+ end_time_unix_nano: toNanos(startTimeMs),
207
+ status: { code: 'OK' },
208
+ attributes: {
209
+ [types_1.MLFLOW_ATTRIBUTE.SpanType]: toAttributeJson(spanType),
210
+ [types_1.MLFLOW_ATTRIBUTE.TraceRequestId]: toAttributeJson(this.traceId),
211
+ [types_1.MLFLOW_ATTRIBUTE.SpanInputs]: toAttributeJson(inputs),
212
+ ...(params.messageFormat && {
213
+ [types_1.MLFLOW_ATTRIBUTE.MessageFormat]: types_1.MLFLOW_MESSAGE_FORMAT,
214
+ }),
215
+ },
216
+ };
217
+ this.spans.set(runId, span);
218
+ this.runOrder.push(runId);
219
+ this.openRuns.add(runId);
220
+ }
221
+ closeSpan(runId) {
222
+ const span = this.spans.get(runId);
223
+ if (!span)
224
+ return undefined;
225
+ const now = Date.now();
226
+ this.lastActivityMs = now;
227
+ span.end_time_unix_nano = toNanos(now);
228
+ this.openRuns.delete(runId);
229
+ return span;
230
+ }
231
+ endSpan(runId, outputs, tokenUsage) {
232
+ const span = this.closeSpan(runId);
233
+ if (!span)
234
+ return;
235
+ span.attributes[types_1.MLFLOW_ATTRIBUTE.SpanOutputs] = toAttributeJson(outputs);
236
+ if (tokenUsage) {
237
+ this.addTokenUsage(tokenUsage);
238
+ span.attributes[types_1.MLFLOW_ATTRIBUTE.TokenUsage] = toAttributeJson({
239
+ input_tokens: tokenUsage.inputTokens,
240
+ output_tokens: tokenUsage.outputTokens,
241
+ total_tokens: tokenUsage.totalTokens,
242
+ });
243
+ }
244
+ }
245
+ addTokenUsage(usage) {
246
+ this.tokenUsage = {
247
+ inputTokens: (this.tokenUsage?.inputTokens ?? 0) + usage.inputTokens,
248
+ outputTokens: (this.tokenUsage?.outputTokens ?? 0) + usage.outputTokens,
249
+ totalTokens: (this.tokenUsage?.totalTokens ?? 0) + usage.totalTokens,
250
+ };
251
+ }
252
+ failSpan(runId, error) {
253
+ const span = this.closeSpan(runId);
254
+ if (!span)
255
+ return;
256
+ span.status = { code: 'ERROR', message: errorMessage(error) };
257
+ }
258
+ handleChainStart(_chain, inputs, runId, parentRunId, _tags, metadata, _runType, runName) {
259
+ this.parentOf.set(runId, parentRunId);
260
+ this.captureRunMetadata(metadata);
261
+ if (this.rootRunId !== undefined)
262
+ return;
263
+ this.rootRunId = runId;
264
+ this.startSpan({
265
+ runId,
266
+ parentRunId: undefined,
267
+ name: runName ?? 'Agent',
268
+ spanType: types_1.MLFLOW_SPAN_TYPE.Agent,
269
+ inputs: withoutKeys(inputs, UNINTERESTING_INPUT_KEYS),
270
+ });
271
+ if (typeof inputs.input === 'string')
272
+ this.requestPreview = inputs.input;
273
+ }
274
+ handleChainEnd(outputs, runId) {
275
+ if (runId !== this.rootRunId)
276
+ return;
277
+ if (typeof outputs.output === 'string')
278
+ this.responsePreview = outputs.output;
279
+ this.endSpan(runId, withoutKeys(outputs, ECHOED_OUTPUT_KEYS));
280
+ }
281
+ handleChainError(error, runId) {
282
+ this.failSpan(runId, error);
283
+ }
284
+ handleChatModelStart(llm, messages, runId, parentRunId, _extraParams, _tags, metadata, runName) {
285
+ this.parentOf.set(runId, parentRunId);
286
+ this.captureRunMetadata(metadata);
287
+ this.startSpan({
288
+ runId,
289
+ parentRunId,
290
+ name: runName ?? serializedName(llm, 'chat model'),
291
+ spanType: types_1.MLFLOW_SPAN_TYPE.ChatModel,
292
+ inputs: { messages: messages.flat().map(toChatMessage) },
293
+ messageFormat: true,
294
+ });
295
+ }
296
+ handleLLMStart(llm, prompts, runId, parentRunId, _extraParams, _tags, metadata, runName) {
297
+ this.parentOf.set(runId, parentRunId);
298
+ this.captureRunMetadata(metadata);
299
+ this.startSpan({
300
+ runId,
301
+ parentRunId,
302
+ name: runName ?? serializedName(llm, 'model'),
303
+ spanType: types_1.MLFLOW_SPAN_TYPE.Llm,
304
+ inputs: prompts,
305
+ });
306
+ }
307
+ handleLLMEnd(output, runId) {
308
+ this.endSpan(runId, toChatCompletion(output), extractTokenUsage(output));
309
+ }
310
+ handleLLMError(error, runId) {
311
+ this.failSpan(runId, error);
312
+ }
313
+ handleToolStart(tool, input, runId, parentRunId, _tags, metadata, runName) {
314
+ this.parentOf.set(runId, parentRunId);
315
+ this.captureRunMetadata(metadata);
316
+ this.startSpan({
317
+ runId,
318
+ parentRunId,
319
+ name: runName ?? serializedName(tool, 'tool'),
320
+ spanType: types_1.MLFLOW_SPAN_TYPE.Tool,
321
+ inputs: input,
322
+ });
323
+ }
324
+ handleToolEnd(output, runId) {
325
+ this.endSpan(runId, output);
326
+ }
327
+ handleToolError(error, runId) {
328
+ this.failSpan(runId, error);
329
+ }
330
+ handleRetrieverStart(retriever, query, runId, parentRunId, _tags, metadata, name) {
331
+ this.parentOf.set(runId, parentRunId);
332
+ this.captureRunMetadata(metadata);
333
+ this.startSpan({
334
+ runId,
335
+ parentRunId,
336
+ name: name ?? serializedName(retriever, 'retriever'),
337
+ spanType: types_1.MLFLOW_SPAN_TYPE.Retriever,
338
+ inputs: query,
339
+ });
340
+ }
341
+ handleRetrieverEnd(documents, runId) {
342
+ this.endSpan(runId, documents);
343
+ }
344
+ handleRetrieverError(error, runId) {
345
+ this.failSpan(runId, error);
346
+ }
347
+ finish() {
348
+ const root = this.rootRunId === undefined ? undefined : this.spans.get(this.rootRunId);
349
+ if (!root || this.startedAtMs === undefined)
350
+ return undefined;
351
+ const spans = this.runOrder
352
+ .map((runId) => this.spans.get(runId))
353
+ .filter((span) => span !== undefined);
354
+ const endTimeMs = Math.max(this.lastActivityMs, this.startedAtMs);
355
+ const endNanos = toNanos(endTimeMs);
356
+ for (const runId of this.openRuns) {
357
+ const span = this.spans.get(runId);
358
+ if (span)
359
+ span.end_time_unix_nano = endNanos;
360
+ }
361
+ return {
362
+ traceId: this.traceId,
363
+ rootSpanId: root.span_id,
364
+ spans,
365
+ startTimeMs: this.startedAtMs,
366
+ endTimeMs,
367
+ state: root.status.code,
368
+ tokenUsage: this.tokenUsage,
369
+ executionId: this.executionId,
370
+ workflowId: this.workflowId,
371
+ nodeName: this.nodeName,
372
+ requestPreview: this.requestPreview,
373
+ responsePreview: this.responsePreview,
374
+ };
375
+ }
376
+ }
377
+ exports.MlflowSpanCollector = MlflowSpanCollector;
378
+ //# sourceMappingURL=span-collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span-collector.js","sourceRoot":"","sources":["../../../../../nodes/vendors/Databricks/mlflow/span-collector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { type IDataObject } from 'n8n-workflow';
2
+ import type { CollectedTrace } from './types';
3
+ export interface MlflowResponse {
4
+ status: number;
5
+ body: unknown;
6
+ }
7
+ export type MlflowRequest = (options: {
8
+ method: 'GET' | 'POST';
9
+ path: string;
10
+ qs?: Record<string, string>;
11
+ body?: IDataObject;
12
+ }) => Promise<MlflowResponse>;
13
+ export type SignedUpload = (options: {
14
+ url: string;
15
+ body: string;
16
+ }) => Promise<void>;
17
+ export interface TraceWriterOptions {
18
+ request: MlflowRequest;
19
+ upload: SignedUpload;
20
+ experimentId: string;
21
+ }
22
+ export declare function defaultExperimentName(workflowId: string): string;
23
+ export declare function ensureExperiment(request: MlflowRequest, experimentName: string): Promise<string>;
24
+ export declare function buildTraceInfo(trace: CollectedTrace, experimentId: string): {
25
+ trace_id: string;
26
+ client_request_id: string | undefined;
27
+ trace_location: {
28
+ type: string;
29
+ mlflow_experiment: {
30
+ experiment_id: string;
31
+ };
32
+ };
33
+ request_preview: string;
34
+ response_preview: string;
35
+ request_time: string;
36
+ execution_duration: string;
37
+ state: import("./types").MlflowStatusCode;
38
+ trace_metadata: Record<string, string>;
39
+ tags: Record<string, string>;
40
+ };
41
+ export declare function writeTrace(options: TraceWriterOptions, trace: CollectedTrace): Promise<void>;
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultExperimentName = defaultExperimentName;
4
+ exports.ensureExperiment = ensureExperiment;
5
+ exports.buildTraceInfo = buildTraceInfo;
6
+ exports.writeTrace = writeTrace;
7
+ const is_record_1 = require("@n8n/utils/is-record");
8
+ const sanitize_error_detail_1 = require("@n8n/utils/redaction/sanitize-error-detail");
9
+ const n8n_workflow_1 = require("n8n-workflow");
10
+ const types_1 = require("./types");
11
+ const EXPERIMENT_GET_BY_NAME = '/api/2.0/mlflow/experiments/get-by-name';
12
+ const EXPERIMENT_CREATE = '/api/2.0/mlflow/experiments/create';
13
+ const TRACE_CREATE = '/api/3.0/mlflow/traces';
14
+ const uploadCredentialsPath = (traceId) => `/api/2.0/mlflow/traces/${encodeURIComponent(traceId)}/credentials-for-data-upload`;
15
+ const MAX_PREVIEW_CHARS = 1_000;
16
+ const MAX_FAILURE_DETAIL_CHARS = 500;
17
+ function describeFailure(body) {
18
+ if (!(0, is_record_1.isRecord)(body))
19
+ return '';
20
+ const code = typeof body.error_code === 'string' ? body.error_code : '';
21
+ const message = typeof body.message === 'string' ? body.message : '';
22
+ return (0, sanitize_error_detail_1.sanitizeErrorDetail)([code, message].filter(Boolean).join(': '), MAX_FAILURE_DETAIL_CHARS);
23
+ }
24
+ function assertOk(response, what) {
25
+ if (response.status < 200 || response.status >= 300) {
26
+ const detail = describeFailure(response.body);
27
+ const message = `Databricks ${what} failed with HTTP ${response.status}${detail ? ` (${detail})` : ''}`;
28
+ throw response.status >= 500 ? new n8n_workflow_1.OperationalError(message) : new n8n_workflow_1.UserError(message);
29
+ }
30
+ return response.body;
31
+ }
32
+ function defaultExperimentName(workflowId) {
33
+ return `/Shared/n8n-workflows-${workflowId}`;
34
+ }
35
+ async function ensureExperiment(request, experimentName) {
36
+ const found = await request({
37
+ method: 'GET',
38
+ path: EXPERIMENT_GET_BY_NAME,
39
+ qs: { experiment_name: experimentName },
40
+ });
41
+ if (found.status === 200 && (0, is_record_1.isRecord)(found.body) && (0, is_record_1.isRecord)(found.body.experiment)) {
42
+ const id = found.body.experiment.experiment_id;
43
+ if (typeof id === 'string')
44
+ return id;
45
+ }
46
+ if (found.status !== 404)
47
+ assertOk(found, 'experiment lookup');
48
+ const createResponse = await request({
49
+ method: 'POST',
50
+ path: EXPERIMENT_CREATE,
51
+ body: { name: experimentName },
52
+ });
53
+ if (createResponse.status >= 400 &&
54
+ (0, is_record_1.isRecord)(createResponse.body) &&
55
+ createResponse.body.error_code === 'RESOURCE_ALREADY_EXISTS') {
56
+ const afterRace = await request({
57
+ method: 'GET',
58
+ path: EXPERIMENT_GET_BY_NAME,
59
+ qs: { experiment_name: experimentName },
60
+ });
61
+ if (afterRace.status === 200 &&
62
+ (0, is_record_1.isRecord)(afterRace.body) &&
63
+ (0, is_record_1.isRecord)(afterRace.body.experiment)) {
64
+ const id = afterRace.body.experiment.experiment_id;
65
+ if (typeof id === 'string')
66
+ return id;
67
+ }
68
+ }
69
+ const created = assertOk(createResponse, 'experiment create');
70
+ if ((0, is_record_1.isRecord)(created) && typeof created.experiment_id === 'string') {
71
+ return created.experiment_id;
72
+ }
73
+ throw new n8n_workflow_1.UnexpectedError('Databricks did not return an experiment id');
74
+ }
75
+ function preview(text, span, attribute) {
76
+ return (text ?? span?.attributes[attribute] ?? '').slice(0, MAX_PREVIEW_CHARS);
77
+ }
78
+ function buildTraceInfo(trace, experimentId) {
79
+ const root = trace.spans.find((span) => span.span_id === trace.rootSpanId);
80
+ const tags = { 'n8n.source': 'n8n' };
81
+ if (trace.workflowId)
82
+ tags['n8n.workflowId'] = trace.workflowId;
83
+ if (trace.nodeName)
84
+ tags['n8n.node'] = trace.nodeName;
85
+ const usage = trace.tokenUsage;
86
+ const traceMetadata = {};
87
+ if (usage) {
88
+ traceMetadata[types_1.MLFLOW_TRACE_METADATA.TokenUsage] = JSON.stringify({
89
+ input_tokens: usage.inputTokens,
90
+ output_tokens: usage.outputTokens,
91
+ total_tokens: usage.totalTokens,
92
+ });
93
+ }
94
+ return {
95
+ trace_id: trace.traceId,
96
+ client_request_id: trace.executionId,
97
+ trace_location: {
98
+ type: 'MLFLOW_EXPERIMENT',
99
+ mlflow_experiment: { experiment_id: experimentId },
100
+ },
101
+ request_preview: preview(trace.requestPreview, root, types_1.MLFLOW_ATTRIBUTE.SpanInputs),
102
+ response_preview: preview(trace.responsePreview, root, types_1.MLFLOW_ATTRIBUTE.SpanOutputs),
103
+ request_time: new Date(trace.startTimeMs).toISOString(),
104
+ execution_duration: `${(trace.endTimeMs - trace.startTimeMs) / 1000}s`,
105
+ state: trace.state,
106
+ trace_metadata: traceMetadata,
107
+ tags,
108
+ };
109
+ }
110
+ async function writeTrace(options, trace) {
111
+ const { request, upload, experimentId } = options;
112
+ assertOk(await request({
113
+ method: 'POST',
114
+ path: TRACE_CREATE,
115
+ body: { trace: { trace_info: buildTraceInfo(trace, experimentId) } },
116
+ }), 'trace create');
117
+ const credentials = assertOk(await request({ method: 'GET', path: uploadCredentialsPath(trace.traceId) }), 'upload credentials');
118
+ const signedUri = (0, is_record_1.isRecord)(credentials) && (0, is_record_1.isRecord)(credentials.credential_info)
119
+ ? credentials.credential_info.signed_uri
120
+ : undefined;
121
+ if (typeof signedUri !== 'string' || signedUri.length === 0) {
122
+ throw new n8n_workflow_1.UnexpectedError('Databricks did not return an upload URL for the trace data');
123
+ }
124
+ await upload({
125
+ url: signedUri,
126
+ body: JSON.stringify({ spans: trace.spans }),
127
+ });
128
+ }
129
+ //# sourceMappingURL=trace-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-writer.js","sourceRoot":"","sources":["../../../../../nodes/vendors/Databricks/mlflow/trace-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type IExecuteFunctions } from 'n8n-workflow';
2
+ import { type DatabricksOAuth2Credential } from '../../../../utils/databricks/token-provider';
3
+ import type { MlflowRequest, SignedUpload } from './trace-writer';
4
+ export declare function createMlflowTransport(ctx: IExecuteFunctions, credential: DatabricksOAuth2Credential): {
5
+ request: MlflowRequest;
6
+ upload: SignedUpload;
7
+ };
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMlflowTransport = createMlflowTransport;
4
+ const ai_utilities_1 = require("@n8n/ai-utilities");
5
+ const constants_1 = require("n8n-nodes-base/dist/nodes/Databricks/constants");
6
+ const n8n_workflow_1 = require("n8n-workflow");
7
+ const constants_2 = require("../../../../utils/databricks/constants");
8
+ const token_provider_1 = require("../../../../utils/databricks/token-provider");
9
+ const REQUEST_TIMEOUT_MS = 60_000;
10
+ function toMlflowResponse(error) {
11
+ if (error instanceof n8n_workflow_1.NodeApiError && error.httpCode) {
12
+ return { status: Number(error.httpCode), body: error.context.data ?? {} };
13
+ }
14
+ throw error;
15
+ }
16
+ function createMlflowTransport(ctx, credential) {
17
+ (0, constants_2.assertHttpsHost)(ctx, credential.host);
18
+ const host = credential.host.replace(/\/$/, '');
19
+ const egressFilter = ctx.helpers.getSecureEgressFilter();
20
+ const cancelSignal = ctx.getExecutionCancelSignal();
21
+ const allowedDomains = (0, n8n_workflow_1.getCredentialAllowedDomains)({
22
+ node: ctx.getNode(),
23
+ credentialData: credential,
24
+ credentialOwnedSurface: true,
25
+ nodeEndpointUrl: host,
26
+ });
27
+ const request = async ({ method, path, qs, body }) => {
28
+ try {
29
+ const response = await ctx.helpers.httpRequestWithAuthentication.call(ctx, token_provider_1.DATABRICKS_CREDENTIAL_TYPE, {
30
+ method,
31
+ url: `${host}${path}`,
32
+ qs,
33
+ body,
34
+ headers: { 'User-Agent': constants_1.DATABRICKS_PARTNER_USER_AGENT },
35
+ timeout: REQUEST_TIMEOUT_MS,
36
+ allowedDomains,
37
+ returnFullResponse: true,
38
+ });
39
+ return { status: response.statusCode, body: response.body };
40
+ }
41
+ catch (error) {
42
+ return toMlflowResponse(error);
43
+ }
44
+ };
45
+ const withDeadline = async (input, init) => {
46
+ const signals = [AbortSignal.timeout(REQUEST_TIMEOUT_MS)];
47
+ if (init?.signal)
48
+ signals.push(init.signal);
49
+ if (cancelSignal)
50
+ signals.push(cancelSignal);
51
+ return await (0, ai_utilities_1.proxyFetch)({
52
+ input,
53
+ init: { ...init, signal: AbortSignal.any(signals) },
54
+ egressFilter,
55
+ });
56
+ };
57
+ const upload = async ({ url, body }) => {
58
+ if (!URL.canParse(url) || new URL(url).protocol !== 'https:') {
59
+ throw new n8n_workflow_1.NodeOperationError(ctx.getNode(), 'Databricks upload URL must use https');
60
+ }
61
+ const response = await withDeadline(url, {
62
+ method: 'PUT',
63
+ body,
64
+ headers: { 'Content-Type': 'application/json' },
65
+ });
66
+ if (!response.ok) {
67
+ throw new n8n_workflow_1.OperationalError(`Databricks trace data upload failed with HTTP ${response.status}`);
68
+ }
69
+ };
70
+ return { request, upload };
71
+ }
72
+ //# sourceMappingURL=transport.js.map