
    dhG                    J   S r SSKJr  SSKrSSKrSSKJrJrJrJ	r	J
r
JrJrJrJrJrJr  SSKJr  SSKJr  SSKJr  SSKJr  SS	KJrJrJrJrJrJrJ r J!r!J"r"J#r#J$r$  SS
K%J&r&J'r'J(r(  SSK)J*r*  SSK+J,r,  SSK-J.r.J/r/  SSK0J1r1  SSK2J3r3J4r4J5r5J6r6  \(       a  SSK7J8r8  SSK9J:r:  \Rv                  " \<5      r=Sr>Sr?Sr@ " S S\A5      rB      S!S jrC      S"S jrD      S#S jrE S$     S%S jjrF " S S\\35      rGSSS.       S&S jjrH  S'             S(S  jjrIg))z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                      \ rS rSrSrSrg)ChatPremAPIErrorJ   zError with the `PremAI` API. N)__name__
__module____qualname____firstlineno____doc____static_attributes__r/       ^/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/chat_models/premai.pyr-   r-   J   s    &r6   r-   c                ^    Uc  U $ U H!  nU R                  U5      nUS:w  d  M  U SU n M#     U $ )z0Truncates text at the earliest stop token found.N)find)textstop
stop_tokenstop_token_idxs       r7   _truncate_at_stop_tokensr?   N   sA    
 |
:.R(D  Kr6   c                &   U R                   (       d  [        S5      e/ nU R                    GH  nUR                  R                  nUc  [        SU S35      e[	        UR                  R
                  =(       d    SUS9nUc  [        SU 35      eUS:X  a[  UR                  S	   nUc  / nO$U Vs/ sH  nUS
   US   S   US   S   S.PM     nnUR                  [        U[        XWS9S95        M  US:X  a"  UR                  [        U[        US9S95        M  UR                  [        U[        XES9S95        GM     U R                  b3  [        USU R                   V	s/ sH  oR                  5       PM     sn	0S9$ [        USS0S9$ s  snf s  sn	f )z4Converts a Prem API response into a LangChain resultz-ChatResponse must have at least one candidateNzChatResponse z must have a role. )r;   r<   z"ChatResponse must have a content: 	assistant
tool_callsidfunctionname	arguments)rD   rF   args)contentrC   )r;   messageuserrI   rolerI   document_chunks)generations
llm_output)choicesr-   rJ   rN   r?   rI   appendr   r   r   r   rO   r    to_dict)
responser<   rP   choicerN   rI   rC   tools	tool_callchunks
             r7   _response_to_resultrZ   ]   s    NOO(*K""~~""<"]6(:L#MNN +0F0F0L"SWX?"%Gy#QRR;5J! &0 &0		 (o )* 5f = )* 5k B
 &0    )G*V
 V^G\'5RS  +4*QC #N +#!191I1I$1IMMO1I$
 	
 k?PRV>WXXE8$s   .F	Fc                   U R                   S   R                  nUR                  SS5      nUR                  SS5      n0 nU R                   S   R                  nUS:X  d
  U[        :X  a  [	        US9U4$ US:X  d
  U[
        :X  a  [        XES9U4$ US	:X  d
  U[        :X  a  [        US9U4$ U(       d
  U[        :X  a  [        XCS
9U4$ U" US9U4$ )z(Converts delta response to message chunkr   rN   rA   rI   rK   rL   rB   )rI   additional_kwargssystem)rI   rN   )rR   deltagetfinish_reasonr   r   r   r   )rU   default_class_deltarN   rI   r\   finish_reasonss          r7   (_convert_delta_response_to_message_chunkrd      s     a &&F::fb!DjjB'G $,$4$4Q$7$E$ENv~*;; 1>AA		 ?7P
 	
 
	].@@!'2NBB	"22;^KKW-~==r6   c                   Sn/ nU  GH  n[        U[        5      (       a  [        UR                  5      nM0  [        U[        5      (       a  Uc)  UR                  S[        UR                  5      S.5        Mq  0 nUR                  b  UR                  S:w  d   [        SS5      5       e[        UR                  5      U[        UR                  5      '   UR                  SUUS.5        M  [        U[        5      (       a  UR                  b  [        UR                  5      S:X  a*  UR                  S	[        UR                  5      S.5        GMH  UR                  UR                  UR                  UR                  S
.nUR                  S	[        R                  US9S.5        GM  [        U[        5      (       a  GM  [        S5      e   SnU  HH  n[        U[        5      (       d  M  UR                   nUR                  n	U["        R                  XS9-  nMJ     US:w  a  [$        n
X-  n
UR                  SU
S.5        X#4$ )z_Converts a list of LangChain Messages into a simple dict
which is the message structure in PremNrK   rM   rA   z9When using prompt template there should be id associated zwith each HumanMessage)rN   template_idparamsr   rB   )rD   rI   response_metadatarC   )jsonzNo such role explicitly exists)tool_idtool_response)
isinstancer   strrI   r   rS   rD   
ValueErrorr   rC   lenrh   !INTERMEDIATE_TOOL_RESULT_TEMPLATEformatr   r-   tool_call_idSINGLE_TOOL_PROMPT_TEMPLATETOOL_PROMPT_HEADER)input_messagesrf   system_promptexamples_and_messages	input_msgrg   ai_msg_to_jsontool_promptrj   tool_resultprompts              r7   _messages_to_prompt_dictr}      s4    $(M24#	i//	 1 12M	<00"%,, &#&y'8'8#9 *,!0y||r7I JO,M J -0	0A0A,Bs9<<()%,, &'2"( 	9--##+s93G3G/HA/M%,, +#&y'8'8#9 $,,(00)2)D)D"+"6"6	" &,, +#D#K#K!/ $L $ 	;// ##CDDk $p K#	i--,,G#++K6== >  K	 $ b#$$f%HI//r6   c                    ^  \ rS rSr% SrS\S'    \" SSS9rS\S	'    \" SS
S9rS\S'    Sr	S\S'    \" SS9r
S\S'    SrS\S'    \" SS9rS\S'    \" SS9rS\S'    SrS\S'    SrS\S'    SrS\S'    SrS\S'   \" SSS S!9r\S*S" j5       r\S+S# j5       r\S,S$ j5       rS-S% jr  S.         S/S& jjr  S.         S0S' jjr      S1U 4S( jjrS)rU =r$ )2
ChatPremAIi  zPremAI 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_nameOptional[str]model
session_id)r   zOptional[float]temperaturetop_pzOptional[int]
max_tokens   max_retriesrA   rv   zOptional[dict]repositoriesFOptional[bool]	streamingr   clientTforbid)populate_by_namearbitrary_types_allowedextrac                     SSK Jn   [        USS5      nU" [	        U[
        5      (       a  UOUR                  S9US'   U$ ! [         a  n[        S5      UeSnAff = f! [         a  n[        S	5      UeSnAff = f)
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#   rl   rm   _secret_value	Exceptionrn   )clsvaluesr   errorr   s        r7   validate_environments ChatPremAI.validate_environmentsF  s    	#
	X4H(*:5N  $nc22 '#11 F8 #  	? 	  	XKLRWW	Xs.   A 7A  
AAA 
A;*A66A;c                    g)Nr   r/   selfs    r7   	_llm_typeChatPremAI._llm_type^  s    r6   c                v    U R                   U R                  U R                  U R                  U R                  S.$ )Nr   rv   r   r   r   r   r   s    r7   _default_paramsChatPremAI._default_paramsb  s7     ZZ!//++// --
 	
r6   c                   / SQn/ nU H5  nXB;   d  M
  [         R                  " SU S35        UR                  U5        M7     U H  nUR                  U5        M     0 U R                  EUEn[        U R                  R                  5       5       H>  nUR                  U5      b  UR                  U5      S:X  d  M,  UR                  US 5        M@     U$ )N)r   frequency_penaltypresence_penalty
logit_biasr<   seedzWARNING: Parameter z is not supported in kwargs.rA   )warningswarnrS   popr   listkeysr_   )r   kwargskwargs_to_ignorekeys_to_removekey
all_kwargss         r7   _get_all_kwargsChatPremAI._get_all_kwargsl  s    
 C& 3C58TUV%%c* 
 "CJJsO " 8,,77
,,1134C~~c"*jnnS.AR.GsD) 5 r6   c                    SU;   a  [        XS   S9u  pVO[        U5      u  pVUb
  US:w  a  XTS'   U R                  " S0 UD6n[        U 4U R                  USUS.UD6n[	        XS9$ )	Nrf   rf   rA   rv   Fr   messagesstreamrun_manager)rU   r<   r/   )r}   r   chat_with_retryr   rZ   )	r   r   r<   r   r   rv   messages_to_passr   rU   s	            r7   	_generateChatPremAI._generate  s     F".F]&;/+M+ /Gx.P+M$")<&3?#))3F3
"
%#
 
 #H@@r6   c              +    #    SU;   a  [        XS   S9u  pVO[        U5      u  pVUb  [        R                  S5        SU;  a  Ub
  US:w  a  XTS'   U R                  " S0 UD6n[        n[        U 4U R                  USUS.UD6 HK  n	 [        XS9u  pUb	  [        US	9OS n[        XS
9nU(       a  UR                  UR                  US9  Uv   MM     g ! [         a  n S nAM`  S nAff = f7f)Nrf   r   z,stop is not supported in langchain streamingrv   rA   Tr   )rU   ra   )r`   )rJ   generation_info)rY   r/   )r}   loggerwarningr   r   r   r   rd   dictr   on_llm_new_tokenr;   r   )r   r   r<   r   r   rv   r   r   default_chunk_classstreamed_responserY   r`   r   cg_chunk_s                  r7   _streamChatPremAI._stream  s%     F".F]&;/+M+ /Gx.P+MNNIJ&((]b-@*7'))3F3
,!0"
%#"
 "
'O.($
 %0 }5  
 /! 00h0O-"
.  s+   BC+ACC+
C(C+#C((C+c                f   > U Vs/ sH  n[        U5      PM     nn[        TU ]  " SSU0UD6$ s  snf )NrW   r/   )r%   superbind)r   rW   r   toolformatted_tools	__class__s        r7   
bind_toolsChatPremAI.bind_tools  s>    
 EJJED1$7EJw|</<V<< Ks   .r/   )r   r   returnr   )r   rm   )r   Dict[str, Any])r   r   r   r   )NN)
r   List[BaseMessage]r<   Optional[List[str]]r   "Optional[CallbackManagerForLLMRun]r   r   r   r    )
r   r   r<   r   r   r   r   r   r   zIterator[ChatGenerationChunk])rW   zDSequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]]r   r   r   z)Runnable[LanguageModelInput, BaseMessage])r0   r1   r2   r3   r4   __annotations__r(   r   r   r   r   r   r   r   rv   r   r   r   r'   model_configr$   r   propertyr   r   r   r   r   r   r5   __classcell__)r   s   @r7   r   r     s    OL*/I*NN'NG \BE=B/
 !%J$K#(#6K6<!E?! !&d 3J32Q'K'/#%M=% $(L.' !&I~%1FC $L  .   
 
8 %):>	A#A "A 8	A
 A 
A@ %):>	1#1 "1 8	1
 1 
'1f=S= = 
3	= =r6   r   r   r   r   c                  SSK nUR                  R                  R                  UR                  R                  R
                  UR                  R                  R                  UR                  R                  R                  UR                  R                  R                  UR                  R                  R                  UR                  R                  R                  UR                  R                   R"                  UR                  R$                  R&                  UR                  R(                  R*                  UR                  R,                  R.                  UR                  R0                  R2                  /n[5        XAUS9nU$ )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   )llmr   r   r   errors	decorators         r7   create_prem_retry_decoratorr    s     	33NN$$22++>>--CC33NN//FF00HH44PP..DD&&5500II&&66F ,I r6   c                x   ^  [        T T R                  US9nU S         SU 4S jjj5       nU" SUUUS.UD6$ )z+Using tenacity for retry in completion callr   c                p   > TR                   R                  R                  R                  " SU UUS.UD6nU$ )Nr   r   r   r/   )r   chatcompletionscreate)r   r   r   r   rU   r  s        r7   _completion_with_retry/chat_with_retry.<locals>._completion_with_retry	  sB     ::??..55 
!
 	
 r6   r  )F)
r   r   r   
List[dict]r   r   r   r   r   r   r/   )r  r   )r  r   r   r   r   r   retry_decoratorr  s   `       r7   r   r     s     2kO  "'  	
 
  "  	 r6   )r;   rm   r<   r   r   rm   )rU   r+   r<   r   r   r    )rU   r*   ra   zType[BaseMessageChunk]r   zdTuple[Union[BaseMessageChunk, HumanMessageChunk, AIMessageChunk, SystemMessageChunk], Optional[str]])N)ru   r   rf   r   r   z*Tuple[Optional[str], List[Dict[str, Any]]])r  r   r   r   r   z)Optional[Union[CallbackManagerForLLMRun]]r   zCallable[[Any], Any])FN)r  r   r   r   r   r  r   boolr   r   r   r   r   r   )Jr4   
__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+   	getLoggerr0   r   rt   rp   rs   r   r-   r?   rZ   rd   r}   r   r  r   r/   r6   r7   <module>r!     s   % "      > D K    S R - ) ? H   N			8	$ % ! 'y '

 	:Y$:Y
:Y :Yz>*>;Q>>< "&O0%O0O0 0O0dS=	 S=r =A		  ;	
 D 6:!	!! ! 	!
 4! ! 	!r6   