
    Ng                         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Z G 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_usagemodel_extrausageparamsreturnc                 P    t           | i}|d         }|D ]}||vr||         ||<   |S )z%Get llm output from usage and params.metadata)token_usage_key_name)r   r   
llm_outputr   keys        j/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/litellm_router.pyget_llm_outputr!   (   sD    &.Jj!H , ,j  &smJsO    c                   @    e Zd ZU dZeed<   dededdf fdZedefd            Z	ddZ
d	eddfd
Z	 	 	 ddee         deee                  dee         dee         dedefdZ	 	 ddee         deee                  dee         dedee         f
dZ	 	 ddee         deee                  dee         dedee         f
dZ	 	 	 ddee         deee                  dee         dee         dedefdZdeee                  defdZdeeef         d	edefdZ xZS )ChatLiteLLMRouterr   routerkwargsr   Nc                H     t                      j        di | || _        dS )zConstruct Chat LiteLLM Router.N )super__init__r%   )selfr%   r&   	__class__s      r    r*   zChatLiteLLMRouter.__init__9   s+    ""6"""r"   c                     dS )NLiteLLMRouterr(   r+   s    r    	_llm_typezChatLiteLLMRouter._llm_type>   s    r"   c                 @    | j         j        d         d         | _        d S )Nr   
model_name)r%   
model_listmodelr/   s    r    _set_model_for_completionz+ChatLiteLLMRouter._set_model_for_completionB   s     [+A.|<


r"   r   c                 h    | j         |d<   d}||v r||         ||= |                    di            d S )Nr4   api_baser   )r4   
setdefault)r+   r   api_base_key_names      r    _prepare_params_for_routerz,ChatLiteLLMRouter._prepare_params_for_routerG   sR    *w '&&62C+D+L() 	*b)))))r"   messagesstoprun_managerstreamc                 0   ||n| j         }|r  | j        |f||d|}t          |          S |                     ||          \  }}	i |	|}	|                                  |                     |	            | j        j        dd|i|	}
 | j        |
fi |	S )N)r<   r=   r;   r(   )		streaming_streamr   _create_message_dictsr5   r:   r%   
completion_create_chat_resultr+   r;   r<   r=   r>   r&   should_streamstream_itermessage_dictsr   responses              r    	_generatezChatLiteLLMRouter._generateR   s     #)"4$. 	5&$,# @F K (444 $ : :8T J Jv%F%f%&&(((''///)4;) 
 
"

 
 (t';;F;;;r"   c              +     K   t           }|                     ||          \  }}i ||ddi}|                                  |                     |            | j        j        d	d|i|D ]r}t          |d                   dk    r|d         d         d         }	t          |	|          }|j        }t          |          }
|r |j
        |j        fd|
i| |
V  sd S 
Nr>   Tr;   choicesr   delta)messagechunkr(   )r   rB   r5   r:   r%   rC   lenr   r,   r   on_llm_new_tokencontentr+   r;   r<   r=   r&   default_chunk_classrH   r   rP   rN   cg_chunks              r    rA   zChatLiteLLMRouter._streaml   s'      - $ : :8T J Jv5F5f5h55&&(((''///+T[+MM]MfMM 		 		E5#$$)))$Q'0E3E;NOOE"'/*5999H V,,U]UU(UfUUUNNNN		 		r"   c                  K   t           }|                     ||          \  }}i ||ddi}|                                  |                     |            | j        j        d	d|i| d {V 2 3 d {V }t          |d                   dk    r!|d         d         d         }	t          |	|          }|j        }t          |          }
|r |j
        |j        fd|
i| d {V  |
W V  6 d S rL   )r   rB   r5   r:   r%   acompletionrQ   r   r,   r   rR   rS   rT   s              r    _astreamzChatLiteLLMRouter._astream   s      - $ : :8T J Jv5F5f5h55&&(((''///!8!8 "
 "
""
&,"
 "
 
 
 
 
 
 
 	 	 	 	 	 	 	% 5#$$)))$Q'0E3E;NOOE"'/*5999H 2k2M )15;         NNNNN
 
 
s   0C/c                 L  K   ||n| j         }|r& | j        d|||d|}t          |           d {V S |                     ||          \  }}	i |	|}	|                                  |                     |	            | j        j        dd|i|	 d {V }
 | j        |
fi |	S )N)r;   r<   r=   r;   r(   )	r@   rY   r   rB   r5   r:   r%   rX   rD   rE   s              r    
_ageneratezChatLiteLLMRouter._agenerate   s#      #)"4$. 	<'$- !+ IO K /{;;;;;;;;; $ : :8T J Jv%F%f%&&(((''///00 
 
"

 
 
 
 
 
 
 
 (t';;F;;;r"   llm_outputsc                    i }d }|D ]l}||d         }|F|                                                                 D ]\  }}||v r||xx         |z  cc<   |||<    ||                    d          }m|| j        d}|r||d<   |S )Nr   system_fingerprint)r   r2   )dictitemsgetr2   )	r+   r\   overall_token_usager^   outputr   kvcombineds	            r    _combine_llm_outputsz&ChatLiteLLMRouter._combine_llm_outputs   s    $&!! 	F 	FF~ /K&',,..4466 3 3DAq///+A...!3....12+A..!)%+ZZ0D%E%E"#6doVV 	@-?H)*r"   rI   c           	      ^   ddl m} g }|d         D ]^}t          |d                   }t          |t	          |                    d                              }|                    |           _|                    d |dd	                    }t          |fi |}	t          ||	
          S )Nr   )UsagerM   rO   finish_reason)rj   )rO   generation_infor   )prompt_tokenstotal_tokens)generationsr   )	litellm.utilsri   r   r   r_   ra   appendr!   r   )
r+   rI   r   ri   rn   resrO   genr   r   s
             r    rD   z%ChatLiteLLMRouter._create_chat_result   s     	('''''I& 	$ 	$C.s9~>>G  $377?3K3K L L L  C s####ll7EEPQ,R,R,RSS#K::6::
kjIIIIr"   )r   N)NNN)NN)__name__
__module____qualname____doc__r   __annotations__r*   propertystrr0   r5   r:   r   r   r	   r   boolr   rJ   r   r   rA   r
   r   rY   r[   r_   rg   r   rD   __classcell__)r,   s   @r    r$   r$   4   s        ,,KKK#        
 3    X= = = =
	* 	* 	* 	* 	* 	* %):>!%< <{#< tCy!< 67	<
 < < 
< < < <: %):>	 {# tCy! 67	
  
%	&   6 %)?C	 {# tCy! ;<	
  
*	+   > %)?C!%< <{#< tCy!< ;<	<
 < < 
< < < <:Xd^0D     ,JS)J58J	J J J J J J J Jr"   r$   N)rv   typingr   r   r   r   r   r	    langchain_core.callbacks.managerr
   r   *langchain_core.language_models.chat_modelsr   r   langchain_core.messagesr   r   langchain_core.outputsr   r   r   'langchain_community.chat_models.litellmr   r   r   r   model_extra_key_namer_   r!   r$   r(   r"   r    <module>r      s   ( (                                                       % $ 	# 	 	 	 	 	 	nJ nJ nJ nJ nJ nJ nJ nJ nJ nJr"   