
    i*                        d dl mZ d dl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 d dl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 d dlmZmZmZ d dlmZ  ej>                  e       Z! G d d      Z"y)    )annotationsN)datetime)ListOptionalType)ChatAnthropic)BaseChatModel)	AIMessageBaseMessageHumanMessageToolMessage)
ChatOpenAI)MessageHistoryMessageMetadata)AgentMessagePromptSystemPrompt)ActionResultAgentOutputAgentStepInfo)MacElementNodec                       e Zd Zdddg ddddf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZdd	Z	 	 d	 	 	 	 	 	 	 dd
ZddZddZddZddZ	dddZ
d  fdZd!dZd"dZd dZd#dZd dZd Z xZS )$MessageManageri }     i   i     FNc                   || _         || _        || _        t               | _        || _        || _        || _        || _        || _	        |	| _
        || _        || j                  |      | _        n|| _        | j                  | j                  |
      j                         }| j                  |       || _        t#        |      }| j                  r| j                  |       d| _        | j                  rdddddddd	g d
t'        | j$                        ddg}t)        d|      }| j                  |       t+        dt'        | j$                              }| j                  |       | xj$                  dz  c_        n@t,        j/                  dt1        |dt1        |d|j2                  j4                                     t7        | j                  j8                        | _        y )N)max_actions_per_step   r   z*Unknown - No previous actions to evaluate.z*Unknown - No previous actions to memorize.zGet user taskzUnknown - Waiting for next goal )evaluation_previous_goalmemory	next_goal	reasoninginformation_storedimprovement_proposal)current_stateaction	tool_callnameargsidtypecontent
tool_callsz macOS automation session startedr.   tool_call_idz2Tool-call message history disabled for model '%s'.
model_namemodel)llmsystem_prompt_classmax_input_tokensr   historytaskaction_descriptionsESTIMATED_TOKENS_PER_CHARACTER
IMG_TOKENSinclude_attributesmax_error_length	give_task_supports_tool_messagesuse_tool_messagesget_system_message_add_message_with_tokenssystem_promptr   tool_idstrr
   r   loggerinfogetattr	__class____name__lenmessagesmin_history_messages)selfr4   r8   r9   r5   r6   estimated_tokens_per_characterimage_tokensr<   r=   r   r>   r@   system_messagetask_messager/   example_tool_calltool_messages                     S/Users/mibo/.openclaw/workspace/data/TuriX-CUA/src/agent/message_manager/service.py__init__zMessageManager.__init__   s    $(0$*$!$,$)0$(F$% $/.$*$$. 88=4-4 ++, ,  	  /%$d#,	^^  .$,	  $P=#5! 
 t||:& !   !23.T\\"<   .<<1<	;;CWSR^`ghkmtvy  wD  wD  wM  wM  aN  FO  P!$,,"7"78$    c                    t        |dd       }|t        |      S dj                  d |j                  j                  t        |dd      t        |dd      t        |dd      t        |dd      fD              d	}t        fd
|D               S )N_turix_supports_tool_calling c              3  R   K   | ]  }|rt        |      j                          ! y wN)rE   lower).0parts     rU   	<genexpr>z9MessageManager._supports_tool_messages.<locals>.<genexpr>n   s,      
t  t9??s   %'r2   r   r3   openai_api_basebase_url)deepseekminimaxzm2.5c              3  &   K   | ]  }|v  
 y wr\    )r^   tokenidentitys     rU   r`   z9MessageManager._supports_tool_messages.<locals>.<genexpr>z   s     C0Bu("0Bs   )rH   booljoinrI   rJ   any)rN   r4   explicitunsupported_tokensrh   s       @rU   r?   z&MessageManager._supports_tool_messagesj   s    S8$?(
x.XX 
 MMCr"C"C"B'CR 
 
( 7C0BCC	CCrW   c                   |r|D ]  }|j                   s|j                  r3t        dt        |j                        z         }| j	                  |       |j
                  rAt        dt        |j
                        | j                   d z         }| j	                  |       d} t        ||| j                  | j                  |      j                         }| j	                  |       y)z"Add browser state as human messagezAction result: r.   zAction error: N)r<   r=   	step_info)
include_in_memoryextracted_contentr   rE   rB   errorr=   r   r<   get_user_message)rN   state_contentresultrp   rmsgstate_messages          rU   add_state_messagez MessageManager.add_state_message}   s     q	!2S9L9L5M!MNc
##C(	!1CL$BWBWAWAX4Y!YZc
##C(V  %	--))   .rW   c                   t        | j                  j                        | j                  kD  rt	        | j                  j                  d   j
                  t              rz| j                  j                          t        | j                  j                        | j                  kD  r3t	        | j                  j                  d   j
                  t              rxy y y y N)rK   r7   rL   rM   
isinstancemessager   remove_messagerN   s    rU   _remove_last_state_messagez)MessageManager._remove_last_state_message   s    DLL!!"T%>%>>:dllNcNcdfNgNoNoq}C~<<  	DLL!!"T%>%>>:dllNcNcdfNgNoNoq}C~>C~>rW   c                |   t        | j                  j                        | j                  kD  rt	        | j                  j                  d   j
                  t              s1t	        | j                  j                  d   j
                  t              r| j                  j                          t        | j                  j                        | j                  kD  ret	        | j                  j                  d   j
                  t              rxt	        | j                  j                  d   j
                  t              ry y y y r|   )	rK   r7   rL   rM   r~   r   r
   r   r   r   s    rU   _remove_last_AIntool_messagez+MessageManager._remove_last_AIntool_message   sC   DLL!!"T%>%>>Jt||OdOdegOhOpOpr{D|  AK  LP  LX  LX  La  La  bd  Le  Lm  Lm  oz  A{<<  	DLL!!"T%>%>>Jt||OdOdegOhOpOpr{D|  AK  LP  LX  LX  La  La  bd  Le  Lm  Lm  oz  A{>  A{>rW   c                   | j                   s.t        |j                  d            }| j                  |       y d|j	                  dd      t        | j                        ddg}t        d	|
      }| j                  |       t        d	t        | j                              }| j                  |       | xj                  dz  c_        y )NT)exclude_unsetro   r   json)moder   r'   r(   r   r-   r0   r   )r@   r
   model_dump_jsonrB   
model_dumprE   rD   r   )rN   model_outputrx   r/   rT   s        rU   add_model_outputzMessageManager.add_model_output   s    				((t(<
3   %	 ##t#D
dll
	* 		#
 $DLL!, -,,!,rW   c                
   | j                   j                  D cg c]  }|j                   }}d}t        j	                  dt        | j                   j                         d       | j                   j                  D ]g  }||j                  j                  z  }t        j	                  |j                  j                  j                   d|j                  j                          i t        j	                  d|        |S c c}w )Nr   zMessages in history: :z - Token count: zTotal input tokens: )
r7   rL   r   rF   debugrK   metadatainput_tokensrI   rJ   )rN   mrx   total_input_tokenss       rU   get_messageszMessageManager.get_messages   s     LL1121q1#2,,&s4<<+@+@'A&B!DE<<  a000	<<199&&//00@AXAX@YZ[ ! 	,,%&8%9:;	* 	3s   D c                z    | j                  |      }t        |      }| j                  j                  |||       y )N)r   )position)_count_tokensr   r7   add_message)rN   r   r   token_countr   s        rU   rB   z'MessageManager._add_message_with_tokens   s5    ""7+++6(,,7Hh?rW   c                    d|v r,| j                   t        | 	  |j                  dd            z   S t        | 	  |      S )z/Enhanced token counter with multi-modal support<image>r   )r;   super_count_text_tokensreplace)rN   textrI   s     rU   r   z!MessageManager._count_text_tokens   s?    $
//EG6t||Ib7QR
RR		#D	))rW   c                   d}t        |j                  t              rZ|j                  D ]J  }t        |t              rd|v r|| j	                  |d         z  }/d|v s4|| j                  |d         z  }L nKd|j                  v r|| j                  |j                        z  }n|| j                  |j                        z  }t        |d      r'|| j                  t        |j                              z  }|S )z7Counts tokens for multi-modal messages including imagesr   	image_urlr   r   r/   )
r~   r.   listdict_count_image_tokensr   _handle_embedded_imageshasattrrE   r/   )rN   r   tokensitems       rU   r   zMessageManager._count_tokens   s    & &t$+"5t''[(9::V	4t&&tF|44V  7??"
d**7??;;F
d%%goo66F Wl#	T$$S););%<==6	-rW   c                "   t        | j                  t              s| j                  S |j	                  dd      }|dk(  ry|j	                  dd      }|j	                  dd      }| j                  ||      \  }}|dz   dz  |dz   dz  z  }d|d	z  z   S )
z9Calculate tokens for images based on OpenAI's token rulesdetaillowU   widthr   heighti  i      )r~   r4   r   r;   get_resize_dimensions)rN   r   r   r   r   scaled_widthscaled_height
tile_counts           rU   r   z"MessageManager._count_image_tokens   s    	DHHj	)
//==5)&u_
 --
#%==1%& !% 7 7v F,#+1D0LM*	zC	  rW   c                    d}|j                  d      }||| j                  z  z  }|j                  dd      }|| j                  |      z  }|S )z0Count tokens for <image> markers in text contentr   r   r   )countr;   r   r   )rN   r   r   image_count
clean_texts        rU   r   z&MessageManager._handle_embedded_images  sR    &

9%+K$//))&||Ir**D##J//&	-rW   c                    d}t        ||      |kD  r+|t        ||      z  }t        ||z        t        ||z        fS ||fS )z/Resize logic matching OpenAI's image processingi   )maxint)rN   r   r   max_dimratios        rU   r   z!MessageManager._resize_dimensions  sN    ''!S''5uu}s6E>2
33
rW   c                   t        | j                  t              r1	 dd i| j                  _        | j                  j	                  |      }|S t        |      | j                  z  }|S # t
        $ r t        |      | j                  z  }Y |S w xY w)Nparallel_tool_calls)r~   r4   r   disabled_paramsget_num_tokens	ExceptionrK   r:   )rN   r   r   s      rU   r   z!MessageManager._count_text_tokens  s    *%> 5t<DHHXX$$T*F
 
- I<<<6	-	  >Y$===F 
-	>s   .A& &!B
Bc                ,   | j                   j                  | j                  z
  }|dk  ry | j                   j                  d   }t	        |j
                  j                  t              r6d}|j
                  j                  D ]  }d|v r|j
                  j                  j                  |       || j                  z  }|j                  xj                  | j                  z  c_        | j                   xj                  | j                  z  c_        t        j                  d| j                   d| j                   j                   d| j                          d|v st	        |t              s||d   z  } ||j
                  _        || j                   j                  d<   |dk  ry ||j                  j                  z  }|d	kD  rt        d
|       t        j                  d|dz  dd||j                  j                  z  dd|j                  j                  dd       |j
                  j                  }t!        t#        |      |z        }|d |  }| j                   j%                  d       t'        |      }| j)                  |       | j                   j                  d   }t        j                  d|j                  j                   d| j                   j                   d| j                   dt#        | j                   j                                y )Nr   r}   r   r   zRemoved image with z tokens - total tokens now: /r   gGz?zhMax token limit reached - history is too long - reduce the system prompt or task. proportion_to_remove: z	Removing d   z.2fz% of the last message  z / z tokens))indexro   zAdded message with z - total messages: )r7   total_tokensr6   rL   r~   r   r.   r   remover;   r   r   rF   r   r   
ValueErrorr   rK   r   r   rB   )	rN   diffrx   r   r   proportion_to_remover.   characters_to_removelast_msgs	            rU   cut_messageszMessageManager.cut_messages  s   		"	"T%:%:	:$	QY
b!###T*
4{{""td[[%	T__T\\$//1	\\$//1\\DOO,,HIbIbHccdeiezezd{| 
4JtT2	T&\T # 3;;"4<<	QY
 9 99D 	124
  	,,#c)#..EFZ]`]i]i]v]vFvwzE{{~  @C  @L  @L  @Y  @Y  Z]  ^  ^f  g KK'S\,@@A***+',,B'W%#$\\""2&(,,**7788TUYUaUaUnUnToopqu  rG  rG  qH  H[  \_  `d  `l  `l  `u  `u  \v  [w  xrW   )r4   r	   r8   rE   r9   rE   r5   zType[SystemPrompt]r6   r   rO   r   rP   r   r<   z	list[str]r=   r   r   r   r>   ri   r@   zOptional[bool])r4   r	   returnri   )NN)ru   r   rv   zOptional[List[ActionResult]]rp   zOptional[AgentStepInfo]r   None)r   r   )r   r   r   r   )r   zList[BaseMessage]r\   )r   r   r   z
int | Noner   r   )r   rE   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   r   ztuple[int, int])rJ   
__module____qualname__rV   r?   rz   r   r   r   r   rB   r   r   r   r   r   r   __classcell__)rI   s   @rU   r   r      s     ()"$&*N9N9 	N9 	N9
 *N9 N9 #&N9 N9  N9 N9 N9 N9 $N9`D, *.'+	// '/ %	/
 /8!!
<@*4!&	,rW   r   )#
__future__r   loggingr   typingr   r   r   langchain_anthropicr   langchain_core.language_modelsr	   langchain_core.messagesr
   r   r   r   langchain_openair   src.agent.message_manager.viewsr   r   src.agent.promptsr   r   src.agent.viewsr   r   r   src.mac.elementr   	getLoggerrJ   rF   r   rf   rW   rU   <module>r      sV    "   ' ' - 8  ( K > D D *			8	$r rrW   