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

  1. Remove every field named in the error message from the openviking backend_config block.
  2. Map any real need (timeouts, retries) onto supported fields such as timeout_seconds instead of the removed client-level knobs.
  3. 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

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


AI-assisted analysis of bytedance/deer-flow@1dd6ba1acb (2026-08-14). Data as JSON: /api/errors/ced824bce3cec141. Report an issue: GitHub.