
    Ng?                        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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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& d dl'm(Z( d dl)m*Z*m+Z+m,Z,m-Z- dZ.ee/eee/ee/ef         f                  f         Z0dee/ef         dee/ef         fdZ1de0deee/ef                  fdZ2dee         deee/ef                  fdZ3 G d de          Z4dS )    N)AnyAsyncIteratorCallableDictIteratorListMappingOptionalSequenceTypeUnion)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)LanguageModelInput)BaseChatModelagenerate_from_streamgenerate_from_stream)	AIMessageAIMessageChunkBaseMessageHumanMessageSystemMessageToolMessage)ChatGenerationChatGenerationChunk
ChatResult)Runnable)BaseTool)get_from_dict_or_envconvert_to_openai_tool)	BaseModel
ConfigDictFieldmodel_validatorz
reka-flashitemreturnc                 v    | d         dk    r,| d         }t          |t                    rd|v r|d         | d<   | S )zProcess a single content item.type	image_urlurl)
isinstancedict)r&   r*   s     `/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/reka.pyprocess_content_itemr/   .   sK    F|{""%	i&& 	15I+=+= )% 0DK    contentc                    t          | t                    rd| dgS t          | t                    rg }| D ]y}t          |t                    r|                    d|d           0t          |t                    r#|                    t          |                     ht          d|           |S t          d          )z\Process content to handle both text and media inputs,
    returning a list of content items.textr)   r3   zInvalid content item format: zInvalid content format)r,   strlistappendr-   r/   
ValueError)r1   resultr&   s      r.   process_contentr:   8   s     '3 31122	GT	"	" 3 	I 	ID$$$ Ivt<<====D$'' I24889999 !G!G!GHHH1222r0   messagesc                    g }d}| D ]^}t          |t                    rB|1t          |j        t                    r|j        }<t	          d          t          d          t          |t                    rt          |j                  }|r~|rat          |d         t                    rF|d         	                    d          dk    r'd|d         v r| d|d         d          |d         d<   n|
                    dd|d           d}|                    d	|d
           t          |t                    rddi}|j        rt          |j                  }||d<   d|j        v rd|j        d         }g }|D ]M}|d         |d         d         t          j        |d         d                   d}	|                    |	           N||d<   |                    |           t          |t                     rRg }
|
                    |j        t          j        d|j        i          d           |                    d|
d
           At          dt'          |                     |S )z2Convert LangChain messages to Reka message format.Nz'SystemMessage content must be a string.z+Multiple system messages are not supported.r   r)   r3   
r4   user)roler1   r?   	assistantr1   
tool_callsidfunctionname	arguments)rB   rD   
parametersstatus)tool_call_idoutputtool_outputzUnsupported message type: )r,   r   r1   r5   	TypeErrorr8   r   r:   r-   getinsertr7   r   additional_kwargsjsonloadsr   rH   dumpsr)   )r;   reka_messagessystem_messagemessageprocessed_contentreka_messagerA   formatted_tool_calls	tool_callformatted_tool_callcontent_lists              r.   convert_to_reka_messagesr[   K   s   *,M$(N ;K ;Kg}-- :	K%gos33 O%,_NN#$MNNN !NOOO.. 2	K / @ @ &%"#4Q#7>> *!,0088FBB"3A"666 *KK->q-A&-IKK &a(00 &,,FNCC   "&  &=N!O!OPPPP++  	K,2K+@L <$3GO$D$D!*;Y'w888$6|D
')$!+ E EI'o )* 5f =&*j:1F{1S&T&T+ +'
 )//0CDDDD-A\*  ....-- 	K13L$+$8"j(GO)DEE      )+     I$w--IIJJJr0   c                   2    e Zd ZU dZdZeed<   dZeed<    ee	          Z
eed<    ed          Zeed<   dZee         ed	<   d
Zeed<   dZee         ed<   dZeed<   dZee         ed<    ee          Zeeef         ed<    ed          ZdZeeeeeee         f         gef                  ed<    e d          e!deeef         deeef         fd                        Z"e#de$eef         fd            Z%e#defd            Z&	 	 d,dee         deee                  dee'         dede(e)         f
d Z*	 	 d,dee         deee                  dee+         dede,e)         f
d!Z-	 	 d,dee         deee                  dee'         dede.f
d"Z/	 	 d,dee         deee                  dee+         dede.f
d#Z0d$eeeee         f         defd%Z1d&dd'd(e2eeeef         e3e4         ee5f                  d)ed*ee         dede6e7ef         f
 fd+Z8 xZ9S )-ChatRekaz Reka chat large language models.Nclientasync_client)defaultmodel   
max_tokenstemperatureF	streamingdefault_request_timeout   max_retriesreka_api_key)default_factorymodel_kwargsforbid)extratoken_counterbefore)modevaluesr'   c                     |                     d          }t          d|idd          }||d<   	 ddlm}m}  ||          |d<    ||          |d<   n# t
          $ r t          d          w xY w|S )	zBValidate that API key and Python package exist in the environment.ri   REKA_API_KEYr   )	AsyncRekaReka)api_keyr^   r_   zTCould not import Reka Python package. Please install it with `pip install reka-api`.)rL   r   reka.clientrt   ru   ImportError)clsrq   ri   rt   ru   s        r.   validate_environmentzChatReka.validate_environment   s     zz.11+\*NN
 
 ".~	33333333#t$     F8 &/Y$& & &F>""  	 	 	A  	
 s   &A A0c                 X    | j         | j        d}| j        
| j        |d<   i || j        S )z0Get the default parameters for calling Reka API.)ra   rc   Nrd   )ra   rc   rd   rk   )selfparamss     r.   _default_paramszChatReka._default_params   sE     Z/
 
 '$($4F=!.&.D-..r0   c                     dS )zReturn type of chat model.z	reka-chat )r|   s    r.   	_llm_typezChatReka._llm_type   s	     {r0   r;   stoprun_managerkwargsc              +   ,  K   t          |          }i | j        |}|r||d<    | j        j        j        dd|i|}|D ]T}|j        d         j        j        }	t          t          |	                    }
|r|
                    |	|
           |
V  Ud S Nr   r;   r   r1   rT   )chunkr   )r[   r~   r^   chatcreate_stream	responsesr   r1   r   r   on_llm_new_tokenr|   r;   r   r   r   rR   r}   streamr   r1   
chat_chunks              r.   _streamzChatReka._stream   s       1::3D(3F3 	"!F6N/!/QQQ&QQ 	 	Eoa(.6G,^G5T5T5TUUUJ H,,WJ,GGG	 	r0   c                F  K   t          |          }i | j        |}|r||d<    | j        j        j        dd|i|}|2 3 d {V }|j        d         j        j        }	t          t          |	                    }
|r|
                    |	|
           d {V  |
W V  a6 d S r   )r[   r~   r_   r   r   r   r   r1   r   r   r   r   s              r.   _astreamzChatReka._astream   s       1::3D(3F3 	"!F6N5"'5WW}WPVWW! 	 	 	 	 	 	 	%oa(.6G,^G5T5T5TUUUJ N!227*2MMMMMMMMM "66s   B c                    | j         rt           | j        |f||d|          S t          |          }i | j        |}|r||d<    | j        j        j        dd|i|}|j        d         j	        j
        r5|j        d         j	        j
        }t          ddd |D             i          }	n+|j        d         j	        j        }
t          |
|
nd	          }	t          t          |	
          g          S )Nr   r   r   r;   r    rA   c                 b    g | ],}|j         d |j        t          j        |j                  dd-S rC   )rD   rE   )rB   r)   rC   rB   rD   rO   rQ   rF   .0tcs     r.   
<listcomp>z&ChatReka._generate.<locals>.<listcomp>  W     
# 
# 
#  #%%$.(*-1Z-F-F) ) 
# 
# 
#r0   r1   rN   r   r   generationsr   )re   r   r   r[   r~   r^   r   creater   rT   rA   r   r1   r   r   r|   r;   r   r   r   rR   r}   responserA   rT   r1   s              r.   	_generatezChatReka._generate   sH    > 	'XTDkTTVTT   1::3D(3F3 	"!F6N*4;#*LLMLVLLa (3 	P!+A.6AJ  
# 
# #-
# 
# 
##  GG" (+3;G73FBOOOG~g'F'F'F&GHHHHr0   c                   K   | j         r$t           | j        |f||d|           d {V S t          |          }i | j        |}|r||d<    | j        j        j        dd|i| d {V }|j        d         j	        j
        r5|j        d         j	        j
        }t          ddd |D             i          }	n+|j        d         j	        j        }
t          |
|
nd	          }	t          t          |	
          g          S )Nr   r   r;   r   r   rA   c                 b    g | ],}|j         d |j        t          j        |j                  dd-S r   r   r   s     r.   r   z'ChatReka._agenerate.<locals>.<listcomp>9  r   r0   r   r   r   r   r   )re   r   r   r[   r~   r_   r   r   r   rT   rA   r   r1   r   r   r   s              r.   
_ageneratezChatReka._agenerate"  s~      > 	.hUT{UUfUU         1::3D(3F3 	"!F6N6*/6XXXQWXXXXXXXXa (3 	P!+A.6AJ  
# 
# #-
# 
# 
##  GG" (+3;G73FBOOOG~g'F'F'F&GHHHHr0   inputc                 6   | j         |                      |          S 	 ddl}n# t          $ r t          d          w xY w|                    d          }t	          |t
                    r"t          |                    |                    S t	          |t                    r]|j	        }t	          |t
                    st          dt          |                     t          |                    |                    S t	          |t                    rid}|D ]b}|j	        }t	          |t
                    st          dt          |                     |t          |                    |                    z  }c|S t          dt          |                     )aN  Calculate number of tokens.

        Args:
            input: Either a string, a single BaseMessage, or a list of BaseMessages.

        Returns:
            int: Number of tokens in the input.

        Raises:
            ImportError: If tiktoken is not installed.
            ValueError: If message content is not a string.
        Nr   zXCould not import tiktoken python package. Please install it with `pip install tiktoken`.cl100k_basez&Message content must be a string, got zUnsupported input type: )rn   tiktokenrx   get_encodingr,   r5   lenencoder   r1   r8   r)   r6   rK   )r|   r   r   encodingr1   totalmsgs          r.   get_num_tokenszChatReka.get_num_tokensM  s    )%%e,,,	OOOO 	 	 	A  	 ((77eS!! 	Fxu--...{++ 	FmGgs++  LT']]LL   xw//000t$$ 	FE 7 7+!'3// $PgPP   X__W55666LDtE{{DDEEEs   # =auto)tool_choicestricttoolsr   r   c                    fd|D             }|dvrt          d| d          ||d<   d |D             } t                      j        dd|i|S )	a  Bind tool-like objects to this chat model.

        The `tool_choice` parameter controls how the model uses the tools you pass.
        There are three available options:

        - `"auto"`: Lets the model decide whether or not to invoke a tool. This is the
          recommended way to do function calling with our models.
        - `"none"`: Disables tool calling. In this case, even if you pass tools to
          the model, the model will not invoke any tools.
        - `"tool"`: Forces the model to invoke one or more of the tools it has
          been passed.

        Args:
            tools: A list of tool definitions to bind to this chat model.
                Supports any tool definition handled by
                :meth:`langchain_core.utils.function_calling.convert_to_openai_tool`.
            tool_choice: Controls how the model uses the tools you pass.
                Options are "auto", "none", or "tool". Defaults to "auto".
            strict:
            If True, model output is guaranteed to exactly match the JSON Schema
                provided in the tool definition.
                If False, input schema will not be validated
                and model output will not be validated.
                If None, ``strict`` argument will not
                be passed to the model.
            kwargs: Any additional parameters are passed directly to the model.

        Returns:
            Runnable: An executable chain or component.
        c                 2    g | ]}t          |           S ))r   r    )r   toolr   s     r.   r   z'ChatReka.bind_tools.<locals>.<listcomp>  s4     
 
 
<@"4777
 
 
r0   )r   noner   zInvalid tool_choice 'zB' provided. Tool choice must be one of: 'auto', 'none', or 'tool'.r   c                     g | ]
}|d          S )rC   r   )r   r   s     r.   r   z'ChatReka.bind_tools.<locals>.<listcomp>  s    HHH4
+HHHr0   r   r   )r8   superbind)r|   r   r   r   r   formatted_tools	__class__s      `  r.   
bind_toolszChatReka.bind_tools}  s    L
 
 
 
