|
from extensions.ext_database import db |
|
from libs.infinite_scroll_pagination import InfiniteScrollPagination |
|
from models.enums import WorkflowRunTriggeredFrom |
|
from models.model import App |
|
from models.workflow import ( |
|
WorkflowNodeExecution, |
|
WorkflowNodeExecutionTriggeredFrom, |
|
WorkflowRun, |
|
) |
|
|
|
|
|
class WorkflowRunService: |
|
def get_paginate_advanced_chat_workflow_runs(self, app_model: App, args: dict) -> InfiniteScrollPagination: |
|
""" |
|
Get advanced chat app workflow run list |
|
Only return triggered_from == advanced_chat |
|
|
|
:param app_model: app model |
|
:param args: request args |
|
""" |
|
|
|
class WorkflowWithMessage: |
|
message_id: str |
|
conversation_id: str |
|
|
|
def __init__(self, workflow_run: WorkflowRun): |
|
self._workflow_run = workflow_run |
|
|
|
def __getattr__(self, item): |
|
return getattr(self._workflow_run, item) |
|
|
|
pagination = self.get_paginate_workflow_runs(app_model, args) |
|
|
|
with_message_workflow_runs = [] |
|
for workflow_run in pagination.data: |
|
message = workflow_run.message |
|
with_message_workflow_run = WorkflowWithMessage(workflow_run=workflow_run) |
|
if message: |
|
with_message_workflow_run.message_id = message.id |
|
with_message_workflow_run.conversation_id = message.conversation_id |
|
|
|
with_message_workflow_runs.append(with_message_workflow_run) |
|
|
|
pagination.data = with_message_workflow_runs |
|
return pagination |
|
|
|
def get_paginate_workflow_runs(self, app_model: App, args: dict) -> InfiniteScrollPagination: |
|
""" |
|
Get debug workflow run list |
|
Only return triggered_from == debugging |
|
|
|
:param app_model: app model |
|
:param args: request args |
|
""" |
|
limit = int(args.get("limit", 20)) |
|
|
|
base_query = db.session.query(WorkflowRun).filter( |
|
WorkflowRun.tenant_id == app_model.tenant_id, |
|
WorkflowRun.app_id == app_model.id, |
|
WorkflowRun.triggered_from == WorkflowRunTriggeredFrom.DEBUGGING.value, |
|
) |
|
|
|
if args.get("last_id"): |
|
last_workflow_run = base_query.filter( |
|
WorkflowRun.id == args.get("last_id"), |
|
).first() |
|
|
|
if not last_workflow_run: |
|
raise ValueError("Last workflow run not exists") |
|
|
|
workflow_runs = ( |
|
base_query.filter( |
|
WorkflowRun.created_at < last_workflow_run.created_at, WorkflowRun.id != last_workflow_run.id |
|
) |
|
.order_by(WorkflowRun.created_at.desc()) |
|
.limit(limit) |
|
.all() |
|
) |
|
else: |
|
workflow_runs = base_query.order_by(WorkflowRun.created_at.desc()).limit(limit).all() |
|
|
|
has_more = False |
|
if len(workflow_runs) == limit: |
|
current_page_first_workflow_run = workflow_runs[-1] |
|
rest_count = base_query.filter( |
|
WorkflowRun.created_at < current_page_first_workflow_run.created_at, |
|
WorkflowRun.id != current_page_first_workflow_run.id, |
|
).count() |
|
|
|
if rest_count > 0: |
|
has_more = True |
|
|
|
return InfiniteScrollPagination(data=workflow_runs, limit=limit, has_more=has_more) |
|
|
|
def get_workflow_run(self, app_model: App, run_id: str) -> WorkflowRun: |
|
""" |
|
Get workflow run detail |
|
|
|
:param app_model: app model |
|
:param run_id: workflow run id |
|
""" |
|
workflow_run = ( |
|
db.session.query(WorkflowRun) |
|
.filter( |
|
WorkflowRun.tenant_id == app_model.tenant_id, |
|
WorkflowRun.app_id == app_model.id, |
|
WorkflowRun.id == run_id, |
|
) |
|
.first() |
|
) |
|
|
|
return workflow_run |
|
|
|
def get_workflow_run_node_executions(self, app_model: App, run_id: str) -> list[WorkflowNodeExecution]: |
|
""" |
|
Get workflow run node execution list |
|
""" |
|
workflow_run = self.get_workflow_run(app_model, run_id) |
|
|
|
if not workflow_run: |
|
return [] |
|
|
|
node_executions = ( |
|
db.session.query(WorkflowNodeExecution) |
|
.filter( |
|
WorkflowNodeExecution.tenant_id == app_model.tenant_id, |
|
WorkflowNodeExecution.app_id == app_model.id, |
|
WorkflowNodeExecution.workflow_id == workflow_run.workflow_id, |
|
WorkflowNodeExecution.triggered_from == WorkflowNodeExecutionTriggeredFrom.WORKFLOW_RUN.value, |
|
WorkflowNodeExecution.workflow_run_id == run_id, |
|
) |
|
.order_by(WorkflowNodeExecution.index.desc()) |
|
.all() |
|
) |
|
|
|
return node_executions |
|
|