o
    Zh                     @   sv   d dl Z d dlZd dlmZmZmZmZmZ d dl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 )    N)AnyDictIteratorListOptional)CallbackManagerForLLMRun)LLM)GenerationChunkc                       sJ  e Zd ZU dZeed< eed< dZeed< dZeed< dZe	ed	< d
Z
eed< deddf fddZedefddZedeeef fddZedeeef fddZdedeeef dejfddZdejdefddZ		d$dedeee  dee dedee f
d d!Z		d$dedeee  dee dedef
d"d#Z  ZS )%CloudflareWorkersAIa  Cloudflare Workers AI service.

    To use, you must provide an API token and
    account ID to access Cloudflare Workers AI, and
    pass it as a named parameter to the constructor.

    Example:
        .. code-block:: python

            from langchain_community.llms.cloudflare_workersai import CloudflareWorkersAI

            my_account_id = "my_account_id"
            my_api_token = "my_secret_api_token"
            llm_model =  "@cf/meta/llama-2-7b-chat-int8"

            cf_ai = CloudflareWorkersAI(
                account_id=my_account_id,
                api_token=my_api_token,
                model=llm_model
            )
    
account_id	api_tokenz@cf/meta/llama-2-7b-chat-int8modelz-https://api.cloudflare.com/client/v4/accountsbase_urlF	streaming endpoint_urlkwargsreturnNc                    s2   t  jdi | | j d| j d| j | _dS )z+Initialize the Cloudflare Workers AI class./z/ai/run/N )super__init__r   r   r   r   )selfr   	__class__r   d/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/llms/cloudflare_workersai.pyr   +   s    zCloudflareWorkersAI.__init__c                 C   s   dS )zReturn type of LLM.Z
cloudflarer   r   r   r   r   	_llm_type1      zCloudflareWorkersAI._llm_typec                 C   s   i S )zDefault parametersr   r   r   r   r   _default_params6   r   z#CloudflareWorkersAI._default_paramsc                 C   s   | j | j| j| jdS )zIdentifying parametersr   r   r   r   r    r   r   r   r   _identifying_params;   s
   z'CloudflareWorkersAI._identifying_paramspromptparamsc                 C   s:   dd| j  i}|| jd|}tj| j||| jd}|S )zCall Cloudflare Workers APIAuthorizationzBearer )r"   stream)headersjsonr%   )r   r   requestspostr   )r   r"   r#   r&   dataresponser   r   r   	_call_apiE   s   zCloudflareWorkersAI._call_apir+   c                 C   s*   |j r| }|d d S td|j )zProcess API responseresultr+   zRequest failed with status )okr'   
ValueErrorstatus_code)r   r+   r*   r   r   r   _process_responseN   s   z%CloudflareWorkersAI._process_responsestoprun_managerc                 k   s    | j }d| _ td}d}| || D ]F}||kr n?t||kr[zt||d }	W n tyA }
 zt| |
d}
~
ww |	dur[d|	v r[|rS|	|	d  t
|	d dV  qtd || _ dS )zStreaming predictionTzdata: s   data: [DONE]Nr+   textz
stream end)r   lenr,   
iter_linesr'   loads	ExceptionloggerdebugZon_llm_new_tokenr	   )r   r"   r2   r3   r   Zoriginal_steamingZ_response_prefix_countZ_response_stream_endchunkr*   er   r   r   _streamV   s.   


zCloudflareWorkersAI._streamc                 K   sB   | j rddd | j|||fi |D S | ||}| |S )zRegular predictionr   c                 S   s   g | ]}|j qS r   r4   ).0cr   r   r   
<listcomp>|   s    z-CloudflareWorkersAI._call.<locals>.<listcomp>)r   joinr>   r,   r1   )r   r"   r2   r3   r   r+   r   r   r   _callr   s   
zCloudflareWorkersAI._call)NN)__name__
__module____qualname____doc__str__annotations__r   r   r   boolr   r   r   propertyr   r   r   r!   r(   Responser,   r1   r   r   r   r   r	   r>   rC   __classcell__r   r   r   r   r
      sV   
  		


r
   )r'   loggingtypingr   r   r   r   r   r(   Zlangchain_core.callbacksr   Z#langchain_core.language_models.llmsr   Zlangchain_core.outputsr	   	getLoggerrD   r:   r
   r   r   r   r   <module>   s    
