Skip to content

Commit 7fa008c

Browse files
authored
refactor: remove deprecated openai-error-handler shim and use error-handler (#767)
* refactor: remove deprecated openai-error-handler and consolidate into error-handler Replace all imports of the deprecated `openai-error-handler` shim with `error-handler`, which has been the canonical source since #10204. Delete `openai-error-handler.ts` and its duplicate test file, as `error-handler.spec.ts` already covers the same behavior. Signed-off-by: daewoongoh <dw.oh@samsung.com> * test(deepseek): add test for API error handling in createMessage Cover the catch block that wraps API errors via handleOpenAIError, fixing 0% patch coverage on the error path. Signed-off-by: daewoongoh <dw.oh@samsung.com> * refactor(deepseek): convert dynamic import to static for handleOpenAIError Replace dynamic `await import()` with a static import for `handleOpenAIError` in the catch block, and update the error handler test to also assert the HTTP status code (401) on the thrown error. Signed-off-by: daewoongoh <dw.oh@samsung.com> --------- Signed-off-by: daewoongoh <dw.oh@samsung.com>
1 parent fa3af3f commit 7fa008c

15 files changed

Lines changed: 23 additions & 217 deletions

File tree

src/api/providers/__tests__/deepseek.spec.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,17 @@ describe("DeepSeekHandler", () => {
426426
expect(chunks).toContainEqual({ type: "reasoning", text: "router-style thought" })
427427
})
428428

429+
it("should throw a wrapped error when the API call fails", async () => {
430+
const apiError = Object.assign(new Error("Invalid API key"), { status: 401 })
431+
mockCreate.mockRejectedValueOnce(apiError)
432+
433+
const stream = handler.createMessage(systemPrompt, messages)
434+
const err = await stream.next().catch((e) => e)
435+
436+
expect(err.message).toBe("DeepSeek completion error: Invalid API key")
437+
expect((err as any).status).toBe(401)
438+
})
439+
429440
it("prefers delta.reasoning_content over delta.reasoning when both are present", async () => {
430441
mockCreate.mockImplementationOnce(async () => ({
431442
[Symbol.asyncIterator]: async function* () {

src/api/providers/base-openai-compatible-provider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { convertToOpenAiMessages } from "../transform/openai-format"
1111
import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index"
1212
import { DEFAULT_HEADERS } from "./constants"
1313
import { BaseProvider } from "./base-provider"
14-
import { handleOpenAIError } from "./utils/openai-error-handler"
14+
import { handleOpenAIError } from "./utils/error-handler"
1515
import { calculateApiCostOpenAI } from "../../shared/cost"
1616
import { extractReasoningFromDelta } from "./utils/extract-reasoning"
1717

src/api/providers/deepseek.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { convertToR1Format } from "../transform/r1-format"
1818
import { OpenAiHandler } from "./openai"
1919
import { extractReasoningFromDelta } from "./utils/extract-reasoning"
2020
import type { ApiHandlerCreateMessageMetadata } from "../index"
21+
import { handleOpenAIError } from "./utils/error-handler"
2122

2223
// Custom interface for DeepSeek params to support thinking mode
2324
type DeepSeekChatCompletionParams = Omit<OpenAI.Chat.ChatCompletionCreateParamsStreaming, "reasoning_effort"> & {
@@ -137,7 +138,6 @@ export class DeepSeekHandler extends OpenAiHandler {
137138
isAzureAiInference ? { path: OPENAI_AZURE_AI_INFERENCE_PATH } : {},
138139
)
139140
} catch (error) {
140-
const { handleOpenAIError } = await import("./utils/openai-error-handler")
141141
throw handleOpenAIError(error, "DeepSeek")
142142
}
143143

src/api/providers/lm-studio.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { ApiStream } from "../transform/stream"
1515
import { BaseProvider } from "./base-provider"
1616
import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index"
1717
import { getModelsFromCache } from "./fetchers/modelCache"
18-
import { handleOpenAIError } from "./utils/openai-error-handler"
18+
import { handleOpenAIError } from "./utils/error-handler"
1919

2020
export class LmStudioHandler extends BaseProvider implements SingleCompletionHandler {
2121
protected options: ApiHandlerOptions

src/api/providers/openai.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { getModelParams } from "../transform/model-params"
2222
import { DEFAULT_HEADERS } from "./constants"
2323
import { BaseProvider } from "./base-provider"
2424
import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index"
25-
import { handleOpenAIError } from "./utils/openai-error-handler"
25+
import { handleOpenAIError } from "./utils/error-handler"
2626
import { extractReasoningFromDelta } from "./utils/extract-reasoning"
2727

2828
// TODO: Rename this to OpenAICompatibleHandler. Also, I think the

src/api/providers/openrouter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import { getModelEndpoints } from "./fetchers/modelEndpointCache"
3636
import { DEFAULT_HEADERS } from "./constants"
3737
import { BaseProvider } from "./base-provider"
3838
import type { ApiHandlerCreateMessageMetadata, SingleCompletionHandler } from "../index"
39-
import { handleOpenAIError } from "./utils/openai-error-handler"
39+
import { handleOpenAIError } from "./utils/error-handler"
4040
import { generateImageWithProvider, ImageGenerationResult } from "./utils/image-generation"
4141
import { applyRouterToolPreferences } from "./utils/router-tool-preferences"
4242

src/api/providers/requesty.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { getModels } from "./fetchers/modelCache"
1616
import { BaseProvider } from "./base-provider"
1717
import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index"
1818
import { toRequestyServiceUrl } from "../../shared/utils/requesty"
19-
import { handleOpenAIError } from "./utils/openai-error-handler"
19+
import { handleOpenAIError } from "./utils/error-handler"
2020
import { applyRouterToolPreferences } from "./utils/router-tool-preferences"
2121
import { extractReasoningFromDelta } from "./utils/extract-reasoning"
2222

src/api/providers/unbound.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { DEFAULT_HEADERS } from "./constants"
1515
import { getModels } from "./fetchers/modelCache"
1616
import { BaseProvider } from "./base-provider"
1717
import type { SingleCompletionHandler, ApiHandlerCreateMessageMetadata } from "../index"
18-
import { handleOpenAIError } from "./utils/openai-error-handler"
18+
import { handleOpenAIError } from "./utils/error-handler"
1919
import { applyRouterToolPreferences } from "./utils/router-tool-preferences"
2020
import { extractReasoningFromDelta } from "./utils/extract-reasoning"
2121

src/api/providers/utils/__tests__/openai-error-handler.spec.ts

Lines changed: 0 additions & 186 deletions
This file was deleted.

src/api/providers/utils/openai-error-handler.ts

Lines changed: 0 additions & 19 deletions
This file was deleted.

0 commit comments

Comments
 (0)