
    Ng2G                       d Z ddlmZ ddl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 ddlmZ ddlmZ ddlmZ ddlm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$ dd
l%m&Z&m'Z'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3m4Z4m5Z5m6Z6 erddl7m8Z8 ddl9m:Z:  ej;        e<          Z=dZ>dZ?dZ@ G d deA          ZBdAdZCdBd ZDdCd%ZE	 dDdEd+ZF G d, d-ee3          ZGd.dd/dFd6ZH	 	 dGdHd@ZIdS )IzWrapper around Prem's Chat API.    )annotationsN)TYPE_CHECKINGAnyCallableDictIteratorListOptionalSequenceTupleTypeUnion)CallbackManagerForLLMRun)LanguageModelInput)BaseChatModel)create_base_retry_decorator)	AIMessageAIMessageChunkBaseMessageBaseMessageChunkChatMessageChatMessageChunkHumanMessageHumanMessageChunkSystemMessageSystemMessageChunkToolMessage)ChatGenerationChatGenerationChunk
ChatResult)Runnable)BaseTool)get_from_dict_or_envpre_initconvert_to_openai_tool)	BaseModel
ConfigDictField	SecretStr)ChatCompletionResponseStream)ChatCompletionResponsezM
Given the set of tools you used and the response, provide the final answer

z
{json}
z3
tool id: {tool_id}
tool_response: {tool_response}
c                      e Zd ZdZdS )ChatPremAPIErrorzError with the `PremAI` API.N)__name__
__module____qualname____doc__     b/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/premai.pyr.   r.   J   s        &&&&r4   r.   textstrstopOptional[List[str]]returnc                b    || S |D ]'}|                      |          }|dk    r
| d|         } (| S )z0Truncates text at the earliest stop token found.N)find)r6   r8   
stop_tokenstop_token_idxs       r5   _truncate_at_stop_tokensr@   N   sM    
 | ) )
:..R(DKr4   responser,   r    c           
        | j         st          d          g }| j         D ]}|j        j        }|t          d| d          t	          |j        j        pd|          }|t          d|           |dk    rR|j        d	         }|g }nd
 |D             }|                    t          |t          ||                               |dk    r3|                    t          |t          |                               |                    t          |t          ||                               | j        "t          |dd | j        D             i          S t          |ddi          S )z4Converts a Prem API response into a LangChain resultz-ChatResponse must have at least one candidateNzChatResponse z must have a role. )r6   r8   z"ChatResponse must have a content: 	assistant
tool_callsc                V    g | ]&}|d          |d         d         |d         d         d'S )idfunctionname	arguments)rG   rI   argsr3   ).0	tool_calls     r5   
<listcomp>z'_response_to_result.<locals>.<listcomp>u   sR        "	 (o )* 5f = )* 5k B   r4   )contentrE   )r6   messageuserrO   rolerO   document_chunksc                6    g | ]}|                                 S r3   )to_dict)rL   chunks     r5   rN   z'_response_to_result.<locals>.<listcomp>   s-     $ $ $(-EMMOO$ $ $r4   )generations
llm_output)choicesr.   rP   rT   r@   rO   appendr   r   r   r   rU   r    )rA   r8   rY   choicerT   rO   rE   toolss           r5   _response_to_resultr_   ]   s     PNOOO(*K" % %~"<"#M6#M#M#MNNN +0F0L"SWXXX?"#Q#Q#QRRR;5J!  &0    )GPU*V*V*V     
 V^^G\'5R5R5RSSS     +4*Q*Q*Q      +#! $ $191I$ $ $
 
 
 	
 k?PRV>WXXXXr4   r+   default_classType[BaseMessageChunk]dTuple[Union[BaseMessageChunk, HumanMessageChunk, AIMessageChunk, SystemMessageChunk], Optional[str]]c                   | j         d         j        }|                    dd          }|                    dd          }i }| j         d         j        }|dk    s|t          k    rt	          |          |fS |dk    s|t
          k    rt          ||          |fS |d	k    s|t          k    rt          |          |fS |s|t          k    rt          ||
          |fS  ||          |fS )z(Converts delta response to message chunkr   rT   rC   rO   rQ   rR   rD   )rO   additional_kwargssystem)rO   rT   )r[   deltagetfinish_reasonr   r   r   r   )rA   r`   _deltarT   rO   rd   finish_reasonss          r5   (_convert_delta_response_to_message_chunkrk      s    a &F::fb!!DjjB''G $,$4Q$7$ENv~~*;;; 111>AA			 ? ?7>OPPP
 	
 
		].@@@!'222NBB	 >"222d;;;^KK}W---~==r4   input_messagesList[BaseMessage]template_idOptional[str]*Tuple[Optional[str], List[Dict[str, Any]]]c                `   d}g }| D ]}t          |t                    rt          |j                  }-t          |t                    r|+|                    dt          |j                  d           oi }|j        |j        dk    sJ t          dd                      t          |j                  |t          |j                  <   |                    d||d           t          |t                    r|j	        t          |j	                  dk    r,|                    d	t          |j                  d           >|j        |j        |j        |j	        d
}|                    d	t                              |          d           t          |t                    rt          d          d}| D ]D}t          |t                    r-|j        }|j        }	|t"                              ||	          z  }E|dk    r$t$          }
|
|z  }
|                    d|
d           ||fS )zcConverts a list of LangChain Messages into a simple dict
    which is the message structure in PremNrQ   rS   rC   z9When using prompt template there should be id associated zwith each HumanMessage)rT   rn   paramsr   rD   )rG   rO   response_metadatarE   )jsonzNo such role explicitly exists)tool_idtool_response)
