"""query_workflow_status:查询某个 trace_id 对应工作流的最近事件。 regulatory_node 在与用户对话时,可以借此工具回答"我那个任务跑到哪一步了" 之类的问题。返回最近 N 条事件 + 当前工作流 status。 """ from typing import Any, Dict, List from kilostar.utils.ray_hook import ray_actor_hook async def query_workflow_status(trace_id: str, limit: int = 10) -> Dict[str, Any]: """查询指定工作流 trace_id 的状态与最近事件。 Args: trace_id: 工作流追踪 ID limit: 返回最近多少条事件,默认 10 Returns: { "trace_id": str, "status": str | None, # 工作流当前状态(pending/running/completed/failed) "title": str | None, "recent_events": [ # 最近事件,按时间倒序 {"event_type": ..., "level": ..., "message": ..., "node_name": ..., "created_at": ...} ] } """ pg = ray_actor_hook("postgres_database").postgres_database workflow = await pg.get_workflow.remote(trace_id) events = await pg.query_event_logs.remote(trace_id=trace_id, limit=limit) recent: List[Dict[str, Any]] = [] for e in events or []: recent.append( { "event_type": getattr(e, "event_type", None), "level": getattr(e, "level", None), "message": getattr(e, "message", None), "node_name": getattr(e, "node_name", None), "created_at": str(getattr(e, "created_at", "")), } ) return { "trace_id": trace_id, "status": getattr(workflow, "status", None) if workflow else None, "title": getattr(workflow, "title", None) if workflow else None, "recent_events": recent, }