bytedance/deer-flow · error
Failed to delete agent: ${res.statusText}
Error message
Failed to delete agent: ${res.statusText} What it means
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.
Source
Thrown at frontend/src/core/agents/api.ts:88
request: UpdateAgentRequest,
): Promise<Agent> {
const res = await fetch(`${getBackendBaseURL()}/api/agents/${name}`, {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(request),
});
if (!res.ok) {
const err = (await res.json().catch(() => ({}))) as { detail?: string };
throw new Error(err.detail ?? `Failed to update agent: ${res.statusText}`);
}
return res.json() as Promise<Agent>;
}
export async function deleteAgent(name: string): Promise<void> {
const res = await fetch(`${getBackendBaseURL()}/api/agents/${name}`, {
method: "DELETE",
});
if (!res.ok) throw new Error(`Failed to delete agent: ${res.statusText}`);
}
export async function checkAgentName(
name: string,
): Promise<{ available: boolean; name: string }> {
let res: Response;
try {
res = await fetch(
`${getBackendBaseURL()}/api/agents/check?name=${encodeURIComponent(name)}`,
);
} catch {
throw new AgentNameCheckError(
"Could not reach the DeerFlow backend.",
"backend_unreachable",
);
}
if (!res.ok) {View on GitHub (pinned to 1dd6ba1acb)
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.
Example fix
# before backend_config: http_client: custom.client timeout_seconds: 30 # after backend_config: timeout_seconds: 30 # only supported fields remain
Defensive patterns
Strategy: validation
Validate before calling
REMOVED_HTTP_FIELDS = {'http_client', 'client_cls', 'verify', 'retries'} # mirror _REMOVED_CUSTOM_HTTP_FIELDS
def lint_custom_http_fields(cfg: dict) -> None:
hits = sorted(REMOVED_HTTP_FIELDS.intersection(cfg))
assert not hits, f'removed custom HTTP fields present: {hits}' Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- Failed to update agent: ${res.statusText}
- backend_unreachable
- request_failed
- Unable to recover SSE history after ${recoveryAttempts} atte
- Failed to submit feedback: ${res.status}
AI-assisted analysis of bytedance/deer-flow@1dd6ba1acb (2026-08-14).
Data as JSON: /api/errors/ced824bce3cec141.
Report an issue: GitHub.