o
    5ti                     @   sz   d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ eeZdd Ze	d	G d
d deZdS )ai  TextSynth API
Implementation provided by Fabrice Bellard:
    https://github.com/EleutherAI/lm-evaluation-harness/issues/295

In order to use the API, you must have a valid TextSynth account and
enough credits.

Example usage:

    python main.py --model textsynth --model_args engine=gptj_6B --no_cache --tasks piqa

Homepage: https://textsynth.com/index.html
    N)tqdm)LM)register_model)retry_on_specific_exceptionsc                     s<   dt dtddfdd}ttjjgd|d fdd	}| S )
zTQuery TextSynth API for completion.
    Retry with back-off until they respond.
    e
sleep_timereturnNc                 S   s   dd l }|  d S )Nr   )	traceback	print_exc)r   r   r	    r   L/home/ubuntu/.local/lib/python3.10/site-packages/lm_eval/models/textsynth.py_exception_callback"   s   z1textsynth_completion.<locals>._exception_callback)on_exceptionsmax_retrieson_exception_callbackc                      s   t jdi  S )Nr   )	_requestspostr   kwargsr   r   
completion'   s   z(textsynth_completion.<locals>.completion)	Exceptionfloatr   r   
exceptionsRequestException)r   r   r   r   r   r   textsynth_completion   s   r   	textsynthc                       s   e Zd Zd!deddf fddZedd Zedefd	d
ZedefddZ	edd Z
edd ZdefddZdd Zd!defddZd!defddZd!defddZdd Zdd  Z  ZS )"TextSynthLMFtruncater   Nc                    s,   t    || _|| _d| _tjd | _dS )z
        :param engine: str
            TextSynth API engine (e.g. `gptj_6B`)
        :param truncate: bool
            Truncate input if too long (if False and input is too long, throw error)
        zhttps://api.textsynth.comTEXTSYNTH_API_SECRET_KEYN)super__init__enginer   api_urlosenvironapi_key)selfr!   r   r   	__class__r   r   r    4   s
   
zTextSynthLM.__init__c                 C      t  NNotImplementedErrorr&   r   r   r   eot_token_idC      zTextSynthLM.eot_token_idc                 C      dS )Ni   r   r-   r   r   r   
max_lengthH   s   zTextSynthLM.max_lengthc                 C   r0   )N   r   r-   r   r   r   max_gen_toksM   s   zTextSynthLM.max_gen_toksc                 C   r)   r*   r+   r-   r   r   r   
batch_sizeQ   r/   zTextSynthLM.batch_sizec                 C   r)   r*   r+   r-   r   r   r   deviceV   r/   zTextSynthLM.devicestringc                 C   r)   r*   r+   )r&   r6   r   r   r   
tok_encode[      zTextSynthLM.tok_encodec                 C   r)   r*   r+   )r&   tokensr   r   r   
tok_decode_   r8   zTextSynthLM.tok_decodedisable_tqdmc           
      C   s   g }t ||dD ]H\}}t| jd | j d dd| j i||dd}| }d|v rG|d }|d	 }	|||	f | jd
||f||	f qt	
d|  J |S )Ndisable/v1/engines/z/logprobAuthorizationBearer )contextcontinuationurlheadersjsonlogprob	is_greedyloglikelihoodz9The following response does not contain `logprobs`. Got:
)r   r   r"   r!   r%   rF   append
cache_hookadd_partialloggererror)
r&   requestsr;   resrA   rB   responseresprG   rH   r   r   r   rI   c   s(   zTextSynthLM.loglikelihoodc                 C   s   t d)Nzl`loglikelihood_rolling` is currently not supported due to lack of input tokenization support from TextSynth.r+   )r&   rO   r;   r   r   r   loglikelihood_rolling{   s   z!TextSynthLM.loglikelihood_rollingc              	   C   s   |sg S g }t ||dD ]J}|d }|d }|d }t| jd | j d dd| j i|| jd|d	d
}| }	d|	v rP|	d }
||
 | j	d||f|
 qt
d J |S )Nr<   r      untilr>   z/completionsr?   r@   )prompt
max_tokenstop_kstoprC   textgenerate_untilzEThe following response does not contain generated `text`. Got:
{resp})r   r   r"   r!   r%   r3   rF   rJ   rK   rL   rM   rN   )r&   rO   r;   rP   requestinprequest_argsrU   rQ   rR   sr   r   r   r[      s4   

zTextSynthLM.generate_untilc                 C   r)   r*   r+   )r&   inpsr   r   r   _model_call   r8   zTextSynthLM._model_callc                 C   r)   r*   r+   )r&   rA   r1   eos_token_idr   r   r   _model_generate   r8   zTextSynthLM._model_generate)F)__name__
__module____qualname__boolr    propertyr.   intr1   r3   r4   r5   strr7   r:   rI   rS   r[   ra   rc   __classcell__r   r   r'   r   r   2   s&    



!r   )__doc__loggingr#   rO   r   r   lm_eval.api.modelr   lm_eval.api.registryr   lm_eval.models.utilsr   	getLoggerrd   rM   r   r   r   r   r   r   <module>   s    
