o
    ưi@                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZmZmZ d dl	Z	d dl
Z
d dlZ
d dl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mZmZmZ d	d
lmZ dedede dedede!deee"e	j#f  fddZ$G dd dZ%dS )    N)partial)CallableOptionalUnion)map_finish_reason)custom_promptprompt_factory)AsyncHTTPHandlerget_async_httpx_client)LiteLLMLoggingBaseClass)ChoicesCustomStreamWrapperMessageModelResponseUsage   )PredibaseErrorclientapi_baseheadersdatamodelmessagestimeoutc           
         sX   | j |||d|dI d H }|jdkrt|j|jd| }	|j|d|	d|id |	S )NTr   r   streamr      status_codemessage 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   responsecompletion_stream r-   Z/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/predibase/chat/handler.py	make_call   s   


r/   c                       sF  e Zd Zd" 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i fdede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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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 )#PredibaseChatCompletionreturnNc                    s   t    d S N)super__init__)self	__class__r-   r.   r4   <   s   z PredibaseChatCompletion.__init__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>r       N)strip
startswithreplaceendswith)r5   r8   Zchat_template_tokenstokenr-   r-   r.   output_parser?   s   
,z%PredibaseChatCompletion.output_parserr   r+   model_responser   r*   optional_paramsr$   r   r   c                 C   s*  |j |	||jd|id |
d|j  z| }W n ty(   t|jddw d|v r8tt|d |jdt|tsFtdd| dd	|vrStdd
| dt	|d	 dkrg| 
|d	 |jd j_d|v rd|d v rt|d d |jd _d}|d d D ]}|d d ur||d 7 }qt|jd jd| d|v r|d dkrd|v rd|d v rg }t|d d D ]D\}}d}|d D ]}|d d ur||d 7 }qt	|d	 dkrt| 
|d	 |d}ntd d}tt|d |d |d}|| q|j| d}ztj|	d}W n
 ty   Y nw |d d d dd}|d urXt	|dkrXd}zt	||d d d dd}W n tyW   Y nw d}|| }tt |_||_t|||d}||_|j }i }|! D ]\}}|"dr||d#|< q{||j$d< |S ) Nr!   r"   zraw model_response: i  )r   r   errorz,'completion_response' is not a dictionary - r   r8   z4'generated_text' is not a key response dictionary - r   detailstokensfinish_reasonZlogprobZ_logprobZbest_ofr9   Zbest_of_sequences)contentZlogprobs)rG   )rF   indexr   )r   choicesr   rG   r    )prompt_tokenscompletion_tokenstotal_tokenszx-zllm_provider-{}Zadditional_headers)%r)   r(   json	Exceptionr   strr   
isinstancedictlenr@   rI   r   rG   r   rF   setattr	enumerater   r   appendextendlitellmZtoken_countergetencodeinttimecreatedr   r   usager   itemsr<   formatZ_hidden_params)r5   r   r+   rA   r   r*   rB   r$   r   r   print_verboseencodingZcompletion_responseZsum_logprobr?   Zchoices_listidxitemZmessage_objZ
choice_objrJ   Zoutput_textrK   rL   r]   Zpredibase_headersresponse_headerskvr-   r-   r.   process_responseS   s   








z(PredibaseChatCompletion.process_responser   custom_prompt_dictr`   litellm_params	tenant_idr   r   c                 C   s   t  j||||
||d}d}d}d}d|v r|}n|r|}ndtjv r*tdd}| d| d| }|
dd	d
u rA|d7 }n|d7 }||v r\|| }t|d |d |d |d}nt||d}t j	 }|
 D ]\}}||
vrw||
|< qk|
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 )N)r$   r   r   rB   r   ri   r    z!https://serving.app.predibase.comhttpsZPREDIBASE_API_BASE/z/deployments/v2/llms/r   FTz/generate_streamz	/generateZrolesinitial_prompt_valuefinal_prompt_value)Z	role_dictrm   rn   r   )r   r   )Zinputs
parameters)r!   r   r   acompletion)r#   r$   r&   )r   r   r   r   rA   r`   ra   r$   r*   rB   ri   	logger_fnr   r   )r   r   r   r   rA   r`   ra   r$   r*   rB   r   ri   rq   r   r   r   	predibase)custom_llm_providerr*   )urlr   r   r   )r   r+   rA   r   r*   rB   r$   r   r   r`   ra   )rW   ZPredibaseConfigZvalidate_environmentosenvirongetenvrX   r   r   Z
get_configr^   popZpre_callasync_streamingasync_completionZmodule_level_clientr'   rM   dumpsr   
iter_linesrg   )r5   r   r   r   rh   rA   r`   ra   r$   r*   rB   ri   rj   r   rp   rq   r   Zcompletion_urlZ
input_textbase_urlZmodel_prompt_detailspromptconfigre   rf   r   r   r+   	_responser-   r-   r.   
completion   s   



z"PredibaseChatCompletion.completionc                    s   t tjjd|id}z|j||t|
dI d H }W n@ tjy8 } zt	|j
jd|j
j|j
jdd }~w ty[ } ztjD ]	}t||rK|qBt	ddt|dd }~ww | j||||	|||
||||dS )	Nr   )Zllm_providerparams)r   r   z;HTTPStatusError - received status_code={}, error_message={}r   i  z{})r   r+   rA   r   r*   r$   r   r   r`   rB   ra   )r
   rW   ZLlmProvidersZ	PREDIBASEr'   rM   r{   httpxZHTTPStatusErrorr   r+   r   r_   r(   rN   ZLITELLM_EXCEPTION_TYPESrP   rO   rg   )r5   r   r   r   rA   r`   ra   r$   r*   r   r   rB   r   ri   rq   r   Zasync_handlerr+   e	exceptionr-   r-   r.   rz   |  sP   

z(PredibaseChatCompletion.async_completionc                    s:   d|	d< t d tt||t|	||||
d|d|d}|S )NTr   )r   r   r   r   r   r*   r   rr   )r,   r/   r   rs   r*   )r   r   r/   rM   r{   )r5   r   r   r   rA   r`   ra   r$   r*   r   r   rB   ri   rq   r   Zstreamwrapperr-   r-   r.   ry     s&   
z'PredibaseChatCompletion.async_streamingc                 O   s   d S r2   r-   )r5   argskwargsr-   r-   r.   	embedding  s   z!PredibaseChatCompletion.embedding)r1   N)__name__
__module____qualname__r4   rO   r@   r   Responser   boolr   rQ   r   listrg   r   floatTimeoutr   r   rz   ry   r   __classcell__r-   r-   r6   r.   r0   ;   s    
	

 	

 0
B

%r0   )&rM   ru   r[   	functoolsr   typingr   r   r   r   rW   Zlitellm.litellm_core_utilsZ*litellm.litellm_core_utils.litellm_loggingZ'litellm.litellm_core_utils.core_helpersr   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   Zcommon_utilsr   rO   rQ   r   r   r   r/   r0   r-   r-   r-   r.   <module>   s>   