isinstancer   r7   rO   r   r\   rG   
ValueErrorr   rE   lenrs   !INTERMEDIATE_TOOL_RESULT_TEMPLATEformatr   r.   tool_call_idSINGLE_TOOL_PROMPT_TEMPLATETOOL_PROMPT_HEADER)rl   rn   system_promptexamples_and_messages	input_msgrr   ai_msg_to_jsontool_promptru   tool_resultprompts              r5   _messages_to_prompt_dictr      s    $(M24# +E +E	i// *	E	 122MM	<00 '	E"%,,#I4E0F0FGG    *,!0y|r7I7I7IJO,M M7I7I7I -0	0A,B,Bs9<(()%,,#K6RR    	9-- 	E#+s93G/H/HA/M/M%,,(S9J5K5KLL   
 $,(0)2)D"+"6	" " &,, +#D#K#K!/ $L $ $     	;// 	E ##CDDD K#  	i-- 	,G#+K6=={ >   K b#+$$f%H%HIII///r4   c                      e Zd ZU dZded<   	  edd          Zded<   	  edd	          Zd
ed<   	 dZd
ed<   	  ed          Z	d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<   	 dZded<   	 dZded<    eddd           Zed9d$            Zed:d&            Zed;d(            Zd<d*Z	 	 d=d>d2Z	 	 d=d?d4Zd@ fd8Z xZS )A
ChatPremAIzPremAI Chat models.

    To use, you will need to have an API key. You can find your existing API Key
    or generate a new one here: https://app.premai.io/api_keys/
    int
project_idNapi_key)defaultaliaszOptional[SecretStr]premai_api_key
model_namero   model
session_id)r   zOptional[float]temperaturetop_pzOptional[int]
max_tokens   max_retriesrC   r   zOptional[dict]repositoriesFOptional[bool]	streamingr   clientTforbid)populate_by_namearbitrary_types_allowedextravaluesr   r:   c                   	 ddl m} n"# t          $ r}t          d          |d}~ww xY w	 t          |dd          } |t	          |t
                    r|n|j                  |d<   n"# t          $ r}t          d	          |d}~ww xY w|S )
