
    iW                        d Z ddlZddlZddlZddlZddlmZmZmZm	Z	m
Z
mZ ddlmZ ddlmZmZ ddlmZmZmZ ddlmZmZmZmZmZmZ ddlmZ dd	lmZ dd
l m!Z!m"Z"m#Z# ddl$m%Z% ddl$m&Z&m'Z'm(Z( ddl)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/  G d de      Z0y)zAgent node executor.

Responsible for running agent nodes, including
- memory retrieval
- thinking workflows
- agent invocation
- tool calling
    N)AnyCallableDictListOptionalSequence)Node)AgentConfigAgentRetryConfig)	CallStageAgentExecFlowStageAgentInputMode)AttachmentRefFunctionCallOutputEventMessageMessageBlockMessageRoleToolCallPayload)ToolSpec)NodeExecutor)MemoryContentSnapshotMemoryRetrievalResultMemoryWritePayload)ThinkingPayload)ModelProviderProviderRegistryModelResponse)AgentSkillManager)Retryingretry_if_exceptionstop_after_attemptwait_random_exponentialc                   J   e Zd ZdZdedee   dee   fdZdedede	dz  dee   fd	Z
dedee   de	dz  dee   fd
Zdedeeef   fdZdededee   de	dz  fdZdede	dz  dedz  fdZdee   de	dz  dee   fdZdededeeef   dee   dedeee   gef   fdZdededee   dee   deeef   dee   dz  dedefdZej4                  fdedededz  deddf
dZdededz  d eg ef   defd!Zdededz  dedz  fd"Zdedee   ded#e de!d$eee   gef   d%e"ddfd&Z#dedee   d#e de!d%e"ddfd'Z$ded#e de!de%dz  fd(Z&dedededee   dee   deeef   d)edee   de	dz  defd*Z'ded+ee(   dee   de	dz  de)ee   ee   f   f
d,Z*d-ed.ed/ededz  fd0Z+d-ed1eeef   de	dz  deeef   fd2Z,d3e(d.ede-fd4Z.d.edefd5Z/d.edefd6Z0d.ed3e(d/ed-edef
d7Z1dee   dee   fd8Z2d9ed:ee   d;e3d/edef
d<Z4d9ed/edefd=Z5d.edee6   fd>Z7d?edeeef   fd@Z8dede9fdAZ:d9ed/eddfdBZ;dCedDe6d/eddfdEZ<dFe=e   de=e>   fdGZ?dHe@defdIZAdFe=e   de=e   fdJZBdedee   d#e dedKede!d$eee   gef   d%e"deez  fdLZCdee   dee   fdMZDdee   dNed/eddfdOZEdee   dNed/eddfdPZFdee   de=e9   fdQZGdee   dNeez  d/eddfdRZHdededee   d.eez  ddf
dSZIdee   dTedefdUZJdee   dTede fdVZKd9eez  dz  dWedefdXZLd.e%dz  dedz  fdYZMy)ZAgentNodeExecutorzExecutor that runs agent nodes.nodeinputsreturnc                    | j                          |j                  dk7  rt        d|j                   d      |j	                  t
              }|st        d|j                   d      	 |j                  | _        t        j                  |j                        }|st        d|j                   d      | j                  j                         |_        |j                  |_        | j                  |      }| j                  ||      }| j!                  ||      }|j"                  xs t$        j&                  }| j(                  j+                  |j,                        }	| j/                  |||	      }
 ||      }|j1                         }|t$        j&                  u r| j3                  |||
      }n| j5                  |||
      }| j7                  |      }| j9                  |	|
      }| j;                  |||||      }|j<                  r%| j?                  ||||t@        jB                  ||       | jE                  |||t@        jF                  |       | jI                  |      }| jK                  |||||||      }|jM                         r| jO                  |||||||||
	      }n|jP                  }| jS                  ||j                         |}|j<                  r9| jU                  |d      }| jW                  |||||t@        jX                  ||      }| j[                  ||||       t]        |t^              r$| ja                  ||j                        gd	| _        S | jc                  td        jf                  ||j                  
      gd	| _        S # th        $ r}tk        jl                          d|j                   dto        |       }| jp                  js                  |       | jc                  td        jf                  d|jt                   dto        |       dd	d  d|j                  
      gcY d	}~d	| _        S d	}~ww xY w# d	| _        w xY w)zExecute an agent node.
        
        Args:
            node: Agent node definition
            inputs: Input messages collected from upstream nodes
        
        Returns:
            Agent output messages
        agentNode z is not an agent nodez missing agent configz
Provider 'z' not foundmodel_output)sourceN)rolecontentr,   [Node: z] Error calling model: zError calling model z: z

Original input:    z...);_ensure_not_cancelled	node_type
ValueErrorid	as_configr
   _current_node_idr   get_providerprovidercontextget_token_trackertoken_trackernode_id_inputs_to_text#_build_thinking_payload_from_inputs_build_memory_query_snapshot
