o
    5ti                     @   sx   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d	G d
d deZdS )    N)RequestException)tqdm)LM)register_modelc                    s   d}| d }| d }| d }d}|| |k r |d7 }|| |k st ||d }t|t|D ]#}|| }	| d |  t   fd	d
d}
|
|	krRd} ||fS q/||fS )NTtext_offsettokenstoken_logprobsr      top_logprobsc                    s    |  S )N )x
top_tokensr   G/home/ubuntu/.local/lib/python3.10/site-packages/lm_eval/models/gguf.py<lambda>   s    zget_result.<locals>.<lambda>)keyF)sumrangelenmaxkeys)logprobscontext_length	is_greedyoffsetsr   tokens_logprobsidxcontinuation_logprobsitoken	top_tokenr   r   r   
get_result   s&   r"   ggufggmlc                       sZ   e Zd Zd fdd	Z	dddZdd
efddZdd
efddZdd
efddZ  Z	S )GGUFLMN   c                    s4   t    || _| jsJ dd| _d| _|| _d S )Nz$must pass `base_url` to use GGUF LM!
   g        )super__init__base_urlr   temperature
max_length)selfr*   r,   kwargs	__class__r   r   r)   &   s   

zGGUFLM.__init__      c                 K   s   t |D ]X}z7|}|| j| jd}	|r ||7 }|	|ddd |d ur(||	d< tj| j d|	d}
|
  |
 W   S  t	y\ } zt
d|  t| W Y d }~qd }~ww td	| d
)N)promptr   r+   r	   T)r3   
max_tokensechostopz/v1/completions)jsonzRequestException: z%Failed to get a valid response after z	 retries.)r   r   r+   updaterequestspostr*   raise_for_statusr7   r   loggererrortimesleepRuntimeError)r-   contextcontinuationr6   retriesdelayr.   _r3   requestresponseer   r   r   gguf_completion.   s2   
zGGUFLM.gguf_completionFdisable_tqdmc                 C   s   |sg S g }t dd |D |dD ]J\}}| j||d}|rRd|v rR|d rR|d d }|d}|rLd|v rL|d rLt|t|\}	}
||	|
f qtd	 qtd
|  J |S )Nc                 S      g | ]}|j qS r   args.0reqr   r   r   
<listcomp>P       z(GGUFLM.loglikelihood.<locals>.<listcomp>disable)rA   rB   choicesr   r   r   zLInvalid logprobs data. Expected 'logprobs' to contain 'token_logprobs' list.z.Invalid response for loglikelihood. Response: )	r   rI   getr"   r   appendr<   warningr=   )r-   r9   rJ   resrA   rB   rG   choicer   logprobr   r   r   r   loglikelihoodK   s2   
zGGUFLM.loglikelihoodc                 C   s   |sg S g }t dd |D |dD ]S}|d }|d }|ddg}| j||d}|rWd	|v rW|d	 rW|d	 d }	d
|	v rI|	d
  }
||
 qtd|  |d  qtd|  |d  q|S )Nc                 S   rK   r   rL   rN   r   r   r   rQ   m   rR   z)GGUFLM.generate_until.<locals>.<listcomp>rS   r   r	   untilz</s>)rA   r6   rU   textz-Invalid response for greedy_until. Response: )r   rV   rI   striprW   r<   r=   )r-   r9   rJ   rY   rF   inprequest_argsr]   rG   rZ   generated_textr   r   r   generate_untilh   s(   zGGUFLM.generate_untilc                 C   s   t d)Nz7loglikelihood_rolling not yet supported for GGUF models)NotImplementedError)r-   r9   rJ   r   r   r   loglikelihood_rolling   s   zGGUFLM.loglikelihood_rolling)Nr&   )NNr1   r2   )F)
__name__
__module____qualname__r)   rI   boolr\   rc   re   __classcell__r   r   r/   r   r%   $   s    	
r%   )loggingr>   r9   requests.exceptionsr   r   lm_eval.api.modelr   lm_eval.api.registryr   	getLoggerrf   r<   r"   r%   r   r   r   r   <module>   s    
