
    Ng$                         d Z ddlZddl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 ddlmZ dd	lmZmZmZ dd
lmZ ddlmZ  ej        e          Z G d de          ZdS )z'Wrapper around EdenAI's Generation API.    N)AnyDictListLiteralOptional)ClientSession)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)LLM)get_from_dict_or_envpre_init)
get_fields)
ConfigDictFieldmodel_validator)enforce_stop_tokens)Requestsc                      e Zd ZU dZdZeed<   dZee         ed<   dZ	e
d         ed<   	 d	Ze
d	         ed
<   	 eed<   	 dZee         ed<   	  eddd          Zee         ed<    edd          Zee         ed<   dZee
d                  ed<    ee          Zeeef         ed<   	  ee          Zeeef         ed<   	 dZeee                  ed<   	  ed          Zededefd            Z ed          edeeef         defd                         Z e!defd!            Z"d"edefd#Z#e$defd$            Z%	 	 d+d%ed&eee                  d'ee&         d(edef
d)Z'	 	 d+d%ed&eee                  d'ee(         d(edef
d*Z)dS ),EdenAIa  EdenAI models.

    To use, you should have
    the environment variable ``EDENAI_API_KEY`` set with your API token.
    You can find your token here: https://app.edenai.run/admin/account/settings

    `feature` and `subfeature` are required, but any other model parameters can also be
    passed in with the format params={model_param: value, ...}

    for api reference check edenai documentation: http://docs.edenai.co.
    zhttps://api.edenai.run/v2base_urlNedenai_api_keytext)r   imagefeature
generation
subfeatureprovidermodelr      )defaultgeletemperature)r    r!   
max_tokens)256x256512x512	1024x1024
resolution)default_factoryparamsmodel_kwargsstop_sequencesforbid)extravaluesreturnc                 .    t          |dd          |d<   |S )z,Validate that api key exists in environment.r   EDENAI_API_KEY)r   )clsr/   s     [/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/llms/edenai.pyvalidate_environmentzEdenAI.validate_environmentL   s)     $8$&6$
 $
      before)modec                 \   d t          |                                           D             }|                    di           }t          |          D ]U}||vrO||v rt	          d| d          t
                              | d| d           |                    |          ||<   V||d<   |S )z>Build extra kwargs from additional params that were passed in.c                     h | ]	}|j         
S  )alias).0fields     r4   	<setcomp>z%EdenAI.build_extra.<locals>.<setcomp>X   s    #V#V#VEEK#V#V#Vr6   r+   zFound z supplied twice.zJ was transferred to model_kwargs.
                    Please confirm that z is what you intended.)r   r/   getlist
ValueErrorloggerwarningpop)r3   r/   all_required_field_namesr.   
field_names        r4   build_extrazEdenAI.build_extraT   s     $W#VZ__=S=S=U=U#V#V#V 

>2..v,, 	; 	;J!999&&$%Jj%J%J%JKKK# N N)3N N N   %+JJz$:$:j!!&~r6   c                     dS )zReturn type of model.edenair;   )selfs    r4   	_llm_typezEdenAI._llm_typeg   s	     xr6   outputc                 |    | j         dk    r|| j                 d         S || j                 d         d         d         S )Nr   generated_textitemsr   r   )r   r   )rK   rM   s     r4   _format_outputzEdenAI._format_outputl   s>    <6!!$-()9::$-(1!4W==r6   c                      ddl m}  d|  S )Nr   __version__z
langchain/)langchain_communityrT   rS   s    r4   get_user_agentzEdenAI.get_user_agentr   s"    333333)K)))r6   promptstoprun_managerkwargsc                    d}| j         |t          d          | j         | j         }n|}| j         d| j         d| j         }d| j         |                                 d}| j        || j        | j	        | j
        d| j        |ddi}d	 |                                D             }| j        | j        | j        i|d
<   t          |          }	|	                    ||          }
|
j        dk    rt#          d|
j                   |
j        dk    rt          d|
j                   |
j        dk    rt#          d|
j         d|
j                   |
                                }|| j                 }|                    d          dk    r8|                    di                               d          }t#          |          |                     |          }|t-          ||          }|S )zCall out to EdenAI's text generation endpoint.

        Args:
            prompt: The prompt to pass into the model.

        Returns:
            json formatted str response.
        N:stop sequences found in both the input and default params./Bearer Authorizationz
