
    *`i              
          d dl Z d dl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          Z$ edddg          Z% edddg          Z&e$'                    d          de
fd            Z(e%)                    d          deez  dee ee          f         de*e+         fd            Z,e&)                    d           ee*           eej-                  fdee ee          f         de*e+         d ede.fd!            Z/e&)                    d           ee*          fdee ee          f         de*e+         defd"            Z0e$)                    d#d$d%g          deez  dee ee          f         defd&            Z1dS )'    N)	Annotated)	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/detokenize
detokenize/returnc                  &   K   t          d          S )zRedirect to the documentation.docs)urlr        {/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/mistral_common/experimental/app/routers.pyredirect_to_docsr(      s       ''''r&   requestsettingsc                   K   t          | t                    rp	 |                                  t          j        di |                                 } n7# t          t          f$ r#}t          dt          |                    d}~ww xY w| j
        g k    rt          dd          |j                            |           }t          |t                    sJ 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   encode_chat_completionr   typetokens)r)   r*   e	tokenizeds       r'   tokenize_requestr<   "   s       '677 @	@%%'''+7OO':L:L:N:NOOGG, 	@ 	@ 	@CA????	@ 24TUUUU"99'BBIi++<<T)__<<+s   7A B"B  Bz/string)default_factory)defaultr9   special_token_policyc                    K   t          |          dk    rt          dd          	 | j                            ||          S # t          $ r#}t          dt          |                    d}~ww xY 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   decoder4   r5   )r*   r9   r?   r:   s       r'   detokenize_to_stringrE   7   s       6{{a4RSSSS<!((FZ([[[ < < <CFF;;;;<s   A 
A1A,,A1c                    
K   t          |          dk    rt          dd           j        j        j        j        t
          j        k    r6t          | j        j        j                            d                    \  }}n|d}}d} j        j        j        j        t
          j	        k    rDt           j        j        t                    sJ  j        j        j        } j        j        j        
ndx}
|
	 t          ||
          }n0# t          $ r#}t          dt!          |                    d}~ww xY w j        j        j        j        |rK
 fd|D             }t          |          d	k    r(t          |d         t$                    r|d         j        }n(|r& j                            |t*          j        
          }|r]	 t/          | j        j        j                  }n># t          t0          j        f$ r#}t          dt!          |                    d}~ww xY wd}|d          j        j        j        j        k    }	t5          |||	           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,   rA   r-   z[TOOL_CALLS]r%   Nc                    g | ]\  }}|gk    |s4t          j                            |t          j                             n>t          j                            |t          j                   |d         k              S )rB   )text)thinkingclosed)r   r   rD   r   IGNOREr   ).0chunkis_think	end_thinkeosr*   s      r'   
<listcomp>z3detokenize_to_assistant_message.<locals>.<listcomp>z   s     	 	 	 $E8SE>>  	x188UgUn8oopppp%/66uSeSl6mm 9	1  
 ">>r&      rB   rI   )content
tool_callsr   )rC   r   r   instruct_tokenizerversionr   v1r   get_special_tokenv13r0   r   BEGIN_THINK	END_THINKr   r4   r5   eos_idr   rH   rD   r   rL   r   jsonJSONDecodeErrorr   )r*   r9   content_tokenstool_calls_tokensrT   begin_thinkcontent_or_think_tokensr:   rU   has_eosrP   rQ   s   `         @@r'   detokenize_to_assistant_messagere   N   s      6{{a4RSSSS,6>AQATTT,IH&9CUUVdee-
 -
))) -3B)9=G,6>BRBVVV(,?AUVVVVV(;G&9C		"&&i9#8	@&EnVacl&m&m## 	@ 	@ 	@CA????	@  3=D" 	*	 	 	 	 	 	 (?	 	 	G 7||q  Z
I%F%F !!*/	 l$++NQcQj+kk 	@+,=x?Q?d?nooJJD01 	@ 	@ 	@CA????	@ 
RjH.AKRRGG
w;WWWWs0   ;D 
D:D55D:G, ,H%H  H%z/v1/chat/completionschatcompletionsc                   K   t          | t                    r8|                                 }t          j        di |                                 } ni }t          | |           d{V }ddh|                                 }|                    |           fd|                                D             }|	                    dd          rt          dd	          	 |j        t          j        k    r*t          j        |j         d
|dd||j                  }nt%          d|j                   n^# t          j        j        $ r t          dd	          t          j        j        $ r#}t          dt-          |          	          d}~ww xY w|j        dk    rt          |j        |j        	          |                                }t5          ||d                    d{V S )zGenerate a chat completion.

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

    Returns:
        The generated chat completion.
    Nr6   toolsc                 $    i | ]\  }}|v	||S r%   r%   )rM   kvexclude_fieldss      r'   
<dictcomp>zgenerate.<locals>.<dictcomp>   s)    UUUTQQn=T=TAq=T=T=Tr&   streamFr,   zStreaming is not supported.r-   z/completionsT)promptreturn_tokens)r^   timeoutzUnsupported engine backend: i  Timeouti     r9   r%   )r0   r   r1   r   r2   r3   r<   updateitemsgetr   engine_backendr   	llama_cpprequestspost
engine_urlrr   r4   
exceptionsrs   RequestExceptionr5   r.   rH   r^   re   )	r)   r*   extra_fields
tokens_idsrequest_jsonresponser:   response_jsonrm   s	           @r'   generater      s?      '677 0022'3KKg6H6H6J6JKK'::::::::J '*N%%''L%%%UUUU\%7%7%9%9UUUL%(( S4QRRRR<"m&===}&444(%)  #
 !(  HH UH<SUUVVV  & ? ? ?I>>>>/ < < <CFF;;;;< s""(<X]SSSSMMOOM0=;RSSSSSSSSSs   AD5 58F-FF)2r^   typingr   rz   fastapir   r   r   r   fastapi.responsesr	   pydanticr
   &mistral_common.experimental.app.modelsr   r   r   r   !mistral_common.experimental.thinkr   !mistral_common.experimental.toolsr   r   &mistral_common.protocol.instruct.chunkr   r   )mistral_common.protocol.instruct.messagesr   (mistral_common.protocol.instruct.requestr   %mistral_common.tokens.tokenizers.baser   r   r   )mistral_common.tokens.tokenizers.instructr   main_routertokenize_routerdecode_routerrw   r(   r{   listintr<   rL   r5   rE   re   r   r%   r&   r'   <module>r      s           ; ; ; ; ; ; ; ; ; ; ; ; . . . . . . $ $ $ $ $ $            N M M M M M _ _ _ _ _ _ _ _ H H H H H H H H F F F F F F J J J J J J a a a a a a a a a a J J J J J JieW%%%)>j8QRRR	!1l8STTT ( 0 ( ( ( (
 c"%@@'',"7"778 
#Y   ( I T222/3t<N<U/V/V/V< <'',"7"778<I< -< 		< < < <, C T222EX EX'',"7"778EXIEX EX EX EX EXP (/FGG4T"%@@4T'',"7"7784T 4T 4T 4T HG4T 4T 4Tr&   