o
    5ti4                     @   s   d dl Z d dlZd dlmZ d dlmZ d dlmZmZm	Z	m
Z
mZmZ d dlmZ d dlmZ d dlmZ e eZedG d	d
 d
eZedG dd deZedG dd deZedG dd deZedG dd deZdS )    N)cached_property)
itemgetter)AnyDictListOptionalTupleUnion)register_model)TemplateAPI)handle_stop_sequenceszlocal-completionsc                       s   e Zd Z					d fdd	Z				ddeeee  ee ee ef d	e	e d
edefddZ
e		ddeeee f deee  dee deeeef  fddZedeeee f dee fddZedd Z  ZS )LocalCompletionsAPINautoTc                    sx   |dkr+|r$ddl m} |||||drtd d}ntd d}ntd	 d}t jd|||||d
| d S )Nr   r   )check_remote_tokenizer_support)verify_certificateca_cert_path
auth_tokenzGAuto-detected remote tokenizer support. Using remote tokenizer backend.remotezDRemote tokenizer not supported. Using huggingface tokenizer backend.huggingfacez:No base_url provided. Using huggingface tokenizer backend.)base_urltokenizer_backendr   r   r    )lm_eval.utilsr   eval_loggerinfowarningsuper__init__)selfr   r   r   r   r   kwargsr   	__class__r   U/home/ubuntu/.local/lib/python3.10/site-packages/lm_eval/models/openai_completions.pyr      s<   

zLocalCompletionsAPI.__init__F  messages
gen_kwargsseedreturnc           
      K   s~   |r4| dd d|v r| d}n| d| j}| dd}t| dd |}	|| j|||	|d|S | j|dd	d	|d
dS )N	do_sampleF
max_tokensmax_gen_tokstemperaturer   until)promptmodelr)   r+   stopr&      T)r.   r-   r+   r)   logprobsr&   echo)pop_max_gen_toksr   r.   
r   r$   generater%   r&   eosr   r)   r+   r/   r   r   r"   _create_payload=   s0   	z#LocalCompletionsAPI._create_payloadoutputstokensctxlensc                 K   s   g }t | ts
| g} | D ][}tt|d tdd|D ]K\}}|dks'J dt|d d |d }|d d |d }	|d d	 |d }
d
}t|	|
D ]\}}|t| kr^d} nqN|||f qq|S )Nchoicesindex)keyr   z%Context length must be greater than 0r1   token_logprobstop_logprobsTF)	
isinstancelistzipsortedr   summaxvaluesappend)r9   r:   r;   r   resoutchoicectxlenr1   tokens_logprobsrA   	is_greedytoktopr   r   r"   parse_logprobsb   s(   
z"LocalCompletionsAPI.parse_logprobsc                 K   sZ   g }t | ts
| g} | D ]}d gt|d  }|d D ]
}|d ||d < q|| }q|S )Nr<   textr=   )rB   rC   len)r9   r   rJ   rK   tmpr<   r   r   r"   parse_generations|   s   

z%LocalCompletionsAPI.parse_generationsc                 C   s   t jddS )NOPENAI_API_KEY )osenvironget)r   r   r   r"   api_key   s   zLocalCompletionsAPI.api_key)Nr   TNNFNr#   NNN)__name__
__module____qualname__r   r	   r   intdictstrr   r8   staticmethodr   r   floatboolrR   rV   propertyr\   __classcell__r   r   r    r"   r      sH    /
%
$r   zlocal-chat-completionsc                       s   e Zd ZdZ						d fdd	Z				ddee d	ed
efddZe	de
eee f d
ee fddZ		dde
eef d
e
ee ee ef fddZdd Z  ZS )LocalChatCompletionz
    Minimal chat-completions wrapper.
    - Only accepts messages as list[dict].
    - No tokenization or template logic.
    - Use with --apply_chat_template or ensure upstream formats messages correctly.
    NTc              	      sB   t  jd||||||d| | jdkrtd d| _d S d S )N)r   r   tokenized_requestsr   r   r   r0   zGChat completions does not support batching. Defaulting to batch size 1.r   )r   r   _batch_sizer   r   )r   r   r   rk   r   r   r   r   r    r   r"   r      s    

	
zLocalChatCompletion.__init__Fr#   r$   r%   r'   c           
      K   s   t |trtdd |D sJ d|pi }|dd d|v r&|d}n|d| j}|dd	}t|d
d |}	t |	ttfsF|	g}	|| j|||	d d |d|S )Nc                 s   s    | ]}t |tV  qd S N)rB   rc   ).0mr   r   r"   	<genexpr>   s    

z6LocalChatCompletion._create_payload.<locals>.<genexpr>zLocalChatCompletion expects messages as list[dict]. If you see this error, ensure --apply_chat_template is set or upstream code formats messages correctly.r(   Fr)   r*   r+   r   r,      )r$   r.   r)   r+   r/   r&   )rB   rC   allr3   r4   r   tupler.   r5   r   r   r"   r8      s.   	

z#LocalChatCompletion._create_payloadr9   c                 K   s   g }t | ts
| g} | D ]@}zd gt|d  }|d D ]}|d d ||d < qW n tyG } ztd|  dg}W Y d }~nd }~ww || }q|S )Nr<   messagecontentr=   zCould not parse generations: rX   )rB   rC   rT   	Exceptionr   r   )r9   r   rJ   rK   rU   r<   er   r   r"   rV      s    

