a
    bg3                     @  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rd dl2m3Z3m4Z4 e5e6Z7dZ8G dd de9Z:G dd de'Z;ddddddZ<d*ddddddZ=d+ddd dd!d"d#d$Z>d,ddd%dd&d"d'd(Z?G d)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                   @  s   e Zd ZdZdS )GPTRouterExceptionzError with the `GPTRouter APIs`N)__name__
__module____qualname____doc__ r.   r.   x/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/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   List[GPTRouterModel]r   r   )models_priority_listkwargsreturnc                   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   f i dqS )   )Z
model_namer3   orderZprompt_params)r2   r3   ).0indexmodelr9   r:   r7   r.   r/   
<listcomp>H   s   z3get_ordered_generation_requests.<locals>.<listcomp>)gpt_router.modelsr9   r:   	enumerate)r6   r7   r.   r@   r/   get_ordered_generation_requests?   s    rD   	GPTRouterzHOptional[Union[AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun]]zCallable[[Any], Any])llmrun_managerr8   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_routerrH   ZGPTRouterApiTimeoutErrorZGPTRouterInternalServerErrorZGPTRouterNotAvailableErrorZGPTRouterTooManyRequestsErrorr   rI   )rF   rG   rH   errorsr.   r.   r/   _create_retry_decoratorS   s    rK   "Optional[CallbackManagerForLLMRun]zKUnion[GenerationResponse, Generator[ChunkedGenerationResponse, None, None]])rF   r6   rG   r7   r8   c                   s4   t  |d}|ddd fdd}|f i |S )z*Use tenacity to retry the completion call.rG   r   r7   r8   c                    s(   t fi | } jj|| dddS NstreamF)ordered_generation_requests	is_stream)rD   clientgenerategetr7   rQ   rF   r6   r.   r/   _completion_with_retryo   s    
z5completion_with_retry.<locals>._completion_with_retryrK   rF   r6   rG   r7   Zretry_decoratorrX   r.   rW   r/   completion_with_retryf   s    	r[   'Optional[AsyncCallbackManagerForLLMRun]zJUnion[GenerationResponse, AsyncGenerator[ChunkedGenerationResponse, None]]c                   s:   t  |d}|ddd fdd}|f i |I dH S )z0Use tenacity to retry the async completion call.rM   r   rN   c                    s.   t fi | } jj|| dddI d H S rO   )rD   rS   Z	ageneraterU   rV   rW   r.   r/   rX      s    
z6acompletion_with_retry.<locals>._completion_with_retryNrY   rZ   r.   rW   r/   acompletion_with_retry|   s    	r]   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d"dd#d$d%Zed&d!d'd(d)d*Zed+d(d,d-Zedd(d.d/Zedd(d0d1Zedd(d2d3Zedd(d4d5ZdVd6d7d8d9dd:d;d<d=ZdWd6d7d>d9dd:d;d?d@ZdAdBdCdDdEdFZdXd6d7d8ddGdHdIdJZdYd6d7d>ddKdHdLdMZd6d7dNdOdPdQZ dRd:dSdTdUZ!dS )ZrE   zgGPTRouter by Writesonic Inc.

    For more information, see https://gpt-router.writesonic.com/docs
    NT)defaultexcluder   rS   r;   )Z
