diff --git a/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/openai_utils.test.ts b/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/openai_utils.test.ts index 656982525cd0e..b480b72859183 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/openai_utils.test.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/openai_utils.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { sanitizeRequest, getRequestWithStreamOption } from './openai_utils'; +import { sanitizeRequest, getRequestWithStreamOption, removeEndpointFromUrl } from './openai_utils'; import { DEFAULT_OPENAI_MODEL, OPENAI_CHAT_URL, @@ -182,4 +182,22 @@ describe('Open AI Utils', () => { expect(sanitizedBodyString).toEqual(bodyString); }); }); + describe('removeEndpointFromUrl', () => { + test('removes "/chat/completions" from the end of the URL', () => { + const originalUrl = 'https://api.openai.com/v1/chat/completions'; + const expectedUrl = 'https://api.openai.com/v1'; + expect(removeEndpointFromUrl(originalUrl)).toBe(expectedUrl); + }); + + test('does not modify the URL if it does not end with "/chat/completions"', () => { + const originalUrl = 'https://api.openai.com/v1/some/other/endpoint'; + expect(removeEndpointFromUrl(originalUrl)).toBe(originalUrl); + }); + + test('handles URLs with a trailing slash correctly', () => { + const originalUrl = 'https://api.openai.com/v1/chat/completions/'; + const expectedUrl = 'https://api.openai.com/v1'; + expect(removeEndpointFromUrl(originalUrl)).toBe(expectedUrl); + }); + }); }); diff --git a/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/openai_utils.ts b/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/openai_utils.ts index 56ad69b056cb9..7dac5f4692bda 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/openai_utils.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/openai/lib/openai_utils.ts @@ -49,3 +49,10 @@ export const getRequestWithStreamOption = ( return body; }; + +// removes the chat completions endpoint from the OpenAI url in order +// to provide the correct endpoint for the OpenAI node package +export const removeEndpointFromUrl = (url: string): string => { + const endpointToRemove = /\/chat\/completions\/?$/; + return url.replace(endpointToRemove, ''); +}; diff --git a/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.ts b/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.ts index 75bcf75496b2f..2a7fc90bc4c68 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.ts @@ -16,6 +16,7 @@ import { ChatCompletionMessageParam, } from 'openai/resources/chat/completions'; import { Stream } from 'openai/streaming'; +import { removeEndpointFromUrl } from './lib/openai_utils'; import { RunActionParamsSchema, RunActionResponseSchema, @@ -76,7 +77,7 @@ export class OpenAIConnector extends SubActionConnector { }, }) : new OpenAI({ - baseURL: this.config.apiUrl, + baseURL: removeEndpointFromUrl(this.config.apiUrl), apiKey: this.secrets.apiKey, defaultHeaders: { ...this.config.headers,