z%LocalChatCompletion.parse_generationsstringc                 K   s   |S rm   r   )r   rx   left_truncate_lenadd_special_tokensr   r   r   r"   
tok_encode   s   zLocalChatCompletion.tok_encodec                 K      t d)Nz`Loglikelihood is not supported for chat completions. Consider using the completions API instead.NotImplementedErrorr   requestsr   r   r   r"   loglikelihood      z!LocalChatCompletion.loglikelihood)NNNTNNr]   r^   )r_   r`   ra   __doc__r   r   r   rc   r8   re   r	   rd   rV   r   rb   r{   r   ri   r   r   r    r"   rj      s<    	
#$

	rj   zopenai-completionsc                       sZ   e Zd Z		d fdd	Zedd Z fddZdd
eee	f de
e	 fddZ  ZS )OpenAICompletionsAPI%https://api.openai.com/v1/completionstiktokenc                    s   t  jd||d| d S )N)r   r   r   )r   r   )r   r   r   r   r    r   r"   r      s
   
zOpenAICompletionsAPI.__init__c                 C   "   t jdd}|du rtd|S zAOverride this property to return the API key for the API request.rW   NzHAPI key not found. Please set the `OPENAI_API_KEY` environment variable.rY   rZ   r[   
ValueErrorr   r>   r   r   r"   r\        zOpenAICompletionsAPI.api_keyc                    s2   | j dv sJ dddg dt j|fi |S )N)babbage-002davinci-002z=Prompt loglikelihoods are only supported by OpenAI's API for r   r   .)r.   r   r   r   r    r   r"   r     s   z"OpenAICompletionsAPI.loglikelihoodFchat_templater'   c                 C   s   dS )NrX   r   )r   r   r   r   r"   r     s   z"OpenAICompletionsAPI.chat_template)r   r   )F)r_   r`   ra   r   r   r\   r   r	   rg   rd   r   r   ri   r   r   r    r"   r      s    

	(	r   zopenai-chat-completionsc                       s\   e Zd Z			d fdd	Zedd Zdd	 Z			
	ddee de	de	fddZ
  ZS )OpenAIChatCompletion*https://api.openai.com/v1/chat/completionsNFc                    s8   d| ddv rtd t jd|||d| d S )No1r.   rX   z>o1 models do not support `stop` and only support temperature=1)r   r   rk   r   )r[   r   r   r   r   )r   r   r   rk   r   r    r   r"   r     s   
zOpenAIChatCompletion.__init__c                 C   r   r   r   r   r   r   r"   r\   .  r   zOpenAIChatCompletion.api_keyc                 K   r|   )NaR  Loglikelihood (and therefore `multiple_choice`-type tasks) is not supported for chat completions as OpenAI does not provide prompt logprobs. See https://github.com/EleutherAI/lm-evaluation-harness/issues/942#issuecomment-1777836312 or https://github.com/EleutherAI/lm-evaluation-harness/issues/1196 for more background on this limitation.r}   r   r   r   r"   r   8  r   z"OpenAIChatCompletion.loglikelihoodr#   <|endoftext|>r$   r%   r'   c                 K   s   t |tus
J d|dd d|v r|d}n|d| j}|dd}t|dd	g|}	t|	ttfs;|	g}	|| j|||	d d
 |d|}
d| jv s_d| jv s_d| jv s_d| jv rh|
d d|
d< |
S )Nz8chat-completions require the --apply_chat_template flag.r(   Fr)   r*   r+   r   r,   r   rq   )r$   r.   max_completion_tokensr+   r/   r&   r   5o3o4r/   r0   )	typerd   r3   r4   r   rB   rC   rs   r.   )r   r$   r6   r%   r&   r7   r   r)   r+   r/   outputr   r   r"   r8   =  s6   	






z$OpenAIChatCompletion._create_payload)r   NF)FNr#   r   )r_   r`   ra   r   r   r\   r   r   r   rc   r8   ri   r   r   r    r"   r     s&    
	r   zazure-openai-chat-completionsc                       s\   e Zd Zedededddfdededed	ed
df
 fddZedd Z	  Z
S )AzureOpenaiChatCompletionsLMAZURE_OPENAI_DEPLOYMENT_NAMEAZURE_OPENAI_ENDPOINTAZURE_OPENAI_API_VERSIONz2025-03-01-previewFr.   r   api_versiontruncater'   Nc                    sh   t    zdd l}W n ty   tdw || _| d| d| | _|| _|j||| j	d| _
d S )Nr   zattempted to use 'openai' LM type, but package `openai` or `tiktoken` are not installed.     please install these via `pip install lm-eval[openai]` or `pip install -e .[openai]`z/openai/deployments/z/chat/completions?api-version=)azure_endpointr   r\   )r   r   openaiModuleNotFoundErrorrv   r.   r   r   AzureOpenAIr\   client)r   r.   r   r   r   r   r   r    r   r"   r   h  s   
z%AzureOpenaiChatCompletionsLM.__init__c                 C   s"   t jdd }|d u rtd|S )NAZURE_OPENAI_API_KEYzNAPI key not found. Please set the `AZURE_OPENAI_API_KEY` environment variable.r   r   r   r   r"   r\     s   z$AzureOpenaiChatCompletionsLM.api_key)r_   r`   ra   rY   getenvrd   rg   r   r   r\   ri   r   r   r    r"   r   f  s$    
r   )loggingrY   	functoolsr   operatorr   typingr   r   r   r   r   r	   lm_eval.api.registryr
   lm_eval.models.api_modelsr   lm_eval.models.utilsr   	getLoggerr_   r   r   rj   r   r   r   r   r   r   r"   <module>   s*     
}f"L