Просмотр исходного кода

fix(app): enhance error handling by unwrapping SDK-wrapped errors in formatServerError (#27061)

OpeOginni 3 месяцев назад
Родитель
Сommit
596f241db5

+ 13 - 0
packages/app/src/utils/server-errors.test.ts

@@ -128,4 +128,17 @@ describe("formatServerError", () => {
       ["Modelo nao encontrado: x/y", "Voce quis dizer: x/y2, x/y3", "Revise provider/model no config"].join("\n"),
     )
   })
+
+  test("unwraps SDK-wrapped errors from cause.body", () => {
+    const body = {
+      name: "ConfigInvalidError",
+      data: {
+        message: "Missing host",
+      },
+    } satisfies ConfigInvalidError
+
+    const wrapped = new Error("ConfigInvalidError", { cause: { body, status: 400 } })
+
+    expect(formatServerError(wrapped, language.t)).toBe("Arquivo de config em config invalido: Missing host")
+  })
 })

+ 10 - 2
packages/app/src/utils/server-errors.ts

@@ -26,14 +26,22 @@ function tr(translator: Translator | undefined, key: string, text: string, vars?
 }
 
 export function formatServerError(error: unknown, translate?: Translator, fallback?: string) {
-  if (isConfigInvalidErrorLike(error)) return parseReadableConfigInvalidError(error, translate)
-  if (isProviderModelNotFoundErrorLike(error)) return parseReadableProviderModelNotFoundError(error, translate)
+  const unwrapped = unwrapNamedError(error)
+  if (isConfigInvalidErrorLike(unwrapped)) return parseReadableConfigInvalidError(unwrapped, translate)
+  if (isProviderModelNotFoundErrorLike(unwrapped)) return parseReadableProviderModelNotFoundError(unwrapped, translate)
   if (error instanceof Error && error.message) return error.message
   if (typeof error === "string" && error) return error
   if (fallback) return fallback
   return tr(translate, "error.chain.unknown", "Unknown error")
 }
 
+function unwrapNamedError(error: unknown): unknown {
+  if (error instanceof Error && error.cause && typeof error.cause === "object" && "body" in error.cause) {
+    return (error.cause as Record<string, unknown>).body
+  }
+  return error
+}
+
 function isConfigInvalidErrorLike(error: unknown): error is ConfigInvalidError {
   if (typeof error !== "object" || error === null) return false
   const o = error as Record<string, unknown>