User-Agent	providersr   r$   r#   r(   
num_imagesr   c                     i | ]
\  }}|||S Nr;   r=   kvs      r4   
<dictcomp>z EdenAI._call.<locals>.<dictcomp>       EEEDAqq}1a}}}r6   settings)headers)urldata  EdenAI Server: Error   $EdenAI received an invalid payload:    3EdenAI returned an unexpected response with status : statusfailerrormessage)r,   rB   r   r   r   r   rV   r   r$   r#   r(   r*   rP   r   r   poststatus_code	Exceptionr   jsonr@   rQ   r   )rK   rW   rX   rY   rZ   stopsrm   rl   payloadrequestresponsern   provider_responseerr_msgrM   s                  r4   _callzEdenAI._callx   sa    *t/?L    ,'EEEAAAAAA<t':<<--//
 

 /+/	#
 	#
 k	#
 	#
 !	#
 	#
 FEGMMOOEEE:!#'=$*"=GJ7+++<<Cg<663&&JH4HJJKKK!S((SHMSSTTT!S((;'; ;+3=; ;  
 }} /  **f44'++GR88<<YGGGG$$$$$T**(77Fr6   c                   K   d}| j         |t          d          | j         | j         }n|}| j         d| j         d| j         }d| j         |                                 d}| j        || j        | j	        | j
        d| j        |ddi}d	 |                                D             }| j        | j        | j        i|d
<   t                      4 d{V }	|	                    |||          4 d{V }
|
j        dk    rt#          d|
j                   |
j        dk    rt          d|
j                   |
j        dk    rt#          d|
j         d|
j                   |
                                 d{V }|| j                 }|                    d          dk    r8|                    di                               d          }t#          |          |                     |          }|t-          ||          }|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 )aI  Call EdenAi model to get predictions based on the prompt.

        Args:
            prompt: The prompt to pass into the model.
            stop: A list of stop words (optional).
            run_manager: A callback manager for async interaction with LLMs.

        Returns:
            The string generated by the model.
        Nr\   r]   r^   r_   ra   rc   r   c                     i | ]
\  }}|||S re   r;   rf   s      r4   ri   z!EdenAI._acall.<locals>.<dictcomp>   rj   r6   rk   )r}   rl   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   )r,   rB   r   r   r   r   rV   r   r$   r#   r(   r*   rP   r   r   rz   rv   r|   r   r}   r@   rQ   r   )rK   rW   rX   rY   rZ   r~   rm   rl   r   sessionr   response_jsonr   r   rM   s                  r4   _acallzEdenAI._acall   s'     $ *t/?L    ,'EEEAAAAAA<t':<<--//
 

 /+/	#
 	#
 k	#
 	#
 !	#
 	#
 FEGMMOOEEE:!#'=$*"=GJ ?? 	 	 	 	 	 	 	g||Cgw|GG       8?c))#$MHO$M$MNNN_++$Nx}NN   _++#>#?> >.6m> >  
 '/mmoo 5 5 5 5 5 5$1$-$@!$((22f<</33GR@@DDYOOG#G,,,,,];;$0??F/            	 	 	 	 	 	 	 	 	 	 	 	 	 	              	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s7   I8DH,I,
H6	6I9H6	:I
II)NN)*__name__
__module____qualname____doc__r   str__annotations__r   r   r   r   r   r   r   r#   floatr$   intr(   dictr*   r   r   r+   r,   r   r   model_configr   r5   r   classmethodrH   propertyrL   rQ   staticmethodrV   r
   r   r	   r   r;   r6   r4   r   r      sL        
 
 0Hc///$(NHSM((((.GW_%...>(4J%444@MMMPE8C= $)5!#B#B#BK%BBB %dq 9 9 9J999GKJ!BCDKKK"U4888FDcN888
 $)5#>#>#>L$sCx.>>>*.NHT#Y'... :  L $ 4    X _(###c3h C    [ $#" 3    X>T >c > > > > *C * * * \* %):>	G GG tCy!G 67	G
 G 
G G G GX %)?C	J JJ tCy!J ;<	J
 J 
J J J J J Jr6   r   ) r   loggingtypingr   r   r   r   r   aiohttpr   langchain_core.callbacksr	   r
   #langchain_core.language_models.llmsr   langchain_core.utilsr   r   langchain_core.utils.pydanticr   pydanticr   r   r   langchain_community.llms.utilsr   &langchain_community.utilities.requestsr   	getLoggerr   rC   r   r;   r6   r4   <module>r      sH   - -  5 5 5 5 5 5 5 5 5 5 5 5 5 5 ! ! ! ! ! !        4 3 3 3 3 3 ? ? ? ? ? ? ? ? 4 4 4 4 4 4 7 7 7 7 7 7 7 7 7 7 > > > > > > ; ; ; ; ; ;		8	$	$u u u u uS u u u u ur6   