
    BjWi/                     l    S r SSKrSSKJrJrJrJr  SSKJr  \R                  " \
5      r " S S5      rg)u_   
上下文管理器

负责管理 AI 对话的上下文，包括消息压缩、阶段摘要等
    N)DictListAnyOptional   )StageDetectorc            
          \ rS rSrSrSS jrS\S\4S jrS\S	\S
\	\\
4   4S jrS\S	\4S jrS\4S jrS
\4S jr SS\\	   S\S\\\	      S
\\	   4S jjrSS\S\\\	      S
\4S jjrSS\S\\\	      S
\\   4S jjrS rSrg)ContextManager   uo   上下文管理器

负责管理对话上下文，包括：
- 消息压缩
- 阶段摘要管理
- 文件跟踪
Nc                 B    Xl         0 U l        / U l        SSSS.U l        g)uH   初始化上下文管理器

Args:
    log_callback: 日志回调函数
d   i'  i )max_messagesmax_tool_results_lengthcompress_thresholdN)log_callbackstage_artifactsgenerated_filescontext_config)selfr   s     N   /Users/yu22x/Desktop/ddd_副本128/ctf/app/services/ai/core/context_manager.py__init__ContextManager.__init__   s-     ):<*,',"'
    levelmessagec                     U R                   (       a  U R                  X5        [        [        U[        R                  5      nU" U5        g)u   记录日志N)r   getattrloggerinfo)r   r   r   log_funcs       r   _logContextManager._log'   s3    e-65&++6r   stagecontentreturnc                 l    [         R                  " X5      nUSS.nU(       a  UR                  U5        U$ )u   从 AI 输出中提取阶段关键信息

Args:
    stage: 阶段号
    content: AI 输出内容
    
Returns:
    阶段摘要字典
 )r#   raw_summary)r   extract_stage_infoupdate)r   r#   r$   r   artifacts        r   extract_stage_artifact%ContextManager.extract_stage_artifact.   s2     //?"26OOD!r   c           
          U R                  X5      nX0R                  U'   U R                  SSU SUR                  SS5       35        g)uR   保存阶段关键信息

Args:
    stage: 阶段号
    content: AI 输出内容
debugu   保存阶段 u	    摘要: r(   r'   N)r,   r   r!   get)r   r#   r$   r+   s       r   save_stage_artifact"ContextManager.save_stage_artifact>   sJ     ..u>&.U#		']5'8<<WY;Z:[\]r   	file_pathc                 j    U(       a,  XR                   ;  a  U R                   R                  U5        ggg)u9   跟踪生成的文件

Args:
    file_path: 文件路径
N)r   append)r   r3   s     r   track_generated_file#ContextManager.track_generated_fileI   s-     *>*>>  ''	2 ?9r   c                 X    [         R                  " U R                  U R                  5      $ )u=   构建上下文摘要

Returns:
    上下文摘要字符串
)r   build_context_summaryr   r   r   s    r   r9   $ContextManager.build_context_summaryR   s#     2243G3GI]I]^^r   messagescurrent_stagefiltered_stagesc           	      l   [        U5      U R                  S   :  a  U$ U R                  SS[        U5       S35        / nU R                  S   nU R                  S   nU(       a1  US   R                  S5      S	:X  a  UR	                  US   5        US
S nU R                  5       nU(       af  UR	                  SUS-   S.5        U(       a  U R                  X#5      O
[        U5      nU R                  X5      n	UR	                  SSU SU	 S3S.5        [        U5      U:  a  X* S OUn
U
(       a  U
S   R                  S5      S:X  am  [        U5      [        U
5      -
  nUS:  aP  [        US
-
  SS5       H<  nX   nU/U
-   n
UR                  S5      S:X  d  M$  UR                  S5      (       d  M<    O   U
 H  nUR                  5       nUR                  S5      S:X  a<  [        UR                  SS5      5      U:  a  US   nUSU S[        U5       S3-   US'   UR                  S5      S:X  aA  [        UR                  SS5      5      S:  a"  US   nSU;   a  USS S-   US'   OUSS S-   US'   UR	                  U5        M     U R                  SS[        U5      S
-    S[        U5       S 35        U$ )!uJ  压缩消息列表，保留关键信息

策略：
1. 保留系统提示词
2. 保留阶段摘要
3. 保留最近 N 条消息
4. 截断过长的工具结果

Args:
    messages: 原始消息列表
    current_stage: 当前阶段
    filtered_stages: 过滤后的阶段列表（可选）
    
Returns:
    压缩后的消息列表
r   r   u   触发上下文压缩: u    条消息 → 压缩中...r   r   r   rolesystem   Nuseru2   

请基于以上历史信息继续当前任务。)r@   r$   	assistantuC   好的，我已了解之前阶段的关键信息。当前在阶段 u   （u   ），继续执行。tool
tool_callsr$   r'   u   
... [已截断，原长度 u    字符]i  |u   
... [已截断]i  u   上下文压缩完成: u    → u
    条消息)lenr   r!   r0   r5   r9   _get_stage_id_by_indexstr_get_stage_namerangecopy)r   r<   r=   r>   
compressedr   max_tool_lencontext_summarystage_id
stage_namerecent_messages	start_idximsgnew_msgr$   s                   r   compress_messages ContextManager.compress_messagesZ   s   , x=4../CDDO		&3CM?B]^_
**>:**+DE /8;hqk*|H 446*-cc 
 Wft22=Rkno|k}H--hHJ#`an`oors}r~  T  U  7:(ml6R(=>2X` q155f=GHO(<<I1}y1}b"5A"+C'*eo&=Owwv+5#'',:O:O	 6 #ChhjG wwv&(SB1G-H<-Wi.%,]l%;@]^abi^j]kks>t%t	" wwv+-#cggi6L2MPT2Ti.'>)0$:M)MGI&)0$:M)MGI&g&! #$ 			&3CMA4E3FeCPZOK\\fghr   rR   c                 R   U(       aH  U HB  n[        UR                  SS5      5      [        U5      :X  d  M-  UR                  SSU 35      s  $     UR                  SS5      R                  5       (       a  [	        U5      OSnUb  [
        R                  " U5      $  SU 3$ !    N	= f)u$   获取阶段名称（辅助方法）idr'   nameu   阶段 .N)rK   r0   replaceisdigitintr   get_stage_name)r   rR   r>   r#   
numeric_ids        r   rL   ContextManager._get_stage_name   s    (uyyr*+s8}< 99Vwxj-ABB )	*2*:*:3*C*K*K*M*MXSWJ%$33J?? & 
##	s   A
B" "B&indexc                 ~    U(       a6  SUs=::  a  [        U5      :  a   O  g[        X!   R                  SS5      5      $ g)u3   根据阶段索引获取阶段 ID（辅助方法）r   r\   r'   N)rI   rK   r0   )r   re   r>   s      r   rJ   %ContextManager._get_stage_id_by_index   s9    qE@C,@@ -11$;<<r   c                 l    U R                   R                  5         U R                  R                  5         g)u   清空上下文N)r   clearr   r:   s    r   ri   ContextManager.clear   s&    ""$""$r   )r   r   r   r   )N)__name__
__module____qualname____firstlineno____doc__r   rK   r!   ra   r   r   r,   r1   r6   r9   r   r   rY   rL   rJ   ri   __static_attributes__ r   r   r
   r
      s   
#  C # $sCx.  	^ 	^s 	^3c 3_s _ 15	St*S S "$t*-	S
 
dSj$ $htDz>R $^a $C (4PT:BV bjknbo %r   r
   )ro   loggingtypingr   r   r   r   core.stage_detectorr   	getLoggerrk   r   r
   rq   r   r   <module>rv      s4   
  , , /			8	$w% w%r   