run.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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 WorkflowRunListRequest(BaseModel):
  23. session_id: str | None = None
  24. limit: int = Field(default=50, ge=1, le=500)
  25. class NodeRunListRequest(BaseModel):
  26. run_id: str
  27. class ExecutionLogListRequest(BaseModel):
  28. run_id: str | None = None
  29. node_run_id: str | None = None
  30. class NodeArtifactListRequest(BaseModel):
  31. run_id: str | None = None
  32. node_run_id: str | None = None
  33. artifact_type: str | None = None
  34. class TraceSpanListRequest(BaseModel):
  35. run_id: str | None = None
  36. node_run_id: str | None = None
  37. span_type: str | None = None
  38. class RuntimeDebugSnapshotRequest(BaseModel):
  39. run_id: str
  40. class WorkflowRunResponse(WorkflowRunContract):
  41. @classmethod
  42. def from_entity(cls, entity: "WorkflowRun") -> "WorkflowRunResponse":
  43. return cls.model_validate(entity, from_attributes=True)
  44. class NodeRunResponse(NodeRunContract):
  45. @classmethod
  46. def from_entity(cls, entity: "NodeRun") -> "NodeRunResponse":
  47. return cls.model_validate(entity, from_attributes=True)
  48. class RunBootstrapResponse(RunBootstrapContract):
  49. run: WorkflowRunResponse
  50. initial_node: NodeRunResponse | None = None
  51. class WorkflowRunStatusUpdateRequest(WorkflowRunStatusUpdateContract):
  52. pass
  53. class NodeRunStatusUpdateRequest(NodeRunStatusUpdateContract):
  54. pass
  55. class NodeRunExecuteRequest(NodeExecutionRequestContract):
  56. pass
  57. class NodeRunExecuteResponse(BaseModel):
  58. run: WorkflowRunResponse
  59. node_run: NodeRunResponse
  60. executor_name: str
  61. class RunExecuteRequest(RunExecutionRequestContract):
  62. pass
  63. class RunExecuteResponse(BaseModel):
  64. run: WorkflowRunResponse
  65. node_runs: list[NodeRunResponse]
  66. executor_names: list[str]
  67. class RuntimeDebugContinueRequest(BaseModel):
  68. worker_key: str | None = None
  69. max_steps: int = Field(default=32, ge=1, le=500)
  70. breakpoint_node_ids: list[str] = Field(default_factory=list)
  71. class WorkerExecuteNextRequest(BaseModel):
  72. worker_key: str
  73. lease_seconds: int | None = Field(default=None, gt=0)
  74. class WorkerExecuteNextResponse(BaseModel):
  75. run: WorkflowRunResponse
  76. node_run: NodeRunResponse
  77. executor_name: str
  78. released_lease_count: int = 0
  79. class HumanNodeResumeRequest(BaseModel):
  80. human_task_id: str
  81. worker_key: str | None = None
  82. class ExecutionLogResponse(BaseModel):
  83. id: str
  84. run_id: str
  85. node_run_id: str | None = None
  86. event_type: str
  87. level: str
  88. message: str
  89. detail_json: dict[str, JSONValue] | None = None
  90. created_time: datetime
  91. @classmethod
  92. def from_entity(cls, entity: "ExecutionLog") -> "ExecutionLogResponse":
  93. return cls.model_validate(entity, from_attributes=True)
  94. class NodeArtifactResponse(BaseModel):
  95. id: str
  96. run_id: str
  97. node_run_id: str
  98. node_id: str
  99. artifact_type: str
  100. name: str
  101. mime_type: str | None = None
  102. content_text: str | None = None
  103. content_json: dict[str, JSONValue] | None = None
  104. storage_uri: str | None = None
  105. size_bytes: int | None = None
  106. created_time: datetime
  107. @classmethod
  108. def from_entity(cls, entity: "NodeArtifact") -> "NodeArtifactResponse":
  109. return cls.model_validate(entity, from_attributes=True)
  110. class TraceSpanResponse(BaseModel):
  111. id: str
  112. run_id: str
  113. node_run_id: str | None = None
  114. parent_span_id: str | None = None
  115. span_type: str
  116. name: str
  117. status: str
  118. started_time: datetime
  119. ended_time: datetime | None = None
  120. duration_ms: int | None = None
  121. attributes_json: dict[str, JSONValue] | None = None
  122. error_code: str | None = None
  123. error_message: str | None = None
  124. created_time: datetime
  125. @classmethod
  126. def from_entity(cls, entity: "TraceSpan") -> "TraceSpanResponse":
  127. return cls.model_validate(entity, from_attributes=True)
  128. class RuntimeDebugSnapshotResponse(BaseModel):
  129. run: WorkflowRunResponse
  130. node_runs: list[NodeRunResponse]
  131. run_state_json: dict[str, JSONValue]
  132. node_output_json_by_node_id: dict[str, dict[str, JSONValue]]
  133. node_output_text_by_node_id: dict[str, str]
  134. queued_node_ids: list[str]
  135. running_node_ids: list[str]
  136. completed_node_ids: list[str]
  137. failed_node_ids: list[str]
  138. execution_logs: list[ExecutionLogResponse]
  139. node_artifacts: list[NodeArtifactResponse]
  140. trace_spans: list[TraceSpanResponse]
  141. class RuntimeDebugStepResponse(BaseModel):
  142. snapshot: RuntimeDebugSnapshotResponse
  143. executed_node_runs: list[NodeRunResponse]
  144. executor_names: list[str]
  145. paused_before_node_id: str | None = None
  146. reason: str