workflow_loader.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import json
  2. import os
  3. from app.service.spec.step import Step
  4. from app.service.spec.workflow import Workflow
  5. def load_from_directory(template_dir: str) -> Workflow:
  6. content_path = os.path.join(template_dir, "content.json")
  7. if not os.path.isfile(content_path):
  8. raise FileNotFoundError(f"content.json not found in {template_dir}")
  9. with open(content_path, "r", encoding="utf-8") as f:
  10. root = json.load(f)
  11. workflow = _parse_workflow(root)
  12. workflow.template_path = template_dir
  13. return workflow
  14. def _parse_workflow(root: dict) -> Workflow:
  15. flow = Workflow(
  16. version=root.get("version", ""),
  17. inputs=root.get("inputs") or {},
  18. outputs=root.get("outputs") or {},
  19. order=root.get("order") or [],
  20. )
  21. steps: dict[str, Step] = {}
  22. for step_id in flow.order:
  23. node = root.get(step_id)
  24. if node is None:
  25. continue
  26. step = Step(
  27. id=step_id,
  28. type=node.get("type", ""),
  29. resources=node.get("resources", ""),
  30. inputs=node.get("inputs") or {},
  31. outputs=node.get("outputs") or {},
  32. retry_count=node.get("retryCount", 0),
  33. )
  34. steps[step_id] = step
  35. flow.steps = steps
  36. return flow