diff --git a/packages/openai-adapters/src/apis/OpenAI.test.ts b/packages/openai-adapters/src/apis/OpenAI.test.ts new file mode 100644 index 0000000000..9f2a5d05a0 --- /dev/null +++ b/packages/openai-adapters/src/apis/OpenAI.test.ts @@ -0,0 +1,33 @@ +import { describe, expect, test } from "vitest"; +import { OpenAIApi } from "./OpenAI.js"; + +describe("OpenAIApi", () => { + test("converts Continue request timeout seconds to OpenAI SDK milliseconds", () => { + const api = new OpenAIApi({ + provider: "openai", + apiKey: "test-api-key", + requestOptions: { timeout: 300 }, + }); + + expect(api.openai.timeout).toBe(300_000); + }); + + test("preserves an omitted timeout so the OpenAI SDK default still applies", () => { + const api = new OpenAIApi({ + provider: "openai", + apiKey: "test-api-key", + }); + + expect(api.openai.timeout).toBe(600_000); + }); + + test("preserves an explicit zero timeout instead of treating it as omitted", () => { + const api = new OpenAIApi({ + provider: "openai", + apiKey: "test-api-key", + requestOptions: { timeout: 0 }, + }); + + expect(api.openai.timeout).toBe(0); + }); +}); diff --git a/packages/openai-adapters/src/apis/OpenAI.ts b/packages/openai-adapters/src/apis/OpenAI.ts index d0f8d30ca3..5012002dcf 100644 --- a/packages/openai-adapters/src/apis/OpenAI.ts +++ b/packages/openai-adapters/src/apis/OpenAI.ts @@ -32,6 +32,10 @@ import { toResponsesParams, } from "./openaiResponses.js"; +function toOpenAISdkTimeout(timeoutSeconds?: number): number | undefined { + return timeoutSeconds === undefined ? undefined : timeoutSeconds * 1000; +} + export class OpenAIApi implements BaseLlmApi { openai: OpenAI; apiBase: string = "https://api.openai.com/v1/"; @@ -45,7 +49,7 @@ export class OpenAIApi implements BaseLlmApi { apiKey: config.apiKey ?? "", baseURL: this.apiBase, fetch: customFetch(config.requestOptions), - timeout: config?.requestOptions?.timeout || undefined, + timeout: toOpenAISdkTimeout(config?.requestOptions?.timeout), }); } modifyChatBody(body: T): T {