input_moder   PROMPTtool_managerget_tool_specstooling_build_skill_managercreate_client_prepare_prompt_messages_prepare_message_conversation_prepare_call_options_merge_skill_tool_specs_build_agent_invokerthinking_apply_pre_generation_thinkingr   PRE_GEN_THINKING_STAGE_apply_memory_retrieval	GEN_STAGE_build_initial_timeline_invoke_providerhas_tool_calls_handle_tool_callsmessage_persist_message_attachments$_build_thinking_payload_from_message_apply_post_generation_thinkingPOST_GEN_THINKING_STAGE_update_memory
isinstancer   _clone_with_source_build_messager   	ASSISTANT	Exception	traceback	print_excstrlog_managererror
model_name)selfr%   r&   agent_configprovider_class
input_datainput_payloadmemory_query_snapshotr@   external_tool_specsskill_managerr8   clientconversationcall_options
tool_specsagent_invokertimelineresponse_objresponse_messagefinal_messagegen_payloade	error_msgs                           Q/Users/bowang/.openclaw/workspace/ChatDev/runtime/node/executor/agent_executor.pyexecutezAgentNodeExecutor.execute+   sH    	""$>>W$uTWWI-BCDD~~k2uTWWI-BCDDt	)$(GGD!-::<;P;PQN! :l.C.C-DK!PQQ)-)G)G)IL&#'77L --f5J DDVZXM$($E$Efj$Y!%00IN4I4IJ"&"3"3"B"B<CWCW"X 55dLJ]^M%l3H++-F^222#<<T:}]#AA$P]^55d;L556I=YJ 55M $$33 !)&==! ((%",, 33LAH00L **,#'#:#:   !
$  $0#7#7 --.>H+;M$$"GG^lGm $ D D )!&>>!	! j&-H-1//twwGH" %)D!! '' **%ww (    %)D!  	!!$''*A#a&JI""9-'' **.t.?r#a&I]^himjm^n]oorsww (    %)D!	 %)D!s8   *K$N
 ,N
 
	P;BP6)P;*P> 6P;;P> >	Qri   rm   Nc                    g }| j                  ||      }|r*|j                  t        t        j                  |             	 t        |t              r#|j                  dd      j                  d      }nt        |      }|j                  t        t        j                  |             |S # t        $ r@}| j                  j                  d|j                   d|        t        |      }Y d}~pd}~ww xY w)z*Prepare the prompt-style message sequence.r-   r.   utf-8ignore)errorsr/   z] Encoding error: N)_build_system_promptappendr   r   SYSTEMr[   rb   encodedecoder_   rc   rd   r4   USER)rf   r%   ri   rm   messagessystem_promptclean_inputencoding_errors           rz   rG   z*AgentNodeExecutor._prepare_prompt_messages   s     #%11$FOOG););]ST	**c*(///IPPQXY!*o
 	[%5%5{KL  	*""WTWWI5GGW#XYj/K	*s   >B, ,	C556C00C5c                 &   g }| j                  ||      }|r*|j                  t        t        j                  |             | j                  |      }|r|j                  |       |S |j                  t        t        j                  d             |S )Nr}    )r   r   r   r   r   _coerce_inputs_to_messagesextendr   )rf   r%   r&   rm   r   r   normalized_inputss          rz   rH   z/AgentNodeExecutor._prepare_message_conversation   s     #%11$FOOG););]ST ;;FCOO-.  OOG)9)92FG    c                     i }|j                  t              }|st        d|j                   d      |j                  r|j                  |j                         |S )z=Prepare model call options (excluding conversation messages).r*   z missing model config)r5   r
   r3   r4   paramsupdate)rf   r%   rp   models       rz   rI   z'AgentNodeExecutor._prepare_call_options   sR    '){+uTWWI-BCDD<<- r   rg   rl   c                      |j                   }|r|j                  sy t        |j                  |D cg c]  }|j                   c} fd      }|S c c}w )Nc                 R    j                   j                  | j                        S )Nr<   )rc   warningr4   )rU   r%   rf   s    rz   <lambda>z8AgentNodeExecutor._build_skill_manager.<locals>.<lambda>   s"    T-=-=-E-EgW[W^W^-E-_r   )allowavailable_tool_nameswarning_reporter)skillsenabledr   r   name)rf   r%   rg   rl   skills_configspecmanagers   ``     rz   rE   z&AgentNodeExecutor._build_skill_manager   sY     %++M$9$9#%%8K!L8K$))8K!L_

  "Ms   A
c           	         g }|j                   r|j                  |j                          ||j                         }|r&|j                  dj                  dddd|g             n\|j	                         }dj                  d |d d D              }|j                  dj                  dd	|g      j                                |sy d
j                  d |D              S )N
z You have access to Agent Skills.zeUse `activate_skill` to load the full SKILL.md instructions for a relevant skill before following it.znUse `read_skill_file` to read supporting files from that skill directory when the instructions reference them.z3Do not assume a skill's contents until you load it.c              3   &   K   | ]	  }d |   yw)z- N ).0r   s     rz   	<genexpr>z9AgentNodeExecutor._build_system_prompt.<locals>.<genexpr>  s     (YGXG2gYGXs      zYAgent Skills are enabled for this node, but no compatible skills are currently available.zNDo not claim to use or load any skill unless it appears in <available_skills>.

