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
- List available graphs (or check storage) to confirm the exact filename.
- Re-upload/save the graph content if it should exist.
- 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
- Fetch the graph list before deep-linking to a graph
- Keep client references in sync with deletions
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
- Design validation failed for '{config_path}': {formatted}
- Design parsing failed for '{config_path}': {exc}
- 2
- 1
- No node types registered; cannot validate workflow
AI-assisted analysis of OpenBMB/ChatDev@4fb2db0ea9 (2026-08-27).
Data as JSON: /api/errors/9c658ebc4170b06a.
Report an issue: GitHub.