o
    Zh3                     @  s  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rd dl2m3Z3m4Z4 e5e6Z7dZ8G dd de9Z:G dd de'Z;d,ddZ<	d-d.d!d"Z=	d-d/d%d&Z>	d-d0d)d*Z?G d+d deZ@dS )1    )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                   @  s   e Zd ZdZdS )GPTRouterExceptionzError with the `GPTRouter APIs`N)__name__
__module____qualname____doc__ r.   r.   a/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/chat_models/gpt_router.pyr)   4   s    r)   c                   @  s"   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__r.   r.   r.   r/   r0   8   s   
 r0   models_priority_listList[GPTRouterModel]kwargsr   returnr   c                   s*   ddl m m  fddt| D S )z5
    Return the body for the model router input.
    r   )GenerationParamsModelGenerationRequestc              
     s2   g | ]\}}|j |j|d   di dqS )   )Z
model_namer3   orderZprompt_paramsr.   )r2   r3   ).0indexmodelr9   r:   r7   r.   r/   
<listcomp>H   s    z3get_ordered_generation_requests.<locals>.<listcomp>)gpt_router.modelsr9   r:   	enumerate)r5   r7   r.   r@   r/   get_ordered_generation_requests?   s   rD   llm	GPTRouterrun_managerHOptional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]]Callable[[Any], Any]c                 C  s0   ddl m} |j|j|j|jg}t|| j|dS )Nr   )
exceptions)Zerror_typesmax_retriesrG   )Z
gpt_routerrJ   ZGPTRouterApiTimeoutErrorZGPTRouterInternalServerErrorZGPTRouterNotAvailableErrorZGPTRouterTooManyRequestsErrorr   rK   )rE   rG   rJ   errorsr.   r.   r/   _create_retry_decoratorS   s   rM   "Optional[CallbackManagerForLLMRun]KUnion[GenerationResponse, Generator[ChunkedGenerationResponse, None, None]]c                   s.   t  |d}|d fdd}|d	i |S )
z*Use tenacity to retry the completion call.rG   r7   r   r8   c                    s(   t fi | } jj|| dddS NstreamF)ordered_generation_requests	is_stream)rD   clientgenerategetr7   rS   rE   r5   r.   r/   _completion_with_retryo   s   
z5completion_with_retry.<locals>._completion_with_retryNr7   r   r8   r   r.   rM   rE   r5   rG   r7   Zretry_decoratorrZ   r.   rY   r/   completion_with_retryf   s   	r^   'Optional[AsyncCallbackManagerForLLMRun]JUnion[GenerationResponse, AsyncGenerator[ChunkedGenerationResponse, None]]c                   s6   t  |d}|d fdd}|d	i |I dH S )
z0Use tenacity to retry the async completion call.rP   r7   r   r8   c                    s0   t fi | } jj|| dddI d H S rQ   )rD   rU   Z	ageneraterW   rX   rY   r.   r/   rZ      s   
z6acompletion_with_retry.<locals>._completion_with_retryNr[   r.   r\   r]   r.   rY   r/   acompletion_with_retry|   s
   	ra   c                   @  s  e Zd ZU dZedddZded< eddZd	ed
< eddZded< 	 dZ	ded< 	 dZ
ded< 	 eed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 d!edYd%d&Zed'd!dZd)d*Zed[d,d-Zed\d.d/Zed]d0d1Zed^d2d3Zed^d4d5Z			d_d`d@dAZ			d_dadCdDZdbdJdKZ		dcdddMdNZ		dcdedPdQZdfdSdTZ dgdWdXZ!dS )hrF   zgGPTRouter by Writesonic Inc.

    For more information, see https://gpt-router.writesonic.com/docs
    NT)defaultexcluder   rU   r;   )
min_lengthr6   r5    )rb   r1   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)modevaluesr   r8   c                 C  s*   t |ddt|d< tt |dd|d< |S )Nrf   ZGPT_ROUTER_API_BASErg   GPT_ROUTER_API_KEY)r   DEFAULT_API_BASE_URLr   )clsrv   r.   r.   r/   validate_environment   s   zGPTRouter.validate_environmentafterr#   c                 C  sN   zddl m} W n ty   tdw || j| jr| j nd }|| _| S )Nr   )GPTRouterClientzZCould not import GPTRouter python package. Please install it with `pip install GPTRouter`.)Zgpt_router.clientr|   ImportErrorr)   rf   rg   Zget_secret_valuerU   )selfr|   Zgpt_router_clientr.   r.   r/   	post_init   s   zGPTRouter.post_initDict[str, str]c                 C  s   ddiS )Nrg   rw   r.   r~   r.   r.   r/   
lc_secrets   s   zGPTRouter.lc_secretsc                 C     dS )NTr.   r   r.   r.   r/   lc_serializable   s   zGPTRouter.lc_serializablec                 C  r   )zReturn type of chat model.zgpt-router-chatr.   r   r.   r.   r/   	_llm_type   s   zGPTRouter._llm_typec                 C  s   i d| j i| jS )zGet the identifying parameters.r5   )r5   _default_paramsr   r.   r.   r/   _identifying_params   s
   zGPTRouter._identifying_paramsc                 C  s   | j | j| j| jd| jS )z5Get the default parameters for calling GPTRouter API.)rs   rR   rq   ri   )rs   rp   rq   ri   rl   r   r.   r.   r/   r      s   zGPTRouter._default_paramsmessagesList[BaseMessage]stopOptional[List[str]]rG   rN   rR   Optional[bool]r7   r   c                 K  s~   |d ur|n| j }|r| j|f||d|}t|S | ||\}}	i |	|ddi}	t| f|| j|d|	}