c              3   &   K   | ]	  }|s|  y wNr   )r   parts     rz   r   z9AgentNodeExecutor._build_system_prompt.<locals>.<genexpr>"  s     :EDT4Es   )r-   r   build_available_skills_xmljoindiscovery_warningsstrip)rf   r%   rm   parts
skills_xmlwarning_lineswarning_texts          rz   r   z&AgentNodeExecutor._build_system_prompt   s    99LL#$&AACJII> D MQ&
 !. @ @ B#yy(Y}UWVWGX(YYIIwl( eg {{:E:::r   rq   c                 0   ||S t        |      }|D ch c]  }|j                   }}|j                         D ]U  }|j                  |v rt        d|j                   d      |j	                  |j                         |j                  |       W |S c c}w )NzTool name 'z&' conflicts with a built-in skill tool)listr   build_tool_specsr3   addr   )rf   rq   rm   mergedr   existing_namess         rz   rJ   z)AgentNodeExecutor._merge_skill_tool_specs$  s    
  j!067$))7!224DyyN* ;tyyk9_!`aatyy)MM$	 5
  8s   Br8   rn   base_call_optionsdefault_tool_specsc           	           dddt         t           dt        t         t              dt        dt        f fd}|S )zDCreate a callable that other components can use to invoke the model.N)toolsro   r   	overridesr'   c          	          t              }|j                  |       j                  |       }j                  
| ||||n	      }|j                  S r   )dictr   rQ   rR   rU   )ro   r   r   rp   rs   responser   rn   r   r%   r8   rf   s         rz   invokez6AgentNodeExecutor._build_agent_invoker.<locals>.invoke?  si       12L	*33LAH,,*0BH ###r   )r   r   r   r   r   )rf   r8   rn   r   r   r%   r   s   `````` rz   rK   z&AgentNodeExecutor._build_agent_invoker5  sL     /3	$w-	$ DN+	$ 		$
 	$ 	$( r   ro   rs   rp   c                 P   | j                          | j                  j                  r%|j                  | j                  j                  _        |j                  t              }| j                  ||      }	dt        ffd}
rdj                  d D              nd}| j                  ||dt        j                         | j                  ||	|
      }| j                  j                  |j!                                | j                  |||t        j"                         |S )z.Invoke provider with logging + token tracking.r'   c                  :     j                   fxs d d S )N)ro   rs   rq   )
call_model)rp   rn   ro   r8   rs   rq   s   rz   _call_providerz:AgentNodeExecutor._invoke_provider.<locals>._call_providerg  s8    &8&&)!%-	
  r   r   c              3   <   K   | ]  }|j                           y wr   )text_content)r   msgs     rz   r   z5AgentNodeExecutor._invoke_provider.<locals>.<genexpr>p  s     H<CS--/<   N)r1   r9   r;   r4   current_node_idr5   r
   _resolve_retry_policyr   r   _record_model_callr   BEFORE_execute_with_retryrc   debugstr_raw_responseAFTER)rf   r8   rn   ro   rs   rp   rq   r%   rg   retry_policyr   
last_inputr   s    ``````      rz   rR   z"AgentNodeExecutor._invoke_providerU  s     	""$<<%%9=DLL&&6~~k211$E	 	 	 MYRWWH<HH^`
j$	8H8HI++D,Ox88:;j(IOOLr   rj   r   stagec                     |r|j                   j                         nd}|rd|j                         ini }| j                  j	                  |j
                  |j                  ||||       y)z+Record model invocation to the log manager.NrS   )rU   r   rS   rc   record_model_callr4   re   )rf   r%   rj   r   r   response_textcall_detailss          rz   r   z$AgentNodeExecutor._record_model_callw  sd     <D((557HP((*A*A*CDVX**GGOO	
r   retry_configfuncc                      rj                   s |       S t        j                  j                        }t	        fd      }d fd}t        t        j                        |||d      } ||      S )N)minmaxc                 &    j                  |       S r   )should_retry)excr   s    rz   r   z7AgentNodeExecutor._execute_with_retry.<locals>.<lambda>  s    9R9RSV9Wr   c                    | j                   j                         }|y | j                  }|j                  |j                  j
                  d}j                  j                  dj                   d| d| j                  |       y )N)attemptmax_attempts	exceptionr/   z] Model call attempt z	 failed: )r<   details)	outcomer   attempt_numberr   	__class____name__rc   r   r4   )retry_stater   r   r   r%   r   rf   s       rz   _before_sleepz<AgentNodeExecutor._execute_with_retry.<locals>._before_sleep  s    %%//1C{!00G" , 9 9 ]]33G
 $$$''"7y	#O % r   T)stopwaitretrybefore_sleepreraise)r'   N)	is_activer"   min_wait_secondsmax_wait_secondsr    r   r!   r   )rf   r%   r   r   r   retry_conditionr   retriers   ```     rz   r   z%AgentNodeExecutor._execute_with_retry  sw     <#9#96M&----
 --WX	  #L$=$=>!&
 t}r   c                     |sy|j                   |j                   S t        |dd      xs t        |dd      xs d}|r| dnd}t        |      }||_         |S )zCEnsure every agent node has a retry policy even if config omits it.Npathz	<runtime>z.retryr   )r   )r   getattrr   )rf   r%   rg   	base_path
retry_pathdefault_retrys         rz   r   z'AgentNodeExecutor._resolve_retry_policy  sm     )%%%L&$7e74QU;VeZe	-6	{&)G
(j9*r   query_snapshotrr   r@   c                 J   | j                          | j                  j                  |j                        }|r|sy|j	                  t
              }	| j                  j                  |j                  |j                        5  | j                  |||      }
| j                  |
      }|j                  |||j                  xs d|d      }ddd       |	r"|	j                  r|	j                  j                  nd}| j                  j                  |j                  |t!        t"              r|nd|j                  dt%        
xr |
j&                        i       |t(        j*                  u rwt!        |t,              rH| j/                  ||j                         |j1                  | j3                  ||j                               y| j5                  |||j                         yt!        |t"              r|n|j7                         }|d   j9                  |      |d<   y# 1 sw Y   QxY w)	zApply pre-generation thinking.Nr   rr   rj   
agent_rolememoryrw   unknown	[message]
has_memoryr   )r1   r9   get_thinking_managerr4   r5   r
   rc   thinking_timervalue_retrieve_memory"_memory_result_to_thinking_payloadthinkr-   rL   typerecord_thinking_processr[   rb   boolitemsr   MESSAGESr   rV   r   r\   _append_user_messager   with_content)rf   r%   ro   rj   r   r   rr   r@   thinking_managerr   retrieved_memorymemory_payloadthinking_result
mode_valuer.   s                  rz   rM   z0AgentNodeExecutor._apply_pre_generation_thinking  s    	""$<<<<TWWE|{+,,TWWekkB#44T>5Q!DDEUVN.44++99?%  5 O C -2ennU^^(()
00GG)/3?O[KK4 0 K5E5K5KLM	
 000/7311/477K##D$;$;OTWW$UV)),QUQXQX)Y)3OS)IoOkOkOmG+B/<<WEL9 CBs    A	HH"c                 V   | j                          |sy| j                  |||      }|r|j                  rt|t        j                  u r)| j                  ||j                  |j                         y|d   }|j                   d|j                          }|j                  |      |d<   yyy)z$Apply memory retrieval side effects.Nr   r  r   )	r1   r  formatted_textr   r  _insert_memory_messager4   r   r  )	rf   r%   ro   r   r   r@   r  last_messagemerged_contents	            rz   rO   z)AgentNodeExecutor._apply_memory_retrieval  s     	""$00~uM 0 ? ?^444++L:J:Y:Ycgcjcj+k+B/$4$C$C#DDIbIbIdHe!f#/#<#<^#LR  !@r   c                 D   | j                   j                  |j                        }|sy| j                  j	                  |j                  d|j
                        5  |j                  |j                  r|j                  nd||      }ddd       r|j                  nd}|j
                  |rt        |j                        nd|rt        |j                               ndd}| j                  j                  |j                  d|j
                  ||       |S # 1 sw Y   xY w)zRetrieve memory for the node.NRETRIEVEr   )r  querycurrent_stager   )r   
item_countattachment_count)r9   get_memory_managerr4   rc   memory_timerr
  retriever-   r  lenr  attachment_overviewrecord_memory_operation)rf   r%   r   r   memory_managerr  preview_textr   s           rz   r  z"AgentNodeExecutor._retrieve_memory
  s     88A**477JL-66(,		499r$#  7   M ;K'66PR[[9I#.445qO_$4$H$H$J Kef
 	00GGKK	
  - MLs   -DDinitial_responsec
           	          |j                   }
g } j                        }d}	  j                           j                  |
j                        }|j                  |       |j                  |       |
j                  s j                  |
|dj                        S ||k\  rJ j                  j                  dj                   d| d        j                  |
|dj                        S |dz  } j                  |
j                  ||	      \  }}|j                  |       |j                  |       |j                   fd|D                j                  ||||||      }|j                   }
O)	zFHandle tool calls until completion or until the loop limit is reached.r   Tr/   z] Tool call limit z+ reached, returning last assistant responseF   c              3   V   K   | ]   }j                  |j                         " y wr   )r\   r4   )r   r   r%   rf   s     rz   r   z7AgentNodeExecutor._handle_tool_calls.<locals>.<genexpr>Y  s%     !fSeC$"9"9#tww"GSes   &))rU   _get_tool_loop_limitr1   r\   r4   r   
tool_calls_finalize_tool_tracerc   r   _execute_tool_batchr   rR   )rf   r%   r8   rn   ro   rs   rp   r-  rq   rm   assistant_messagetrace_messages
loop_limit	iterationcloned_assistanttool_call_messagestool_eventsfollow_up_responses   ``                rz   rT   z$AgentNodeExecutor._handle_tool_calls.  s    -44(*..t4
	&&(#667H$''R 01!!"23$//001BNTXZ^ZaZabbJ&  ((dggY&8Dop 001BNTY[_[b[bccNI.2.F.F!,,	/+  23OOK(!!!fSe!ff!%!6!6" !3 : :I r   r2  c                    g }g }|j                  t              }|D ci c]  }|j                  | }	}|r|j                  ng }
| j                  j
                  }||j                  d      nd}||j                  |d<   	 |D ]d  }| j                          |j                  }| j                  |j                        }|	j                  |      }d}|}|rU|j                  j                  d      }|d|cxk  rt        |
      k  rn n|
|   }|j                  j                  d|      }|ry|j                  j                  d      dk(  rZ	 | j                  j                  |j                  |ddd|it         j"                         | j                  j%                  |j                  |      5  | j'                  |||      }ddd       | j)                  ||j                  |	      }|j+                  | j-                  ||             | j/                  |||j                        }|"|j+                  |       |j+                  |       | j                  j                  |j                  |d
| j1                  |      d|it         j2                         |j+                  |       #||jA                         nd}||jB                  r||jB                  vrd| d|j                   dtE        |jB                         }| j                  j                  |j                  |dd||dt         j2                         t9        t:        j<                  d| |j                  ||j                  d      }|j+                  t?        |j                  xs |j                  xs d|j                  d|              |j+                  |       H|sd| d}| j                  j                  |j                  |dd||dt         j2                         t9        t:        j<                  d| |j                  ||j                  d      }|j+                  t?        |j                  xs |j                  xs d|j                  d|              |j+                  |       	 | j                  j                  |j                  |ddd|it         j"                         | j                  j%                  |j                  |      5  tG        jH                  | jJ                  jM                  |||| j                  j
                              }ddd       | j)                  ||j                  |	      }|j+                  | j-                  ||             | j                  j                  |j                  |d
| j1                  |      d|it         j2                         |j+                  |       g 	 |||jO                  dd       ||fS ||d<   ||fS c c}w # 1 sw Y   UxY w# t4        $ r}| j                  j                  |j                  |ddt7        |      |dt         j2                         t9        t:        j<                  d| d| |j                  ||j                  d      }|j+                  t?        |j                  xs |j                  xs d|j                  d|              Y d}~ad}~ww xY w# 1 sw Y   xY w# t4        $ r}| j                  j                  |j                  |ddt7        |      |dt         j2                         t9        t:        j<                  d| d| |j                  ||j                  d      }|j+                  t?        |j                  xs |j                  xs d|j                  d|              Y d}~d}~ww xY w# |||jO                  dd       w ||d<   w w xY w)zHExecute a batch of tool calls and return conversation + timeline events.Nr<   _config_indexr   original_namer,   agent_skill_internal	arguments)r<   	tool_nameTF)rd   rA  zTool z error: rB  r,   r-   r.   tool_call_idmetadata	tool_callzerror: call_idfunction_nameoutput_textzTool 'z"' is not allowed by active skill 'z'. Allowed tools: zError: z' configuration not found.)tool_context)(r5   r
   r   rD   r9   global_stategetr4   r1   rJ  _parse_tool_call_argumentsrA  rF  r(  rc   record_tool_callr   r   
tool_timer_execute_skill_tool_build_tool_messager   !_build_function_call_output_event_build_skill_followup_message_serialize_tool_resultr   r_   rb   r   r   TOOLr   active_skillallowed_toolsr   asynciorunrB   execute_toolpop)rf   r%   r2  rq   rm   r   eventsr   r   spec_mapconfigscontext_stateprevious_node_idrG  rB  rA  tool_configexecution_nameidxresulttool_messagesystem_messager   rX  ry   s                            rz   r4  z%AgentNodeExecutor._execute_tool_batchf  s    #%{+ 1;;
DIItO
;#(%--b11;H;T=,,Y7Z^$'+wwM)$S	@'	**,%33	 ;;I<O<OP	  ||I."!*--++O<C1+Bc'l+B&-cl%)]]%6%6	%RNDMM--h7;QQ4((99 GG%  ()4%,, "--88)L%)%=%=iTa%bF M (,'?'?"%$(GG&/	 (@ ( d&L&LYX^&_`)-)K)KIW]_c_f_f)g)5$OON;"MM.9((99 GG%  77?()4%OO> OOL1?L?X}99;^b ,$22&l.H.HH ! ,(--..@lF`F`Aa@bd  $$55!"+)D! $+(--")) 5%.\\/8DGG!L	$L MM/$-LL$ZI4K4K$Z{*3*A*A*1)(= OOL1" $*)4N!OY%%66!"+)D! %,(--")) 5%.\\/8DGG!L	%\ ]]/$-LL$ZI4K4K$Z{*3*A*A*1)(= __\2=$$55!$i0!(( ))44TWWiH!( --:: . ) +-1\\-F-F	 ; " I $(#;#;! $"+	 $< $L MM>>%" $$55!33F;$i0!> -Y (\ (#+!%%i6  0@M),{ <H ML, % ((99 GG%! &)#hYG%OO (/!,!1!1&+I;hse$D)23<%P	( 3(1(^	8O8O(^S^.7.E.E.5cUO J IH> ! $$55!"%c(C! $+(--"'	{(3% @%.\\/8DGG!L	$L MM/$-LL$ZI4K4K$Z{*3*A*A*1# 2 (#+!%%i6/?M),	 )s   XC_$ A X!-XCX!H_$ A \	?A[<B\	_$ X	X!!	[9*C[4._$ 4[99_$ <\	\			_!C__$ _!!_$ $`rB  rf  r<   c                 Z   |dk7  st        |t              sy |j                  d      }|j                  dd      }|j                  d      }t        |t              r|j	                         sy d}t        |t
              r|rd| }t        t        j                  d| d	| | ||d
d      S )Nactivate_skillinstructions
skill_namezunknown-skillrY  r   z<

Only use these external tools while this skill is active: zActivated Agent Skill `za`. Follow its instructions for the current task until they are completed or no longer relevant.

T)r,   rl  skill_activationr-   r.   rF  )	r[   r   rN  rb   r   r   r   r   r   )rf   rB  rf  r<   rk  rl  rY  tool_constraints           rz   rU  z/AgentNodeExecutor._build_skill_followup_messageR  s     ((
640Hzz.1ZZo>


?3,,L4F4F4HmT*} ^_l^mnO##)* 6s. 13 !(zW[\
 	
r   rA  c                    |t        d      |dk(  rGt        |j                  dd            j                         }|st        d      |j	                  |      S |dk(  r~t        |j                  dd            j                         }t        |j                  dd            j                         }|st        d      |st        d      |j                  ||      S t        d	| d
      )Nz*Agent Skills are not enabled for this noderj  rl  r   zskill_name is requiredread_skill_filerelative_pathzrelative_path is requiredzUnsupported skill tool '')r3   rb   rN  r   rj  rq  )rf   rB  rA  rm   rl  rr  s         rz   rR  z%AgentNodeExecutor._execute_skill_toolo  s      IJJ((Y]]<<=CCEJ !9:: //
