run.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. from datetime import datetime
  2. from typing import TYPE_CHECKING
  3. from pydantic import BaseModel, Field
  4. from core_domain import (
  5. InitialNodeContract,
  6. NodeExecutionRequestContract,
  7. NodeRunContract,
  8. NodeRunStatusUpdateContract,
  9. RunBootstrapContract,
  10. RunCreateContract,
  11. RunExecutionRequestContract,
  12. WorkflowRunStatusUpdateContract,
  13. WorkflowRunContract,
  14. )
  15. from core_shared import JSONValue
  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. tenant_id: str
  63. human_task_id: str
  64. worker_key: str | None = None
  65. class ExecutionLogResponse(BaseModel):
  66. id: str
  67. tenant_id: str
  68. run_id: str
  69. node_run_id: str | None = None
  70. event_type: str
  71. level: str
  72. message: str
  73. detail_json: dict[str, JSONValue] | None = None
  74. created_time: datetime
  75. @classmethod
  76. def from_entity(cls, entity: "ExecutionLog") -> "ExecutionLogResponse":
  77. return cls.model_validate(entity, from_attributes=True)
  78. class NodeArtifactResponse(BaseModel):
  79. id: str
  80. tenant_id: str
  81. run_id: str
  82. node_run_id: str
  83. node_id: str
  84. artifact_type: str
  85. name: str
  86. mime_type: str | None = None
  87. content_text: str | None = None
  88. content_json: dict[str, JSONValue] | None = None
  89. storage_uri: str | None = None
  90. size_bytes: int | None = None
  91. created_time: datetime
  92. @classmethod
  93. def from_entity(cls, entity: "NodeArtifact") -> "NodeArtifactResponse":
  94. return cls.model_validate(entity, from_attributes=True)
  95. class TraceSpanResponse(BaseModel):
  96. id: str
  97. tenant_id: str
  98. run_id: str
  99. node_run_id: str | None = None
  100. parent_span_id: str | None = None
  101. span_type: str
  102. name: str
  103. status: str
  104. started_time: datetime
  105. ended_time: datetime | None = None
  106. duration_ms: int | None = None
  107. attributes_json: dict[str, JSONValue] | None = None
  108. error_code: str | None = None
  109. error_message: str | None = None
  110. created_time: datetime
  111. @classmethod
  112. def from_entity(cls, entity: "TraceSpan") -> "TraceSpanResponse":
  113. return cls.model_validate(entity, from_attributes=True)
  114. class RuntimeDebugSnapshotResponse(BaseModel):
  115. run: WorkflowRunResponse
  116. node_runs: list[NodeRunResponse]
  117. run_state_json: dict[str, JSONValue]
  118. node_output_json_by_node_id: dict[str, dict[str, JSONValue]]
  119. node_output_text_by_node_id: dict[str, str]
  120. queued_node_ids: list[str]
  121. running_node_ids: list[str]
  122. completed_node_ids: list[str]
  123. failed_node_ids: list[str]
  124. execution_logs: list[ExecutionLogResponse]
  125. node_artifacts: list[NodeArtifactResponse]
  126. trace_spans: list[TraceSpanResponse]
  127. class RuntimeDebugStepResponse(BaseModel):
  128. snapshot: RuntimeDebugSnapshotResponse
  129. executed_node_runs: list[NodeRunResponse]
  130. executor_names: list[str]
  131. paused_before_node_id: str | None = None
  132. reason: str