
    NgV                        d dl Z d dl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mZmZ d dl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#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/m0Z0m1Z1 d dl2m3Z3m4Z4m5Z5 d dl6m7Z7m8Z8m9Z9 d dl:m;Z; d dl<m=Z=m>Z>m?Z? d dl@mAZA d dlBmCZC d dlDmEZEmFZFmGZGmHZH d dlImJZJ de5de4fdZKdeLdeLfdZMde
e          dee
eeLef                  e
e          f         fdZNde
e          deeLef         fdZOde de
fdZPd eeLef         dee
e$         e
e"         f         fd!ZQ G d" d#e          ZRdS )$    N)
itemgetter)AnyAsyncIteratorCallableDictIteratorListLiteralOptionalSequenceTupleTypeUnioncast)ClientSession)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)LanguageModelInput)BaseChatModelagenerate_from_streamgenerate_from_stream)	AIMessageAIMessageChunkBaseMessageHumanMessageInvalidToolCallSystemMessageToolCallToolMessage)invalid_tool_call)	tool_call)tool_call_chunk)OutputParserLike)JsonOutputKeyToolsParserPydanticToolsParser)ChatGenerationChatGenerationChunk
ChatResult)RunnableRunnableMapRunnablePassthrough)BaseTool)convert_to_secret_strget_from_dict_or_envpre_initconvert_to_openai_tool)is_basemodel_subclass)	BaseModel
ConfigDictField	SecretStr)Requestsgenerated_resultreturnc                 &   | j         d         j        }t          |t                    rK|j        Dd t          |j                  D             }t          |j        |          }t          |          S t          t          | j         d                   S )Nr   c           	          g | ]<\  }}t          |d          t          j        |d                   |d         |          =S )nameargsid)r<   r=   r>   index)create_tool_call_chunkjsondumps).0idxr!   s      b/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/edenai.py
<listcomp>z._result_to_chunked_message.<locals>.<listcomp>D   sa     
 
 
 Y #v&Z	& 122T?	  
 
 
    )contenttool_call_chunksmessage)
generationsrK   
isinstancer   
tool_calls	enumerater   rH   r'   r   )r8   rK   rI   message_chunks       rE   _result_to_chunked_messagerQ   A   s    *1-5G'9%% J'*<*H
 
 #,G,>"?"?
 
 
 'O-
 
 
 #=9999')9)Ea)HIIIrG   typec                 L    ddddd}| |v r||          S t          d|            )N	assistantuser)aihumanchatr   zUnknown type: )
ValueError)rR   role_mappings     rE   _message_roler[   V   sI    %	 L |D!!0$00111rG   messagesc                     g }| dd         }t          |           D ]>}t          |t                    r'|j        |j        dg|}|                                 > ||fS )z
    Get the last langchain tools messages to transform them into edenai tool_results
    Returns tool_results and messages without the extracted tool messages
    N)r>   result)reversedrM   r   tool_call_idrH   pop)r\   tool_resultsother_messagesmsgs       rE   *_extract_edenai_tool_results_from_messagesre   d   s     *,Laaa[N!!  c;'' 	'3;??L     ''rG   c                 (   d }g }t          t          d |                     }|r|d         nd}t          |           \  }}t          |          D ]\  }}t	          |t
                    r|dk    rt          d          |j        }7t	          |t                    r|	                    d|j        d           j||k    r=|	                    t          |j                  |j        t          |          d           t          |d	d          |||d
S )Nc                 ,    t          | t                    S N)rM   r   )rd   s    rE   <lambda>z)_format_edenai_messages.<locals>.<lambda>}   s    Z\-J-J rG    r   z4System message must be at beginning of message list.tool)rolerK   )rm   rK   rN   rH   )textprevious_historychatbot_global_actionrb   )listfilterre   rO   rM   r   rY   rH   r   appendr[   rR   '_format_tool_calls_to_edenai_tool_callsgetattr)	r\   systemformatted_messageshuman_messageslast_human_messagerb   rc   irK   s	            rE   _format_edenai_messagesr{   y   sF   F&!J!JHUUVVN/=E++2#Mh#W#W L.//  
7g}-- 	Avv !WXXX_FF-- 		%%v'/&R&RSSSS***%%)',77&"I'"R"R    *Ir::.!'$	  rG   rK   c                    t          | dg           }t          | dg           }g }|D ]T}|                    |                    d          |                    d          |                    d          d           U|D ]r}|                    di           }	 t          j        |          }n# t
          $ r t          |          }Y nw xY w|                    ||d         |d         d           s|S )NrN   invalid_tool_callsr=   r>   r<   )	argumentsr>   r<   )ru   rs   getrA   rB   	TypeErrorstr)rK   rN   r}   edenai_tool_callsr    r!   	tool_argsr~   s           rE   rt   rt      s;   ,33J *>CC/ 
 
  .226::'++D11)--f55 	
 	
 	
 	
   
 
	MM&"--		'
