OpenBMB/ChatDev · error · WorkflowExecutionError

Failed to copy workflow file

Error message

Failed to copy workflow file

What it means

copy_workflow reads the source file and writes it to the target inside one try/except; any IO failure (source unreadable, target unwritable, disk full) is logged and re-raised as WorkflowExecutionError with source/target details.

Solutions

  1. Check logs for the underlying exception
  2. Verify read permission on source and write permission on the directory
  3. Retry once after re-validating both files' existence
  4. Free disk space

Example fix

# before
copy_workflow_file(sid, src, tgt)
# after
try:
    copy_workflow_file(sid, src, tgt)
except WorkflowExecutionError:
    if not workflow_exists(sid, src):
        raise ResourceGone(src)
    raise
Defensive patterns

Strategy: try-catch

Validate before calling

assert (directory/src).is_file() and os.access(directory, os.W_OK)

Try / catch

try:
    copy_workflow_file(sid, src, tgt)
except WorkflowExecutionError as e:
    handle_io_failure(e.details)  # check source gone vs perms vs disk

Prevention

When it happens

Trigger: Permissions changed between the existence check and the read/write; source deleted concurrently (TOCTOU); disk full; read-only volume for the target.

Common situations: Container with read-only workflows mount; concurrent deletion; quota exhausted.

Related errors


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

Appendix: source

Thrown at server/services/workflow_storage.py:196

        raise ResourceNotFoundError(
            "Workflow file not found",
            resource_type="workflow",
            resource_id=source_safe,
        )

    if target_path.exists():
        raise ResourceConflictError(
            "Target workflow already exists",
            resource_type="workflow",
            resource_id=target_safe,
        )

    logger = get_server_logger()
    try:
        target_path.write_text(source_path.read_text(encoding="utf-8"), encoding="utf-8")
    except Exception as exc:
        logger.log_exception(exc, f"Failed to copy workflow file {source_safe} to {target_safe}")
        raise WorkflowExecutionError(
            "Failed to copy workflow file",
            details={"source": source_safe, "target": target_safe},
        )

    logger.info(
        "Workflow file copied",
        log_type=LogType.WORKFLOW,
        source=source_safe,
        target=target_safe,
        action="copy",
    )

View on GitHub (pinned to 4fb2db0ea9)