Build lightweight AI agent admin
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
工作流执行任务 - 供定时任务调度器调用
|
||||
"""
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
async def execute_workflow_task(
|
||||
job_code: str = None,
|
||||
workflow_code: str = None,
|
||||
inputs: dict = None,
|
||||
**kwargs
|
||||
):
|
||||
"""
|
||||
执行工作流任务
|
||||
|
||||
在定时任务中调用已发布的数据处理/自动化工作流。
|
||||
|
||||
Args:
|
||||
job_code: 任务编码(由调度器自动传入)
|
||||
workflow_code: 要执行的工作流编码(必填)
|
||||
inputs: 工作流输入变量
|
||||
**kwargs: 其他参数(包含 task_logger)
|
||||
|
||||
Returns:
|
||||
dict: 执行结果
|
||||
"""
|
||||
if not workflow_code:
|
||||
raise ValueError("workflow_code 参数不能为空,请在 task_kwargs 中配置")
|
||||
|
||||
inputs = inputs or {}
|
||||
inputs['job_code'] = job_code
|
||||
|
||||
from app.database import AsyncSessionLocal
|
||||
from ai_platform.services.workflow_service import AIWorkflowService
|
||||
from ai_platform.models.workflow import AIWorkflow
|
||||
from sqlalchemy import select
|
||||
from scheduler.task_utils import TaskLoggerWrapper
|
||||
|
||||
log = TaskLoggerWrapper(job_code, kwargs.get('task_logger'))
|
||||
await log.info(f"开始执行工作流: {workflow_code}")
|
||||
|
||||
async with AsyncSessionLocal() as db:
|
||||
result = await db.execute(
|
||||
select(AIWorkflow).where(
|
||||
AIWorkflow.code == workflow_code,
|
||||
AIWorkflow.is_deleted == False
|
||||
)
|
||||
)
|
||||
workflow = result.scalar_one_or_none()
|
||||
|
||||
if not workflow:
|
||||
raise ValueError(f"工作流不存在: {workflow_code}")
|
||||
|
||||
if workflow.workflow_type not in ('data_process', 'automation'):
|
||||
raise ValueError(
|
||||
f"工作流类型不支持定时执行: {workflow.workflow_type},"
|
||||
f"仅支持 data_process 和 automation 类型"
|
||||
)
|
||||
|
||||
if workflow.status != 'published':
|
||||
raise ValueError(f"工作流未发布: {workflow_code}")
|
||||
|
||||
await log.info(
|
||||
f"工作流类型: {workflow.workflow_type}, "
|
||||
f"工作流名称: {workflow.name}, "
|
||||
f"输入变量: {list(inputs.keys())}"
|
||||
)
|
||||
|
||||
service = AIWorkflowService(db)
|
||||
run = await service.run_workflow(
|
||||
workflow_id=str(workflow.id),
|
||||
inputs=inputs,
|
||||
trigger_type='api',
|
||||
)
|
||||
|
||||
await log.info(
|
||||
f"工作流执行完成: status={run.status}, "
|
||||
f"elapsed_time={run.elapsed_time}ms, "
|
||||
f"total_steps={run.total_steps}"
|
||||
)
|
||||
|
||||
if run.status == 'failed':
|
||||
raise RuntimeError(f"工作流执行失败: {run.error_message}")
|
||||
|
||||
return {
|
||||
'run_id': str(run.id),
|
||||
'workflow_code': workflow_code,
|
||||
'workflow_name': workflow.name,
|
||||
'status': run.status,
|
||||
'elapsed_time': run.elapsed_time,
|
||||
'total_steps': run.total_steps,
|
||||
'total_tokens': run.total_tokens,
|
||||
'outputs': run.outputs,
|
||||
}
|
||||
Reference in New Issue
Block a user