
    Ng3                       d dl mZ d dlZd dlmZmZmZmZmZm	Z	m
Z
mZ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mZ d dlmZ d dlmZmZmZ d dlm Z m!Z!m"Z" d d	l#m$Z$m%Z% d d
l&m'Z'm(Z(m)Z)m*Z* d dl+m,Z, d dl-m.Z.m/Z/ d dl0m1Z1 erd dl2m3Z3m4Z4  ej5        e6          Z7dZ8 G d de9          Z: G d de'          Z;d(dZ<	 d)d*d Z=	 d)d+d#Z>	 d)d,d&Z? G d' de          Z@dS )-    )annotationsN)TYPE_CHECKINGAnyAsyncGeneratorAsyncIteratorCallableDict	GeneratorIteratorListMappingOptionalTupleTypeUnion)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseChatModelagenerate_from_streamgenerate_from_stream)create_base_retry_decorator)AIMessageChunkBaseMessageBaseMessageChunk)ChatGenerationChatGenerationChunk
ChatResult)convert_to_secret_strget_from_dict_or_env)	BaseModelField	SecretStrmodel_validator)Self)convert_dict_to_messageconvert_message_to_dict)_convert_delta_to_message_chunk)ChunkedGenerationResponseGenerationResponsez)https://gpt-router-preview.writesonic.comc                      e Zd ZdZdS )GPTRouterExceptionzError with the `GPTRouter APIs`N)__name__
__module____qualname____doc__     f/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/gpt_router.pyr+   r+   4   s        ))))r1   r+   c                  (    e Zd ZU dZded<   ded<   dS )GPTRouterModelzGPTRouter model.strnameprovider_nameN)r,   r-   r.   r/   __annotations__r0   r1   r2   r4   r4   8   s-         IIIr1   r4   models_priority_listList[GPTRouterModel]kwargsr   returnr   c                R    ddl mm fdt          |           D             S )z5
    Return the body for the model router input.
    r   )GenerationParamsModelGenerationRequestc                Z    g | ]'\  }} |j         |j        |d z    di           (S )   )
model_namer7   orderprompt_paramsr0   )r6   r7   ).0indexmodelr>   r?   r;   s      r2   
<listcomp>z3get_ordered_generation_requests.<locals>.<listcomp>H   sg        E5 	z-!)**44V44		
 	
 	
  r1   )gpt_router.modelsr>   r?   	enumerate)r9   r;   r>   r?   s    `@@r2   get_ordered_generation_requestsrK   ?   s`     KJJJJJJJ      &&:;;   r1   llm	GPTRouterrun_managerHOptional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]]Callable[[Any], Any]c                p    ddl m} |j        |j        |j        |j        g}t          || j        |          S )Nr   )
exceptions)error_typesmax_retriesrN   )
gpt_routerrR   GPTRouterApiTimeoutErrorGPTRouterInternalServerErrorGPTRouterNotAvailableErrorGPTRouterTooManyRequestsErrorr   rT   )rL   rN   rR   errorss       r2   _create_retry_decoratorr[   S   sY     &%%%%% 	+/-0	F '[   r1   "Optional[CallbackManagerForLLMRun]KUnion[GenerationResponse, Generator[ChunkedGenerationResponse, None, None]]c                V     t           |          }|d fd            } |di |S )z*Use tenacity to retry the completion call.rN   r;   r   r<   c                 ~    t          fi | }j                            ||                     dd                    S NstreamF)ordered_generation_requests	is_stream)rK   clientgenerategetr;   rc   rL   r9   s     r2   _completion_with_retryz5completion_with_retry.<locals>._completion_with_retryo   sX    &E '
 '
$*'
 '
# z""(Cjj511 # 
 
 	
r1   r;   r   r<   r   r0   r[   rL   r9   rN   r;   retry_decoratorri   s   ``    r2   completion_with_retryrn   f   s^     .c{KKKO
 
 
 
 
 
 _
 "!++F+++r1   'Optional[AsyncCallbackManagerForLLMRun]JUnion[GenerationResponse, AsyncGenerator[ChunkedGenerationResponse, None]]c                f    K   t           |          }|d fd            } |di | d{V S )	z0Use tenacity to retry the async completion call.r_   r;   r   r<   c                    K   t          fi | }j                            ||                     dd                     d {V S ra   )rK   re   	ageneraterg   rh   s     r2   ri   z6acompletion_with_retry.<locals>._completion_with_retry   sz      &E '
 '
$*'
 '
# Z))(Cjj511 * 
 
 
 
 
 
 
 
 	
r1   Nrj   r0   rk   rl   s   ``    r2   acompletion_with_retryrt   |   st       .c{KKKO
 
 
 
 
 
 _
 ('11&111111111r1   c                  4   e Zd ZU dZ edd          Zded<    ed          Zd	ed
<    ed          Zded<   	 dZ	ded<   	 dZ
ded<   	  ee          Zded<   	 dZded<   	 dZded<   	 dZded<   	 dZded<    ed !          edKd%                        Z ed&!          dLd(            ZedMd*            ZedNd+            ZedOd,            ZedPd-            ZedPd.            Z	 	 	 dQdRd9Z	 	 	 dQdSd;ZdTdAZ	 	 dUdVdCZ	 	 dUdWdEZdXdGZ dYdJZ!dS )ZrM   zgGPTRouter by Writesonic Inc.

    For more information, see https://gpt-router.writesonic.com/docs
    NT)defaultexcluder   re   rA   )
min_lengthr:   r9    )rv   r5   gpt_router_api_basezOptional[SecretStr]gpt_router_api_keygffffff?floattemperature)default_factoryDict[str, Any]model_kwargs   intrT   Fbool	streamingn   
max_tokensbefore)modevaluesr	   r<   c                |    t          |ddt                    |d<   t          t          |dd                    |d<   |S )Nrz   GPT_ROUTER_API_BASEr{   GPT_ROUTER_API_KEY)r   DEFAULT_API_BASE_URLr   )clsr   s     r2   validate_environmentzGPTRouter.validate_environment   sY     )=!! 	)
 )