min_lengthr5   r6    )r^   r1   gpt_router_api_basezOptional[SecretStr]gpt_router_api_keygffffff?floattemperature)default_factoryzDict[str, Any]model_kwargs   intrI   Fbool	streamingn   
max_tokensbefore)moder   )valuesr8   c                 C  s*   t |ddt|d< tt |dd|d< |S )Nra   ZGPT_ROUTER_API_BASErb   GPT_ROUTER_API_KEY)r   DEFAULT_API_BASE_URLr   )clsrp   r.   r.   r/   validate_environment   s    zGPTRouter.validate_environmentafterr#   )r8   c                 C  sR   zddl m} W n ty*   tdY n0 || j| jrB| j nd }|| _| S )Nr   )GPTRouterClientzZCould not import GPTRouter python package. Please install it with `pip install GPTRouter`.)Zgpt_router.clientrv   ImportErrorr)   ra   rb   Zget_secret_valuerS   )selfrv   Zgpt_router_clientr.   r.   r/   	post_init   s    
zGPTRouter.post_initzDict[str, str]c                 C  s   ddiS )Nrb   rq   r.   rx   r.   r.   r/   
lc_secrets   s    zGPTRouter.lc_secretsc                 C  s   dS )NTr.   rz   r.   r.   r/   lc_serializable   s    zGPTRouter.lc_serializablec                 C  s   dS )zReturn type of chat model.zgpt-router-chatr.   rz   r.   r.   r/   	_llm_type   s    zGPTRouter._llm_typec                 C  s   i d| j i| jS )zGet the identifying parameters.r6   )r6   _default_paramsrz   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.)rm   rP   rk   rd   )rm   rj   rk   rd   rf   rz   r.   r.   r/   r~      s    zGPTRouter._default_paramszList[BaseMessage]zOptional[List[str]]rL   zOptional[bool]r   )messagesstoprG   rP   r7   r8   c                 K  s~   |d ur|n| j }|r6| j|f||d|}t|S | ||\}}	i |	|ddi}	t| f|| j|d|	}
| |
S N)r   rG   rP   Fr   r6   rG   )rj   _streamr   _create_message_dictsr[   r6   _create_chat_resultrx   r   r   rG   rP   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   )rj   _astreamr   r   r]   r6   r   r   r.   r.   r/   
_agenerate  s,    zGPTRouter._ageneratezMapping[str, Any]zType[BaseMessageChunk]z2Tuple[ChatGenerationChunk, Type[BaseMessageChunk]])datadefault_chunk_classr8   c                 C  sP   t d|ddi|}|d}|d ur2t|dnd }|j}t||d}||fS )Ncontenttextr`   finish_reasonr   messagegeneration_info)r&   rU   dict	__class__r   )rx   r   r   chunkr   r   Z	gen_chunkr.   r.   r/   _create_chat_generation_chunk'  s    
z'GPTRouter._create_chat_generation_chunkzIterator[ChatGenerationChunk])r   r   rG   r7   r8   c           
      k  s   |  ||\}}i ||ddi}t}t| f|| j|d|}|D ]@}	|	jdkrVqF| |	j|\}	}|r|j|	jj	|	jd |	V  qFd S NrP   Tr   update)tokenr   )
r   r   r[   r6   eventr   r   on_llm_new_tokenr   r   
rx   r   r   rG   r7   r   r   r   Zgenerator_responser   r.   r.   r/   r   5  s.    

zGPTRouter._streamz"AsyncIterator[ChatGenerationChunk]c           
      K s   |  ||\}}i ||ddi}t}t| f|| j|d|}|I d H 2 zN3 d H W }	|	jdkrdqL| |	j|\}	}|r|j|	jj	|	jdI d H  |	V  qL6 d S r   )
r   r   r]   r6   r   r   r   r   r   r   r   r.   r.   r/   r   V  s.    

zGPTRouter._astreamz+Tuple[List[Dict[str, Any]], Dict[str, Any]])r   r   r8   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         z3GPTRouter._create_message_dicts.<locals>.<listcomp>)r~   
ValueError)rx   r   r   r   r   r.   r.   r/   r   w  s    zGPTRouter._create_message_dictsr(   )r   r8   c                 C  sX   g }|j D ]2}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   )rx   r   r   resr   genr   r.   r.   r/   r     s    

zGPTRouter._create_chat_result)NNN)NNN)NN)NN)"r*   r+   r,   r-   r    rS   r4   r6   ra   rb   rd   r   rf   rI   rj   rk   rm   r"   classmethodrt   ry   propertyr{   r|   r}   r   r~   r   r   r   r   r   r   r   r.   r.   r.   r/   rE      sV   
        $  !)N)N)N)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*   loggerrr   	Exceptionr)   r0   rD   rK   r[   r]   rE   r.   r.   r.   r/   <module>   s4   @
   