zFValidate that the package is installed and that the API token is validr   )PremzQCould not import Prem Python package.Please install it with: `pip install premai`Nr   PREMAI_API_KEY)r   r   z,Your API Key is incorrect. Please try again.)	premair   ImportErrorr#   rw   r7   _secret_value	Exceptionrx   )clsr   r   errorr   s        r5   validate_environmentsz ChatPremAI.validate_environments<  s    	####### 	 	 	?  	
	X4H(*:5 5N  $tnc222#1     F8
  	X 	X 	XKLLRWW	Xs'   	 
(#(<A) )
B3BBr7   c                    dS )Nr   r3   selfs    r5   	_llm_typezChatPremAI._llm_typeT  s    xr4   Dict[str, Any]c                D    | j         | j        | j        | j        | j        dS )Nr   r   r   r   r   r   r   s    r5   _default_paramszChatPremAI._default_paramsX  s/     Z!/+/ -
 
 	
r4   kwargsc                   g d}g }|D ]3}||v r-t          j        d| d           |                    |           4|D ]}|                    |           i | j        |}t          | j                                                  D ]F}|                    |          |                    |          dk    r|                    |d            G|S )N)r   frequency_penaltypresence_penalty
logit_biasr8   seedzWARNING: Parameter z is not supported in kwargs.rC   )warningswarnr\   popr   listkeysrg   )r   r   kwargs_to_ignorekeys_to_removekey
all_kwargss         r5   _get_all_kwargszChatPremAI._get_all_kwargsb  s   
 
 
  	+ 	+C&&&UCUUUVVV%%c***! 	 	CJJsOOOO7,77
