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..005ee33808 100644 --- a/packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts +++ b/packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts @@ -104,8 +104,8 @@ export class LmChatOpenAi implements INodeType { properties: { // If the baseURL is not set or is set to api.openai.com, include only chat models pass: `={{ - ($parameter.options?.baseURL && !$parameter.options?.baseURL?.includes('api.openai.com')) || - ($credentials?.url && !$credentials.url.includes('api.openai.com')) || + ($parameter.options?.baseURL && !$parameter.options?.baseURL?.startsWith('https://api.openai.com/')) || + ($credentials?.url && !$credentials.url.startsWith('https://api.openai.com/')) || $responseItem.id.startsWith('ft:') || $responseItem.id.startsWith('o1') || $responseItem.id.startsWith('o3') || diff --git a/packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/methods/loadModels.ts b/packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/methods/loadModels.ts index 0badcfb682..acb0487ed7 100644 --- a/packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/methods/loadModels.ts +++ b/packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/methods/loadModels.ts @@ -15,8 +15,9 @@ export async function searchModels( const { data: models = [] } = await openai.models.list(); const filteredModels = models.filter((model: { id: string }) => { + const url = baseURL && new URL(baseURL); const isValidModel = - (baseURL && !baseURL.includes('api.openai.com')) || + (url && url.hostname !== 'api.openai.com') || model.id.startsWith('ft:') || model.id.startsWith('o1') || model.id.startsWith('o3') || diff --git a/packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/methods/listSearch.ts b/packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/methods/listSearch.ts index 33c1b9ef2d..158fb082e8 100644 --- a/packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/methods/listSearch.ts +++ b/packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/methods/listSearch.ts @@ -77,7 +77,8 @@ export async function modelSearch( filter?: string, ): Promise { const credentials = await this.getCredentials<{ url: string }>('openAiApi'); - const isCustomAPI = credentials.url && !credentials.url.includes('api.openai.com'); + const url = credentials.url && new URL(credentials.url); + const isCustomAPI = url && url.hostname !== 'api.openai.com'; return await getModelSearch( (model) => diff --git a/packages/nodes-base/credentials/CustomerIoApi.credentials.ts b/packages/nodes-base/credentials/CustomerIoApi.credentials.ts index abec2b2348..35c2a90e73 100644 --- a/packages/nodes-base/credentials/CustomerIoApi.credentials.ts +++ b/packages/nodes-base/credentials/CustomerIoApi.credentials.ts @@ -64,14 +64,14 @@ export class CustomerIoApi implements ICredentialType { requestOptions: IHttpRequestOptions, ): Promise { // @ts-ignore - const url = requestOptions.url ? requestOptions.url : requestOptions.uri; - if (url.includes('track') || url.includes('api.customer.io')) { + const url = new URL(requestOptions.url ? requestOptions.url : requestOptions.uri); + if (url.hostname === 'track.customer.io' || url.hostname === 'api.customer.io') { const basicAuthKey = Buffer.from( `${credentials.trackingSiteId}:${credentials.trackingApiKey}`, ).toString('base64'); // @ts-ignore Object.assign(requestOptions.headers, { Authorization: `Basic ${basicAuthKey}` }); - } else if (url.includes('beta-api.customer.io')) { + } else if (url.hostname === 'beta-api.customer.io') { // @ts-ignore Object.assign(requestOptions.headers, { Authorization: `Bearer ${credentials.appApiKey as string}`, diff --git a/packages/nodes-base/credentials/MindeeInvoiceApi.credentials.ts b/packages/nodes-base/credentials/MindeeInvoiceApi.credentials.ts index 497d6b120e..fefc840f34 100644 --- a/packages/nodes-base/credentials/MindeeInvoiceApi.credentials.ts +++ b/packages/nodes-base/credentials/MindeeInvoiceApi.credentials.ts @@ -27,8 +27,8 @@ export class MindeeInvoiceApi implements ICredentialType { requestOptions: IHttpRequestOptions, ): Promise { // @ts-ignore - const url = requestOptions.url ? requestOptions.url : requestOptions.uri; - if (url.includes('https://api.mindee.net/v1/')) { + const url = new URL(requestOptions.url ? requestOptions.url : requestOptions.uri); + if (url.hostname === 'api.mindee.net' && url.pathname.startsWith('/v1/')) { requestOptions.headers!.Authorization = `Token ${credentials.apiKey}`; } else { requestOptions.headers!['X-Inferuser-Token'] = `${credentials.apiKey}`; diff --git a/packages/nodes-base/credentials/MindeeReceiptApi.credentials.ts b/packages/nodes-base/credentials/MindeeReceiptApi.credentials.ts index 54f686d9b2..796869d737 100644 --- a/packages/nodes-base/credentials/MindeeReceiptApi.credentials.ts +++ b/packages/nodes-base/credentials/MindeeReceiptApi.credentials.ts @@ -27,8 +27,8 @@ export class MindeeReceiptApi implements ICredentialType { requestOptions: IHttpRequestOptions, ): Promise { // @ts-ignore - const url = requestOptions.url ? requestOptions.url : requestOptions.uri; - if (url.includes('https://api.mindee.net/v1/')) { + const url = new URL(requestOptions.url ? requestOptions.url : requestOptions.uri); + if (url.hostname === 'api.mindee.net' && url.pathname.startsWith('/v1/')) { requestOptions.headers!.Authorization = `Token ${credentials.apiKey}`; } else { requestOptions.headers!['X-Inferuser-Token'] = `${credentials.apiKey}`;