
    ii#                       d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZmZ d dlmZmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlm Z m!Z! d dl"m#Z# d dl$m%Z% d dl&m'Z' d dl(m)Z)m*Z* d dl+m,Z, d dl-m.Z.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5  e       Z6dZ7d dZ8d!dZ9	 	 	 	 	 	 	 	 d"dZ:	 	 	 	 	 	 	 	 	 	 	 	 	 	 d#dZ;d$dZ<e6j{                  d      d%d       Z>y)&    )annotationsN)datetime)Path)AnyOptionalSequenceUnion)	APIRouterHTTPExceptionRequest)StreamingResponse)run_in_threadpool)load_config)LogLevel)GraphConfig)Message) ensure_schema_registry_populated)OUTPUT_ROOTrun_workflow)WorkflowRunRequest)YAML_DIR)AttachmentStore)ValidationErrorWorkflowExecutionError)WorkflowLogger)get_server_loggerLogType)TaskInputBuilder)GraphExecutor)GraphContextztext/event-streamc                    |r |j                         r|j                         S t        j                         j                  d      }d| j                   d| S )Nz%Y%m%d%H%M%Ssdk__)stripr   nowstrftimestem)	yaml_pathsession_name	timestamps      G/Users/bowang/.openclaw/workspace/ChatDev/server/routes/execute_sync.py_normalize_session_namer,   #   sM    **,!!##''7I)..!9+..    c                <   t        |       j                         }|j                         r|S |j                         r|S t        t              j                         j                  d   }t        j                         rt        n|t        z  }||z  j                         S )N   )r   
expanduseris_absoluteexists__file__resolveparentsr   )	yaml_file	candidate	repo_root	yaml_roots       r+   _resolve_yaml_pathr:   *   s    Y**,IX&&(003I$002X9MI	!--//r-   c                   |s|S | j                   dz  dz  }|j                  dd       t        |      }t        |      }|D cg c]$  }t	        t        |      j                               & }}|j                  ||      S c c}w )Ncode_workspaceattachmentsT)r5   exist_ok)	directorymkdirr   r   strr   r0   build_from_file_paths)graph_contextpromptr=   attachments_dirstorebuilderpathnormalized_pathss           r+   _build_task_inputrJ   5   s    
 #--0@@=PO$6O,Eu%GALMDJ1134M((1ABB Ns   )Bc                z   t                t        |       }|j                         st        d|       |xs g }|r|j	                         s|st        ddt        |      i      t        ||      }t        ||      }	t        j                  |j                  |	t        t        |      |j                        }
r|
_        |
j                   _        t#        |
      }t%        |||      } G fdd	t&               G fd
dt(              } |||	      }|j+                  |       |j-                         }|j.                  r|j.                  j1                         nd }|r|j2                  nd }|j4                  r|j4                  j7                         nd }|	t        |      |||j8                  d}||fS )NzYAML file not found: zTask prompt cannot be emptytask_prompt_provided)details)vars_override)nameoutput_rootsource_pathvars)configc                  "     e Zd Z fdZ xZS );_run_workflow_with_logger.<locals>._StreamingWorkflowLoggerc                    t        |   |i |}|r+|j                         }|j                  dd         d|       |S )NrM   log)superadd_logto_dictpop)selfargskwargsentrypayload	__class__log_callbacks        r+   rY   zC_run_workflow_with_logger.<locals>._StreamingWorkflowLogger.add_logo   sA    GOT4V4E--/It,UG,Lr-   )__name__
__module____qualname__rY   __classcell__)ra   rb   s   @r+   _StreamingWorkflowLoggerrU   n   s    	 	r-   rg   c                      e Zd Zd fdZy)5_run_workflow_with_logger.<locals>._StreamingExecutorc                x    xs | j                   j                  } | j                   j                  |dd      S )NTF)use_structured_logginglog_to_console)graph	log_levelrO   )r\   levelrg   rn   s     r+   _create_loggerzD_run_workflow_with_logger.<locals>._StreamingExecutor._create_loggerx   s8    5!5!5E+

