OpenBMB/ChatDev · warning · DesignError

Workflow logical issues detected for '{config_path}': {forma

Error message

Workflow logical issues detected for '{config_path}':
{formatted}

What it means

404 returned by the Vue graph content GET endpoint when the loader returns None, meaning the requested filename has no stored content. This is the expected not-found signal, distinct from the 500 read-failure path.

Source

Thrown at check/check.py:89

        raw_data = dict(raw_data)
        raw_data["vars"] = merged_vars

    data = prepare_design_mapping(raw_data, source=str(config_path))

    schema_errors = validate_design(data, set_defaults=set_defaults, fn_module_ref=fn_module)
    if schema_errors:
        formatted = "\n".join(f"- {err}" for err in schema_errors)
        raise DesignError(f"Design validation failed for '{config_path}':\n{formatted}")

    try:
        design = DesignConfig.from_dict(data, path="root")
    except ConfigError as exc:
        raise DesignError(f"Design parsing failed for '{config_path}': {exc}") from exc

    logic_errors = check_workflow_structure(data)
    if logic_errors:
        formatted = "\n".join(f"- {err}" for err in logic_errors)
        raise DesignError(f"Workflow logical issues detected for '{config_path}':\n{formatted}")
    else:
        print("Workflow OK.")

    graph = data.get("graph") or {}
    _ensure_supported(graph)

    return design


def check_config(yaml_content: Any) -> str:
    if not isinstance(yaml_content, dict):
        return "YAML root must be a mapping"

    # Skip placeholder resolution during save - users may configure env vars at runtime
    # Use yaml_content directly instead of prepare_design_mapping()
    schema_errors = validate_design(yaml_content)
    if schema_errors:
        formatted = "\n".join(f"- {err}" for err in schema_errors)

View on GitHub (pinned to 4fb2db0ea9)

Solutions

  1. List available graphs (or check storage) to confirm the exact filename.
  2. Re-upload/save the graph content if it should exist.
  3. Handle 404 gracefully in the client by prompting re-creation.
Defensive patterns

Strategy: type-guard

Validate before calling

const exists = await api.listGraphs().then(g => g.includes(filename));
if (!exists) return;

Type guard

async function graphExists(name: string): Promise<boolean> { return (await listGraphs()).includes(name); }

Try / catch

catch (e) { if (e.status === 404) offerToCreateGraph(filename); }

Prevention

When it happens

Trigger: GET graph content for a filename that was never uploaded, was deleted, or whose save failed earlier.

Common situations: Fetching a graph by a stale name after it was renamed/deleted; typos or wrong extension in the filename; frontend referencing graphs from an old environment.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of OpenBMB/ChatDev@4fb2db0ea9 (2026-08-27). Data as JSON: /api/errors/9c658ebc4170b06a. Report an issue: GitHub.