;;))Y]]<<=CCEJ	or BCIIKM !9::  !<== 00]KK3I;a@AAr   rG  c                     |j                   xs |j                  xs d}| j                  |      }|rt        ||j                  |      S t        ||j                  | j	                  |            S )NrG  )rI  rJ  output_blocksrH  )r4   rJ  _coerce_tool_result_to_blocksr   _stringify_tool_result)rf   rG  rf  rI  blockss        rz   rT  z3AgentNodeExecutor._build_function_call_output_event  su    
 ,,H)"9"9H[33F;*'55$ 
 '#1133F;
 	
r   c                    t        |t              r|j                         S t        |t              rQt	        d |D              r?|D cg c]#  }|j                         s|j                         % }}dj                  |      S t        |t        t        f      r	 t        j                  |d      S t        |      S c c}w # t        $ r t        |      cY S w xY w)Nc              3   <   K   | ]  }t        |t                y wr   r[   r   r   items     rz   r   z;AgentNodeExecutor._stringify_tool_result.<locals>.<genexpr>  s     +^W]tJt\,JW]r   r   F)ensure_ascii)r[   r   r   r   alldescriber   r   jsondumpsr_   rb   )rf   rf  blockr   s       rz   rw  z(AgentNodeExecutor._stringify_tool_result  s    fg&&&((fd#+^W]+^(^39N6%U^^=MU^^%6EN99U##ftTl+#zz&u== 6{ O
  #6{"#s   B;B;C   CCc                    ddl m} |yt        |t              r|j	                  d      S t        |t
              r|j	                  d      S t        ||      r|j	                         S t        |t              r|D cg c]  }| j                  |       c}S t        |t              r<|j                         D ci c]   \  }}t        |      | j                  |      " c}}S t        |d      r 	 | j                  |j	                               S t        |t        t        t        t        f      r|S t        |      S c c}w c c}}w # t        $ r t        |      cY S w xY w)zCConvert tool outputs into JSON-serializable structures for logging.r   AttachmentRecordNF)include_datato_dict)utils.attachmentsr  r[   r   r  r   r   rV  r   r  rb   hasattrr_   intfloatr  )rf   rf  r  r}  keyr
  s         rz   rV  z(AgentNodeExecutor._serialize_tool_result  sA   6>fg&>>u>55fl+>>u>55f./>>##fd#BHI&$D//5&IIfd# #),,."0JC C$55e<<"0  69%#226>>3CDD $FS#ud,CDvU#f+U J  #6{"#s   >D><%E2E	 	E E c                   ||d}t        |t              ro|j                         }|j                  t        j
                        }|j                  |_        t        |      }|j                  |j                         ||_
        |S ddlm} t        ||      r|j                         g}	nt        |t              r0t        d |D              r|D 
