o
    ưi6                     @   s   d dl Z d dlmZ d dlmZmZmZmZ 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 d dlmZmZ d dlmZ d d	lmZmZ G d
d deZdedededededefddZG dd dZ dS )    N)partial)CallableListOptionalUnion)Logging)track_llm_api_timing)custom_promptprompt_factory)AsyncHTTPHandlerget_async_httpx_client)TextChoices)CustomStreamWrapperTextCompletionResponsec                       s8   e Zd Z		ddeej deej f fddZ  ZS )TextCompletionCodestralErrorNrequestresponsec                    s`   || _ || _|d ur|| _ntjddd| _|d ur|| _n	tj|| jd| _t | j d S )NPOSTz8https://docs.codestral.com/user-guide/inference/rest_api)methodurl)status_coder   )	r   messager   httpxRequestr   Responsesuper__init__)selfr   r   r   r   	__class__ `/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/codestral/completion/handler.pyr      s    z%TextCompletionCodestralError.__init__)NN)	__name__
__module____qualname__r   r   r   r   r   __classcell__r    r    r   r!   r      s    r   clientapi_baseheadersdatamodelmessagesc           	         sV   | j |||ddI d H }|jdkrt|j|jd| }|j|d|d|id |S )NTr(   r)   stream   r   r    complete_input_dictinputapi_keyoriginal_responseadditional_args)postr   r   textZaiter_lines	post_call)	r&   r'   r(   r)   r*   r+   logging_objr   completion_streamr    r    r!   	make_call5   s   	
r<   c                       sf  e Zd Zd# fddZdee dedefddZd	efd
dZdede	j
dedededededeeef dedefddZdddi fdededededededededeee	jf dedeeef fddZe ddi fdedededededededeee	jf defddZe dddi fdededededededeee	jf defdd Zd!d" Z  ZS )$CodestralTextCompletionreturnNc                    s   t    d S N)r   r   )r   r   r    r!   r   R   s   z CodestralTextCompletion.__init__r4   user_headersc                 C   sB   |d u rt ddd|d}|d urt|tri ||}|S )NzVMissing CODESTRAL_API_Key - Please add CODESTRAL_API_Key to your environment variableszapplication/jsonz	Bearer {})zcontent-typeAuthorization)
ValueErrorformat
isinstancedict)r   r4   r@   r(   r    r    r!   _validate_environmentU   s   z-CodestralTextCompletion._validate_environmentgenerated_textc                 C   sh   g d}|D ]+}|  |r||dd}||r1|ddd |ddd ddddd }q|S )z
        Parse the output text to remove any special characters. In our current approach we just check for ChatML tokens.

        Initial issue that prompted this - https://github.com/BerriAI/litellm/issues/763
        )z<|assistant|>z
<|system|>z<|user|>z<s>z</s>r0      N)strip
startswithreplaceendswith)r   rG   Zchat_template_tokenstokenr    r    r!   output_parserf   s   
,z%CodestralTextCompletion.output_parserr*   r   model_responser-   r:   optional_paramsr)   r+   c              
   C   s  |j |	||jd|id |
d|j  |jdkr#tt|j|jdz| }W n ty7   t|jddw |dg }g }|D ]+}d }d}d }d }|d	i }tj	j
|d
|d|d|dd}|| qBtj|d||d|d|dd|dd}|S )Nr1   r2   z#codestral api: raw model_response: r.   )r   r   i  choicesr   r   finish_reasonindexcontentlogprobs)rS   rT   r8   rV   idcreatedr*   usageFobject)rW   rR   rX   r*   rY   r-   rZ   )r9   r8   r   r   strjson	Exceptiongetlitellmutilsr   appendr   )r   r*   r   rP   r-   r:   rQ   r4   r)   r+   print_verboseencodingZcompletion_responseZ_original_choicesZ_choiceschoiceZ_finish_reason_index_textZ	_logprobsZ_choice_messageZ_choice	_responser    r    r!    process_text_completion_responsez   sT   
	z8CodestralTextCompletion.process_text_completion_responser'   custom_prompt_dictrb   timeoutr(   c                 C   s  |  ||}|