,113344 	* 	*C~~c""*jnnS.A.AR.G.GsD)))r4   messagesrm   r8   r9   run_manager"Optional[CallbackManagerForLLMRun]r    c                    d|v rt          ||d                   \  }}nt          |          \  }}||dk    r||d<    | j        di |}t          | f| j        |d|d|}t	          ||          S )	Nrn   rn   rC   r   Fr   r   streamr   )rA   r8   r3   )r   r   chat_with_retryr   r_   )	r   r   r8   r   r   r   messages_to_passr   rA   s	            r5   	_generatezChatPremAI._generate{  s     F"".Ff]&;/ / /+M++ /Gx.P.P+M+$")<)<&3F?#)T)33F33
"
%#
 
 
 
 #H4@@@@r4   Iterator[ChatGenerationChunk]c              +    K   d|v rt          ||d                   \  }}nt          |          \  }}|t                              d           d|vr||dk    r||d<    | j        di |}t          }t          | f| j        |d|d|D ]u}		 t          |	|          \  }
}|t          |	          nd }t          |
|
          }|r|
                    |j        |           |V  _# t          $ r
}Y d }~nd }~ww xY wd S )Nrn   r   z,stop is not supported in langchain streamingr   rC   Tr   )rA   r`   )rh   )rP   generation_info)rX   r3   )r   loggerwarningr   r   r   r   rk   dictr   on_llm_new_tokenr6   r   )r   r   r8   r   r   r   r   r   default_chunk_classstreamed_responserX   rh   r   cg_chunk_s                  r5   _streamzChatPremAI._stream  s      F"".Ff]&;/ / /+M++ /Gx.P.P+M+NNIJJJ&(((]b-@-@*7')T)33F33
,!0"
%#"
 "
 "
 "
 	 	'O.>Q( ( ($}
 %0 }5555  
 /!?    P00h0OOO   /	 	s   AC++
C?:C?r^   DSequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]])Runnable[LanguageModelInput, BaseMessage]c                R    d |D             } t                      j        dd|i|S )Nc                ,    g | ]}t          |          S r3   r%   )rL   tools     r5   rN   z)ChatPremAI.bind_tools.<locals>.<listcomp>  s!    JJJD1$77JJJr4   r^   r3   )superbind)r   r^   r   formatted_tools	__class__s       r5   
bind_toolszChatPremAI.bind_tools  s:    
 KJEJJJuww|<</<V<<<r4   )r   r   r:   r   )r:   r7   )r:   r   )r   r   r:   r   )NN)
r   rm   r8   r9   r   r   r   r   r:   r    )
r   rm   r8   r9   r   r   r   r   r:   r   )r^   r   r   r   r:   r   )r/   r0   r1   r2   __annotations__r)   r   r   r   r   r   r   r   r   r   r   r   r(   model_configr$   r   propertyr   r   r   r   r   r   __classcell__)r   s   @r5   r   r      sd          OOOL*/%I*N*N*NNNNNNG 5\BBBEBBBB/
 !%J$$$$K#(5#6#6#6K6666<!E!!!! !&d 3 3 3J33332uQ'''K''''/#%M%%%% $(L'''' !&I%%%%1F: $  L    X.    X 
 
 
 X
   8 %):>	A A A A A@ %):>	1 1 1 1 1f= = = = = = = = = =r4   r   r   r   r   llmr   r   r   )Optional[Union[CallbackManagerForLLMRun]]Callable[[Any], Any]c                  ddl }|j        j        j        |j        j        j        |j        j        j        |j        j        j	        |j        j
        j        |j        j        j        |j        j        j        |j        j        j        |j        j        j        |j        j        j        |j        j        j        |j        j        j        g}t5          |||          }|S )z/Create a retry decorator for PremAI API errors.r   N)error_typesr   r   )premai.modelsmodelsapi_response_validation_errorAPIResponseValidationErrorconflict_errorConflictErrormodel_not_found_errorModelNotFoundErrorpermission_denied_errorPermissionDeniedErrorprovider_api_connection_errorProviderAPIConnectionErrorprovider_api_status_errorProviderAPIStatusErrorprovider_api_timeout_errorProviderAPITimeoutErrorprovider_internal_server_errorProviderInternalServerErrorprovider_not_found_errorProviderNotFoundErrorrate_limit_errorRateLimitErrorunprocessable_entity_errorUnprocessableEntityErrorvalidation_errorValidationErrorr   )r   r   r   r   errors	decorators         r5   create_prem_retry_decoratorr    s      	3N$2+>-C3N/F0H4P.D&50I&6F ,  I r4   Fr   r   
List[dict]r   boolr   r   r   c                j     t            j        |          }|	 dd fd            } |d|||d|S )z+Using tenacity for retry in completion callr   Fr   r   r   r	  r   r   r   r   r:   c                H     j         j        j        j        d| ||d|}|S )Nr   r   r   r3   )r   chatcompletionscreate)r   r   r   r   rA   r   s        r5   _completion_with_retryz/chat_with_retry.<locals>._completion_with_retry  sD     63:?.5 
!
 
 	
 
 r4   r  )F)
r   r   r   r	  r   r   r   r   r:   r   r3   )r  r   )r   r   r   r   r   r   retry_decoratorr  s   `       r5   r   r     s     2k  O  "'      _ "!   	  r4   )r6   r7   r8   r9   r:   r7   )rA   r,   r8   r9   r:   r    )rA   r+   r`   ra   r:   rb   )N)rl   rm   rn   ro   r:   rp   )r   r   r   r   r   r   r:   r   )FN)r   r   r   r   r   r	  r   r
  r   r   r   r   r:   r   )Jr2   
__future__r   loggingr   typingr   r   r   r   r   r	   r
   r   r   r   r   langchain_core.callbacksr   langchain_core.language_modelsr   *langchain_core.language_models.chat_modelsr   #langchain_core.language_models.llmsr   langchain_core.messagesr   r   r   r   r   r   r   r   r   r   r   langchain_core.outputsr   r   r    langchain_core.runnablesr!   langchain_core.toolsr"   langchain_core.utilsr#   r$   %langchain_core.utils.function_callingr&   pydanticr'   r(   r)   r*   6premai.api.chat_completions.v1_chat_completions_creater+   &premai.models.chat_completion_responser,   	getLoggerr/   r   r~   rz   r}   r   r.   r@   r_   rk   r   r   r  r   r3   r4   r5   <module>r$     s   % % " " " " " "                                 > = = = = = D D D D D D K K K K K K                          S R R R R R R R R R - - - - - - ) ) ) ) ) ) ? ? ? ? ? ? ? ? H H H H H H             N      NMMMMM		8	$	$ % ! ' ' ' ' 'y ' ' '   :Y :Y :Y :Yz> > > >< "&E0 E0 E0 E0 E0PS= S= S= S= S=	 S= S= S=r =A	     D 6:! ! ! ! ! ! !r4   