
    h3                       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jj                  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@y)    )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y)GPTRouterExceptionzError with the `GPTRouter APIs`N)__name__
__module____qualname____doc__     h/var/www/html/eduruby.in/venv/lib/python3.12/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<   y)GPTRouterModelzGPTRouter model.strnameprovider_nameN)r,   r-   r.   r/   __annotations__r0   r1   r2   r4   r4   8   s    
Ir1   r4   c                    ddl m}m} t        |       D cg c].  \  }} ||j                  |j
                  |dz    |di |      0 c}}S c c}}w )z5
    Return the body for the model router input.
    r   )GenerationParamsModelGenerationRequest   )
model_namer7   orderprompt_paramsr0   )gpt_router.modelsr:   r;   	enumerater6   r7   )models_priority_listkwargsr:   r;   indexmodels         r2   get_ordered_generation_requestsrF   ?   s]     K &&:; E5 	zz--!)*4V4		
  s   3A	GPTRouterc                    ddl m} |j                  |j                  |j                  |j
                  g}t        || j                  |      S )Nr   )
exceptions)error_typesmax_retriesrun_manager)
gpt_routerrI   GPTRouterApiTimeoutErrorGPTRouterInternalServerErrorGPTRouterNotAvailableErrorGPTRouterTooManyRequestsErrorr   rK   )llmrL   rI   errorss       r2   _create_retry_decoratorrT   S   sN     & 	++//--00	F '[ r1   c                H     t         |      }|d fd       } |di |S )z*Use tenacity to retry the completion call.rL   c                 v    t        fi | }j                  j                  || j                  dd            S NstreamF)ordered_generation_requests	is_stream)rF   clientgenerategetrC   rZ   rR   rB   s     r2   _completion_with_retryz5completion_with_retry.<locals>._completion_with_retryo   sH    &E '
$*'
# zz""(Cjj51 # 
 	
r1   rC   r   returnr   r0   rT   rR   rB   rL   rC   retry_decoratorr`   s   ``    r2   completion_with_retryrf   f   s3     .c{KO
 
 "+F++r1   c                d    K   t         |      }|d fd       } |di | d{   S 7 w)z0Use tenacity to retry the async completion call.rV   c                    K   t        fi | }j                  j                  || j                  dd             d {   S 7 wrX   )rF   r\   	agenerater^   r_   s     r2   r`   z6acompletion_with_retry.<locals>._completion_with_retry   sV     &E '
$*'
# ZZ))(Cjj51 * 
 
 	
 
s   =A AANra   r0   rc   rd   s   ``    r2   acompletion_with_retryrj   |   s=      .c{KO
 
 (1&1111s   %0.0c                  F   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d1d"              Z ed#!      d2d$       Zed3d%       Zed4d&       Zed5d'       Zed6d(       Zed6d)       Z	 	 	 d7	 	 	 	 	 	 	 	 	 	 	 d8d*Z	 	 	 d7	 	 	 	 	 	 	 	 	 	 	 d9d+Z	 	 	 	 	 	 d:d,Z	 	 d;	 	 	 	 	 	 	 	 	 d<d-Z	 	 d;	 	 	 	 	 	 	 	 	 d=d.Z	 	 	 	 	 	 d>d/Z d?d0Z!y)@rG   zgGPTRouter by Writesonic Inc.

    For more information, see https://gpt-router.writesonic.com/docs
    NT)defaultexcluder   r\   r<   )
min_lengthList[GPTRouterModel]rB    )rl   r5   gpt_router_api_basezOptional[SecretStr]gpt_router_api_keygffffff?floattemperature)default_factoryDict[str, Any]model_kwargs   intrK   Fbool	streamingn   
max_tokensbefore)modec                b    t        |ddt              |d<   t        t        |dd            |d<   |S )Nrq   GPT_ROUTER_API_BASErr   GPT_ROUTER_API_KEY)r   DEFAULT_API_BASE_URLr   )clsvaluess     r2   validate_environmentzGPTRouter.validate_environment   sJ     )=!! 	)
$% (= $$(
#$ r1   afterc                    	 ddl m}  || j                  | j
                  r| j
                  j                         nd       }|| _        | S # t        $ r t        d      w xY w)Nr   )GPTRouterClientzZCould not import GPTRouter python package. Please install it with `pip install GPTRouter`.)gpt_router.clientr   ImportErrorr+   rq   rr   get_secret_valuer\   )selfr   gpt_router_clients      r2   	post_initzGPTRouter.post_init   sr    	9 ,$$&& ##446	
 (  	$B 	s   A
 
Ac                
    ddiS )Nrr   r   r0   r   s    r2   
lc_secretszGPTRouter.lc_secrets   s    $&:;;r1   c                     y)NTr0   r   s    r2   lc_serializablezGPTRouter.lc_serializable   s    r1   c                     y)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.rB   )rB   _default_paramsr   s    r2   _identifying_paramszGPTRouter._identifying_params   s-    
%t'@'@A
""
 	
r1   c                x    | j                   | j                  | j                  | j                  d| j                  S )z5Get the default parameters for calling GPTRouter API.)r~   rY   r|   rt   )r~   r{   r|   rt   rw   r   s    r2   r   zGPTRouter._default_params   s<     //nn++	

 
 	
r1   c                    ||n| j                   }|r! | j                  |f||d|}t        |      S | j                  ||      \  }}	i |	|ddi}	t	        | f|| j
                  |d|	}
