o
    Zh                      @   s   d Z ddlmZmZmZmZmZmZ ddlm	Z	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mZmZ dZd	Zd
ededefddZG dd deZdS )"LiteLLM Router as LangChain Model.    )AnyAsyncIteratorIteratorListMappingOptional)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)agenerate_from_streamgenerate_from_stream)AIMessageChunkBaseMessage)ChatGenerationChatGenerationChunk
ChatResult)ChatLiteLLM_convert_delta_to_message_chunk_convert_dict_to_messagetoken_usageZmodel_extrausageparamsreturnc                 K   s2   t | i}|d }|D ]}||vr|| ||< q
|S )z%Get llm output from usage and params.metadata)token_usage_key_name)r   r   
llm_outputr   key r   e/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/chat_models/litellm_router.pyget_llm_output   s   r   c                       s  e Zd ZU dZeed< dededdf fddZedefdd	Z	d
eddfddZ
deddfddZ			d"dee deee  dee dee dedefddZ		d#dee deee  dee dedee f
ddZ		d#dee deee  dee dedee f
ddZ			d"dee deee  dee dee dedefddZdeee  defddZdeeef d
edefd d!Z  ZS )$ChatLiteLLMRouterr   routerkwargsr   Nc                   s    t  jdd|i| || _dS )zConstruct Chat LiteLLM Router.r!   Nr   )super__init__r!   )selfr!   r"   	__class__r   r   r$   +   s   
zChatLiteLLMRouter.__init__c                 C   s   dS )NZLiteLLMRouterr   )r%   r   r   r   	_llm_type0   s   zChatLiteLLMRouter._llm_typer   c                 C   s.   d}||v r|| d u r||= | di  d S )NZapi_baser   )
setdefault)r%   r   Zapi_base_key_namer   r   r   _prepare_params_for_router4   s   z,ChatLiteLLMRouter._prepare_params_for_router
model_namec                 C   sF   | j j}|s
td|D ]}|d |kr|| _ dS qtd| d)a  Set the default model to use for completion calls.

        Sets `self.model` to `model_name` if it is in the litellm router's
        (`self.router`) model list. This provides the default model to use
        for completion calls if no `model` kwarg is provided.
        zmodel_list is None or empty.r+   NzModel z not found in model_list.)r!   
model_list
ValueErrormodel)r%   r+   r,   entryr   r   r   set_default_model=   s   z#ChatLiteLLMRouter.set_default_modelmessagesstoprun_managerstreamc                 K   s   |d ur|n| j }|r| j|f||d|}t|S | ||\}}	i |	|}	| |	 | jjdd|i|	}
| j|
fi |	S )N)r2   r3   r1   r   )	streaming_streamr   _create_message_dictsr*   r!   
completion_create_chat_resultr%   r1   r2   r3   r4   r"   Zshould_streamZstream_itermessage_dictsr   responser   r   r   	_generateM   s&   

zChatLiteLLMRouter._generatec                 k   s    t }| ||\}}i ||ddi}| | | jjd	d|i|D ]1}t|d dkr0q%|d d d }	t|	|}|j}t|d}
|rS|j	|j
fd|
i| |
V  q%d S 
Nr4   Tr1   choicesr   delta)messagechunkr   )r   r7   r*   r!   r8   lenr   r'   r   on_llm_new_tokencontentr%   r1   r2   r3   r"   Zdefault_chunk_classr;   r   rB   r@   Zcg_chunkr   r   r   r6   f   s    


zChatLiteLLMRouter._streamc                 K  s   t }| ||\}}i ||ddi}| | | jjd	d|i|I d H 2 z83 d H W }t|d dkr7q(|d d d }	t|	|}|j}t|d}
|r]|j	|j
fd|
i|I d H  |
V  q(6 d S r>   )r   r7   r*   r!   acompletionrC   r   r'   r   rD   rE   rF   r   r   r   _astream}   s4   



zChatLiteLLMRouter._astreamc                    s   |d ur|n| j }|r| jd|||d|}t|I d H S | ||\}}	i |	|}	| |	 | jjdd|i|	I d H }
| j|
fi |	S )N)r1   r2   r3   r1   r   )r5   rH   r   r7   r*   r!   rG   r9   r:   r   r   r   
_agenerate   s$   

zChatLiteLLMRouter._ageneratellm_outputsc           	      C   s   i }d }|D ]:}|d u rq|d }|d ur7|   D ]\}}||v r2|| d ur2||  |7  < q|||< q|d u r@|d}q|| jd}|rM||d< |S )Nr   system_fingerprint)r   r+   )Z
model_dumpitemsgetr.   )	r%   rJ   Zoverall_token_usagerK   outputr   kvcombinedr   r   r   _combine_llm_outputs   s$   

z&ChatLiteLLMRouter._combine_llm_outputsr<   c           
      K   s|   ddl m} g }|d D ]}t|d }t|t|ddd}|| q|d|ddd	}t|fi |}	t||	d
S )Nr   )Usager?   rA   finish_reason)rT   )rA   Zgeneration_infor   )Zprompt_tokensZtotal_tokens)generationsr   )	Zlitellm.utilsrS   r   r   dictrM   appendr   r   )
r%   r<   r   rS   rU   resrA   genr   r   r   r   r   r9      s   z%ChatLiteLLMRouter._create_chat_result)NNN)NN)__name__
__module____qualname____doc__r   __annotations__r$   propertystrr(   r*   r0   r   r   r   r
   boolr   r=   r   r   r6   r	   r   rH   rI   rV   rR   r   r9   __classcell__r   r   r&   r   r    &   s   
 	








r    N)r]   typingr   r   r   r   r   r   Z langchain_core.callbacks.managerr	   r
   Z*langchain_core.language_models.chat_modelsr   r   Zlangchain_core.messagesr   r   Zlangchain_core.outputsr   r   r   Z'langchain_community.chat_models.litellmr   r   r   r   Zmodel_extra_key_namerV   r   r    r   r   r   r   <module>   s     