9--II 	' 	' 	'IIII	'  &o!&) 	
 	
 	
 	
 s   B,,CCprovider_responsec                    g }g }|                      di           d         }|                     d          x}r|D ]}	 |                    t          |d         t          j        |d                   |d                              M# t          j        $ rl}|                    t          |                     d          |                     d          |                     d          d| 	                     Y d }~d }~ww xY w||fS )
NrK      rN   r<   r~   r>   )r<   r=   r>   zReceived JSONDecodeError )r<   r=   r>   error)r   rs   create_tool_callrA   loadsJSONDecodeErrorcreate_invalid_tool_call)r   rN   r}   rK   raw_tool_callsraw_tool_callexcs          rE   (_extract_tool_calls_from_edenai_responser      sZ    J##Ir2215G \222~ + 	 	M!!$*62!Zk(BCC(.      '   ")),*..v66*..{;;(,,T22?#??	          )))s   A	BDA"C==Dc                   T    e Zd ZU dZ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<   	 dZeed<    edd          Zee         ed<    ed          Zededefd            Zedefd            Zede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 d!e(e)eee!f         e*e+         e,e-f                  d"ee)e.ee/d#         ef                  de!de0e1ef         f fd$Z2d
d%d&e)ee*e+         f         d'ede!de0e1e)ee+f         f         fd(Z3	 	 d-dee         deee                  dee          de!de4f
d)Z5	 	 d-dee         deee                  dee%         de!de4f
d*Z6dee         deee                  dee          de!de#f
d+Z7dee         deee                  dee%         de!de#f
d,Z8 xZ9S ).
ChatEdenAIa(	  `EdenAI` chat large language models.

    `EdenAI` is a versatile platform that allows you to access various language models
    from different providers such as Google, OpenAI, Cohere, Mistral and more.

    To get started, make sure you have the environment variable ``EDENAI_API_KEY``
    set with your API key, or pass it as a named parameter to the constructor.

    Additionally, `EdenAI` provides the flexibility to choose from a variety of models,
    including the ones like "gpt-4".

    Example:
        .. code-block:: python

            from langchain_community.chat_models import ChatEdenAI
            from langchain_core.messages import HumanMessage

            # Initialize `ChatEdenAI` with the desired configuration
            chat = ChatEdenAI(
                provider="openai",
                model="gpt-4",
                max_tokens=256,
                temperature=0.75)

            # Create a list of messages to interact with the model
            messages = [HumanMessage(content="hello")]

            # Invoke the model with the provided messages
            chat.invoke(messages)

    `EdenAI` goes beyond mere model invocation. It empowers you with advanced features :

    - **Multiple Providers**: access to a diverse range of llms offered by various
     providers giving you the freedom to choose the best-suited model for your use case.

    - **Fallback Mechanism**: Set a fallback mechanism to ensure seamless operations
        even if the primary provider is unavailable, you can easily switches to an
        alternative provider.

    - **Usage Statistics**: Track usage statistics on a per-project
    and per-API key basis.
    This feature allows you to monitor and manage resource consumption effectively.

    - **Monitoring and Observability**: `EdenAI` provides comprehensive monitoring
    and observability tools on the platform.

    Example of setting up a fallback mechanism:
        .. code-block:: python

            # Initialize `ChatEdenAI` with a fallback provider
            chat_with_fallback = ChatEdenAI(
                provider="openai",
                model="gpt-4",
                max_tokens=256,
                temperature=0.75,
                fallback_provider="google")

    you can find more details here : https://docs.edenai.co/reference/text_chat_create
    openaiproviderNmodel   
max_tokensr   temperatureF	streamingfallback_providerszhttps://api.edenai.run/v2edenai_api_urlzEdenAI API Token)descriptionedenai_api_keyforbid)extravaluesr9   c                 H    t          t          |dd                    |d<   |S )z,Validate that api key exists in environment.r   EDENAI_API_KEY)r-   r.   )clsr   s     rE   validate_environmentzChatEdenAI.validate_environment0  s1     $9 )9;KLL$
 $
  rG   c                      ddl m}  d|  S )Nr   __version__z
