
    Ti-                         S r SSKJrJr  SSKJrJrJrJrJ	r	  SSK
r
\
R                  " \5      r " S S\5      r " S S5      rg)	uD   
AI 提供商基类

定义所有 AI 提供商必须实现的接口
    )ABCabstractmethod)DictListAnyOptional	GeneratorNc                   8   \ rS rSrSrS S\S\S\4S jjr\\S\4S	 j5       5       r	\\S\4S
 j5       5       r
\S\4S j5       r\S\4S j5       r\S\\   4S j5       r\   S!S\\\\4      S\\   S\S\S\\\4   4
S jj5       r\   S!S\\\\4      S\\   S\S\S\\\\4   SS4   4
S jj5       rS\\\4   4S jrS\\   4S jrS\\   4S jrS rS\S\4S jrS\\\\4      S\\\\4      4S jrS\\   S\\   4S jrS\S\\\4   4S jrSrg)"BaseAIProvider   uX   AI 提供商抽象基类

所有 AI 提供商都必须继承此类并实现抽象方法
Napi_keybase_urlmodelc                    Xl         U=(       d    U R                  5       U l        U=(       d    U R                  5       U l        UR                  SS5      U l        UR                  SS5      U l        / U l        UR                  S5      U l	        g)u   初始化 AI 提供商

Args:
    api_key: API 密钥
    base_url: API 基础 URL（可选，使用默认值）
    model: 模型名称（可选，使用默认值）
    **kwargs: 其他配置参数
timeouti,  max_retries   log_callbackN)
r   get_default_base_urlr   get_default_modelr   getr   r   _toolsr   )selfr   r   r   kwargss        O   /Users/yu22x/Desktop/ddd_副本123/ctf/app/services/ai_driver/providers/base.py__init__BaseAIProvider.__init__   st      ?D$=$=$?6d446
zz)S1!::mQ7  #JJ~6    returnc                     g)u   返回提供商类型标识N r   s    r   provider_typeBaseAIProvider.provider_type*        	r   c                     g)u   返回提供商显示名称Nr!   r"   s    r   provider_nameBaseAIProvider.provider_name0   r%   r   c                     g)u   返回默认 API Base URLNr!   r"   s    r   r   #BaseAIProvider.get_default_base_url6        	r   c                     g)u   返回默认模型名称Nr!   r"   s    r   r    BaseAIProvider.get_default_model;   r+   r   c                     g)u   返回可用模型列表Nr!   r"   s    r   get_available_models#BaseAIProvider.get_available_models@   r+   r   messagestoolstemperature
max_tokensc                     g)u  执行聊天补全

Args:
    messages: 消息列表，格式为 [{"role": "user/assistant/system", "content": "..."}]
    tools: 工具定义列表（用于 Function Calling）
    temperature: 温度参数
    max_tokens: 最大 token 数
    **kwargs: 其他参数
    
Returns:
    响应字典，包含:
    - content: 文本响应内容
    - tool_calls: 工具调用列表（如果有）
    - usage: token 使用统计
    - finish_reason: 结束原因
Nr!   r   r1   r2   r3   r4   r   s         r   chatBaseAIProvider.chatE   s    2 	r   c                     g)uR   流式聊天补全

Args:
    同 chat 方法
    
Yields:
    响应片段字典
