(request: WorkflowRunRequest, http_request: Request)
| 151 | |
| 152 | @router.post("/api/workflow/run") |
| 153 | async def run_workflow_sync(request: WorkflowRunRequest, http_request: Request): |
| 154 | try: |
| 155 | resolved_log_level: Optional[LogLevel] = None |
| 156 | if request.log_level: |
| 157 | resolved_log_level = LogLevel(request.log_level) |
| 158 | except ValueError: |
| 159 | raise HTTPException( |
| 160 | status_code=400, |
| 161 | detail="log_level must be one of DEBUG, INFO, WARNING, ERROR, CRITICAL", |
| 162 | ) |
| 163 | |
| 164 | accepts_stream = _SSE_CONTENT_TYPE in (http_request.headers.get("accept") or "") |
| 165 | if not accepts_stream: |
| 166 | try: |
| 167 | result = await run_in_threadpool( |
| 168 | run_workflow, |
| 169 | request.yaml_file, |
| 170 | task_prompt=request.task_prompt, |
| 171 | attachments=request.attachments, |
| 172 | session_name=request.session_name, |
| 173 | variables=request.variables, |
| 174 | log_level=resolved_log_level, |
| 175 | ) |
| 176 | except FileNotFoundError as exc: |
| 177 | raise HTTPException(status_code=404, detail=str(exc)) |
| 178 | except ValidationError as exc: |
| 179 | raise HTTPException(status_code=400, detail=str(exc)) |
| 180 | except Exception as exc: |
| 181 | logger = get_server_logger() |
| 182 | logger.log_exception(exc, "Failed to run workflow via sync API") |
| 183 | raise WorkflowExecutionError(f"Failed to run workflow: {exc}") |
| 184 | |
| 185 | final_message = result.final_message.text_content() if result.final_message else "" |
| 186 | meta = result.meta_info |
| 187 | |
| 188 | logger = get_server_logger() |
| 189 | logger.info( |
| 190 | "Workflow execution completed via sync API", |
| 191 | log_type=LogType.WORKFLOW, |
| 192 | session_id=meta.session_name, |
| 193 | yaml_path=meta.yaml_file, |
| 194 | ) |
| 195 | |
| 196 | return { |
| 197 | "status": "completed", |
| 198 | "final_message": final_message, |
| 199 | "token_usage": meta.token_usage, |
| 200 | "output_dir": str(meta.output_dir.resolve()), |
| 201 | } |
| 202 | |
| 203 | event_queue: queue.Queue[tuple[str, Any]] = queue.Queue() |
| 204 | done_event = threading.Event() |
| 205 | |
| 206 | def enqueue(event_type: str, data: Any) -> None: |
| 207 | event_queue.put((event_type, data)) |
| 208 | |
| 209 | def worker() -> None: |
| 210 | try: |
nothing calls this directly
no test coverage detected