langchain/)langchain_communityr   r   s    rE   get_user_agentzChatEdenAI.get_user_agent8  s"    333333)K)))rG   c                     dS )zReturn type of chat model.zedenai-chat selfs    rE   	_llm_typezChatEdenAI._llm_type>  s	     }rG   c                 F    | j         r| j                                         S dS )Nrk   )r   get_secret_valuer   s    rE   _api_keyzChatEdenAI._api_keyC  s'     	:&77999rrG   r\   stoprun_managerkwargsc              +     K   d|v r | j         |f||d|V  dS | j         d}d| j         |                                 d}t	          |          }| j        | j        | j        | j        d||}d	 |	                                D             }| j
        | j        | j
        i|d
<   t          |          }	|	                    ||d          }
|
                                 |
                                D ]k}t          j        |                                          }|d         }t%          t'          |                    }|r|                    ||           |V  ldS )#Call out to EdenAI's chat endpoint.available_toolsr   r   N/text/chat/streamBearer Authorizationz
User-Agentr\   	providersr   r   r   c                     i | ]
\  }}|||S rh   r   rC   kvs      rE   
<dictcomp>z&ChatEdenAI._stream.<locals>.<dictcomp>e      EEEDAqq}1a}}}rG   settingsheadersT)urldatastreamrn   rH   rJ   )chunk)_stream_with_tools_as_generater   r   r   r{   r   r   r   r   itemsr   r7   postraise_for_status
iter_linesrA   r   decoder'   r   on_llm_new_token)r   r\   r   r   r   r   r   formatted_datapayloadrequestresponsechunk_responser   tokencg_chunks                  rE   _streamzChatEdenAI._streamI  s      &&5$5# @F     F$7776t}66--//
 
 1(CCC/+"&"9	#
 #

 #
 #
 FEGMMOOEEE:!#'=$*"=GJ7+++<<Cgd<CC!!###&1133 	 	NJ~446677E&ME*>%3P3P3PQQQH D,,U(,CCCNNNN	 	rG   c                  K   d|v r | j         |f||d| d {V W V  d S | j         d}d| j         |                                 d}t	          |          }| j        | j        | j        | j        d||}d |	                                D             }| j
        | j        | j
        i|d	<   t                      4 d {V }	|	                    |||
          4 d {V }
|
                                 |
j        2 3 d {V }t          j        |                                          }|d         }t%          t'          |                    }|r#|                    |d         |           d {V  |W V  ~6 	 d d d           d {V  n# 1 d {V swxY w Y   d d d           d {V  d S # 1 d {V swxY w Y   d S )Nr   r   r   r   r   r   r   c                     i | ]
\  }}|||S rh   r   r   s      rE   r   z'ChatEdenAI._astream.<locals>.<dictcomp>  r   rG   r   rA   r   rn   r   rJ   )r   r   ) _astream_with_tools_as_agenerater   r   r   r{   r   r   r   r   r   r   r   r   r   rH   rA   r   r   r'   r   r   )r   r\   r   r   r   r   r   r   r   sessionr   r   r   r   r   s                  rE   _astreamzChatEdenAI._astreamv  s      &&==# @F            F$7776t}66--//
 
 1(CCC/+"&"9	#
 #

 #
 #
 FEGMMOOEEE:!#'=$*"=GJ ?? 	# 	# 	# 	# 	# 	# 	#g||Cgw|GG # # # # # # #8))+++,4,< 
# 
# 
# 
# 
# 
# 
#. J~'<'<'>'>??E!&ME2 .u = = =     H # )::"'-x ;          #NNNNN -=,<# # # # # # # # # # # # # # # # # # # # # # # # # # #	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#sC   F6$F E>A9F F6
F	F6F	 F66
G G tool_choicetoolsr   )autononerequiredanyc                h    d |D             }|dk    rdn|} t                      j        d||d|S )Nc                 8    g | ]}t          |          d          S )functionr0   )rC   rl   s     rE   rF   z)ChatEdenAI.bind_tools.<locals>.<listcomp>  s&    VVV1$77
CVVVrG   r   r   )r   r   r   )superbind)r   r   r   r   formatted_toolsformatted_tool_choice	__class__s         rE   
bind_toolszChatEdenAI.bind_tools  s`     WVPUVVV.9U.B.B

uww| 
+9N
 
RX
 
 	
rG   )include_rawschemar   c                   |rt          d|           |                     |gd          }t          |t                    r"t	          |          rt          |gd          }n,t          |          d         d         }t          |d          }|rht          j	        t          d	          |z  d
           }t          j	        d           }|                    |gd          }	t          |          |	z  S ||z  S )NzReceived unsupported arguments r   r   T)r   first_tool_onlyr   r<   )key_namer   rawc                     d S rh   r   _s    rE   ri   z3ChatEdenAI.with_structured_output.<locals>.<lambda>  s    RV rG   )parsedparsing_errorc                     d S rh   r   r   s    rE   ri   z3ChatEdenAI.with_structured_output.<locals>.<lambda>  s    d rG   )r   r   )exception_key)r   )rY   r   rM   rR   r2   r%   r1   r$   r+   assignr   with_fallbacksr*   )
r   r   r   r   llmoutput_parserr   parser_assignparser_noneparser_with_fallbacks
             rE   with_structured_outputz!ChatEdenAI.with_structured_output  s?     	IGvGGHHHoovhJo??fd## 	(=f(E(E 	.Ah/ / /MM .f55jA&IH4!4  M  
	'/6!%((=8  M .4NNKKKK#0#?#?_ $@ $ $  3'''*>>>&&rG   c           	         | j         r9d|v rt          j        d           n  | j        |f||d|}t	          |          S | j         d}d| j         |                                 d}t          |          }| j	        | j
        | j        | j        d||}	d	 |	                                D             }	| j        | j	        | j        i|	d<   t          |          }
|
                    ||	          }|                                 |                                }|| j	                 }| j        r|                    | j                  }|r|}|                    d          dk    r8|                    di                               d          }t)          |          t+          |          \  }}t-          t/          t1          |d         pd||                    g|          S )r   r   8stream: Tool use is not yet supported in streaming mode.r   
/text/chatr   r   r   r   c                     i | ]
\  }}|||S rh   r   r   s      rE   r   z(ChatEdenAI._generate.<locals>.<dictcomp>  r   rG   Nr   r   )r   r   statusfailr   rK   generated_textrk   )rH   rN   r}   rJ   rL   
llm_output)r   warningswarnr   r   r   r   r   r{   r   r   r   r   r   r   r7   r   r   rA   r   	Exceptionr   r(   r&   r   )r   r\   r   r   r   stream_iterr   r   r   r   r   r   r   r   fallback_responseerr_msgrN   r}   s                     rE   	_generatezChatEdenAI._generate  sl    > 		9 F**N    +dl#'[ DJ  ,K888$0006t}66--//
 
 1(CCC /+"&"9	#
 #

 #
 #
 FEGMMOOEEE:!#'=$*"=GJ7+++<<Cg<66!!###}} /" 	6 $)@ A A  6$5!  **f44'++GR88<<YGGGG$$$)Q*
 *
&
& % 12B C Ir#-+=     
 
 
 	
rG   c           
        K   | j         r?d|v rt          j        d           n& | j        |f||d|}t	          |           d {V S | j         d}d| j         |                                 d}t          |          }| j	        | j
        | j        | j        d||}	d	 |	                                D             }	| j        | j	        | j        i|	d
<   t                      4 d {V }
|
                    ||	|          4 d {V }|                                 |                                 d {V }|| j	                 }| j        r|                    | j                  }|r|}|                    d          dk    r8|                    di                               d          }t)          |          t+          t-          t/          |d                             g|          cd d d           d {V  cd d d           d {V  S # 1 d {V swxY w Y   	 d d d           d {V  d S # 1 d {V swxY w Y   d S )Nr   r  r   r	  r   r   r   r   c                     i | ]
\  }}|||S rh   r   r   s      rE   r   z)ChatEdenAI._agenerate.<locals>.<dictcomp>>  r   rG   r   r   r  r  r   rK   r  r   rJ   r  )r   r  r  r   r   r   r   r   r{   r   r   r   r   r   r   r   r   r   rA   r   r  r(   r&   r   )r   r\   r   r   r   r  r   r   r   r   r   r   r   r   r  r  s                   rE   
_ageneratezChatEdenAI._agenerate  s      > 		@ F**N    ,dm#'[ DJ  3;?????????$0006t}66--//
 
 1(CCC/+"&"9	#
 #

 #
 #
 FEGMMOOEEE:!#'=$*"=GJ ?? 	 	 	 	 	 	 	g||Cgw|GG       8))+++%]]__,,,,,,$($7!* >(,1H(I(I%( >,=)$((22f<</33GR@@DDYOOG#G,,,!&$-(9:J(K% % %  !  $	 	 	            	 	 	 	 	 	 	 	 	 	 	 	 	 	              	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s7   +H9
C%H/H9
H	H9!H	"H99
IIc                 j    t          j        d            | j        |f||d|}t          |          S Nr  r   )r  r  r  rQ   r   r\   r   r   r   r^   s         rE   r   z)ChatEdenAI._stream_with_tools_as_generate]  sD     	PQQQWtWWPVWW)&111rG   c                 z   K   t          j        d            | j        |f||d| d {V }t          |          S r  )r  r  r  rQ   r  s         rE   r   z+ChatEdenAI._astream_with_tools_as_agenerateh  st       	PQQQ&t
[
 
<B
 
 
 
 
 
 
 
 *&111rG   )NN):__name__
__module____qualname____doc__r   r   __annotations__r   r   r   intr   floatr   boolr   r   r5   r   r6   r4   model_configr/   r   r   staticmethodr   propertyr   r   r	   r   r   r   r   r'   r   r   r   r   r   r   r   r3   r   r,   dictr
   r)   r   r   r  r(   r  r  r   r   __classcell__)r   s   @rE   r   r      s        : :x Hc7E8C=
 JA#$K%$$$QIt((,,,,S5NC555*/%BT*U*U*UNHY'UUU:  L $ 4    X *C * * * \*
 3    X #    X %):>	+ +{#+ tCy!+ 67	+
 + 
%	&+ + + +` %)?C	-# -#{#-# tCy!-# ;<	-#
 -# 
