
    hh                          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        k/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/langchain_community/chat_models/litellm_router.pyget_llm_outputr!      sD    &.Jj!H , ,j  &smJsO    c                   H    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eddf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                L     t                      j        dd|i| || _        dS )zConstruct Chat LiteLLM Router.r%   N )super__init__r%   )selfr%   r&   	__class__s      r    r*   zChatLiteLLMRouter.__init__+   s0    111&111r"   c                     dS )NLiteLLMRouterr(   )r+   s    r    	_llm_typezChatLiteLLMRouter._llm_type0   s    r"   r   c                 T    d}||v r||         ||= |                     di            d S )Napi_baser   )
setdefault)r+   r   api_base_key_names      r    _prepare_params_for_routerz,ChatLiteLLMRouter._prepare_params_for_router4   sE    &&&62C+D+L() 	*b)))))r"   
model_namec                     | j         j        }|st          d          |D ]}|d         |k    r
|| _         dS 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.r5   NzModel z not found in model_list.)r%   
model_list
ValueErrormodel)r+   r5   r7   entrys       r    set_default_modelz#ChatLiteLLMRouter.set_default_model=   ss     [+
 	=;<<< 	 	E\"j00'
 1 G*GGGHHHr"   messagesstoprun_managerstreamc                    ||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_dictsr4   r%   
completion_create_chat_resultr+   r<   r=   r>   r?   r&   should_streamstream_itermessage_dictsr   responses              r    	_generatezChatLiteLLMRouter._generateM   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   rC   r4   r%   rD   lenr   r,   r   on_llm_new_tokencontentr+   r<   r=   r>   r&   default_chunk_classrI   r   rQ   rO   cg_chunks              r    rB   zChatLiteLLMRouter._streamf   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 rM   )r   rC   r4   r%   acompletionrR   r   r,   r   rS   rT   rU   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   Cc                 $  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(   )rA   rZ   r   rC   r4   r%   rY   rE   rF   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 ]t}||d         }|N|                                                                 D ]'\  }}||v r||         ||xx         |z  cc<   "|||<   (||                    d          }u|| j        d}|r||d<   |S )Nr   system_fingerprint)r   r5   )
model_dumpitemsgetr9   )	r+   r]   overall_token_usager_   outputr   kvcombineds	            r    _combine_llm_outputsz&ChatLiteLLMRouter._combine_llm_outputs   s    $&!! 	F 	FF~ /K&'2244::<< 3 3DAq///4G4J4V+A...!3....12+A..!)%+ZZ0D%E%E"#6djQQ 	@-?H)*r"   rJ   c           	      ^   ddl m} g }|d         D ]^}t          |d                   }t          |t	          |                    d                              }|                    |           _|                    d |dd	                    }t          |fi |}	t          ||	
          S )Nr   )UsagerN   rP   finish_reason)rk   )rP   generation_infor   )prompt_tokenstotal_tokens)generationsr   )	litellm.utilsrj   r   r   dictrb   appendr!   r   )
r+   rJ   r   rj   ro   resrP   genr   r   s
             r    rE   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"   )NNN)NN)__name__
__module____qualname____doc__r   __annotations__r*   propertystrr/   r4   r;   r   r   r	   r   boolr   rK   r   r   rB   r
   r   rZ   r\   rq   rh   r   rE   __classcell__)r,   s   @r    r$   r$   &   s        ,,KKK#        
 3    X* * * * * *IC ID I I I I& %):>!%< <{#< tCy!< 67	<
 < < 
< < < <8 %):>	 {# tCy! 67	
  
%	&   4 %)?C	 {# tCy! ;<	
  
*	+   < %)?C!%< <{#< tCy!< ;<	<
 < < 
< < < <8Xd^0D     ,JS)J58J	J J J J J J J Jr"   r$   N)rx   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_namerq   r!   r$   r(   r"   r    <module>r      su   ( ( H H H H H H H H H H H H H H H H               @ ? ? ? ? ? ? ? R R R R R R R R R R          % $ 	# 	 	 	 	 	 	sJ sJ sJ sJ sJ sJ sJ sJ sJ sJr"   