| |
S N)r   rG   rR   Fr   r5   rG   )rp   _streamr   _create_message_dictsr^   r5   _create_chat_resultr~   r   r   rG   rR   r7   Zshould_streamZstream_itermessage_dictsparamsresponser.   r.   r/   	_generate   s,   
zGPTRouter._generater_   c                   s   |d ur|n| j }|r| j|f||d|}t|I d H S | ||\}}	i |	|ddi}	t| f|| j|d|	I d H }
| |
S r   )rp   _astreamr   r   ra   r5   r   r   r.   r.   r/   
_agenerate  s.   
zGPTRouter._ageneratedataMapping[str, Any]default_chunk_classType[BaseMessageChunk]2Tuple[ChatGenerationChunk, Type[BaseMessageChunk]]c                 C  sP   t d|ddi|}|d}|d urt|dnd }|j}t||d}||fS )Ncontenttextre   finish_reasonr   messagegeneration_info)r&   rW   dict	__class__r   )r~   r   r   chunkr   r   Z	gen_chunkr.   r.   r/   _create_chat_generation_chunk'  s   
z'GPTRouter._create_chat_generation_chunkIterator[ChatGenerationChunk]c           
      k  s    |  ||\}}i ||ddi}t}t| f|| j|d|}|D ] }	|	jdkr,q$| |	j|\}	}|rA|j|	jj	|	jd |	V  q$d S NrR   Tr   update)tokenr   )
r   r   r^   r5   eventr   r   on_llm_new_tokenr   r   
r~   r   r   rG   r7   r   r   r   Zgenerator_responser   r.   r.   r/   r   5  s2   

zGPTRouter._stream"AsyncIterator[ChatGenerationChunk]c           
      K s   |  ||\}}i ||ddi}t}t| f|| j|d|}|I d H 2 z'3 d H W }	|	jdkr3q'| |	j|\}	}|rK|j|	jj	|	jdI d H  |	V  q'6 d S r   )
r   r   ra   r5   r   r   r   r   r   r   r   r.   r.   r/   r   V  s2   

zGPTRouter._astream+Tuple[List[Dict[str, Any]], Dict[str, Any]]c                 C  s<   | j }|d urd|v rtd||d< dd |D }||fS )Nr   z2`stop` found in both the input and default params.c                 S  s   g | ]}t |qS r.   )r%   )r=   mr.   r.   r/   rA     s    z3GPTRouter._create_message_dicts.<locals>.<listcomp>)r   
ValueError)r~   r   r   r   r   r.   r.   r/   r   w  s   zGPTRouter._create_message_dictsr   r(   c                 C  sX   g }|j D ]}td|jd}t|t|jdd}|| q|j|jd}t	||dS )NZ	assistant)Zroler   r   r   )Ztoken_usager?   )generations
llm_output)
choicesr$   r   r   r   r   appendmetar?   r   )r~   r   r   resr   genr   r.   r.   r/   r     s   

zGPTRouter._create_chat_result)rv   r   r8   r   )r8   r#   )r8   r   )r8   ro   )r8   r1   )r8   rk   )NNN)r   r   r   r   rG   rN   rR   r   r7   r   r8   r   )r   r   r   r   rG   r_   rR   r   r7   r   r8   r   )r   r   r   r   r8   r   )NN)
r   r   r   r   rG   rN   r7   r   r8   r   )
r   r   r   r   rG   r_   r7   r   r8   r   )r   r   r   r   r8   r   )r   r(   r8   r   )"r*   r+   r,   r-   r    rU   r4   r5   rf   rg   ri   r   rl   rK   rp   rq   rs   r"   classmethodrz   r   propertyr   r   r   r   r   r   r   r   r   r   r   r   r.   r.   r.   r/   rF      sf   
 
$
!)r5   r6   r7   r   r8   r   )N)rE   rF   rG   rH   r8   rI   )
rE   rF   r5   r6   rG   rN   r7   r   r8   rO   )
rE   rF   r5   r6   rG   r_   r7   r   r8   r`   )A
__future__r   loggingtypingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   Zlangchain_core.callbacksr   r   Z*langchain_core.language_models.chat_modelsr   r   r   Z#langchain_core.language_models.llmsr   Zlangchain_core.messagesr   r   r   Zlangchain_core.outputsr   r   r   Zlangchain_core.utilsr   r   Zpydanticr   r    r!   r"   Ztyping_extensionsr#   Z#langchain_community.adapters.openair$   r%   Z&langchain_community.chat_models.openair&   rB   r'   r(   	getLoggerr*   loggerrx   	Exceptionr)   r0   rD   rM   r^   ra   rF   r.   r.   r.   r/   <module>   s6    @

