
    vi                         d Z ddlZddlZddlZddlmZ ddlZddlmZ de	e         de
fdZ G d d	          Z e            ZdS )
u:   Claude Agent 模块 - 自然语言理解和输出总结。    N)Any)settingscontentreturnc                     g }| D ],}t          |d          r|                    |j                   -d                    |                                          S )u<   从响应内容中提取文本，跳过 ThinkingBlock 等。text
)hasattrappendr   joinstrip)r   textsblocks      4/root/projects/qq-shell/src/butler/agent/__init__.py_extract_textr      s[    E % %5&!! 	%LL$$$99U!!###    c                   4   e Zd ZdZdZdZ	 	 	 ddedz  dedz  dedz  fdZed	e	j
        fd
            Zd	efdZddZ	 	 ddedededee         dz  d	edz  f
dZ	 	 ddedeeef         dz  dee         dz  d	efdZ	 ddedededee         dz  d	ef
dZdS )
ShellAgentu$   基于 LLM 的 Shell 助手 Agent。u  你是一个远程服务器的 Shell 助手。用户通过自然语言描述他们想做的事情，你需要：

1. 理解用户的意图
2. 生成合适的 shell 命令
3. 只返回命令本身，不要解释

规则：
- 用户可能说"查看文件"、"列出目录"、"看下内存"等自然语言
- 你需要将其转换为准确的 shell 命令
- 如果用户输入已经是有效的 shell 命令，直接返回
- 如果无法理解，返回 "UNKNOWN: <原因>"
- 只返回一行命令，不要有多余内容

示例：
用户: "查看当前目录"
返回: ls -la

用户: "看下磁盘空间"
返回: df -h

用户: "查看最近的日志"
返回: tail -100 /var/log/syslog

用户: "ls -la"
返回: ls -la

用户: "我想编辑 config.yaml"
返回: vim config.yamlu  你是一个远程服务器的 Shell 助手。用户执行了一个命令，你需要用简洁的中文总结输出结果。

要求：
- 用自然语言总结，不要直接复制输出
- 突出关键信息：数量、状态、异常、路径等
- 如果有错误，明确指出错误原因
- 如果输出为空或只是提示符，说明命令执行完毕
- 保持简洁，1-3句话Napi_keybase_urlmodelc                 &   |p+t           j        pt          j                            dd          | _        |p+t           j        pt          j                            dd          | _        |pt           j        pd| _	        d | _
        d| _        d| _        d S )NANTHROPIC_API_KEY ANTHROPIC_BASE_URLzclaude-sonnet-4-20250514r   g       @)r   anthropic_api_keyosenvirongetr   anthropic_base_urlr   anthropic_modelr   _client_last_call_time_min_interval)selfr   r   r   s       r   __init__zShellAgent.__init__?   s     g("<g
Obdf@g@g kH$?k2:>>RfhjCkCkTh6T:T
37&'$'r   r   c                     | j         F| j        st          d          d| j        i}| j        r
| j        |d<   t	          j        di || _         | j         S )u   延迟初始化客户端。Nu   ANTHROPIC_API_KEY 未设置r   r    )r"   r   
ValueErrorr   	anthropic	Anthropic)r%   kwargss     r   clientzShellAgent.clientL   sh     << @ !>???&/%>F} 3%)]z"$.8888DL|r   c                 *    t          | j                  S )u   检查 API 是否可用。)boolr   )r%   s    r   is_availablezShellAgent.is_availableX   s    DL!!!r   c                    K   t          j                    }|| j        z
  }|| j        k     r"t	          j        | j        |z
             d{V  t          j                    | _        dS )u%   简单的速率限制，避免 429。N)time	monotonicr#   r$   asynciosleep)r%   nowelapseds      r   _rate_limitzShellAgent._rate_limit\   sn      n,,T'''- 2W <=========#~//r      systemuser_message
max_tokensmessagesc                 n  K   |                                   d{V  |d|dg}n	|d|dgz   }	 | j        j                            | j        |||          }t          |j                  S # t          j        $ r t          d           t          j        d           d{V  	 | j        j                            | j        |||          }t          |j                  cY S # t          $ r}t          d|            Y d}~Y dS d}~ww xY wt          $ r}t          d|            Y d}~dS d}~ww xY w)	u"   调用 API，带重试和限流。Nuser)roler   )r   r<   r:   r=   z#[agent] Rate limited, waiting 5s...   z[agent] Retry failed: z[agent] API error: )r8   r-   r=   creater   r   r   r*   RateLimitErrorprintr4   r5   	Exception)r%   r:   r;   r<   r=   responsees          r   	_call_apizShellAgent._call_apid   s               !'LAABHHF|#L#L"MMH	{+22j%!	 3  H !!1222' 	 	 	7888-"""""""""
;/66*)!%	 7   %X%566666   2q22333tttttt  	 	 	+++,,,44444	sA   ;A, ,8D4%;C# D4#
D-D?D4DD4D//D4
user_inputcontextllm_messagesc                 @  K   d}|rN|                     d          r|d|d          z  }|                     d          r|d|d         dd          z  }|}|r| d| }|                     | j        ||	           d{V }||S |                    d
          r|S |S )u7   理解用户自然语言输入，生成 shell 命令。r   pwdu   
当前目录: last_outputu   
最近输出: N   u
   

用户: )r=   zUNKNOWN:)r   rH   UNDERSTAND_PROMPT
startswith)r%   rI   rJ   rK   context_hintr;   results          r   
understandzShellAgent.understand   s	       	R{{5!! D C75> C CC{{=)) R Q7=3I$3$3O Q QQ! 	E*DD
DDL~~"! & 
 
 
 
 
 
 
 
 >Z(( 	r   command
raw_outputc                    K   |                                  sd| d|dd          S d| d| d|dd          }|                     | j        |d	|
           d{V }|d| d|dd          S |S )u6   总结命令执行结果，返回自然语言回复。u   执行了: r	   iNu   用户想: u   
执行的命令: u
   

输出:
i  i   )r<   r=   )r0   rH   SUMMARIZE_PROMPT)r%   rI   rU   rV   rK   r;   rS   s          r   	summarizezShellAgent.summarize   s         "" 	@???Jtuu,=???mZmmGmmZdejfjejZkmm~~!!	 & 
 
 
 
 
 
 
 
 >???Jtuu,=???r   )NNN)r   N)r9   N)NN)N)__name__
__module____qualname____doc__rP   rX   strr&   propertyr*   r+   r-   r/   r0   r8   intlistdictrH   r   rT   rY   r(   r   r   r   r      s       ..: ## 	( (t( *( Tz	( ( ( ( 		+ 	 	 	 X	"d " " " "0 0 0 0 &*' '' ' 	'
 t*t#' 
t' ' ' 'X *.*.	  c3h$& 4j4'	
 
   J +/   	
 4j4' 
     r   r   )r]   r4   r   r2   typingr   r*   butler.configr   ra   r^   r   r   agentr(   r   r   <module>rf      s    @ @  				            " " " " " "$49 $ $ $ $ $m m m m m m m mb 	
r   