
    7|h$                         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j8                  e      Z G d de      Zy)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)y),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/test/engine/venv/lib/python3.12/site-packages/langchain_community/llms/edenai.pyvalidate_environmentzEdenAI.validate_environmentL   s$     $8$&6$
      before)modec                 L   t        |       j                         D ch c]  }|j                   }}|j                  di       }t	        |      D ]I  }||vs||v rt        d| d      t        j                  | d| d       |j                  |      ||<   K ||d<   |S c c}w )z>Build extra kwargs from additional params that were passed in.r+   zFound z supplied twice.zJ was transferred to model_kwargs.
                    Please confirm that z is what you intended.)	r   r/   aliasgetlist
ValueErrorloggerwarningpop)r3   r/   fieldall_required_field_namesr.   
field_names         r4   build_extrazEdenAI.build_extraT   s     >H_=S=S=U#VEEKK#V #V

>2.v, 	;J!99&$vj\9I%JKK# %))34JN %+JJz$:j!	; "'~ $Ws   B!c                      y)zReturn type of model.edenai )selfs    r4   	_llm_typezEdenAI._llm_typeg   s     r6   outputc                 t    | j                   dk(  r|| j                     d   S || j                     d   d   d   S )Nr   generated_textitemsr   r   )r   r   )rH   rJ   s     r4   _format_outputzEdenAI._format_outputl   sA    <<6!$--()9::$--(1!4W==r6   c                      ddl m}  d|  S )Nr   __version__z
langchain/)langchain_communityrQ   rP   s    r4   get_user_agentzEdenAI.get_user_agentr   s    3K=))r6   promptstoprun_managerkwargsc                 j   d}| j                   |t        d      | j                   | j                   }n|}| j                   d| j                   d| j                   }d| j
                   | j                         d}| j                  || j                  | j                  | j                  d| j                  |ddi}|j                         D 	
ci c]  \  }	}
|
	|	|
 }}	}
| j                  | j                  | j                  i|d	<   t        |
      }|j                  ||      }|j                   dk\  rt#        d|j                          |j                   dk\  rt        d|j$                         |j                   dk7  r%t#        d|j                    d|j$                         |j'                         }|| j                     }|j)                  d      dk(  r,|j)                  di       j)                  d      }t#        |      | j+                  |      }|t-        ||      }|S c c}
}	w )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   settings)headers)urldata  EdenAI Server: Error   $EdenAI received an invalid payload:    3EdenAI returned an unexpected response with status : statusfailerrormessage)r,   r=   r   r   r   r   rS   r   r$   r#   r(   r*   rM   r   r   poststatus_code	Exceptionr   jsonr;   rN   r   )rH   rT   rU   rV   rW   stopsrc   rb   payloadkvrequestresponserd   provider_responseerr_msgrJ   s                    r4   _callzEdenAI._callx   sK    *t/?L    ,''EEqa/@A&t':':&;<--/

 //++//	#
 kk	#
 	#
 !	#
 %,MMOEDAqq}1a4EE::!#'==$**"=GJ7+<<Cg<63&3H4H4H3IJKK!!S(CHMM?STT!!S(E''(8==/; 
 }} /  *f4'++GR8<<YGGG$$$$T*(7F; Fs   
H/H/c                 x  K   d}| j                   |t        d      | j                   | j                   }n|}| j                   d| j                   d| j                   }d| j
                   | j                         d}| j                  || j                  | j                  | j                  d| j                  |ddi}|j                         D 	
ci c]  \  }	}
|
	|	|
 }}	}
| j                  | j                  | j                  i|d	<   t               4 d{   }|j                  |||
      4 d{   }|j                   dk\  rt#        d|j                          |j                   dk\  rt        d|j$                         |j                   dk7  r%t#        d|j                    d|j$                         |j'                          d{   }|| j                     }|j)                  d      dk(  r,|j)                  di       j)                  d      }t#        |      | j+                  |      }|t-        ||      }|cddd      d{    cddd      d{    S c c}
}	w 7 T7 :7 7 $7 # 1 d{  7  sw Y   nxY wddd      d{  7   y# 1 d{  7  sw Y   yxY ww)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.
        NrY   rZ   r[   r\   r^   r`   r   ra   )rs   rb   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   )r,   r=   r   r   r   r   rS   r   r$   r#   r(   r*   rM   r   r   rp   rl   rr   r   rs   r;   rN   r   )rH   rT   rU   rV   rW   rt   rc   rb   ru   rv   rw   sessionry   response_jsonrz   r{   rJ   s                    r4   _acallzEdenAI._acall   s    $ *t/?L    ,''EEqa/@A&t':':&;<--/

 //++//	#
 kk	#
 	#
 !	#
 %,MMOEDAqq}1a4EE::!#'==$**"=GJ ? 	 	g||Cgw|G  8??c)#&;HOO;L$MNN__+$>x}}oN  __+#M#??+2hmm_> 
 '/mmo 5$1$--$@!$((2f</33GR@DDYOG#G,,,,];$0?F/  	 	 	 F
	 !6	  	 	 	 	 	s   CJ:
I,!I,&8J:I2J:"J%;I5<J%?BI>I8A3I>	J%I:J%J:&I<'J:5J%8I>:J%<J:>J	JJ	J%J:J!J:%J7+J.,J73J:)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   classmethodrD   propertyrI   rN   staticmethodrS   r
   r|   r	   r   rG   r6   r4   r   r      sE   
 0Hc/$(NHSM((.GW_%.>(4J%4@MPE8C= $)!#BK%B %dq 9J9GKJ!BCDK"48FDcN8
 $)#>L$sCx.>*.NHT#Y'. L $ 4   (#c3h C   $" 3  >T >c > *C * * %):>	GG tCy!G 67	G
 G 
GX %)?C	JJ tCy!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   r>   r   rG   r6   r4   <module>r      sP    -  5 5 ! 4 ? 4 7 7 > ;			8	$uS ur6   