U
    h$                     @   s   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mZ dd	lmZ dd
lmZ ddlmZ eeZG dd deZdS )z'Wrapper around EdenAI's Generation API.    N)AnyDictListLiteralOptional)ClientSession)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)LLM)Fieldroot_validator)get_from_dict_or_envpre_init)
get_fields)enforce_stop_tokens)Requestsc                   @   s  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dZee ed< edddZee ed< dZee
d  ed< eedZeeef ed< eedZeeef ed< dZeee  ed< G dd dZeeedddZeddeeef eeef dd d!Zeed"d#d$Z eed%d&d'Z!e"ed"d(d)Z#d/eeee  ee$ eed*d+d,Z%d0eeee  ee& eed*d-d.Z'dS )1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featureZ
generation
subfeatureprovidermodelr      )defaultgeletemperature)r   r   
max_tokens)Z256x256Z512x512Z	1024x1024
resolution)default_factoryparamsmodel_kwargsstop_sequencesc                   @   s   e Zd ZdZdS )zEdenAI.ConfigZforbidN)__name__
__module____qualname__extra r*   r*   C/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/llms/edenai.pyConfigH   s   r,   )valuesreturnc                 C   s   t |dd|d< |S )z,Validate that api key exists in environment.r   ZEDENAI_API_KEY)r   )clsr-   r*   r*   r+   validate_environmentK   s      zEdenAI.validate_environmentT)prec                 C   s   dd t |  D }|di }t|D ]H}||kr*||krNtd| dt| d| d ||||< q*||d< |S )z>Build extra kwargs from additional params that were passed in.c                 S   s   h | ]
}|j qS r*   )alias).0fieldr*   r*   r+   	<setcomp>V   s     z%EdenAI.build_extra.<locals>.<setcomp>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)r/   r-   Zall_required_field_namesr)   
field_namer*   r*   r+   build_extraS   s    zEdenAI.build_extra)r.   c                 C   s   dS )zReturn type of model.Zedenair*   )selfr*   r*   r+   	_llm_typee   s    zEdenAI._llm_type)outputr.   c                 C   s2   | j dkr|| j d S || j d d d S d S )Nr   Zgenerated_textitemsr   r   )r   r   )r>   r@   r*   r*   r+   _format_outputj   s    
zEdenAI._format_outputc                  C   s   ddl m}  d|  S )Nr   __version__z
langchain/)Zlangchain_communityrD   rC   r*   r*   r+   get_user_agentp   s    zEdenAI.get_user_agent)promptstoprun_managerkwargsr.   c                 K   s  d}| j dk	r |dk	r tdn| j dk	r2| j }n|}| j d| j d| j }d| j |  d}| j|| j| j	| j
d| j|ddi}d	d
 | D }| jdk	r| j| ji|d< t|d}	|	j||d}
|
jdkrtd|
j nB|
jdkr
td|
j n$|
jdkr.td|
j d|
j |
 }|| j }|ddkrj|di d}t|| |}|dk	rt||}|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Z	providersr   r    r   r!   
num_imagesr   c                 S   s   i | ]\}}|d k	r||qS Nr*   r3   kvr*   r*   r+   
<dictcomp>   s       z EdenAI._call.<locals>.<dictcomp>settings)headers)urldata  EdenAI Server: Error   $EdenAI received an invalid payload:    3EdenAI returned an unexpected response with status : statusfailerrormessage)r%   r8   r   r   r   r   rE   r   r    r   r!   r#   rA   r   r   poststatus_code	Exceptionr   jsonr6   rB   r   )r>   rF   rG   rH   rI   stopsrX   rW   payloadrequestresponserY   provider_responseerr_msgr@   r*   r*   r+   _callv   sZ    

 






zEdenAI._callc                    s  d}| j dk	r |dk	r tdn| j dk	r2| j }n|}| j d| j d| j }d| j |  d}| j|| j| j	| j
d| j|ddi}d	d
 | D }| jdk	r| j| ji|d< t 4 I dH }	|	j|||d4 I dH }
|
jdkrtd|
j nB|
jdkr td|
j n$|
jdkrDtd|
j d|
j |
 I dH }|| j }|ddkr|di d}t|| |}|dk	rt||}|W  5 Q I dH R  W  5 Q I dH R  S Q I dH R X W 5 Q I dH R X 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.
        NrJ   rK   rL   rM   rO   rP   r   c                 S   s   i | ]\}}|d k	r||qS rQ   r*   rR   r*   r*   r+   rU      s       z!EdenAI._acall.<locals>.<dictcomp>rV   )rh   rW   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   )r%   r8   r   r   r   r   rE   r   r    r   r!   r#   rA   r   r   re   ra   rg   r   rh   r6   rB   r   )r>   rF   rG   rH   rI   ri   rX   rW   rj   sessionrl   Zresponse_jsonrm   rn   r@   r*   r*   r+   _acall   s^    

 





zEdenAI._acall)NN)NN)(r&   r'   r(   __doc__r   str__annotations__r   r   r   r   r   r   r   r   floatr    intr!   dictr#   r   r   r$   r%   r   r,   r   r0   r   r=   propertyr?   rB   staticmethodrE   r	   ro   r   rq   r*   r*   r*   r+   r      sR   
"  
L  
r   )rr   loggingtypingr   r   r   r   r   Zaiohttpr   Zlangchain_core.callbacksr   r	   Z#langchain_core.language_models.llmsr
   Zlangchain_core.pydantic_v1r   r   Zlangchain_core.utilsr   r   Zlangchain_core.utils.pydanticr   Zlangchain_community.llms.utilsr   Z&langchain_community.utilities.requestsr   	getLoggerr&   r9   r   r*   r*   r*   r+   <module>   s   
