From a9bc9c57e7f9cde1894decf7e8161daaaae712aa Mon Sep 17 00:00:00 2001 From: Mayank SIngh <105289231+mayanksingh-27@users.noreply.github.com> Date: Thu, 24 Sep 2026 15:13:31 +0000 Subject: [PATCH] fix(Mistral Cloud Node): Support citation reference chunks (#38952) --- .../test/LmChatMistralCloud.test.ts | 39 ++++++++++++ packages/@n8n/nodes-langchain/package.json | 4 +- pnpm-lock.yaml | 59 ++++++++++++++----- pnpm-workspace.yaml | 2 +- 4 files changed, 86 insertions(+), 18 deletions(-) create mode 100644 packages/@n8n/nodes-langchain/nodes/llms/LmChatMistralCloud/test/LmChatMistralCloud.test.ts diff --git a/packages/@n8n/nodes-langchain/nodes/llms/LmChatMistralCloud/test/LmChatMistralCloud.test.ts b/packages/@n8n/nodes-langchain/nodes/llms/LmChatMistralCloud/test/LmChatMistralCloud.test.ts new file mode 100644 index 00000000000..32155091ac2 --- /dev/null +++ b/packages/@n8n/nodes-langchain/nodes/llms/LmChatMistralCloud/test/LmChatMistralCloud.test.ts @@ -0,0 +1,39 @@ +import { ChatMistralAI } from '@langchain/mistralai'; +import { HTTPClient } from '@mistralai/mistralai/lib/http.js'; + +describe('Mistral reference chunks', () => { + it('should stream reference chunks with string and numeric IDs', async () => { + const event = { + id: 'completion-1', + object: 'chat.completion.chunk', + created: 0, + model: 'mistral-test', + choices: [ + { + index: 0, + delta: { + role: 'assistant', + content: [{ type: 'reference', reference_ids: ['document-1', 2] }], + }, + finish_reason: null, + }, + ], + }; + const body = `data: ${JSON.stringify(event)}\n\ndata: [DONE]\n\n`; + const httpClient = new HTTPClient({ + fetcher: async () => new Response(body, { headers: { 'content-type': 'text/event-stream' } }), + }); + const model = new ChatMistralAI({ + apiKey: 'test-api-key', + model: 'mistral-test', + httpClient, + maxRetries: 0, + }); + + const chunks = []; + for await (const chunk of await model.stream('Cite the source')) chunks.push(chunk); + + expect(chunks).toHaveLength(1); + expect(chunks[0]?.content).toEqual([{ type: 'reference', referenceIds: ['document-1', 2] }]); + }); +}); diff --git a/packages/@n8n/nodes-langchain/package.json b/packages/@n8n/nodes-langchain/package.json index ce6a69e3286..7255d7c24d7 100644 --- a/packages/@n8n/nodes-langchain/package.json +++ b/packages/@n8n/nodes-langchain/package.json @@ -259,7 +259,7 @@ "@langchain/groq": "1.0.2", "@langchain/langgraph": "catalog:", "@langchain/langgraph-checkpoint": "catalog:", - "@langchain/mistralai": "1.0.1", + "@langchain/mistralai": "1.1.0", "@langchain/mongodb": "1.0.1", "@langchain/ollama": "1.2.6", "@langchain/openai": "catalog:", @@ -273,7 +273,7 @@ "@microsoft/agents-a365-tooling": "1.0.0", "@microsoft/agents-activity": "1.6.1", "@microsoft/agents-hosting": "1.6.1", - "@mistralai/mistralai": "^1.10.0", + "@mistralai/mistralai": "^2.2.1", "@modelcontextprotocol/sdk": "catalog:", "@mozilla/readability": "catalog:", "@n8n/ai-utilities": "workspace:*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 03a5898782e..bdb090d725a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -944,7 +944,7 @@ overrides: baseline-browser-mapping: ^2.10.31 '@azure/identity': 4.13.0 '@lezer/common': ^1.2.0 - '@mistralai/mistralai': ^1.10.0 + '@mistralai/mistralai': ^2.2.1 '@n8n/typeorm>@sentry/node': 10.70.0 mssql@12.7.0>tedious: 20.0.5 '@opentelemetry/api': 1.9.1 @@ -3497,8 +3497,8 @@ importers: specifier: 'catalog:' version: 1.0.0(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/exporter-trace-otlp-proto@0.221.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.46.0(@aws-sdk/credential-provider-node@3.972.80)(@smithy/signature-v4@5.7.2)(ws@8.21.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))) '@langchain/mistralai': - specifier: 1.0.1 - version: 1.0.1(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/exporter-trace-otlp-proto@0.221.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.46.0(@aws-sdk/credential-provider-node@3.972.80)(@smithy/signature-v4@5.7.2)(ws@8.21.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))) + specifier: 1.1.0 + version: 1.1.0(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/exporter-trace-otlp-proto@0.221.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.46.0(@aws-sdk/credential-provider-node@3.972.80)(@smithy/signature-v4@5.7.2)(ws@8.21.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@langchain/mongodb': specifier: 1.0.1 version: 1.0.1(@aws-sdk/credential-providers@3.808.0)(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/exporter-trace-otlp-proto@0.221.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.46.0(@aws-sdk/credential-provider-node@3.972.80)(@smithy/signature-v4@5.7.2)(ws@8.21.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(gcp-metadata@5.3.0(supports-color@8.1.1))(socks@2.8.3) @@ -3539,8 +3539,8 @@ importers: specifier: 1.6.1 version: 1.6.1(@opentelemetry/api-logs@0.221.0)(@opentelemetry/api@1.9.1)(supports-color@8.1.1) '@mistralai/mistralai': - specifier: ^1.10.0 - version: 1.10.0 + specifier: ^2.2.1 + version: 2.7.0(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@modelcontextprotocol/sdk': specifier: 'catalog:' version: 1.26.0(supports-color@8.1.1)(zod@3.25.76) @@ -3564,7 +3564,7 @@ importers: version: link:../json-schema-to-zod '@n8n/typeorm': specifier: 0.3.20-16 - version: 0.3.20-16(@sentry/node@10.70.0(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/exporter-trace-otlp-http@0.221.0(@opentelemetry/api@1.9.1))(supports-color@8.1.1))(mysql2@3.23.1(@types/node@20.19.41))(pg-native@3.8.0)(pg-query-stream@4.16.0(pg@8.21.0(pg-native@3.8.0)))(pg@8.21.0(pg-native@3.8.0))(sqlite3@5.1.7(bluebird@3.7.2)(supports-color@8.1.1))(supports-color@8.1.1) + version: 0.3.20-16(@sentry/node@10.70.0(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))(supports-color@8.1.1))(mysql2@3.23.1(@types/node@20.19.41))(pg-native@3.8.0)(pg-query-stream@4.16.0(pg@8.21.0(pg-native@3.8.0)))(pg@8.21.0(pg-native@3.8.0))(sqlite3@5.1.7(bluebird@3.7.2)(supports-color@8.1.1))(supports-color@8.1.1) '@n8n/typescript-config': specifier: workspace:* version: link:../typescript-config @@ -11008,8 +11008,8 @@ packages: '@langchain/core': ^1.1.48 zod: 3.25.76 - '@langchain/mistralai@1.0.1': - resolution: {integrity: sha512-neIM/o3Y+0WSMMKDsM4Vfc1KFHqO0IDII4fouPXbn0INvJpniBFEUEnLayd4y3NwCeMsg155L3SBhMqpDZBPmQ==} + '@langchain/mistralai@1.1.0': + resolution: {integrity: sha512-MUGLKgJbfH81UIvvKLRHmMZxWnyg6qPTeiXnIu3zbzjJR456W5eWOWjr4LLuXIRTy1hRxX+mZZHyqHu4Bkq+0Q==} engines: {node: '>=20'} peerDependencies: '@langchain/core': ^1.0.0 @@ -11271,8 +11271,22 @@ packages: '@miragejs/pretender-node-polyfill@0.1.2': resolution: {integrity: sha512-M/BexG/p05C5lFfMunxo/QcgIJnMT2vDVCd00wNqK2ImZONIlEETZwWJu1QtLxtmYlSHlCFl3JNzp0tLe7OJ5g==} - '@mistralai/mistralai@1.10.0': - resolution: {integrity: sha512-tdIgWs4Le8vpvPiUEWne6tK0qbVc+jMenujnvTqOjogrJUsCSQhus0tHTU1avDDh5//Rq2dFgP9mWRAdIEoBqg==} + '@mistralai/mistralai@2.7.0': + resolution: {integrity: sha512-zCrx6MtNpcz+EL/Nqvg55QubSgmfwJfBmd3d3wSYfJGfnvlNnWcJYlxEW5xQpS3KR6A5qK9KUyRBwMDIWnyVGA==} + peerDependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/exporter-trace-otlp-http': ^0.220.0 + '@opentelemetry/resources': ^2.9.0 + '@opentelemetry/sdk-trace-base': ^2.9.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@opentelemetry/exporter-trace-otlp-http': + optional: true + '@opentelemetry/resources': + optional: true + '@opentelemetry/sdk-trace-base': + optional: true '@mixmark-io/domino@2.2.0': resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==} @@ -29470,11 +29484,17 @@ snapshots: - svelte - vue - '@langchain/mistralai@1.0.1(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/exporter-trace-otlp-proto@0.221.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.46.0(@aws-sdk/credential-provider-node@3.972.80)(@smithy/signature-v4@5.7.2)(ws@8.21.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': + '@langchain/mistralai@1.1.0(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/exporter-trace-otlp-proto@0.221.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.46.0(@aws-sdk/credential-provider-node@3.972.80)(@smithy/signature-v4@5.7.2)(ws@8.21.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@langchain/core': 1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/exporter-trace-otlp-proto@0.221.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.46.0(@aws-sdk/credential-provider-node@3.972.80)(@smithy/signature-v4@5.7.2)(ws@8.21.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@mistralai/mistralai': 1.10.0 - uuid: 13.0.1 + '@mistralai/mistralai': 2.7.0(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-http' + - '@opentelemetry/resources' + - '@opentelemetry/sdk-trace-base' + - bufferutil + - utf-8-validate '@langchain/mongodb@1.0.1(@aws-sdk/credential-providers@3.808.0)(@langchain/core@1.2.8(@opentelemetry/api@1.9.1)(@opentelemetry/exporter-trace-otlp-proto@0.221.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(openai@6.46.0(@aws-sdk/credential-provider-node@3.972.80)(@smithy/signature-v4@5.7.2)(ws@8.21.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.25.76))(ws@8.21.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(gcp-metadata@5.3.0(supports-color@8.1.1))(socks@2.8.3)': dependencies: @@ -29937,10 +29957,19 @@ snapshots: '@miragejs/pretender-node-polyfill@0.1.2': {} - '@mistralai/mistralai@1.10.0': + '@mistralai/mistralai@2.7.0(@opentelemetry/api@1.9.1)(@opentelemetry/resources@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.1))(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: + '@opentelemetry/semantic-conventions': 1.43.0 + ws: 8.21.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) zod: 3.25.76 zod-to-json-schema: 3.25.2(zod@3.25.76) + optionalDependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/resources': 2.10.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.10.0(@opentelemetry/api@1.9.1) + transitivePeerDependencies: + - bufferutil + - utf-8-validate '@mixmark-io/domino@2.2.0': {} @@ -30030,7 +30059,7 @@ snapshots: - debug - supports-color - '@n8n/typeorm@0.3.20-16(@sentry/node@10.70.0(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))(@opentelemetry/exporter-trace-otlp-http@0.221.0(@opentelemetry/api@1.9.1))(supports-color@8.1.1))(mysql2@3.23.1(@types/node@20.19.41))(pg-native@3.8.0)(pg-query-stream@4.16.0(pg@8.21.0(pg-native@3.8.0)))(pg@8.21.0(pg-native@3.8.0))(sqlite3@5.1.7(bluebird@3.7.2)(supports-color@8.1.1))(supports-color@8.1.1)': + '@n8n/typeorm@0.3.20-16(@sentry/node@10.70.0(@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.1))(supports-color@8.1.1))(mysql2@3.23.1(@types/node@20.19.41))(pg-native@3.8.0)(pg-query-stream@4.16.0(pg@8.21.0(pg-native@3.8.0)))(pg@8.21.0(pg-native@3.8.0))(sqlite3@5.1.7(bluebird@3.7.2)(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: app-root-path: 3.1.0 async-mutex: 0.5.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6092d042c61..6f662c515ce 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -369,7 +369,7 @@ overrides: baseline-browser-mapping: ^2.10.31 '@azure/identity': 4.13.0 '@lezer/common': ^1.2.0 - '@mistralai/mistralai': ^1.10.0 + '@mistralai/mistralai': ^2.2.1 '@n8n/typeorm>@sentry/node': catalog:sentry 'mssql@12.7.0>tedious': 20.0.5 '@opentelemetry/api': 'catalog:'