Nr!   r6   s         r   chat_streamBaseAIProvider.chat_stream`   s    " 	r   c                    SSK n UR                  5       nU R                  SSS./SS9n[        UR                  5       U-
  S-  5      nUR                  S	5      (       a  S
SU R                   3UU R                  S.$ SSUS.$ ! [
         a=  n[        R                  S[        U5       35        SS[        U5       3SS.s SnA$ SnAff = f)u   测试 API 连接

Returns:
    测试结果字典:
    - success: 是否成功
    - message: 结果消息
    - latency: 响应延迟（毫秒）
r   Nuserz"Hi, just testing. Reply with 'OK'.)rolecontent
   )r1   r4   i  r?   Tu   连接成功，模型: )successmessagelatencyr   Fu   连接成功但响应为空)rA   rB   rC   u   测试连接失败: u   连接失败: )	timer7   intr   r   	Exceptionloggererrorstr)r   rD   
start_timeresponserC   es         r   test_connectionBaseAIProvider.test_connections   s     		J yy#)6Z[\ ! H
 499;3t;<G||I&&#!8E&!ZZ	   %<&   	LL/Ax89 +CF84 	s$   A6B =B 
C
2C?C
C
c                     Xl         g)u8   设置可用工具

Args:
    tools: 工具定义列表
Nr   r   r2   s     r   	set_toolsBaseAIProvider.set_tools   s	     r   c                     U R                   $ )u   获取当前工具列表rP   r"   s    r   	get_toolsBaseAIProvider.get_tools   s    {{r   c                     Xl         g)u\   设置日志回调函数

Args:
    callback: 回调函数，接受 (level, message) 参数
N)r   )r   callbacks     r   set_log_callbackBaseAIProvider.set_log_callback   s
     %r   levelrB   c                     U R                   (       a  U R                  X5        [        [        U[        R                  5      nU" SU R                   SU 35        g)u]   记录日志

Args:
    level: 日志级别 (info, warning, error)
    message: 日志消息
[z] N)r   getattrrG   infor'   )r   r[   rB   log_funcs       r   _logBaseAIProvider._log   sI     e-65&++61T''(7)45r   c                     U$ )u   格式化消息（子类可重写以适配不同格式）

Args:
    messages: 原始消息列表
    
Returns:
    格式化后的消息列表
r!   )r   r1   s     r   _format_messagesBaseAIProvider._format_messages   	     r   c                     U$ )u   格式化工具定义（子类可重写以适配不同格式）

Args:
    tools: 原始工具定义列表
    
Returns:
    格式化后的工具定义列表
r!   rQ   s     r   _format_toolsBaseAIProvider._format_tools   s	     r   rK   c                     U$ )uy   解析 API 响应（子类可重写）

Args:
    response: 原始 API 响应
    
Returns:
    标准化的响应字典
r!   )r   rK   s     r   _parse_responseBaseAIProvider._parse_response   rf   r   )r   r   r   r   r   r   r   )NN)Ngffffff?N)__name__
__module____qualname____firstlineno____doc__rI   r   propertyr   r#   r'   r   r   r   r/   r   floatrE   r   r7   r	   r:   rM   rR   rU   rY   ra   rd   rh   rk   __static_attributes__r!   r   r   r   r      sI   
7 7s 7# 7* s    s    c   3   d3i    ! tCH~& Dz 	
  
c3h 4  ! tCH~& Dz 	
  
4S>4-	. $*c3h *XtDz 4: %6# 6 6	d38n)= 	$tCQTH~BV 		4: 	$t* 		 	S#X 	r   r   c                   4   \ rS rSrSr\ SS\S\S\\\4   S\	\   S\4
S	 jj5       r
\S\4S
 j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\	\   4S j5       rSrg)ToolDefinition   u   工具定义辅助类Nnamedescription
parametersrequiredr   c                 .    SU USUU=(       d    / S.S.S.$ )u   创建工具定义

Args:
    name: 工具名称
    description: 工具描述
    parameters: 参数定义
    required: 必需参数列表
    
Returns:
    工具定义字典（OpenAI 格式）
functionobject)type
propertiesr{   )rx   ry   rz   )r   r}   r!   rx   ry   rz   r{   s       r   createToolDefinition.create   s.    & *$", (B
 	
r   c            	      J    [         R                  SSSSS.SSS.SSS.S	.S
/S9$ )u   运行命令工具定义run_commandu"   在指定目录执行 shell 命令stringu   要执行的 shell 命令r   ry   u'   命令执行的工作目录（可选）integeru'   命令超时时间（秒），默认 60)commandcwdr   r   r   rv   r   r!   r   r   r   ToolDefinition.run_command  sU     $$< %#>
 %#L
 &#L  [# % 
 	
r   c                  :    [         R                  SSSSSS.0S/S9$ )u   读取文件工具定义	read_fileu!   读取指定路径的文件内容pathr      文件的绝对路径r   r   r   r!   r   r   r   ToolDefinition.read_file  s<     $$;$#: X % 

 
	
r   c                  D    [         R                  SSSSS.SSS.S.SS	/S
9$ )u   写入文件工具定义
write_fileu<   将内容写入指定路径的文件（自动创建目录）r   r   r   u   要写入的文件内容)r   r?   r   r?   r   r   r!   r   r   r   ToolDefinition.write_file*  sK     $$V %#:
 %#=	 i( % 
 	
r   c                  :    [         R                  SSSSSS.0S/S9$ )u   列出目录工具定义list_directoryu*   列出指定目录下的文件和子目录r   r   u   目录的绝对路径r   r   r   r!   r   r   r   ToolDefinition.list_directory=  s<     $$!D$#: X % 

 
	
r   c                  D    [         R                  SSSSS.SSS.S.SS	/S
9$ )u   保存记忆工具定义save_memoryuN   保存关键上下文信息到记忆存储（用于跨阶段保持一致性）r   u[   记忆键名（建议使用固定key，如 challenge_name, exploit_chain, output_dir 等）r   u<   要保存的内容（建议结构化、简短、可复用）)keyr?   r   r?   r   r   r!   r   r   r   ToolDefinition.save_memoryL  sN     $$h % $A
 %#a	 Y' % 
 	
r   c                  :    [         R                  SSSSSS.0S/S9$ )u   读取记忆工具定义read_memoryu    读取指定 key 的记忆内容r   r   u   要读取的记忆键名r   r   r   r!   r   r   r   ToolDefinition.read_memory_  s<     $$:$#= W % 

 
	
r   c                  .    [         R                  SS0 / S9$ )u   列出记忆工具定义list_memoriesu(   列出当前已保存的所有记忆 keyr   r   r!   r   r   r   ToolDefinition.list_memoriesn  s(     $$ B	 % 
 	
r   c                  8    [         R                  SSSSSS.0/ S9$ )u   清空记忆工具定义clear_memoriesu;   清空所有记忆或按 key 前缀清空（谨慎使用）prefixr   u1   可选：仅清空以该前缀开头的记忆 keyr   r   r   r!   r   r   r   ToolDefinition.clear_memoriesx  s:     $$!U$#V  % 

 
	
r   c                      [         R                  5       [         R                  5       [         R                  5       [         R	                  5       /$ )u,   获取 CTF 题目生成所需的所有工具)rv   r   r   r   r   r!   r   r   get_ctf_toolsToolDefinition.get_ctf_tools  s>     &&($$&%%'))+	
 	
r   r!   )N)rm   rn   ro   rp   rq   staticmethodrI   r   r   r   r   r   r   r   r   r   r   r   r   r   rt   r!   r   r   rv   rv      sM   
 #	


 cN
 s)	

 

 
< 
 
 
, 
t 
 
 
 
 
$ 
D 
 
 
 
 
$ 
 
 
 
4 
 
 
D 
 
 
4: 
 
r   rv   )rq   abcr   r   typingr   r   r   r   r	   logging	getLoggerrm   rG   r   rv   r!   r   r   <module>r      sC    $ 7 7 			8	$PS Pfm
 m
r   