a
    bg                      @   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eeed
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   |/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/chat_models/litellm_router.pyget_llm_output   s    r   c                       sL  e Zd ZU dZeed< eedd fddZeeddd	Z	edd
ddZ
eddddZd ee eee  ee ee eedddZd!ee eee  ee eee dddZd"ee eee  ee eee dddZd#ee eee  ee ee eedddZeee  edddZeeef eedddZ  ZS )$ChatLiteLLMRouterr   routerN)r!   kwargsr   c                   s    t  jf d|i| || _dS )zConstruct Chat LiteLLM Router.r!   N)super__init__r!   )selfr!   r"   	__class__r   r   r$   +   s    zChatLiteLLMRouter.__init__)r   c                 C   s   dS )NZLiteLLMRouterr   )r%   r   r   r   	_llm_type0   s    zChatLiteLLMRouter._llm_type)r   r   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_namer   c                 C   sJ   | j j}|std|D ]}|d |kr|| _ dS qtd| ddS )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streamr"   r   c                 K   s   |d ur|n| j }|r6| j|f||d|}t|S | ||\}}	i |	|}	| |	 | jjf d|i|	}
| j|
fi |	S )N)r2   r3   r1   )	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._generate)r1   r2   r3   r"   r   c                 k   s   t }| ||\}}i ||ddi}| | | jjf d|i|D ]b}t|d dkr^qH|d d d }	t|	|}|j}t|d}
|r|j	|j
fd|
i| |
V  qHd S 	Nr4   Tr1   choicesr   delta)messagechunk)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f d|i|I d H 2 zp3 d H W }t|d dkrlqN|d d d }	t|	|}|j}t|d}
|r|j	|j
fd|
i|I d H  |
V  qN6 d S r>   )r   r7   r*   r!   acompletionrC   r   r'   r   rD   rE   rF   r   r   r   _astream}   s0    



zChatLiteLLMRouter._astreamc                    s   |d ur|n| j }|r<| jf |||d|}t|I d H S | ||\}}	i |	|}	| |	 | jjf d|i|	I d H }
| j|
fi |	S )N)r1   r2   r3   r1   )r5   rH   r   r7   r*   r!   rG   r9   r:   r   r   r   
_agenerate   s"    

zChatLiteLLMRouter._agenerate)llm_outputsr   c           	      C   s   i }d }|D ]t}|d u rq|d }|d urn|   D ]6\}}||v rd|| d urd||  |7  < q6|||< q6|d u r|d}q|| jd}|r||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_outputs)r<   r   r   c           
      K   s|   ddl m} g }|d D ]2}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)NN)NNN)__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    &   sf   
	   
  
  
   
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    