DI
 
 

 666I I I I   !,} IHHHHuww|<</<V<<<r0   )NN):__name__
__module____qualname____doc__r^   r   __annotations__r_   r$   DEFAULT_REKA_MODELra   r5   rc   intrd   r
   floatre   boolrf   rh   ri   r-   rk   r   r#   model_configrn   r   r   r   r   r%   classmethodrz   propertyr	   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r   r   r   r   __classcell__)r   s   @r.   r]   r]      s        **FCL#1222E3222eC(((J(((#'K%'''It/3Xe_333K"&L(3-&&&#(5#>#>#>L$sCx.>>>:H---L 	 8%[${*;;<=sBC    _(###$sCx. T#s(^    [ $#2 /c!2 / / / X/ 3    X %):>	 {# tCy! 67	
  
%	&   0 %)?C	 {# tCy! ;<	
  
*	+   0 %):>	)I )I{#)I tCy!)I 67	)I
 )I 
)I )I )I )I\ %)?C	)I )I{#)I tCy!)I ;<	)I
 )I 
)I )I )I )IV.FE#{D<M*M$N .FSV .F .F .F .Fh "!%6= 6= 6=d38nd9oxQRS6= 	6=
 6= 6= 
$k1	26= 6= 6= 6= 6= 6= 6= 6= 6= 6=r0   r]   )5rO   typingr   r   r   r   r   r   r	   r
   r   r   r   langchain_core.callbacksr   r   langchain_core.language_modelsr   *langchain_core.language_models.chat_modelsr   r   r   langchain_core.messagesr   r   r   r   r   r   langchain_core.outputsr   r   r   langchain_core.runnablesr   langchain_core.toolsr   langchain_core.utilsr   %langchain_core.utils.function_callingr!   pydanticr"   r#   r$   r%   r   r5   ContentTyper/   r:   r[   r]   r   r0   r.   <module>r      s                                    > = = = = =         
                S R R R R R R R R R - - - - - - ) ) ) ) ) ) 5 5 5 5 5 5 H H H H H H B B B B B B B B B B B B! CeCc3h$7899:tCH~ $sCx.    3[ 3T$sCx.-A 3 3 3 3&BtK'8 BT$sCx.=Q B B B BJc= c= c= c= c=} c= c= c= c= c=r0   