cg c]  }
|
j!                          }	}
nU|}	t        |t              r(t#        j$                  | j'                  |	      dd      }	nt        |t(              st)        |      }	t        t        j
                  |	|j                  |      S c c}
w )	NrC  r   r  c              3   <   K   | ]  }t        |t                y wr   r{  r|  s     rz   r   z8AgentNodeExecutor._build_tool_message.<locals>.<genexpr>  s     -`Y_QUj|.LY_r   F   )r~  indentrD  )r[   r   clone	with_roler   rW  r4   rE  r   r   rF  r  r  as_message_blockr   r  copyr  r  rV  rb   )rf   rf  rG  r<   rB  base_metadatar   rF  r  r.   r  s              rz   rS  z%AgentNodeExecutor._build_tool_message  s#    '07Cfg&,,.C-- 0 01C(||CM*HOOCLL)#CLJ6f./..01G%#-`Y_-`*`178uzz|G8G&$'**T%@%@%IX]fgh,f+!!""	
 	
 9s   E%c                 H    |D cg c]  }|j                          c}S c c}w r   )r  )rf   ro   r   s      rz   rQ   z)AgentNodeExecutor._build_initial_timeline  s     '34|		|444s   rU   r6  completec                     | j                  ||      }|rBt        |j                        }|D cg c]  }|j                          c}|d<   ||d<   ||_        |S c c}w )Ncontext_tracecontext_trace_complete)r\   r   rF  r  )rf   rU   r6  r  r<   rv   rF  r}  s           rz   r3  z&AgentNodeExecutor._finalize_tool_trace  sg     //AM223HDR(SNDN(SH_%19H-.%-M" )Ts   Ac                     |j                         }t        |j                        }|j                  d|       ||_        |S )Nr,   )r  r   rF  
