
    i                         d dl mZmZ d dlmZmZ d dlmZmZm	Z	m
Z
 d dlmZ d dlmZmZmZ ee
e   gef   Ze G d d             Z G d d	e      Zy
)    )abstractmethodABC)	dataclassfield)AnyCallableDictList)ThinkingConfig)MessageMessageRoleMessageBlockc                       e Zd ZU dZeed<    ee      Ze	e
   ed<    ee      Zeeef   ed<   dZedz  ed<   defd	Zy)
ThinkingPayloadzAContainer used to pass multimodal context into thinking managers.text)default_factoryblocksmetadataNrawreturnc                     | j                   S N)r   )selfs    Y/Users/bowang/.openclaw/workspace/ChatDev/runtime/node/agent/thinking/thinking_manager.pydescribezThinkingPayload.describe   s    yy    )__name__
__module____qualname____doc__str__annotations__r   listr   r
   r   dictr   r	   r   r   r    r   r   r   r      sO    K
I!&t!<FD<$T:Hd38n:Ct# r   r   c                       e Zd ZdefdZedededededz  de	ee
f   f
d	       Zedededededz  d
ede	ee
f   fd       Z	 ddededededz  d
edz  deez  fdZy)ThinkingManagerBaseconfigc                 <    || _         d| _        d| _        d| _        y )NFz%{origin}

Thinking Result: {thinking})r(   before_gen_think_enabledafter_gen_think_enabledthinking_concat_prompt)r   r(   s     r   __init__zThinkingManagerBase.__init__   s$    (-%',$ 'P#r   agent_invokerinput_payload
agent_rolememoryNr   c                      y)z
        think based on input_data before calling model API for node to generate

        Returns:
            str: thinking result
            bool: whether to replace the original input_data with the modified one
        Nr%   )r   r.   r/   r0   r1   s        r   _before_gen_thinkz%ThinkingManagerBase._before_gen_think"   s     	r   gen_payloadc                      y)z
        think based on input_data and gen_data after calling model API for node to generate

        Returns:
            str: thinking result
            bool: whether to replace the original gen_data with the modified one
        Nr%   )r   r.   r/   r0   r1   r4   s         r   _after_gen_thinkz$ThinkingManagerBase._after_gen_think3   s      	r   c                    |j                   }||j                   nd}|D| j                  r8| j                  ||||      \  }}	|	r|S | j                  j	                  ||      S |I| j
                  r=| j                  |||||      \  }}
|
r|S | j                  j	                  |xs d|      S |$|j                  |j                  S |j                   S |j                  |j                  S |j                   S )z|
        think based on input_data and gen_data if provided

        Returns:
            str: result for next step
        N)originthinking )r   r*   r3   r,   formatr+   r6   r   )r   r.   r/   r0   r1   r4   normalized_inputnormalized_genthink_resultreplace_inputreplace_gens              r   thinkzThinkingManagerBase.thinkE   s    )---8-D))$4#@#@*.*@*@}j&+'L- ##2299AQ\h9ii$)E)E(,(=(=}j&+)%L+ ##2299AUSU`l9mm&*5//*E{[;K[K[[(5(9(9(E=$$]=K]K]]r   r   )r   r   r   r   r-   r   AgentInvokerr   r!   tupleboolr3   r6   r   rA   r%   r   r   r'   r'      s   P~ P # ' 	
  $& 
sDy	   # ' 	
  $& % 
sDy	 . /3%^#%^ '%^ 	%^
  $&%^ %t+%^ 
w%^r   r'   N)abcr   r   dataclassesr   r   typingr   r   r	   r
   entity.configsr   entity.messagesr   r   r   rB   r   r'   r%   r   r   <module>rJ      sX    # ( , , ) > >g01 	 	 	Q^# Q^r   