o
    #1 i'                  
   @   s  d dl Z d dlmZmZmZmZ d dlZd dlmZm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZmZmZ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  d dl!m"Z"m#Z#m$Z$ d dl%m&Z& edgdZ'edddgdZ(edddgdZ)e'*ddefddZ+e(,ddee ef deee
ef de-e. fddZ/e),de	e-de	e"j0d fdeee
ef d!e-e. d"e"de1fd#d$Z2e),de	e-dfdeee
ef d!e-e. defd%d&Z3e'j,d'd(d)gddee ef deee
ef defd*d+Z4dS ),    N)	AnnotatedListOptionalUnion)	APIRouterBodyDependsHTTPExceptionRedirectResponse)ValidationError)EngineBackendOpenAIChatCompletionRequestSettingsget_settings)_split_content_and_think_chunks)_decode_tool_calls_split_content_and_tool_calls)	TextChunk
ThinkChunk)AssistantMessage)ChatCompletionRequest)SpecialTokenPolicy	TokenizedTokenizerVersion)InstructTokenizerV13app)tagsz/v1/tokenize	tokenizertokenize)prefixr   z/v1/detokenizeZ
detokenize/returnc                      s   t ddS )zRedirect to the documentation.docs)urlr
    r%   r%   s/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/mistral_common/experimental/app/routers.pyredirect_to_docs   s   
r'   requestsettingsc              
      s   t | tr-z|   tjdi |  } W n ttfy, } ztdt	|dd}~ww | j
g kr8tddd|j| }t |tsIJ t||jS )z#Tokenize a chat completion request.  status_codedetailNzMessages list cannot be empty.r%   )
isinstancer   drop_extra_fieldsr   from_openai
model_dumpr   
ValueErrorr	   strmessagesr   Zencode_chat_completionr   typetokens)r(   r)   eZ	tokenizedr%   r%   r&   tokenize_request"   s   

r8   z/string)default_factory)defaultr6   special_token_policyc              
      sV   t |dkrtdddz	| jj||dW S  ty* } ztdt|dd}~ww )zDetokenize a list of tokens to a string.

    Args:
        tokens: The tokens to detokenize.
        special_token_policy: The policy to use for special tokens.

    Returns:
        The detokenized string or assistant message.
    r   r*   Tokens list cannot be empty.r+   r;   N)lenr	   r   decoder2   r3   )r)   r6   r;   r7   r%   r%   r&   detokenize_to_string7   s   r@   c           
   
      s  t |dkrtdddjjjjtjkr$t|jjjd\}}n|d}}d}jjjjtj	krHt
jjts=J jjj}jjj nd } |dur durzt|| }W n typ } ztdt|dd}~ww jjjj|r fdd	|D }t |d
krt
|d tr|d j}n|rjj|tjd}|rz
t|jjj}W n ttjfy } ztdt|dd}~ww d}|d jjjjk}	t|||	 dS )zDetokenize a list of tokens to an assistant message.

    Parse tool calls from the tokens and extract content before the first tool call.

    Args:
        tokens: The tokens to detokenize.

    Returns:
        The detokenized assistant message.
    r   r*   r<   r+   z[TOOL_CALLS]r%   Nc                    sX   g | ](\}}|gkr|st jj|tjd dntjj|tjd |d  kdqS )r=   )text)Zthinkingclosed)r   r   r?   r   IGNOREr   ).0chunkZis_thinkZ	end_thinkZeosr)   r%   r&   
<listcomp>z   s    

z3detokenize_to_assistant_message.<locals>.<listcomp>   r=   rB   )content
tool_callsr    )r>   r	   r   Zinstruct_tokenizerversionr   v1r   Zget_control_tokenZv13r.   r   ZBEGIN_THINKZ	END_THINKr   r2   r3   Zeos_idr   rA   r?   r   rD   r   jsonJSONDecodeErrorr   )
r)   r6   Zcontent_tokensZtool_calls_tokensrJ   Zbegin_thinkZcontent_or_think_tokensr7   rK   Zhas_eosr%   rG   r&   detokenize_to_assistant_messageN   sR   




rP   z/v1/chat/completionsZchatZcompletionsc              
      sL  t | tr|  }tjdi |  } ni }t| |I dH }ddh |  }||  fdd| D }|	ddrCt
dd	d
z#|jtjkr]tj|j d|dd||jd}ntd|j W n$ tjjyu   t
ddd
 tjjy } zt
dt|d
d}~ww |jdkrt
|j|jd
| }t||d I dH S )zGenerate a chat completion.

    Args:
        request: The chat completion request.
        settings: The settings for the Mistral-common API.

    Returns:
        The generated chat completion.
    Nr4   Ztoolsc                    s   i | ]\}}| vr||qS r%   r%   )rE   kvZexclude_fieldsr%   r&   
<dictcomp>   s    zgenerate.<locals>.<dictcomp>streamFr*   zStreaming is not supported.r+   z/completionsT)promptZreturn_tokens)rN   timeoutzUnsupported engine backend: i  Timeouti     r6   r%   )r.   r   r/   r   r0   r1   r8   updateitemsgetr	   Zengine_backendr   Z	llama_cpprequestspostZ
engine_urlrW   r2   
exceptionsrX   RequestExceptionr3   r,   rA   rN   rP   )r(   r)   Zextra_fieldsZ
tokens_idsZrequest_jsonresponser7   Zresponse_jsonr%   rS   r&   generate   sF   




rb   )5rN   typingr   r   r   r   r]   Zfastapir   r   r   r	   Zfastapi.responsesr   Zpydanticr   Z&mistral_common.experimental.app.modelsr   r   r   r   Z!mistral_common.experimental.thinkr   Z!mistral_common.experimental.toolsr   r   Z&mistral_common.protocol.instruct.chunkr   r   Z)mistral_common.protocol.instruct.messagesr   Z(mistral_common.protocol.instruct.requestr   Z%mistral_common.tokens.tokenizers.baser   r   r   Z)mistral_common.tokens.tokenizers.instructr   Zmain_routerZtokenize_routerZdecode_routerr\   r'   r^   listintr8   rD   r3   r@   rP   rb   r%   r%   r%   r&   <module>   sp    

H