setdefault)rf   rU   r<   clonedrF  s        rz   r\   z$AgentNodeExecutor._clone_with_source  s7    (Hg."r   c                    |g S t        |t              r,|j                         D cg c]  }|j                          c}S t        |t              r|j                         gS ddlm} t        ||      r|j                         gS t        |t              rFt        |t        t        t        f      s+g }|D ]"  }|j                  | j                  |             $ |S g S c c}w )z;Convert supported tool outputs into MessageBlock sequences.r   r  )r[   r   rx  r  r   r  r  r  r   rb   bytes	bytearrayr   rv  )rf   rf  r  r  rx  r}  s         rz   rv  z/AgentNodeExecutor._coerce_tool_result_to_blocks  s    >Ifg&.4mmo>oUEJJLo>>fl+KKM?"6f./++-..fh'
6CPYCZ0[)+Fd@@FG M	 ?s   Craw_argumentsc                     t        |t              r|S |si S t        |t              r*	 t        j                  |      }t        |t              r|S i S i S # t        j
                  $ r i cY S w xY wr   )r[   r   rb   r  loadsJSONDecodeError)rf   r  parseds      rz   rO  z,AgentNodeExecutor._parse_tool_call_arguments  sn    mT*  ImS)M2 (56=2=	 '' 	s   A A+*A+c                     d}|j                  t              }|r|j                  s|S |j                  j                  d      }t	        |t
              r|dkD  r|S |S )N2   tool_loop_limitr   )r5   r
   r   rN  r[   r  )rf   r%   default_limitr   custom_limits        rz   r1  z&AgentNodeExecutor._get_tool_loop_limit%  sV    {+ELL  ||''(9:lC(\A-=r   c                 :   | j                   j                  j                  d      }|y|j                         D ]%  }|j                  }|s	 | j                  |||       ' y# t        $ r/}t        d|j                  xs |j                   d|       |d}~ww xY w)zGRegister attachments produced by model outputs to the attachment store.attachment_storeNzFailed to persist attachment 'z': )
r9   rM  rN  rx  
attachment_persist_single_attachmentr_   RuntimeErrorr   attachment_id)rf   rU   r<   storer  r  r   s          rz   rV   z.AgentNodeExecutor._persist_message_attachments/  s    ))--.@A=^^%E))JD//ugF &  D"%CJOODoWaWoWoCppstwsx#yz  AD  DDs   A""	B+*BBr  r  c           	         |j                   }|y |j                  r|j                  s|j                  sw|j	                  |j                  |j
                  xs |j                  xs d|j                  |j                  |j                  |j                        }|j                  |_         y | j                  j                  j                  d      }||st        d      |dz  |z  }|j                  dd       |j                  xs | j!                  |j                        }||_        |j                  r| j#                  |j                        nd }	d }