$% (= $$ (
 (
#$ r1   afterr$   c                    	 ddl m} n# t          $ r t          d          w xY w || j        | j        r| j                                        nd           }|| _        | S )Nr   )GPTRouterClientzZCould not import GPTRouter python package. Please install it with `pip install GPTRouter`.)gpt_router.clientr   ImportErrorr+   rz   r{   get_secret_valuere   )selfr   gpt_router_clients      r2   	post_initzGPTRouter.post_init   s    	9999999 	 	 	$B  	 ,O$&D#44666	
 
 (s   	 #Dict[str, str]c                
    ddiS )Nr{   r   r0   r   s    r2   
lc_secretszGPTRouter.lc_secrets   s    $&:;;r1   c                    dS )NTr0   r   s    r2   lc_serializablezGPTRouter.lc_serializable   s    tr1   c                    dS )zReturn type of chat model.zgpt-router-chatr0   r   s    r2   	_llm_typezGPTRouter._llm_type   s
     ! r1   c                &    i d| j         i| j        S )zGet the identifying parameters.r9   )r9   _default_paramsr   s    r2   _identifying_paramszGPTRouter._identifying_params   s'    
%t'@A
"
 	
r1   c                F    | j         | j        | j        | j        d| j        S )z5Get the default parameters for calling GPTRouter API.)r   rb   r   r}   )r   r   r   r}   r   r   s    r2   r   zGPTRouter._default_params   s5     /n+	
 

 
 	
r1   messagesList[BaseMessage]stopOptional[List[str]]rN   r\   rb   Optional[bool]r;   r   c                    ||n| j         }|r  | j        |f||d|}t          |          S |                     ||          \  }}	i |	|ddi}	t	          | f|| j        |d|	}
|                     |
          S N)r   rN   rb   Fr   r9   rN   )r   _streamr   _create_message_dictsrn   r9   _create_chat_resultr   r   r   rN   rb   r;   should_streamstream_itermessage_dictsparamsresponses              r2   	_generatezGPTRouter._generate   s     #)"4$. 	5&$,# @F K (444 $ : :8T J Jv6F6f6h66(
"!%!:#	
 

 
 
 ''111r1   ro   c                  K   ||n| j         }|r& | j        |f||d|}t          |           d {V S |                     ||          \  }}	i |	|ddi}	t	          | f|| j        |d|	 d {V }
|                     |
          S r   )r   _astreamr   r   rt   r9   r   r   s              r2   
_ageneratezGPTRouter._agenerate  s      #)"4$. 	<'$-# @F K /{;;;;;;;;; $ : :8T J Jv6F6f6h66/
"!%!:#	
 

 
 
 
 
 
 
 
 
 ''111r1   dataMapping[str, Any]default_chunk_classType[BaseMessageChunk]2Tuple[ChatGenerationChunk, Type[BaseMessageChunk]]c                    t          d|                    dd          i|          }|                    d          }|t          |          nd }|j        }t	          ||          }||fS )Ncontenttextry   finish_reasonr   messagegeneration_info)r'   rg   dict	__class__r   )r   r   r   chunkr   r   	gen_chunks          r2   _create_chat_generation_chunkz'GPTRouter._create_chat_generation_chunk'  s     0,,-/B
 
 111>1JD}----PT 	 $o'WWW	---r1   Iterator[ChatGenerationChunk]c              +  @  K   |                      ||          \  }}i ||ddi}t          }t          | f|| j        |d|}|D ]X}	|	j        dk    r|                     |	j        |          \  }	}|r&|                    |	j        j	        |	j                   |	V  Yd S Nrb   Tr   update)tokenr   )