| j                  |
      S N)stoprL   rY   FmessagesrB   rL   )r{   _streamr   _create_message_dictsrf   rB   _create_chat_resultr   r   r   rL   rY   rC   should_streamstream_itermessage_dictsparamsresponses              r2   	_generatezGPTRouter._generate   s     #)"4$..&$,,#@FK (44 $ : :8T Jv6F6f6h6(
"!%!:!:#	

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

 
 
 ''11 <
s"   7BBA B:B;BBc                    t        d|j                  dd      i|      }|j                  d      }|t        |      nd }|j                  }t	        ||      }||fS )Ncontenttextrp   finish_reasonr   messagegeneration_info)r'   r^   dict	__class__r   )r   datadefault_chunk_classchunkr   r   	gen_chunks          r2   _create_chat_generation_chunkz'GPTRouter._create_chat_generation_chunk'  sm     0,-/B
 11>1JD}-PT 	 $oo'W	---r1   c              +  d  K   | j                  ||      \  }}i ||ddi}t        }t        | f|| j                  |d|}|D ]h  }	|	j                  dk7  r| j                  |	j                  |      \  }	}|r1|j                  |	j                  j                  |	j                         |	 j y wNrY   Tr   update)tokenr   )
r   r   rf   rB   eventr   r   on_llm_new_tokenr   r   
r   r   r   rL   rC   r   r   r   generator_responser   s
             r2   r   zGPTRouter._stream5  s      !% : :8T Jv5F5f5h56D2
"!%!:!:#	

 
 ( 	E{{h&)-)K)K

/*&E& ,,--//u}} -  K	s   B.B0c                 K   | j                  ||      \  }}i ||ddi}t        }t        | f|| j                  |d|}| d {   2 3 d {   }	|	j                  dk7  r| j                  |	j                  |      \  }	}|r9|j                  |	j                  j                  |	j                         d {    |	 y7 }7 v7 6 y wr   )
r   r   rj   rB   r   r   r   r   r   r   r   s
             r2   r   zGPTRouter._astreamV  s      !% : :8T Jv5F5f5h56D3
"!%!:!:#	

 
 "43 	 	%{{h&)-)K)K

/*&E& !22--//u}} 3    K 4 	 4sI   ACCCCCCA&C:C	;CC	CCc                    | j                   }|d|v rt        d      ||d<   |D cg c]  }t        |       }}||fS c c}w )Nr   z2`stop` found in both the input and default params.)r   
ValueErrorr&   )r   r   r   r   mr   s         r2   r   zGPTRouter._create_message_dictsw  s\     %% !UVV!F6N=EF03FFf$$ Gs   ?c                   g }|j                   D ]L  }t        d|j                  d      }t        |t	        |j
                              }|j                  |       N |j                  |j                  d}t        ||      S )N	assistant)roler   r   r   )token_usagerE   )generations
llm_output)
choicesr%   r   r   r   r   appendmetarE   r   )r   r   r   resr   genr   s          r2   r   zGPTRouter._create_chat_result  s    ## 	$C-'"xxG ! $33D3D EC s#	$ &.]]X^^L
kjIIr1   )r   r	   rb   r   )rb   r$   )rb   zDict[str, str])rb   rz   )rb   r5   )rb   rv   )NNN)r   List[BaseMessage]r   Optional[List[str]]rL   "Optional[CallbackManagerForLLMRun]rY   Optional[bool]rC   r   rb   r   )r   r   r   r   rL   'Optional[AsyncCallbackManagerForLLMRun]rY   r   rC   r   rb   r   )r   zMapping[str, Any]r   zType[BaseMessageChunk]rb   z2Tuple[ChatGenerationChunk, Type[BaseMessageChunk]])NN)
r   r   r   r   rL   r   rC   r   rb   zIterator[ChatGenerationChunk])
r   r   r   r   rL   r   rC   r   rb   z"AsyncIterator[ChatGenerationChunk])r   r   r   r   rb   z+Tuple[List[Dict[str, Any]], Dict[str, Any]])r   r)   rb   r   )"r,   r-   r.   r/   r!   r\   r8   rB   rq   rr   rt   r   rw   rK   r{   r|   r~   r#   classmethodr   r   propertyr   r   r   r   r   r   r   r   r   r   r   r   r0   r1   r2   rG   rG      s   
 d3FC316!1D.D$R00..2+2&K+#(#>L.>VK<It/AsJAJ(#  $" '" #( < <   ! ! 
 
 
 
 %):>!%2#2 "2 8	2
 2 2 
2: %)?C!%2#2 "2 =	2
 2 2 
24.%.<R.	;." %):>	# " 8	
  
'H %)?C	# " =	
  
,B	%)	%1D	%	4	%Jr1   )rB   ro   rC   r   rb   r   )N)rR   rG   rL   zHOptional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]]rb   zCallable[[Any], Any])
rR   rG   rB   ro   rL   r   rC   r   rb   zKUnion[GenerationResponse, Generator[ChunkedGenerationResponse, None, None]])
rR   rG   rB   ro   rL   r   rC   r   rb   zJUnion[GenerationResponse, AsyncGenerator[ChunkedGenerationResponse, None]])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'   r@   r(   r)   	getLoggerr,   loggerr   	Exceptionr+   r4   rF   rT   rf   rj   rG   r0   r1   r2   <module>r      sU   "    " 
 L Q Q R R L A A " SO 
		8	$B * *Y .:=	0 			
 , 7;,	,., 4, 	,
 Q,2 <@2	2.2 92 	2
 P2.~J ~Jr1   