run.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. from datetime import datetime
  2. from typing import TYPE_CHECKING
  3. from core_domain import (
  4. InitialNodeContract,
  5. NodeExecutionRequestContract,
  6. NodeRunContract,
  7. NodeRunStatusUpdateContract,
  8. RunBootstrapContract,
  9. RunCreateContract,
  10. RunExecutionRequestContract,
  11. WorkflowRunContract,
  12. WorkflowRunStatusUpdateContract,
  13. )
  14. from core_shared import JSONValue
  15. from pydantic import BaseModel, Field
  16. if TYPE_CHECKING:
  17. from app.db.models import ExecutionLog, NodeArtifact, NodeRun, TraceSpan, WorkflowRun
  18. class InitialNodeCreateRequest(InitialNodeContract):
  19. pass
  20. class RunCreateRequest(RunCreateContract):
  21. initial_node: InitialNodeCreateRequest | None = None
  22. class WorkflowRunResponse(WorkflowRunContract):
  23. @classmethod
  24. def from_entity(cls, entity: "WorkflowRun") -> "WorkflowRunResponse":
  25. return cls.model_validate(entity, from_attributes=True)
  26. class NodeRunResponse(NodeRunContract):
  27. @classmethod
  28. def from_entity(cls, entity: "NodeRun") -> "NodeRunResponse":
  29. return cls.model_validate(entity, from_attributes=True)
  30. class RunBootstrapResponse(RunBootstrapContract):
  31. run: WorkflowRunResponse
  32. initial_node: NodeRunResponse | None = None
  33. class WorkflowRunStatusUpdateRequest(WorkflowRunStatusUpdateContract):
  34. pass
  35. class NodeRunStatusUpdateRequest(NodeRunStatusUpdateContract):
  36. pass
  37. class NodeRunExecuteRequest(NodeExecutionRequestContract):
  38. pass
  39. class NodeRunExecuteResponse(BaseModel):
  40. run: WorkflowRunResponse
  41. node_run: NodeRunResponse
  42. executor_name: str
  43. class RunExecuteRequest(RunExecutionRequestContract):
  44. pass
  45. class RunExecuteResponse(BaseModel):
  46. run: WorkflowRunResponse
  47. node_runs: list[NodeRunResponse]
  48. executor_names: list[str]
  49. class RuntimeDebugContinueRequest(BaseModel):
  50. worker_key: str | None = None
  51. max_steps: int = Field(default=32, ge=1, le=500)
  52. breakpoint_node_ids: list[str] = Field(default_factory=list)
  53. class WorkerExecuteNextRequest(BaseModel):
  54. worker_key: str
  55. lease_seconds: int | None = Field(default=None, gt=0)
  56. class WorkerExecuteNextResponse(BaseModel):
  57. run: WorkflowRunResponse
  58. node_run: NodeRunResponse
  59. executor_name: str
  60. released_lease_count: int = 0
  61. class HumanNodeResumeRequest(BaseModel):
  62. human_task_id: str
  63. worker_key: str | None = None
  64. class ExecutionLogResponse(BaseModel):
  65. id: str
  66. run_id: str
  67. node_run_id: str | None = None
  68. event_type: str
  69. level: str
  70. message: str
  71. detail_json: dict[str, JSONValue] | None = None
  72. created_time: datetime
  73. @classmethod
  74. def from_entity(cls, entity: "ExecutionLog") -> "ExecutionLogResponse":
  75. return cls.model_validate(entity, from_attributes=True)
  76. class NodeArtifactResponse(BaseModel):
  77. id: str
  78. run_id: str
  79. node_run_id: str
  80. node_id: str
  81. artifact_type: str
  82. name: str
  83. mime_type: str | None = None
  84. content_text: str | None = None
  85. content_json: dict[str, JSONValue] | None = None
  86. storage_uri: str | None = None
  87. size_bytes: int | None = None
  88. created_time: datetime
  89. @classmethod
  90. def from_entity(cls, entity: "NodeArtifact") -> "NodeArtifactResponse":
  91. return cls.model_validate(entity, from_attributes=True)
  92. class TraceSpanResponse(BaseModel):
  93. id: str
  94. run_id: str
  95. node_run_id: str | None = None
  96. parent_span_id: str | None = None
  97. span_type: str
  98. name: str
  99. status: str
  100. started_time: datetime
  101. ended_time: datetime | None = None
  102. duration_ms: int | None = None
  103. attributes_json: dict[str, JSONValue] | None = None
  104. error_code: str | None = None
  105. error_message: str | None = None
  106. created_time: datetime
  107. @classmethod
  108. def from_entity(cls, entity: "TraceSpan") -> "TraceSpanResponse":
  109. return cls.model_validate(entity, from_attributes=True)
  110. class RuntimeDebugSnapshotResponse(BaseModel):
  111. run: WorkflowRunResponse
  112. node_runs: list[NodeRunResponse]
  113. run_state_json: dict[str, JSONValue]
  114. node_output_json_by_node_id: dict[str, dict[str, JSONValue]]
  115. node_output_text_by_node_id: dict[str, str]
  116. queued_node_ids: list[str]
  117. running_node_ids: list[str]
  118. completed_node_ids: list[str]
  119. failed_node_ids: list[str]
  120. execution_logs: list[ExecutionLogResponse]
  121. node_artifacts: list[NodeArtifactResponse]
  122. trace_spans: list[TraceSpanResponse]
  123. class RuntimeDebugStepResponse(BaseModel):
  124. snapshot: RuntimeDebugSnapshotResponse
  125. executed_node_runs: list[NodeRunResponse]
  126. executor_names: list[str]
  127. paused_before_node_id: str | None = None
  128. reason: str