|	O|j                  rC||j
                  xs | j%                  |      z  }
dd l}|j)                  |j                  |
       nV|	I||j
                  xs | j%                  |      z  }
t+        |
d	      5 }|j-                  |	       d d d        nt/        d
      |j1                  |
|j                  |j
                  xs |
j
                  |j                  |j                  dd      }|j                  |_         y # 1 sw Y   ixY w)Nremote_file)remote_file_idr   	mime_typesizekindr  python_workspace_rootz<Workspace or node context missing for attachment persistence	generatedT)parentsexist_okr   wbz'Attachment missing data for persistenceF)r  display_namer  r  	copy_filepersist)r  r  data_uri
local_pathregister_remote_filer   r  r  r  r  refr9   rM  rN  r  mkdir_guess_mime_from_data_uri_decode_data_uri_make_generated_filenameshutilcopy2openwriter3   register_file)rf   r  r  r<   r  recordworkspace_root
target_dirinferred_mime
data_bytestarget_pathr  handles                rz   r  z,AgentNodeExecutor._persist_single_attachment=  s,   %%
$$Z-@-@I^I^//)88__Q
(@(@QM$..__ZZ(66 0 F  &zzE22667NO!]^^#k1G;
5",,c0N0NzObOb0c,
CMCVCVT**:+>+>?\`
*"7"7$
(d4;X;XYc;deKLL..<#$
(d4;X;XYc;deKk4(FZ( )( FGG$$#<K,<,< **$22 % 
 ":: )(s   II%r  c                     |sy |j                  d      sy |j                  d      \  }}}|sy d|v rt        j                  |      S |j	                  d      S )Ndata:,z;base64r~   )
startswith	partitionbase64	b64decoder   )rf   r  header_payloads        rz   r  z"AgentNodeExecutor._decode_data_urip  s^    ""7+%//47##G,,~~g&&r   r  c                     |j                   }|r|S |j                  xs d}d}d|v r.|j                  dd      d   }|rd|j                  d      d    }|sd}|j                  xs d | S )	z8Generate a filename based on mime type or attachment id.r   /r/  .+r   z.binr  )r   r  splitr  )rf   r  r   mimeextsubtypes         rz   r  z*AgentNodeExecutor._make_generated_filename|  s    K##)r$;jja(+G'--,Q/01C**9k:3%@@r   c                     |r|j                  d      sy |j                  dd      d   }d|v r|j                  dd      d   }d|v r|j                  d      d   S |S )Nr  r  r/  r   :;)r  r  )rf   r  r  s      rz   r  z+AgentNodeExecutor._guess_mime_from_data_uri  se    x227;Q'*&=\\#q)!,F'*f}v||C #@&@r   rw   c	                    | j                          | j                  j                  |j                        }	|	s$|j                  |j                  S |j
                  S |j                  t              }
| j                  j                  |j                  |j                        5  | j                  |||      }| j                  |      }|	j                  |||j                  xs d||      }ddd       |
r"|
j                  r|
j                  j                   nd}| j                  j#                  |j                  |t%        t&              r|nd|j                  dt)        xr |j*                        i       |t,        j.                  u rjt%        |t0              r<| j3                  ||j                         | j5                  |||j                         |S | j5                  |||j                         |S # 1 sw Y   xY w)zApply post-generation thinking.Nr   r  r  r  r  r   )r1   r9   r  r4   rawtextr5   r
   rc   r	  r
  r  r  r  r-   rL   r  r  r[   rb   r  r  r   r  r   rV   $_reset_conversation_with_user_result)rf   r%   ro   r   rj   rw   r   rr   r@   r  r   r  r  rf  r  s                  rz   rX   z1AgentNodeExecutor._apply_post_generation_thinking  s    	""$<<<<TWWE&1oo&A;??W{GWGWW{+,,TWWekkB#44T>5Q!DDEUVN%++++99?%' , F C -2ennU^^(()
00GG -F;KK4 0 K5E5K5KLM	
 000&'*11&$''B99,X\X_X_9`  99,X\X_X_9`7 CBs   !A	G44G>c                 j    |D cg c]#  }t        |t              s|j                         % c}S c c}w r   )r[   r   r  )rf   r&   rU   s      rz   r   z,AgentNodeExecutor._coerce_inputs_to_messages  s)    /5VvGGW9UvVVVs   00r.   c                ^    |j                  t        t        j                  |d|i             y Nr,   rn  )r   r   r   r   )rf   ro   r.   r<   s       rz   r  z&AgentNodeExecutor._append_user_message  s(    ))7hPWEXY	
r   c          	          | j                  |      }||n
t        |      }|j                  |t        t        j
                  |d|i             y r  )_find_last_user_indexr(  insertr   r   r   )rf   ro   r.   r<   last_user_idx
insert_idxs         rz   r  z(AgentNodeExecutor._insert_memory_message  sL    22<@&3&?]SEV
))7hPWEXY	
r   c                     t        t        |      dz
  dd      D ]%  }||   j                  t        j                  u s#|c S  y )Nr/  r  )ranger(  r-   r   r   )rf   ro   re  s      rz   r  z'AgentNodeExecutor._find_last_user_index  sB    \*Q.B7CC %%)9)99
 8 r   c                   |D cg c]/  }|j                   t        j                  u s |j                         1 }}|j	                          |j                  |       t        |t              r?|j                  | j                  |j                  t        j                        |             y |j                  t        t        j                  |d|i             y c c}w r  )r-   r   r   r  clearr   r[   r   r   r\   r  r   )rf   ro   r.   r<   r   system_messagess         rz   r  z6AgentNodeExecutor._reset_conversation_with_user_result  s    2>a,3#((kN`N`B`399;,aO,gw' 7 78I8I+JZJZ8[]d ef[--w(T[I\] bs
   !CCc                 
   | j                   j                  |j                        }|syt        j                  }t        j                  |      }t        j                  |      }t        |j                  r|j                  nd|||      }	| j                  j                  |j                  d|j                        5  |j                  |	       ddd       t        |t              r|j!                         n
