From b4548a12cbd852e2f983a29a0cb6d71d73056039 Mon Sep 17 00:00:00 2001 From: Jason Date: Tue, 4 Mar 2025 19:36:14 +0800 Subject: [PATCH 1/2] add proxy for chat open ai node --- .../llms/LMChatOpenAi/LmChatOpenAi.node.ts | 14 ++ packages/@n8n/nodes-langchain/package.json | 1 + pnpm-lock.yaml | 182 ++++++++++++++++-- 3 files changed, 177 insertions(+), 20 deletions(-) diff --git a/packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts b/packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts index 1db5ef7706..1bb416fa68 100644 --- a/packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts +++ b/packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts @@ -1,6 +1,7 @@ /* eslint-disable n8n-nodes-base/node-dirname-against-convention */ import { ChatOpenAI, type ClientOptions } from '@langchain/openai'; +import { HttpsProxyAgent } from 'https-proxy-agent'; import { NodeConnectionType, type INodeType, @@ -353,6 +354,19 @@ export class LmChatOpenAi implements INodeType { configuration.baseURL = credentials.url as string; } + // process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; + // set ODE_TLS_REJECT_UNAUTHORIZED to '0' value in order to skip SSL trust issue(i.e. self cert) + // e.g. if you use ProxyMan, you can add the following two values in your n8n config file, i.e. ~/.n8n/config: + // "https_proxy":"http://127.0.0.1:9091", + // "NODE_TLS_REJECT_UNAUTHORIZED":"0" + // + // This does NOT work by setting the value in terminal as following: + // export https_proxy=http://127.0.0.1:9091 NODE_TLS_REJECT_UNAUTHORIZED=0 + const httpProxy = process.env.http_proxy ?? process.env.https_proxy; + if (httpProxy) { + configuration.httpAgent = new HttpsProxyAgent(httpProxy); + } + // Extra options to send to OpenAI, that are not directly supported by LangChain const modelKwargs: { response_format?: object; diff --git a/packages/@n8n/nodes-langchain/package.json b/packages/@n8n/nodes-langchain/package.json index ffdd31a7b9..29e0fcaeed 100644 --- a/packages/@n8n/nodes-langchain/package.json +++ b/packages/@n8n/nodes-langchain/package.json @@ -173,6 +173,7 @@ "form-data": "catalog:", "generate-schema": "2.6.0", "html-to-text": "9.0.5", + "https-proxy-agent": "^7.0.6", "jsdom": "23.0.1", "langchain": "0.3.11", "lodash": "catalog:", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ba06540d3..70b4a05543 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -605,6 +605,9 @@ importers: html-to-text: specifier: 9.0.5 version: 9.0.5 + https-proxy-agent: + specifier: ^7.0.6 + version: 7.0.6 jsdom: specifier: 23.0.1 version: 23.0.1 @@ -867,6 +870,9 @@ importers: '@n8n_io/license-sdk': specifier: 2.17.0 version: 2.17.0 + '@ngrok/ngrok': + specifier: 1.4.1 + version: 1.4.1 '@oclif/core': specifier: 4.0.7 version: 4.0.7 @@ -4620,6 +4626,87 @@ packages: '@ngneat/falso@7.2.0': resolution: {integrity: sha512-283EXBFd05kCbGuGSXgmvhCsQYEYzvD/eJaE7lxd05qRB0tgREvZX7TRlJ1KSp8nHxoK6Ws029G1Y30mt4IVAA==} + '@ngrok/ngrok-android-arm-eabi@1.4.1': + resolution: {integrity: sha512-KQe59T8PhFg5XvWypcOCIgUakk/A9ipD1UvSgGuLI7pYIiVcx6oyW12RxCJr6cfdO0K5GrbUG6dlEXSmDD4jBg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@ngrok/ngrok-android-arm64@1.4.1': + resolution: {integrity: sha512-WPYJenabIArkGmeVhBcIVtgXmLK297pfJCYHP1Tnw220ANEXFdo7EW4dZoP0AA0gxciFHGYnQUMOn1Meo0IQFQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@ngrok/ngrok-darwin-arm64@1.4.1': + resolution: {integrity: sha512-hJW+ZDJ0uV7PieZAdZHdzR/WBRctjOkLzFqHTxSuNbmBr9uIg6PGf1dB2lySszK1wyKZL7wvh4GedQ4vSU5lkw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@ngrok/ngrok-darwin-universal@1.4.1': + resolution: {integrity: sha512-rUZKl/vr2cALpT1Ng91h8Jf5OfDtF+zNEC65AFWthPkHJpPQCLvuEC9hyF8XI52Bv45ORRb1YKR3hdhjZ4WGHQ==} + engines: {node: '>= 10'} + os: [darwin] + + '@ngrok/ngrok-darwin-x64@1.4.1': + resolution: {integrity: sha512-UKIkRpsGBywAqvwz8L6R8ITz+xxPoZ58LSFhZoMAWm2alGOdA2js1eHZwwVTSz96/tmmSRE/H+r69TvtuL0lXA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@ngrok/ngrok-freebsd-x64@1.4.1': + resolution: {integrity: sha512-v1xXqmu3f4W1PQt+NKlqXgLcpULYCSwStKGRSdgXljg1bRdOnW3ZdjbGzrIdKwQ7OcwZP34KbP13G+hqcTxo5Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@ngrok/ngrok-linux-arm-gnueabihf@1.4.1': + resolution: {integrity: sha512-yEeiVAGQNUErkSpOI1EZI+X3AkHCGd8yzqfjHamnhEONkwxLcWuTiUfcwFeMVtE9jyLfvQxctldPXXAjvaI/QA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@ngrok/ngrok-linux-arm64-gnu@1.4.1': + resolution: {integrity: sha512-Fb2uju769eO/yOrWdbMvCXNczbXHnqNmN5TCYvqQbPdscFgrsNaJcVr2SmWOfBq+OcLWYbx6mXE1ki5yOZKU9w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@ngrok/ngrok-linux-arm64-musl@1.4.1': + resolution: {integrity: sha512-nMTTZkUnwCzeIVDkoUdNqBKe6ArYXRWGjC4iXinfPOdENkb/tZ/eAjVdg+8bQ5PJgl/n/TbdZKNj//Jz2x8fdw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@ngrok/ngrok-linux-x64-gnu@1.4.1': + resolution: {integrity: sha512-IfDaYd9ZGk7F0szHql5Tr3rlLBlhuKbbNXDVkujGy/njA4/YnckfsZilGEtgnR7aYgHo3NqppfEw+AOmlDytCw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@ngrok/ngrok-linux-x64-musl@1.4.1': + resolution: {integrity: sha512-Ze6wb2umg6hfJhxOrFQhiyIZOf9YjSRkefnaQdAaONrIKxiFsu5SIKQbp7MQRnm8wabB9i0OI0Q/TVBsxo/HLw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@ngrok/ngrok-win32-ia32-msvc@1.4.1': + resolution: {integrity: sha512-FV3dwGpbh1h2fJ7h+Od8vFRrR9RxqBUAI+ELxQxropDxwYp6rWGKFnfE+JUcT79fEH3OpA0ElULrIDrLgK7bgg==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@ngrok/ngrok-win32-x64-msvc@1.4.1': + resolution: {integrity: sha512-Zr1Dyel4M3cA1kjT/N5ftTiCdoPnVv/VbyE6AKKemP9DDFkTlpdvMwSXikm/ypNtCNFEs/+q8CBZPhhaKktl8A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@ngrok/ngrok@1.4.1': + resolution: {integrity: sha512-KZ7/T4UOY3BqJBdweJPeebKW34YzIH+a2y4o7yqTIowoi6dw3sMj140o1Q8FvpPbH5J6lr2TWVCWdgSTYvHNgw==} + engines: {node: '>= 10'} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -6564,6 +6651,10 @@ packages: resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} engines: {node: '>= 14'} + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + agentkeepalive@4.2.1: resolution: {integrity: sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==} engines: {node: '>= 8.0.0'} @@ -9045,12 +9136,8 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - https-proxy-agent@7.0.2: - resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} - engines: {node: '>= 14'} - - https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} human-signals@1.1.1: @@ -13312,6 +13399,9 @@ packages: vue-component-type-helpers@2.2.4: resolution: {integrity: sha512-F66p0XLbAu92BRz6kakHyAcaUSF7HWpWX/THCqL0TxySSj7z/nok5UUMohfNkkCm1pZtawsdzoJ4p1cjNqCx0Q==} + vue-component-type-helpers@2.2.8: + resolution: {integrity: sha512-4bjIsC284coDO9om4HPA62M7wfsTvcmZyzdfR0aUlFXqq4tXxM1APyXpNVxPC8QazKw9OhmZNHBVDA6ODaZsrA==} + vue-demi@0.14.10: resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} engines: {node: '>=12'} @@ -16883,6 +16973,61 @@ snapshots: seedrandom: 3.0.5 uuid: 8.3.2 + '@ngrok/ngrok-android-arm-eabi@1.4.1': + optional: true + + '@ngrok/ngrok-android-arm64@1.4.1': + optional: true + + '@ngrok/ngrok-darwin-arm64@1.4.1': + optional: true + + '@ngrok/ngrok-darwin-universal@1.4.1': + optional: true + + '@ngrok/ngrok-darwin-x64@1.4.1': + optional: true + + '@ngrok/ngrok-freebsd-x64@1.4.1': + optional: true + + '@ngrok/ngrok-linux-arm-gnueabihf@1.4.1': + optional: true + + '@ngrok/ngrok-linux-arm64-gnu@1.4.1': + optional: true + + '@ngrok/ngrok-linux-arm64-musl@1.4.1': + optional: true + + '@ngrok/ngrok-linux-x64-gnu@1.4.1': + optional: true + + '@ngrok/ngrok-linux-x64-musl@1.4.1': + optional: true + + '@ngrok/ngrok-win32-ia32-msvc@1.4.1': + optional: true + + '@ngrok/ngrok-win32-x64-msvc@1.4.1': + optional: true + + '@ngrok/ngrok@1.4.1': + optionalDependencies: + '@ngrok/ngrok-android-arm-eabi': 1.4.1 + '@ngrok/ngrok-android-arm64': 1.4.1 + '@ngrok/ngrok-darwin-arm64': 1.4.1 + '@ngrok/ngrok-darwin-universal': 1.4.1 + '@ngrok/ngrok-darwin-x64': 1.4.1 + '@ngrok/ngrok-freebsd-x64': 1.4.1 + '@ngrok/ngrok-linux-arm-gnueabihf': 1.4.1 + '@ngrok/ngrok-linux-arm64-gnu': 1.4.1 + '@ngrok/ngrok-linux-arm64-musl': 1.4.1 + '@ngrok/ngrok-linux-x64-gnu': 1.4.1 + '@ngrok/ngrok-linux-x64-musl': 1.4.1 + '@ngrok/ngrok-win32-ia32-msvc': 1.4.1 + '@ngrok/ngrok-win32-x64-msvc': 1.4.1 + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -17390,7 +17535,7 @@ snapshots: '@redocly/ajv': 8.11.2 '@redocly/config': 0.12.1 colorette: 1.4.0 - https-proxy-agent: 7.0.5 + https-proxy-agent: 7.0.6 js-levenshtein: 1.1.6 js-yaml: 4.1.0 lodash.isequal: 4.5.0 @@ -18341,7 +18486,7 @@ snapshots: ts-dedent: 2.2.0 type-fest: 2.19.0 vue: 3.5.13(typescript@5.7.2) - vue-component-type-helpers: 2.2.4 + vue-component-type-helpers: 2.2.8 '@supabase/auth-js@2.65.0': dependencies: @@ -19478,6 +19623,8 @@ snapshots: transitivePeerDependencies: - supports-color + agent-base@7.1.3: {} + agentkeepalive@4.2.1: dependencies: debug: 4.4.0(supports-color@8.1.1) @@ -22138,7 +22285,7 @@ snapshots: gaxios@6.6.0(encoding@0.1.13): dependencies: extend: 3.0.2 - https-proxy-agent: 7.0.5 + https-proxy-agent: 7.0.6 is-stream: 2.0.1 node-fetch: 2.7.0(encoding@0.1.13) uuid: 9.0.1 @@ -22567,16 +22714,9 @@ snapshots: transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.2: + https-proxy-agent@7.0.6: dependencies: - agent-base: 7.1.0 - debug: 4.4.0(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - https-proxy-agent@7.0.5: - dependencies: - agent-base: 7.1.0 + agent-base: 7.1.3 debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -23443,7 +23583,7 @@ snapshots: form-data: 4.0.0 html-encoding-sniffer: 4.0.0 http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.5 + https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 nwsapi: 2.2.7 parse5: 7.1.2 @@ -26394,7 +26534,7 @@ snapshots: fastest-levenshtein: 1.0.16 generic-pool: 3.9.0 glob: 10.4.5 - https-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 jsonwebtoken: 9.0.2 mime-types: 2.1.35 mkdirp: 1.0.4 @@ -27624,6 +27764,8 @@ snapshots: vue-component-type-helpers@2.2.4: {} + vue-component-type-helpers@2.2.8: {} + vue-demi@0.14.10(vue@3.5.13(typescript@5.7.2)): dependencies: vue: 3.5.13(typescript@5.7.2) From 0c94d7863e9d29c36b5a448579f6599ba2068b66 Mon Sep 17 00:00:00 2001 From: Jason Date: Wed, 5 Mar 2025 11:27:20 +0800 Subject: [PATCH 2/2] correct the comments in proxy setting --- .../nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts b/packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts index 1bb416fa68..f868815a6d 100644 --- a/packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts +++ b/packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts @@ -354,13 +354,8 @@ export class LmChatOpenAi implements INodeType { configuration.baseURL = credentials.url as string; } - // process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; // set ODE_TLS_REJECT_UNAUTHORIZED to '0' value in order to skip SSL trust issue(i.e. self cert) - // e.g. if you use ProxyMan, you can add the following two values in your n8n config file, i.e. ~/.n8n/config: - // "https_proxy":"http://127.0.0.1:9091", - // "NODE_TLS_REJECT_UNAUTHORIZED":"0" - // - // This does NOT work by setting the value in terminal as following: + // This works by setting the value in terminal as following: // export https_proxy=http://127.0.0.1:9091 NODE_TLS_REJECT_UNAUTHORIZED=0 const httpProxy = process.env.http_proxy ?? process.env.https_proxy; if (httpProxy) {