
    n+j                         d Z ddlmZ ddlZddlmZmZ ddlmZ  ej	        dej
                  Z G d de          Z G d	 d
          Z G d d          ZdS )u   LLM 客户端:协议 + litellm 实现(DeepSeek / MiniMax)+ 测试用脚本桩。

面向接口编程——上层只依赖 LLM 协议,换模型/换厂商只改注入(litellm 已抽象多厂商)。
    )annotationsN)CallableProtocol)configz<think>.*?</think>\s*c                      e Zd Zd	dZdS )
LLMmessages
list[dict]kwargsobjectreturnstrc                    dS )u7   传 [{'role','content'}...],返回模型文本输出。N selfr	   r   s      -/root/genesis-world/src/genesis/llm/client.pycompletezLLM.complete   s        Nr	   r
   r   r   r   r   )__name__
__module____qualname__r   r   r   r   r   r      s(             r   r   c                  0    e Zd ZdZ	 dddddddZddZdS )LiteLLMClientuO   litellm 后端,按 config.LLM_PROVIDER 路由到 MiniMax(默认)或 DeepSeek。Ng?)api_keyapi_basetemperaturemodel
str | Noner   r   r   floatr   Nonec               <   dd l }|| _        t          j        dk    r=|pdt          j         | _        |pt          j        | _        |pt          j        | _	        n<|pdt          j
         | _        |pt          j        | _        |pt          j        | _	        || _        d S )Nr   minimaxzopenai/z	deepseek/)litellm_litellmr   LLM_PROVIDERMINIMAX_MODELr   MINIMAX_API_KEYr   MINIMAX_BASE_URLr   DEEPSEEK_MODELDEEPSEEK_API_KEYDEEPSEEK_BASE_URLr   )r   r   r   r   r   r%   s         r   __init__zLiteLLMClient.__init__   s     	)++B"BF,@"B"BDJ"<f&<DL$?(?DMM E"Ef.C"E"EDJ"=f&=DL$@(@DM&r   r	   r
   r   r   r   c                T   t          |                    dd                    }t          |                    di           pi           }t          j        dk    rdnd}|                    dd|r|nd	i            | j        j        d| j        || j	        | j
        |                    d
| j                  |                    dd          |                    dd          |d|}|j        d         j        j        pd}t                              d|                                          S )N	_thinkingF
extra_bodyr$   adaptiveenabledthinkingtypedisabledr   timeout<   num_retries   )r   r	   r   r   r   r7   r9   r1   r    r   )boolpopdictr   r'   
setdefaultr&   
completionr   r   r   r   choicesmessagecontent_THINK_BLOCKsubstrip)r   r	   r   r4   r1   on_typeresprC   s           r   r   zLiteLLMClient.complete0   s(    

;6677&**\266<"==
 & 3y @ @**ij6h3V77J*WXXX't}' 

*L]

=$2BCCJJy"--

=!44!

 

 

 

 ,q/)17RG,,22444r   N)
r   r    r   r    r   r    r   r!   r   r"   r   r   r   r   __doc__r.   r   r   r   r   r   r      sa        YY !' ## ' ' ' ' ' '.5 5 5 5 5 5r   r   c                  ,    e Zd ZdZ	 ddddd
ZddZdS )ScriptedLLMuX   确定性测试桩:按队列依次返回,或用 responder(messages)->str 动态应答。N)	responder	responseslist[str] | NonerN   "Callable[[list[dict]], str] | Noner   r"   c               N    t          |pg           | _        || _        g | _        d S rI   )list
_responses
_respondercalls)r   rO   rN   s      r   r.   zScriptedLLM.__init__L   s)     yB//#')


r   r	   r
   r   r   r   c                    | j                             |           | j        |                     |          S | j        r| j                            d          S t          d          )Nr   u   ScriptedLLM 响应已耗尽)rV   appendrU   rT   r=   AssertionErrorr   s      r   r   zScriptedLLM.completeV   sa    
(###?&??8,,,? 	*?&&q))):;;;r   rI   )rO   rP   rN   rQ   r   r"   r   rJ   r   r   r   rM   rM   I   s[        bb '+* 9=	* * * * * *< < < < < <r   rM   )rK   
__future__r   retypingr   r   genesisr   compileSrD   r   r   rM   r   r   r   <module>r`      s    
 # " " " " " 				 % % % % % % % %      rz2BD99    (   05 05 05 05 05 05 05 05f< < < < < < < < < <r   