
    :i              
          S SK r S SKJr  S SKrS SKJrJrJrJr  S SK	J
r
  S SKJr  S SKJrJrJrJr  S SKJr  S SKJrJr  S S	KJrJr  S S
KJr  S SKJr  S SKJrJ r J!r!  S SK"J#r#  \" S/S9r$\" SSS/S9r%\" SSS/S9r&\$RO                  S5      S\
4S j5       r(\%RS                  S5      S\\-  S\\\" \5      4   S\*\+   4S j5       r,\&RS                  S5      \" \*S9\" \RZ                  S94S\\\" \5      4   S\*\+   S \S\.4S! jj5       r/\&RS                  S5      \" \*S94S\\\" \5      4   S\*\+   S\4S" jj5       r0\$RS                  S#S$S%/S9S\\-  S\\\" \5      4   S\4S& j5       r1g)'    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                     #    [        SS9$ 7f)zRedirect to the documentation.docs)urlr        a/home/james-whalen/.local/lib/python3.13/site-packages/mistral_common/experimental/app/routers.pyredirect_to_docsr(      s      ''s   
requestsettingsc                   #    [        U [        5      (       a5   U R                  5         [        R                  " S0 U R                  5       D6n U R                  / :X  a
  [        SSS9eUR                  R                  U 5      n[        U[        5      (       d   [        U5      5       eUR                  $ ! [        [        4 a  n[        S[        U5      S9eSnAff = f7f)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7O':L:L:NOG 24TUU""99'BIi++<T)_<+  , 	@CA??	@s)   C4B3 A&C3CCCCz/string)default_factory)defaultr9   special_token_policyc                    #    [        U5      S:X  a
  [        SSS9e U R                  R                  XS9$ ! [         a  n[        S[        U5      S9eSnAff = f7f)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<!!((([[ <CF;;<s%   A6 A
A AAAc                   #    [        U5      S:X  a
  [        SSS9eU R                  R                  R                  R                  [
        R                  :  a;  [        XR                  R                  R                  R                  S5      5      u  p#OUSp2SnU R                  R                  R                  R                  [
        R                  :  al  [        U R                  R                  [        5      (       d   eU R                  R                  R                  nU R                  R                  R                  nOS=pVUGb   Ub   [        X%U5      nU R                  R                  R                  R"                  n	U(       a  U V
Vs/ s Hy  u  pX/:w  d  M  U(       d/  [%        U R                  R'                  U
[(        R*                  S9S	9O5[-        U R                  R'                  U
[(        R*                  S9U
S
   U:H  S9PM{     nn
n[        U5      S:X  a'  [        US   [$        5      (       a  US   R.                  nO/U(       a(  U R                  R'                  U[(        R*                  S9nU(       a+   [1        X0R                  R                  R                  5      nOSnUS
   U R                  R                  R                  R"                  :H  n[7        XLU(       + S9$ ! [         a  n[        S[!        U5      S9eSnAff = fs  snn
f ! [        [2        R4                  4 a  n[        S[!        U5      S9eSnAff = f7f)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%   NrB   )text)thinkingclosed   )content
tool_callsr   )rC   r   r   instruct_tokenizerversionr   v1r   get_control_tokenv13r0   r   BEGIN_THINK	END_THINKr   r4   r5   eos_idr   rD   r   IGNOREr   rG   r   jsonJSONDecodeErrorr   )r*   r9   content_tokenstool_calls_tokensrL   begin_think	end_thinkcontent_or_think_tokensr:   eoschunkis_thinkrM   has_eoss                 r'   detokenize_to_assistant_messagerb   N   s     6{a4RSS,,66>>AQATATT,I&&99CCUUVde-
)) -3B)9=G,,66>>BRBVBVV(,,??AUVVVV((;;GG&&99CC	"&&9#8	@&Encl&m#   33==DD" (?	 (?OEE> x1188UgUnUn8op%//66uSeSlSl6m 9	1 (?  	 7|q Z
I%F%F!!*//	$$++NQcQjQj+k	@+,=?Q?Q?d?d?n?noJ 
RjH..AAKKRRRGGw;WWA  	@CA??	@	& D001 	@CA??	@sc   EM	K) 6M	LA0LA0M	>)L 'AM	)
L3LL	M	M.MMM	z/v1/chat/completionschatcompletionsc                   #    [        U [        5      (       a5  U R                  5       n[        R                  " S0 U R                  5       D6n O0 n[        X5      I Sh  vN nSS1nU R                  5       nUR                  U5        UR                  5        VVs0 s H  u  pgXd;  d  M  Xg_M     nnnUR                  SS5      (       a
  [        SSS9e UR                  [        R                  :X  a3  [        R                  " UR                    S	3US
S.UEUR"                  S9nO[%        SUR                   35      eUR.                  S:w  a  [        UR.                  UR0                  S9eUR3                  5       n
[5        XS   5      I Sh  vN $  GN4s  snnf ! [        R&                  R(                   a    [        SSS9e[        R&                  R*                   a  n	[        S[-        U	5      S9eSn	A	ff = f Nm7f)zGenerate a chat completion.

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

Returns:
    The generated chat completion.
Nr6   toolsstreamFr,   zStreaming is not supported.r-   z/completionsT)promptreturn_tokens)rW   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_urlrj   r4   
exceptionsrk   RequestExceptionr5   r.   rG   rW   rb   )r)   r*   extra_fields
tokens_idsexclude_fieldsrequest_jsonkvresponser:   response_jsons              r'   generater      s     '677002'33Kg6H6H6JK'::J '*N%%'L%%1%7%7%9U%9TQQ=TDAD%9LU%((4QRR<""m&=&==}}&&'|4(%) #
 !((H ;H<S<S;TUVV s"(<(<X]]SSMMOM0;RSSSE ; V$ && ?I>>// <CF;;< Tsi   AG<F<G<F)F/$G<AF $G<%F =AG<G:G<G<AG7G22G77G<)2rW   typingr   rr   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_routerro   r(   rs   listintr<   rV   r5   rE   rb   r   r%   r&   r'   <module>r      s      ; ; . $  N _ H F J a a JeW%>j8QR!1l8ST ( 0 ( (
 c"%@@',"778 
#Y ( I T2/3<N<U<U/V<',"778<I< -< 		< <, C T2EX',"778EXIEX EX EXP (/FG4T"%@@4T',"7784T 4T H4Tr&   