'+$	 r-   N)returnr   )rc   rd   re   rp   )rg   rn   s   r+   _StreamingExecutorri   w   s    	r-   rr   )
session_id)r)   r6   log_idtoken_usage
output_dir)r   r:   r2   FileNotFoundErrorr$   r   boolr   r,   r   from_definitionrm   r   rA   rR   rn   
definitionr    rJ   r   r   _executeget_final_output_messagelog_manager
get_loggerworkflow_idtoken_trackerget_token_usager?   )r6   task_promptr=   r)   	variablesrn   rb   r(   designnormalized_sessiongraph_configrC   
task_inputrr   executorfinal_messageloggerrt   ru   metarg   s        ``             @r+   _run_workflow_with_loggerr   E   s    %&"9-I"7	{ CDD#K{002K)+T+->?
 	

 )<F0LI..	N[[L !*,5) 5M"=+{KJ> ]  "-<NOHj!557M2:2F2FX!!,,.DF#)VtF>F>T>T(((88:Z^K +^"#--D $r-   c                L    t        j                  |dt              }d|  d| dS )NF)ensure_asciidefaultzevent: z
data: z

)jsondumpsrA   )
event_typedatar`   s      r+   
_sse_eventr      s)    jjE3?GZL	66r-   z/api/workflow/runc           	        
K   	 d  j                   rt         j                         t        |j
                  j                  d      xs dv }|s	 t        t         j                   j                   j                   j                   j                         d {   }|j*                  r|j*                  j-                         nd}|j.                  }t%               }|j1                  d
t2        j4                  |j                  |j                         d||j6                  t        |j8                  j;                               dS t=        j>                         tA        jB                         
dfdd
 fd}tA        jD                  |d      jG                          
fd}	tI         |	       t              S # t        $ r t        dd      w xY w7 ># t        $ r}t        dt        |            d }~wt         $ r}t        dt        |            d }~wt"        $ r/}t%               }|j'                  |d       t)        d	|       d }~ww xY ww)Ni  z>log_level must be one of DEBUG, INFO, WARNING, ERROR, CRITICAL)status_codedetailaccept )r   r=   r)   r   rn   i  z#Failed to run workflow via sync APIFailed to run workflow: z)Workflow execution completed via sync API)log_typers   r(   	completedstatusr   ru   rv   c                ,    j                  | |f       y )N)put)r   r   event_queues     r+   enqueuez"run_workflow_sync.<locals>.enqueue   s    T*+r-   c            
     p   	  dj                   j                  d       t        j                   j                  j                  j                  j
                        \  } } dd| r| j                         nd|d   t        |d   j                               d       j                          y # t        t        f$ r} d	d
t        |      i       Y d }~9d }~wt        $ r4}t               }|j                  |d        d	d
d| i       Y d }~td }~ww xY w# j                          w xY w)Nstarted)r6   r   )r6   r   r=   r)   r   rn   rb   r   r   ru   rv   r   errormessagez(Failed to run workflow via streaming APIr   )r6   r   r   r=   r)   r   text_contentrA   r4   rw   r   	Exceptionr   log_exceptionset)r   r   excr   
done_eventr   requestresolved_log_levels       r+   workerz!run_workflow_sync.<locals>.worker   s3   	%//@S@ST #<!++#//#//$11!++,$#M4 )ER]%?%?%AXZ#'#6"%d<&8&@&@&B"C	  NN "?3 	4GiS233 	L&(F  &PQGi+CC5)IJKK	L
 NNs<   B$B8 8D C D#  D ,*DD# D  D# #D5T)targetdaemonc                   K   	 	 j                  d      \  } }t        | |       &# t        j                  $ r j	                         rY y Y (w xY ww)Ng?)timeout)getr   queueEmptyis_set)r   r   r   r   s     r+   streamz!run_workflow_sync.<locals>.stream   s^     #.??3?#? 
D T22  ;; $$& 's%   A$+ A#AAAA)
media_type)r   rA   r   r   rq   None)rq   r   )%rn   r   
ValueErrorr   _SSE_CONTENT_TYPEheadersr   r   r   r6   r   r=   r)   r   rw   rA   r   r   r   r   r   r   r   	meta_infoinfor   WORKFLOWru   rv   r4   r   Queue	threadingEventThreadstartr   )r   http_requestaccepts_streamresultr   r   r   r   r   r   r   r   r   r   s   `         @@@@r+   run_workflow_syncr      s'    
15!)'*;*;!< '<+?+?+C+CH+M+SQSTN	K,!!#//#//$11!++, F$ @F?S?S,,99;Y["$7%%((nn	 	 	
 "*++doo5578	
 	
 16K"J, B F40668 VX2CDD  
S
 	

 ! 	BCCAA 	BCCAA 	K&(F  &KL(+CC5)IJJ	Ksk   I#G 'IAG  G G  $DIGIG   	I)G??IH!!I-*III)r(   r   r)   Optional[str]rq   rA   )r6   Union[str, Path]rq   r   )rC   r    rD   rA   r=   zSequence[Union[str, Path]]rq   zUnion[str, list[Message]])r6   r   r   rA   r=   z$Optional[Sequence[Union[str, Path]]]r)   r   r   zOptional[dict]rn   zOptional[LogLevel]rq   z(tuple[Optional[Message], dict[str, Any]])r   rA   r   r   rq   rA   )r   r   r   r   )?
__future__r   r   r   r   r   pathlibr   typingr   r   r   r	   fastapir
   r   r   fastapi.responsesr   starlette.concurrencyr   check.checkr   entity.enumsr   entity.graph_configr   entity.messagesr   runtime.bootstrap.schemar   runtime.sdkr   r   server.modelsr   server.settingsr   utils.attachmentsr   utils.exceptionsr   r   utils.loggerr   utils.structured_loggerr   r   utils.task_inputr   workflow.graphr   workflow.graph_contextr    routerr   r,   r:   rJ   r   r   postr    r-   r+   <module>r      s   "      1 1 5 5 / 3 # ! + # E 1 , $ - D ' > - ( /	' /0CCC ,C 	C KK K 6	K
  K K "K .K\7
  !dE "dEr-   