{"record":{"id":"9e673740e0a3ccca","repo":"different-ai/openwork","slug":"failed-to-delete-provider-response-status","errorCode":null,"errorMessage":"Failed to delete provider (${response.status}).","messagePattern":"Failed to delete provider \\((.+?)\\)\\.","errorType":"http","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"ee/apps/den-web/app/(den)/dashboard/_components/llm-provider-detail-screen.tsx","lineNumber":77,"sourceCode":"            !window.confirm(\n                `Delete ${provider.name}? This will remove its saved model list and access rules.`,\n            )\n        ) {\n            return;\n        }\n\n        setDeleteError(null);\n        try {\n            await runReauthableAction(\"delete-llm-provider\", async () => {\n                setDeleteBusy(true);\n                const { response, payload } = await requestJson(\n                    `/v1/llm-providers/${encodeURIComponent(provider.id)}`,\n                    { method: \"DELETE\" },\n                    12000,\n                );\n\n                if (response.status !== 204 && !response.ok) {\n                    throw getRequestError(payload, response, `Failed to delete provider (${response.status}).`);\n                }\n\n                await reloadProviders();\n                router.push(getLlmProvidersRoute(orgSlug));\n                router.refresh();\n            });\n        } catch (nextError) {\n            setDeleteError(\n                nextError instanceof Error\n                    ? nextError.message\n                    : \"Could not delete the provider.\",\n            );\n        } finally {\n            setDeleteBusy(false);\n        }\n    }\n\n    if (busy && !provider) {","sourceCodeStart":59,"sourceCodeEnd":95,"githubUrl":"https://github.com/different-ai/openwork/blob/2b7df46e8ae1517d64c896c7793d2d52ec845669/ee/apps/den-web/app/(den)/dashboard/_components/llm-provider-detail-screen.tsx#L59-L95","documentation":"Thrown by deleteProvider in llm-provider-detail-screen.tsx when DELETE /v1/llm-providers/{id} (12s timeout) returns anything other than 204 or an ok status. getRequestError (den-flow.ts:527) wraps the server payload: 403 {error:'reauth'} becomes ReauthRequiredError, otherwise the message is the server `error` text or \"Failed to delete provider (<status>).\".","triggerScenarios":"DELETE returns e.g. 400 (provider still referenced by workers/policies or is a built-in managed provider), 401/403 (not an org owner/admin, session expired), 404 (provider already deleted), 5xx. Note the success path explicitly accepts 204, so 200-with-body and 4xx/5xx all throw.","commonSituations":"Deleting the last provider while active workers still reference it; a non-admin member attempting deletion; double-delete from a stale detail page; trying to remove a Den-managed/built-in provider that is read-only.","solutions":["On 404, proceed as if deleted: refresh the providers list and navigate to the providers route.","On 400/409, detach workers, automations, or policies referencing the provider before deleting.","Verify the user has owner/admin org role for 401/403, and complete reauth when isReauthRequiredError is true.","If the provider is managed/built-in, disable it instead of deleting."],"exampleFix":"// before\nif (response.status !== 204 && !response.ok) {\n  throw getRequestError(payload, response, `Failed to delete provider (${response.status}).`);\n}\n// after\nif (response.status !== 204 && !response.ok) {\n  if (response.status === 404) {\n    await reloadProviders();\n    router.push(getLlmProvidersRoute(orgSlug));\n    return;\n  }\n  throw getRequestError(payload, response, `Failed to delete provider (${response.status}).`);\n}","handlingStrategy":"try-catch","validationCode":"// before deleting\nif (!provider?.id) throw new Error(\"No provider selected.\");\nif (!hasOrgAdminRole(userRole)) throw new Error(\"Only owners/admins can delete providers.\");\nif (provider.managed) throw new Error(\"Built-in providers cannot be deleted.\");","typeGuard":"function isReauthError(e: unknown): e is ReauthRequiredError {\n  return e instanceof ReauthRequiredError;\n}","tryCatchPattern":"try {\n  await deleteProvider(orgSlug, provider);\n} catch (error) {\n  if (isReauthError(error)) { startReauth(); return; }\n  if (/\\(404\\)/.test(error.message)) { router.push(getLlmProvidersRoute(orgSlug)); return; }\n  setDeleteError(error.message);\n}","preventionTips":["Confirm no workers/automations reference the provider before showing the delete button.","Hide delete for managed/built-in providers.","Gate the action on owner/admin role client-side.","Reload the provider list after delete so a double-delete 404 is handled as success."],"tags":["http","llm-providers","den-api","react-query"],"backgroundTag":"http-non-ok-response","analyzedSha":"2b7df46e8ae1517d64c896c7793d2d52ec845669","analyzedAt":"2026-09-01T07:59:23.713Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}