r   r   rn   r9   eventr   r   on_llm_new_tokenr   r   
r   r   r   rN   r;   r   r   r   generator_responser   s
             r2   r   zGPTRouter._stream5  s      !% : :8T J Jv5F5f5h556D2
"!%!:#	
 

 
 
 ( 	 	E{h&&)-)K)K
/* *&E&  ,,-/u} -    KKKK	 	r1   "AsyncIterator[ChatGenerationChunk]c               f  K   |                      ||          \  }}i ||ddi}t          }t          | f|| j        |d|}| d {V 2 3 d {V }	|	j        dk    r|                     |	j        |          \  }	}|r,|                    |	j        j	        |	j                   d {V  |	W V  e6 d S r   )
r   r   rt   r9   r   r   r   r   r   r   r   s
             r2   r   zGPTRouter._astreamV  sN      !% : :8T J Jv5F5f5h556D3
"!%!:#	
 

 
 
 "4333333 	 	 	 	 	 	 	%{h&&)-)K)K
/* *&E&  !22-/u} 3          KKKKK 433s   B0+Tuple[List[Dict[str, Any]], Dict[str, Any]]c                d    | j         }|d|v rt          d          ||d<   d |D             }||fS )Nr   z2`stop` found in both the input and default params.c                ,    g | ]}t          |          S r0   )r&   )rE   ms     r2   rH   z3GPTRouter._create_message_dicts.<locals>.<listcomp>  s!    FFF033FFFr1   )r   
ValueError)r   r   r   r   r   s        r2   r   zGPTRouter._create_message_dictsw  sS     % !UVVV!F6NFFXFFFf$$r1   r   r)   c                    g }|j         D ]R}t          d|j        d          }t          |t	          |j                            }|                    |           S|j        |j        d}t          ||          S )N	assistant)roler   r   r   )token_usagerG   )generations
llm_output)
choicesr%   r   r   r   r   appendmetarG   r   )r   r   r   resr   genr   s          r2   r   zGPTRouter._create_chat_result  s    # 	$ 	$C-'"x  G ! $33D E E E  C s####%-]X^LL
kjIIIIr1   )r   r	   r<   r   )r<   r$   )r<   r   )r<   r   )r<   r5   )r<   r   )NNN)r   r   r   r   rN   r\   rb   r   r;   r   r<   r   )r   r   r   r   rN   ro   rb   r   r;   r   r<   r   )r   r   r   r   r<   r   )NN)
r   r   r   r   rN   r\   r;   r   r<   r   )
r   r   r   r   rN   ro   r;   r   r<   r   )r   r   r   r   r<   r   )r   r)   r<   r   )"r,   r-   r.   r/   r!   re   r8   r9   rz   r{   r}   r   r   rT   r   r   r   r#   classmethodr   r   propertyr   r   r   r   r   r   r   r   r   r   r   r   r0   r1   r2   rM   rM      s         
 %d333F333316!1D1D1DDDDD$uR0000000..22222&K+#(5#>#>#>L>>>>VK<I/AJJJJAJ_(###   [ $#" _'"""   #"( < < < X<    X ! ! ! X! 
 
 
 X
 
 
 
 X
 %):>!%2 2 2 2 2: %)?C!%2 2 2 2 24. . . ." %):>	    H %)?C	    B	% 	% 	% 	%J J J J J Jr1   )r9   r:   r;   r   r<   r   )N)rL   rM   rN   rO   r<   rP   )
rL   rM   r9   r:   rN   r\   r;   r   r<   r]   )
rL   rM   r9   r:   rN   ro   r;   r   r<   rp   )A
__future__r   loggingtypingr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   langchain_core.callbacksr   r   *langchain_core.language_models.chat_modelsr   r   r   #langchain_core.language_models.llmsr   langchain_core.messagesr   r   r   langchain_core.outputsr   r   r   langchain_core.utilsr   r   pydanticr    r!   r"   r#   typing_extensionsr$   #langchain_community.adapters.openair%   r&   &langchain_community.chat_models.openair'   rI   r(   r)   	getLoggerr,   loggerr   	Exceptionr+   r4   rK   r[   rn   rt   rM   r0   r1   r2   <module>r      s<   " " " " " "                                "                
 L K K K K K Q Q Q Q Q Q Q Q Q Q R R R R R R R R R R L L L L L L L L A A A A A A A A A A A A " " " " " "        S R R R R R POOOOOOOO 
	8	$	$B * * * * * * * *    Y      0 		    , 7;, , , , ,2 <@2 2 2 2 2.~J ~J ~J ~J ~J ~J ~J ~J ~J ~Jr1   