t#        |      }
| j                  j%                  |j                  d|j                  |
|j                  t'        t#        |            t'        |
      |rt'        |j)                               ndd       y# 1 sw Y   xY w)z5Update the memory store with the latest conversation.Nr   )r  inputs_textinput_snapshotoutput_snapshotUPDATEr   )r   
input_sizeoutput_sizer$  )r9   r%  r4   r   FINISHED_STAGEr   from_messagesfrom_messager   r-   rc   r&  r
  r   r[   r   r   rb   r*  r(  r)  )rf   r%   ri   r&   rf  r+  r   r  r  r  normalized_results              rz   rZ   z AgentNodeExecutor._update_memory  s0   88A"11.<<VD/<<VD$$(IItyy2")+	
 **477HekkJ!!'* K 6@5PF//1VYZ`Va00GGKK!#j/2"#45RaC(K(K(M$Ngh		
 KJs   ;E99F
input_textc                 t    g }|D ]!  }|j                  |j                                # t        ||ddi|      S )Nr,   r&   r  rx  rF  r  )r   rx  r   )rf   r&   r  rx  rU   s        rz   r>   z5AgentNodeExecutor._build_thinking_payload_from_inputs  sB    %'GMM'..*+ )	
 	
r   c                 x    t        j                  |      }|rt        |j                        ng }t        ||      S )N)r  rx  )r   r  r   rx  )rf   r&   r  base_snapshotrx  s        rz   r?   z.AgentNodeExecutor._build_memory_query_snapshot  s5    
 .;;FC/<m**+"$*VDDr   r,   c                    t        |t              r-t        |j                         |j	                         d|i|      S |dn
t        |      }t        |g d|i|      S )Nr,   r  r   )r[   r   r   r   rx  rb   )rf   rU   r,   r  s       rz   rW   z6AgentNodeExecutor._build_thinking_payload_from_message  sb    gw'"))+~~'"F+	  _r#g,Dx>PVZ[[r   c                    |sy g }|j                   D ]m  }|j                  r)|j                  |j                  j                                |j                  sE|j                  |j                  j                                o d|j                         t        |j                               d}t        |j                  ||      S )Nr  )r,   has_multimodalr$  )r  rx  rF  )
r  r  r   to_message_blocksr  r  r(  r)  r   r  )rf   rf  rx  r}  rF  s        rz   r  z4AgentNodeExecutor._memory_result_to_thinking_payload'  s     %'LLD##d22DDFG""d11CCEF	 ! $335 #F$>$>$@ A

 F$9$9&S[\\r   )Nr   
__module____qualname____doc__r	   r   r   r{   rb   r   rG   rH   r   r   rI   r
   r   rE   r   rJ   r   r   rK   r   rR   r   r   r   r   r   r   r   r   r   r   rM   rO   r   r  rT   r   tupler4  rU  rR  r   rT  rw  rV  rS  rQ   r  r3  r\   r   rv  rO  r  r1  rV   r  r   r  r  r   r  r  rX   r   r  r  r  r  rZ   r>   r?   rW   r  r   r   rz   r$   r$   (   s   )F)D F)$w- F)DM F)P  )4/	
 
g2 W )4/	
 
g($ 4S>  " "(^	
 
T	!""; ";>ORV>V ";[^ae[e ";HN )4/ 
h	"   S>	
 !N  
4=/7*	+@     7m	 
 s)  38n  NT)    
 N %??

 
  $&	

 
 

&&& '-& r=()	&
 
&P "D( 
D	 	".F.F 7m.F '	.F
 ..F ".F  g 89.F #.F 
.F`MM 7mM .	M
 "M #M 
M.! !  .!  "	! 
 
	%! H6;6;  6; 	6;
 7m6; s)6; 38n6; (6; N6; )4/6; 
6;pj j  )j  N	j 
 )4/j  
tG}d3i'	(j X

 
 	

 
4
:BB S>B )4/	B
 
c3hB4
"
 
 
!	
&S S VS VS V4$
$
 #$

 $
 $
 
$
L5DM 5d3i 5 W 	
  
' C G C D<N , S#X  # DG Dc Dd D1& 1&L 1&SV 1&[_ 1&f
'# 
'8E? 
'A= AS AA(3- AHSM A.. 7m. .	.
 '. %. ".  g 89. #. 
3.`Wg W4= W
g 
 
Z] 
bf 


4= 
3 
\_ 
dh 
$w- HSM 	g 	Y`cfYf 	tw 	  }A 	!
4 !
S !
$w- !
Y`cfYf !
ko !
F	
$w- 	
UX 	
]l 	
EWE E 
	E	\GcMD<P 	\]` 	\et 	\]%,] 
4	]r   r$   )1r  rZ  r  r  r`   typingr   r   r   r   r   r   entity.configsr	   entity.configs.node.agentr
   r   entity.enumsr   r   r   entity.messagesr   r   r   r   r   r   entity.tool_specr   runtime.node.executor.baser   %runtime.node.agent.memory.memory_baser   r   r   runtime.node.agentr   r   r   r   runtime.node.agent.skillsr   tenacityr   r    r!   r"   r$   r   r   rz   <module>r     sj        @ @  C F F  & 3 
 / M M 7 ^ ^P] P]r   