dd du r|}n|pd}||v r,|| }t|d |d |d |d}nt||d}tj }| D ]\}}||
vrG||
|< q;|
d	d
}||d|
}|}|	j||||||dd |du r|du r| j	|||||||||	|
||||dS | j
|||||||||	|
d
||||dS |du rtjj||t||d}t| |d|	d}|S tjj||t|d}| j||||
d	d
|	|
|||||dS )NZcustom_endpointTz/https://codestral.mistral.ai/v1/fim/completionsZrolesinitial_prompt_valuefinal_prompt_value)Z	role_dictrk   rl   r+   )r*   r+   r-   F)r*   prompt)r1   r(   r'   acompletion)r3   r4   r6   )r*   r+   r)   r'   rP   rb   rc   r4   r:   rQ   litellm_params	logger_fnr(   rj   )r*   r+   r)   r'   rP   rb   rc   r4   r:   rQ   r-   ro   rp   r(   rj   r,   Z	codestral)custom_llm_providerr:   )r   r(   r)   )r*   r   rP   r-   r:   rQ   r4   r)   r+   rb   rc   )rF   popr	   r
   r_   ZCodestralTextCompletionConfigZ
get_configitemsZpre_callasync_streamingasync_completionZmodule_level_clientr7   r\   dumpsr   
iter_linesrh   r^   )r   r*   r+   r'   ri   rP   rb   rc   r4   r:   rQ   rj   rn   ro   rp   r(   Zcompletion_urlZmodel_prompt_detailsrm   configkvr-   r)   Z
input_textr   rg   r    r    r!   
completion   s   

z"CodestralTextCompletion.completionc                    s   t tjjd|id}z|j||t|
dI d H }W n0 tjy5 } zt	|j
jd|j
jdd }~w tyK } zt	ddt|dd }~ww | j||||	|||
||||dS )	Nrj   )Zllm_providerparams)r(   r)   zHTTPStatusError - {}r/   i  z{})r*   r   rP   r-   r:   r4   r)   r+   rb   rQ   rc   )r   r_   ZLlmProvidersZTEXT_COMPLETION_CODESTRALr7   r\   rv   r   ZHTTPStatusErrorr   r   r   rC   r8   r]   r[   rh   )r   r*   r+   r'   rP   rb   rc   r4   r:   r-   r)   rQ   rj   ro   rp   r(   Zasync_handlerr   er    r    r!   ru   Q  sD   z(CodestralTextCompletion.async_completionc                    s8   d|	d< t d tt||t|	|||d|d|d}|S )NTr-   )r'   r(   r)   r*   r+   r:   ztext-completion-codestral)r;   r<   r*   rq   r:   )r   r   r<   r\   rv   )r   r*   r+   r'   rP   rb   rc   r4   r:   r)   rj   rQ   ro   rp   r(   Zstreamwrapperr    r    r!   rt     s$   	z'CodestralTextCompletion.async_streamingc                 O   s   d S r?   r    )r   argskwargsr    r    r!   	embedding  s   z!CodestralTextCompletion.embedding)r>   N)r"   r#   r$   r   r   r[   rE   rF   rO   r   r   r   boolLiteLLMLoggingr   listrh   r   floatTimeoutr   r{   r   ru   rt   r   r%   r    r    r   r!   r=   Q   s    

	

V	

 1
$r=   )!r\   	functoolsr   typingr   r   r   r   r   r_   Z*litellm.litellm_core_utils.litellm_loggingr   r   Z(litellm.litellm_core_utils.logging_utilsr   Z3litellm.litellm_core_utils.prompt_templates.factoryr	   r
   Z&litellm.llms.custom_httpx.http_handlerr   r   Zlitellm.types.utilsr   Zlitellm.utilsr   r   r]   r   r[   rE   r   r<   r=   r    r    r    r!   <module>   s4   
