
    Ig                         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y)"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                 H    t         | i}|d   }|D ]  }||vs||   ||<    |S )z%Get llm output from usage and params.metadata)token_usage_key_name)r   r   
llm_outputr   keys        k/var/www/html/answerous/venv/lib/python3.12/site-packages/langchain_community/chat_models/litellm_router.pyget_llm_outputr!   (   sB    &.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                2    t        |   di | || _        y)zConstruct Chat LiteLLM Router.N )super__init__r%   )selfr%   r&   	__class__s      r    r*   zChatLiteLLMRouter.__init__9   s    "6"r"   c                      y)NLiteLLMRouterr(   r+   s    r    	_llm_typezChatLiteLLMRouter._llm_type>   s    r"   c                 F    | j                   j                  d   d   | _        y )Nr   
model_name)r%   
model_listmodelr/   s    r    _set_model_for_completionz+ChatLiteLLMRouter._set_model_for_completionB   s     [[++A.|<
r"   r   c                 b    | j                   |d<   d}||v r||   ||= |j                  di        y )Nr4   api_baser   )r4   
setdefault)r+   r   api_base_key_names      r    _prepare_params_for_routerz,ChatLiteLLMRouter._prepare_params_for_routerG   sE    **w '&62C+D+L() 	*b)r"   messagesstoprun_managerstreamc                 B   ||n| j                   }|r! | j                  |f||d|}t        |      S | j                  ||      \  }}	i |	|}	| j	                          | j                  |	        | 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$..&$,,#@FK (44 $ : :8T Jv%F%f%&&(''/)4;;)) 
"

 (t'';F;;r"   c              +     K   t         }| j                  ||      \  }}i ||ddi}| j                          | j                  |        | j                  j
                  d	d|i|D ]h  }t        |d         dk(  r|d   d   d   }	t        |	|      }|j                  }t        |      }
|r |j                  |j                  fd|
i| |
 j y w
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v5F5f5h5&&(''/+T[[++M]MfM 		E5#$))$Q'0E3E;NOE"'//*59H,,,U]]U(UfUN		s   CCc                  K   t         }| j                  ||      \  }}i ||ddi}| j                          | j                  |        | j                  j
                  d	d|i| d {   2 3 d {   }t        |d         dk(  r|d   d   d   }	t        |	|      }|j                  }t        |      }
|r' |j                  |j                  fd|
i| d {    |
 y7 }7 v7 6 y wrL   )r   rB   r5   r:   r%   acompletionrQ   r   r,   r   rR   rS   rT   s              r    _astreamzChatLiteLLMRouter._astream   s(     - $ : :8T Jv5F5f5h5&&(''/!8!8!8 "
""
&,"
 
 	 	% 5#$))$Q'0E3E;NOE"'//*59H2k22MM)15;   N
 	
sI   A(C0*C(+C0/C.3C*4C.7A&C0C,C0*C.,C0.C0c                 r  K   ||n| j                   }|r) | j                  d|||d|}t        |       d {   S | j                  ||      \  }}	i |	|}	| j	                          | j                  |	        | j                  j                  dd|i|	 d {   }
 | j                  |
fi |	S 7 y7 w)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v%F%f%&&(''/000 
"

 
 (t'';F;; <
s"   7B7B3A!B7B5B75B7llm_outputsc                     i }d }|D ]]  }||d   }|=|j                         j                         D ]  \  }}||v r||xx   |z  cc<   |||<    |M|j                  d      }_ || 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~ /K&',,.446 3DAq//+A.!3.12+A.	3
 ")%+ZZ0D%E"	F $7dooV-?H)*r"   rI   c           	         ddl m} g }|d   D ]G  }t        |d         }t        |t	        |j                  d                  }|j                  |       I |j                  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?3K LC s#	$ ll7EPQ,RS#K:6:
kj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   ,K#   
 3  =
	* 	* 	* %):>!%<{#< tCy!< 67	<
 < < 
<: %):>	{# tCy! 67	
  
%	&6 %)?C	{# tCy! ;<	
  
*	+> %)?C!%<{#< tCy!< ;<	<
 < < 
<:Xd^0D  ,JS)J58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      sm    (    % $ 	# 	 	 	nJ nJr"   