{"record":{"id":"ced824bce3cec141","repo":"bytedance/deer-flow","slug":"failed-to-delete-agent-res-statustext","errorCode":null,"errorMessage":"Failed to delete agent: ${res.statusText}","messagePattern":"Failed to delete agent: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"frontend/src/core/agents/api.ts","lineNumber":88,"sourceCode":"  request: UpdateAgentRequest,\n): Promise<Agent> {\n  const res = await fetch(`${getBackendBaseURL()}/api/agents/${name}`, {\n    method: \"PUT\",\n    headers: { \"Content-Type\": \"application/json\" },\n    body: JSON.stringify(request),\n  });\n  if (!res.ok) {\n    const err = (await res.json().catch(() => ({}))) as { detail?: string };\n    throw new Error(err.detail ?? `Failed to update agent: ${res.statusText}`);\n  }\n  return res.json() as Promise<Agent>;\n}\n\nexport async function deleteAgent(name: string): Promise<void> {\n  const res = await fetch(`${getBackendBaseURL()}/api/agents/${name}`, {\n    method: \"DELETE\",\n  });\n  if (!res.ok) throw new Error(`Failed to delete agent: ${res.statusText}`);\n}\n\nexport async function checkAgentName(\n  name: string,\n): Promise<{ available: boolean; name: string }> {\n  let res: Response;\n  try {\n    res = await fetch(\n      `${getBackendBaseURL()}/api/agents/check?name=${encodeURIComponent(name)}`,\n    );\n  } catch {\n    throw new AgentNameCheckError(\n      \"Could not reach the DeerFlow backend.\",\n      \"backend_unreachable\",\n    );\n  }\n\n  if (!res.ok) {","sourceCodeStart":70,"sourceCodeEnd":106,"githubUrl":"https://github.com/bytedance/deer-flow/blob/1dd6ba1acb03700589994b0366c5d1c7d05e2eff/frontend/src/core/agents/api.ts#L70-L106","documentation":"Raised when backend_config contains any of the removed custom HTTP client fields tracked in _REMOVED_CUSTOM_HTTP_FIELDS (old knobs for client class, transport, or TLS tuning). Those fields moved into fixed behavior of the managed HTTP client, and the sorted offender list is appended to the message so you know exactly what to delete.","triggerScenarios":"An openviking backend_config carrying any removed custom-HTTP key (the message lists them) survives into a newer backend version. Detected during from_backend_config, before the client is built.","commonSituations":"Version upgrade with stale config.yaml; reusing a config tuned for an older client implementation; copying a blog or example config that still sets transport-level fields the backend now owns.","solutions":["Remove every field named in the error message from the openviking backend_config block.","Map any real need (timeouts, retries) onto supported fields such as timeout_seconds instead of the removed client-level knobs.","Re-run startup afterwards; the unknown-field check (error 607) catches any leftovers."],"exampleFix":"# before\nbackend_config:\n  http_client: custom.client\n  timeout_seconds: 30\n\n# after\nbackend_config:\n  timeout_seconds: 30  # only supported fields remain","handlingStrategy":"validation","validationCode":"REMOVED_HTTP_FIELDS = {'http_client', 'client_cls', 'verify', 'retries'}  # mirror _REMOVED_CUSTOM_HTTP_FIELDS\n\n\ndef lint_custom_http_fields(cfg: dict) -> None:\n    hits = sorted(REMOVED_HTTP_FIELDS.intersection(cfg))\n    assert not hits, f'removed custom HTTP fields present: {hits}'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat transport-level tuning in backend_config as suspect after an upgrade; check the current example config.","Keep a canonical, version-pinned config per backend version in your repo.","Map real needs onto supported knobs (timeout_seconds) instead of client internals."],"tags":["openviking","configuration","migration","breaking-change","http-client"],"backgroundTag":null,"analyzedSha":"1dd6ba1acb03700589994b0366c5d1c7d05e2eff","analyzedAt":"2026-08-14T21:20:34.804Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}