*	+-# -# -# -#j 
 
 
d38nd9oxQRS
 $W%FGMN
	
 
 
$k1	2
 
 
 
 
 
& "	' ' 'dDO+,' 	'
 ' 
$eD)O&<<	=' ' ' 'F %):>	G
 G
{#G
 tCy!G
 67	G

 G
 
G
 G
 G
 G
X %)?C	> >{#> tCy!> ;<	>
 > 
> > > >@	2{#	2 tCy!	2 67		2
 	2 
	2 	2 	2 	22{#2 tCy!2 ;<	2
 2 
2 2 2 2 2 2 2 2rG   r   )SrA   r  operatorr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   aiohttpr   langchain_core.callbacksr   r   langchain_core.language_modelsr   *langchain_core.language_models.chat_modelsr   r   r   langchain_core.messagesr   r   r   r   r   r   r   r   langchain_core.messages.toolr    r   r!   r   r"   r@   "langchain_core.output_parsers.baser#   *langchain_core.output_parsers.openai_toolsr$   r%   langchain_core.outputsr&   r'   r(   langchain_core.runnablesr)   r*   r+   langchain_core.toolsr,   langchain_core.utilsr-   r.   r/   %langchain_core.utils.function_callingr1   langchain_core.utils.pydanticr2   pydanticr3   r4   r5   r6   &langchain_community.utilities.requestsr7   rQ   r   r[   re   r{   rt   r   r   r   rG   rE   <module>r=     sZ                                         " ! ! ! ! !        > = = = = =         
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 W V V V V V F F F F F F R R R R R R ? ? ? ? ? ?        S R R R R R R R R R O O O O O O O O O O ) ) ) ) ) ) V V V V V V V V V V H H H H H H ? ? ? ? ? ?            < ; ; ; ; ;J J@S J J J J*2 2 2 2 2 2(;(
4S#Xk!223( ( ( (*d;&7 DcN    @[ T    <*CH~*
4>4001* * * *>]2 ]2 ]2 ]2 ]2 ]2 ]2 ]2 ]2 ]2rG   