Skip to content

Commit 98d85e6

Browse files
authored
fix: WorkflowNodeExecution.created_at may be earlier than WorkflowRun.created_at (#11070)
1 parent 319d490 commit 98d85e6

File tree

2 files changed

+30
-29
lines changed

2 files changed

+30
-29
lines changed

api/core/app/task_pipeline/workflow_cycle_manage.py

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from collections.abc import Mapping, Sequence
44
from datetime import UTC, datetime
55
from typing import Any, Optional, Union, cast
6+
from uuid import uuid4
67

78
from sqlalchemy.orm import Session
89

@@ -80,38 +81,38 @@ def _handle_workflow_run_start(self) -> WorkflowRun:
8081

8182
inputs[f"sys.{key.value}"] = value
8283

83-
inputs = WorkflowEntry.handle_special_values(inputs)
84-
8584
triggered_from = (
8685
WorkflowRunTriggeredFrom.DEBUGGING
8786
if self._application_generate_entity.invoke_from == InvokeFrom.DEBUGGER
8887
else WorkflowRunTriggeredFrom.APP_RUN
8988
)
9089

90+
# handle special values
91+
inputs = WorkflowEntry.handle_special_values(inputs)
92+
9193
# init workflow run
92-
workflow_run = WorkflowRun()
93-
workflow_run_id = self._workflow_system_variables[SystemVariableKey.WORKFLOW_RUN_ID]
94-
if workflow_run_id:
95-
workflow_run.id = workflow_run_id
96-
workflow_run.tenant_id = self._workflow.tenant_id
97-
workflow_run.app_id = self._workflow.app_id
98-
workflow_run.sequence_number = new_sequence_number
99-
workflow_run.workflow_id = self._workflow.id
100-
workflow_run.type = self._workflow.type
101-
workflow_run.triggered_from = triggered_from.value
102-
workflow_run.version = self._workflow.version
103-
workflow_run.graph = self._workflow.graph
104-
workflow_run.inputs = json.dumps(inputs)
105-
workflow_run.status = WorkflowRunStatus.RUNNING.value
106-
workflow_run.created_by_role = (
107-
CreatedByRole.ACCOUNT.value if isinstance(self._user, Account) else CreatedByRole.END_USER.value
108-
)
109-
workflow_run.created_by = self._user.id
94+
with Session(db.engine, expire_on_commit=False) as session:
95+
workflow_run = WorkflowRun()
96+
system_id = self._workflow_system_variables[SystemVariableKey.WORKFLOW_RUN_ID]
97+
workflow_run.id = system_id or str(uuid4())
98+
workflow_run.tenant_id = self._workflow.tenant_id
99+
workflow_run.app_id = self._workflow.app_id
100+
workflow_run.sequence_number = new_sequence_number
101+
workflow_run.workflow_id = self._workflow.id
102+
workflow_run.type = self._workflow.type
103+
workflow_run.triggered_from = triggered_from.value
104+
workflow_run.version = self._workflow.version
105+
workflow_run.graph = self._workflow.graph
106+
workflow_run.inputs = json.dumps(inputs)
107+
workflow_run.status = WorkflowRunStatus.RUNNING
108+
workflow_run.created_by_role = (
109+
CreatedByRole.ACCOUNT if isinstance(self._user, Account) else CreatedByRole.END_USER
110+
)
111+
workflow_run.created_by = self._user.id
112+
workflow_run.created_at = datetime.now(UTC).replace(tzinfo=None)
110113

111-
db.session.add(workflow_run)
112-
db.session.commit()
113-
db.session.refresh(workflow_run)
114-
db.session.close()
114+
session.add(workflow_run)
115+
session.commit()
115116

116117
return workflow_run
117118

api/models/workflow.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import json
22
from collections.abc import Mapping, Sequence
33
from datetime import UTC, datetime
4-
from enum import Enum
4+
from enum import Enum, StrEnum
55
from typing import Any, Optional, Union
66

77
import sqlalchemy as sa
@@ -314,7 +314,7 @@ def conversation_variables(self, value: Sequence[Variable]) -> None:
314314
)
315315

316316

317-
class WorkflowRunStatus(Enum):
317+
class WorkflowRunStatus(StrEnum):
318318
"""
319319
Workflow Run Status Enum
320320
"""
@@ -393,13 +393,13 @@ class WorkflowRun(db.Model):
393393
version = db.Column(db.String(255), nullable=False)
394394
graph = db.Column(db.Text)
395395
inputs = db.Column(db.Text)
396-
status = db.Column(db.String(255), nullable=False)
397-
outputs: Mapped[str] = db.Column(db.Text)
396+
status = db.Column(db.String(255), nullable=False) # running, succeeded, failed, stopped
397+
outputs: Mapped[str] = mapped_column(sa.Text, default="{}")
398398
error = db.Column(db.Text)
399399
elapsed_time = db.Column(db.Float, nullable=False, server_default=db.text("0"))
400400
total_tokens = db.Column(db.Integer, nullable=False, server_default=db.text("0"))
401401
total_steps = db.Column(db.Integer, server_default=db.text("0"))
402-
created_by_role = db.Column(db.String(255), nullable=False)
402+
created_by_role = db.Column(db.String(255), nullable=False) # account, end_user
403403
created_by = db.Column(StringUUID, nullable=False)
404404
created_at = db.Column(db.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP(0)"))
405405
finished_at = db.Column(db.DateTime)

0 commit comments

Comments
 (0)