
    yjMm                     .   % S SK r S SKr\R                  R                  \R                  R	                  \R                  R                  \5      5      S5      rS SKrS SK	r	S SK	J
r
  S SKrS SKrS SKrS SKJrJr  S SKJrJrJrJrJrJrJrJrJr  S SKJr  S SKrSrSrS	rS
r  " S S5      r! " S S\"5      r# " S S5      r$\%" 5       r&\\$   \'S'    " S S5      r(S\\\S\4   \\S4   4      S\\   4S jr)S\*S\*S\+4S jr,SS\*S\*S-  S\*4S jjr-S r.g)     Ntmp)JSONDecodeError)ThreadPoolExecutoras_completed)	AnyCallableContextManagerIterableIteratorListLiteralTupleSet)	RegexFlag<   iX     g?c                   :    \ rS rSr% \\S'   \\S'   \\-  \S'   Srg)ServerResponse+   headersstatus_codebody N)	__name__
__module____qualname____firstlineno__dict__annotations__intr   __static_attributes__r       8/mnt/workspace/git/llama.cpp/tools/server/tests/utils.pyr   r   +   s    M
*r"   r   c                       \ rS rSrS rSrg)ServerError1   c                     Xl         X l        g N)coder   )selfr)   r   s      r#   __init__ServerError.__init__2   s    		r"   )r   r)   N)r   r   r   r   r+   r!   r   r"   r#   r%   r%   1   s    r"   r%   c                      \ rS rSr% Sr\\S'   Sr\\S'   Sr	\
\S'   Sr\
S	-  \S
'   Sr\
S	-  \S'   Sr\
\S'   Sr\\S'   Sr\\S'   Sr\\S'   S	r\
S	-  \S'   S	r\
S	-  \S'   S	r\
S	-  \S'   S	r\
S	-  \S'   S	r\
S	-  \S'   S	r\S	-  \S'   S	r\S	-  \S'   S	r\S	-  \S'   S	r\S	-  \S'   S	r\S	-  \S'   S	r\S	-  \S'   S	r\S	-  \S'   S	r\S	-  \S'   S r\S	-  \S!'   S	r\
S	-  \S"'   S	r \S	-  \S#'   S	r!\S	-  \S$'   S	r"\S	-  \S%'   S	r#\
S	-  \S&'   S	r$\
S	-  \S''   S	r%\
S	-  \S('   Sr&\S	-  \S)'   Sr'\S	-  \S*'   Sr(\S	-  \S+'   Sr)\S	-  \S,'   Sr*\S	-  \S-'   Sr+\S	-  \S.'   Sr,\S	-  \S/'   S	r-\
S	-  \S0'   S	r.\
S	-  \S1'   S	r/\
S	-  \S2'   S	r0\S	-  \S3'   S	r1\
S	-  \S4'   S	r2\S	-  \S5'   S	r3\4\
   S	-  \S6'   Sr5\S	-  \S7'   S	r6\
S	-  \S8'   S	r7\S	-  \S9'   S	r8\S	-  \S:'   S	r9\S	-  \S;'   S	r:\S	-  \S<'   S	r;\<S=   S	-  \S>'   S	r=\<S?   S	-  \S@'   S	r>\
S	-  \SA'   S	r?\
S	-  \SB'   S	r@\
S	-  \SC'   S	rA\
S	-  \SD'   S	rB\
S	-  \SE'   S	rC\S	-  \SF'   S	rD\S	-  \SG'   SrE\\SH'   S	rF\
S	-  \SI'   SrG\\SJ'   SrH\\SK'   SrI\\SL'   S	rJ\
S	-  \SM'   S	rK\
S	-  \SN'   S	rL\
S	-  \SO'   S	rM\
S	-  \SP'   S	rN\
S	-  \SQ'   S	rO\PR                  S	-  \SR'   SS rR\S4ST\SUS	4SV jjrTScSW jrUSX\
SY\
SZ\V\W-  S	-  S[\VS	-  S\\S	-  SU\XR                  4S] jrZS	S	\[4SX\
S^\
SZ\V\W-  S	-  S[\VS	-  S\\S	-  SU\\4S_ jjr]  SdSX\
S^\
SZ\VS	-  S[\VS	-  SU\^\V   4
S` jjr_S	S	\[4SX\
S^\
SZ\VS	-  S[\VS	-  S\\S	-  SU\V4Sa jjr`Sbrag	)eServerProcess7   Fdebugi  server_portz	127.0.0.1server_hostggml-org/modelsNmodel_hf_repoztinyllamas/stories260K.ggufmodel_hf_filetinyllama-2model_aliasg?temperature*   seedoffline
model_tags	model_url
model_filemodel_draft	n_threadsn_gpu_layern_batchn_ubatchn_ctxn_gan_ga_w	n_predictr   	n_promptsslot_save_pathid_slotcache_promptn_slotsctkctvfaserver_continuous_batchingserver_embeddingsserver_rerankingserver_metricsserver_scope
kv_unifiedserver_slotspoolingapi_key
models_dir
models_maxmodels_presetno_models_autoload
lora_filesenable_ctx_shift	spec_typespec_draft_n_minspec_draft_n_maxno_uijinja)deepseeknonenothinkreasoning_format)onoffauto	reasoningchat_templatechat_template_fileserver_path
mmproj_url
media_pathsleep_idle_seconds	cache_ramno_cache_idle_slotslog_pathui_mcp_proxybackend_sampling
gcp_compatserver_toolsserver_tools_runtimemcp_servers_configmcp_servers_jsoncors_originsprocessc                 >   S[         R                  ;   a!  [        [         R                  S   5      U l        S[         R                  ;   a  SU l        S[         R                  ;   a!  [        [         R                  S   5      U l        S[         R                  ;   U l        g )NN_GPU_LAYERSDEBUGTPORTDEBUG_EXTERNAL)osenvironr    rA   r0   r1   external_server)r*   s    r#   r+   ServerProcess.__init__   sj    RZZ'"2::n#=>Dbjj DJRZZ"2::f#56D/2::=r"   timeout_secondsreturnc                 z   0 [         R                  ESS0EnS[         R                  ;  a  SUS'   U R                  (       a&  [        SU R                   SU R
                   35        g U R                  b  U R                  nOAS[         R                  ;   a  [         R                  S   nO[         R                  S:X  a  S	nOS
nSU R                  SU R
                  SU R                  SU R                  /nU R                  (       a  UR                  S5        U R                  (       a  UR                  SU R                  /5        U R                  (       a  UR                  SU R                  /5        U R                  (       a  UR                  SU R                  /5        U R                   (       a  UR                  SU R                   /5        U R"                  (       a  UR                  SU R"                  /5        U R$                  (       a  UR                  SU R$                  /5        U R&                  b  UR                  SU R&                  /5        U R(                  (       a  UR                  SU R(                  /5        U R*                  (       a  UR                  SU R*                  /5        U R,                  (       a  UR                  SU R,                  /5        U R.                  (       a  UR                  SU R.                  /5        U R0                  (       a  UR                  SU R0                  /5        U R2                  (       a  UR                  SU R2                  /5        U R4                  (       a  UR                  S5        U R6                  (       a  UR                  S5        U R8                  (       a  UR                  S5        U R:                  (       a  UR                  S 5        U R<                  (       a  UR                  S!5        U R>                  (       a  UR                  S"5        U R@                  (       a  UR                  S#5        OUR                  S$5        U RB                  (       a  UR                  S%U RB                  /5        U RD                  (       a  UR                  S&U RD                  /5        U RF                  (       a  UR                  S'U RF                  /5        U RH                  (       a  UR                  S(U RH                  /5        U RJ                  (       a  UR                  S)U RJ                  /5        U RL                  (       a  UR                  S*U RL                  /5        U RN                  (       a  UR                  S+U RN                  /5        U RP                  b  UR                  S,U RP                  /5        U RR                  (       a  UR                  S-U RR                  /5        U RT                  (       a  UR                  S.U RT                  /5        U RV                  (       a  UR                  S/U RV                  /5        U RX                  (       a  UR                  S0U RX                  /5        U RZ                  (       a  UR                  S15        U R\                  (       a&  U R\                   H  nUR                  S2U/5        M     U R^                  (       a  UR                  S35        U R`                  (       a  UR                  S4U R`                  /5        U Rb                  (       a  UR                  S5U Rb                  /5        U Rd                  (       a  UR                  S6U Rd                  /5        U Rf                  (       a  UR                  S7U Rf                  /5        U Rh                  (       a  UR                  S85        U Rj                  (       a  UR                  S95        U Rl                  (       a  UR                  S:5        OUR                  S;5        U Rn                  b  UR                  S<U Rn                  45        U Rp                  b  UR                  S=U Rp                  45        U Rr                  (       a  UR                  S>U Rr                  /5        U Rt                  (       a  UR                  S?U Rt                  /5        U Rv                  (       a  UR                  S@U Rv                  /5        U Rx                  (       a  UR                  SAU Rx                  /5        U Rz                  b  UR                  SBU Rz                  /5        U R|                  b  UR                  SCU R|                  /5        U R~                  (       a  UR                  SD5        U R                  (       a  UR                  SE5        U R                  (       a  UR                  SFU R                  /5        U R                  (       a  UR                  SGU R                  /5        U R                  (       a  UR                  SHU R                  /5        U R                  (       a  UR                  SIU R                  /5        U R                  (       a  UR                  SJ5        U R                  (       a  SKUSL'   U/UQ Vs/ s H  n[        U5      PM     nn[        SMSNR                  U5       35        SOnS[         R                  :X  a9  U[        R                  -  nU[        R                  -  nU[        R                  -  nU R                  (       a  [        U R                  SP5      U lO        O[        R                  U lO        [        R                  " U/UQ Vs/ s H  n[        U5      PM     snUU R                  U R                  [        R                  :w  a  U R                  O[        R                  USQ9U lS        [        R                  U 5        [        SRU R                  R                   SS[         R                  " 5        35        [        R                  " 5       n	U	n
[        R                  " 5       U	-
  U:  a   U R                  STSUSVU Rb                  (       a  SWU Rb                   3OS 0SX9nUR                  SY:X  a  SZU l[        g  U R                  R                  5       b"  [        S[U R                  R                   35      e[        R                  " 5       U
-
  S\:  a   [        S]5        [        R                  " 5       n
[        R                  " S^5        [        R                  " 5       U	-
  U:  a  M  [        S_U S`35      es  snf s  snf ! [         a
  n S nANS nAff = f)aNLLAMA_SERVER_DEBUG_FAKE_TIMING1LLAMA_CACHEr   z7[external_server]: Assuming external server running on :LLAMA_SERVER_BIN_PATHntz+../../../build/bin/Release/llama-server.exez../../../build/bin/llama-serverz--hostz--portz--tempz--seedz	--offlinez--modelz--model-urlz--model-draftz	--hf-repoz	--hf-filez--models-dirz--models-maxz--models-presetz--cors-originsz--batch-sizez--ubatch-sizez	--threadsz--n-gpu-layersz--cont-batchingz--embeddingz--rerankingz	--metricsz--scopez--kv-unifiedz--slotsz
--no-slotsz	--poolingz--aliasz--tagsz
--ctx-sizez
--parallelz-ctkz-ctvz-faz--n-predictz--slot-save-pathz--grp-attn-nz--grp-attn-wz	--verbosez--loraz--context-shiftz--spec-typez	--api-keyz--spec-draft-n-maxz--spec-draft-n-minz--no-uiz--no-models-autoloadz--jinjaz
--no-jinjaz--reasoning-formatz--reasoningz--chat-templatez--chat-template-filez--mmproj-urlz--media-pathz--sleep-idle-secondsz--cache-ramz--no-cache-idle-slotsz--ui-mcp-proxyz--toolsz--tools-runtimez--mcp-servers-configz--mcp-servers-jsonz--backend_sampling
PREDICTIONAIP_MODEztests: starting server with:  r   w)creationflagsstdoutstderrenvzserver pid=z, pytest pid=GETz/healthAuthorizationzBearer )r      Tz%Server process died with return code g      ?zWaiting for server to start...g{Gz?zServer did not start within z seconds)br   r   r   printr2   r1   rn   namer8   r:   r;   appendr>   extendr=   r?   r4   r5   rY   rZ   r[   r|   rB   rC   r@   rA   rP   rQ   rR   rS   rT   rU   rV   rW   r7   r<   rD   rL   rM   rN   rO   rG   rI   rE   rF   r0   r]   r^   r_   rX   ra   r`   rb   r\   rc   rg   rk   rl   rm   ro   rp   rq   rr   rs   ru   rx   ry   rz   r{   rv   rw   strjoin
subprocessDETACHED_PROCESSCREATE_NEW_PROCESS_GROUPCREATE_NO_WINDOWrt   open_logsysr   Popenr}   server_instancesaddpidgetpidtimemake_requestr   ready	ExceptionpollRuntimeError
returncodesleepTimeoutError)r*   r   r   rn   server_args	lora_fileargargsflags
start_timelast_print_timeresponsees                r#   startServerProcess.start   s?
   
jj
,c
 

*!&CKDL\L\K]]^_c_o_o^pqr'**K$

2**%<=KWW_GK;KII	
 <<{+??	4??;<>>t~~>?1A1ABCT-?-?@AT-?-?@A??@A??&@A 143E3EFG 0$2C2CDE<<=>==?@>>T^^<= 0$2B2BCD**01!!}-  }-{+y)??~.y)|,<<T\\:;	4+;+;<=??$//:;::djj9:<<dll;<8812881277tww/0>>t~~>? 2D4G4GHI99		:;;;<=::{+??!__	""Hi#89 -  01>>t~~>?<<T\\:;   4d6K6KLM   4d6K6KLM::y)""56::y)|,  , 4d6K6KLM>>%t~~>? 143E3EFG"" 68O8OPQ??@A??@A"". 68O8OPQ>>%t~~>?##67/0	4+<+<=>$$ 143L3LMN"" 68O8OPQ   4d6K6KLM  34??*C
O%0$?;$?@$?SC$?@-chhtn-=>?277?Z000EZ888EZ000E==T]]C0DI

DI!''"-!<!<=!<#SX!<=99 $		SZZ 7499SZZ
 	T"DLL,,-]299;-HI YY[
$iikJ&8,,UI#wt||n%=SWH,  ''3.!%DJ / ||  "."%J4<<KbKbJc#deeyy{_,368"&))+JJt# iikJ&8$ 9/9J(STT] A >*  s   v.v!A
v& &
v:5v:c                    U R                   (       a  [        S5        g U [        ;   a  [        R                  U 5        U R                  (       a]  [        SU R                  R
                   35        U R                  R                  5          U R                  R                  SS9  S U l        [        U S5      (       a:  U R                  [        R                  :w  a  U R                  R!                  5         g g g ! [        R                   aY    [        SU R                  R
                   S35        U R                  R                  5         U R                  R                  SS9   N[         a  n[        SU 35         S nANS nAff = f)	Nz/[external_server]: Not stopping external serverzStopping server with pid=   timeoutzServer pid=z# did not terminate in time, killingzError waiting for server: r   )r   r   r   remover}   r   	terminatewaitr   TimeoutExpiredkillr   hasattrr   r   r   close)r*   r   s     r#   stopServerProcess.stopU  s*   CD####D)<<-dll.>.>-?@ALL""$8!!!!,  DL4  TYY#**%<IIOO &=  ,, -DLL$4$4#55XYZ!!#!!!!, 821#6778s   C7 7A*F#	F,E??Fmethodurldatar   r   c                     US:X  a  [         R                  " X$US9$ US:X  a  [         R                  " X$X5S9$ US:X  a  [         R                  " X$US9$ US:X  a  [         R                  " X$US9$ [        SU 35      e)Nr   )r   r   POST)r   jsonr   DELETEOPTIONSUnimplemented method: )requestsgetpostdeleteoptions
ValueError)r*   r   r   r   r   r   s         r#   _send_requestServerProcess._send_requestj  s|     U?<<gFFV==DRRX??3IIY##C'JJ1&:;;r"   pathc                    SU R                    SU R                   U 3nUS:g  n[        [        5       H  n U R	                  XX4U5      n	  O   [        5       n
[        W	R                  5      U
l        U	R                  U
l        U(       a   U	R                  5       U
l        OS U
l        ['        S[        R(                  " U
R                   SS95        U
$ ! [
        R                  R                   a,    U[        S-
  :X  a  e [        R                  " [        5         M  f = f! ["        [
        R                  R"                  4 a    U	R$                  U
l         Nf = f)Nhttp://r   r      zResponse from server   indent)r2   r1   rangeCONNECTION_RESET_ATTEMPTSr   r   
exceptionsConnectionErrorr   r   CONNECTION_RESET_DELAY_SECr   r   r   r   r   r   r   textr   dumps)r*   r   r   r   r   r   r   
parse_bodyattemptr   results              r#   r   ServerProcess.make_request|  s,    (()4+;+;*<TFCy(
67G7--f4'R 8  !h../%11,&mmo FK$djjQ&GH &&66 77!;;

567 $X%8%8%H%HI ,&mm,s$   CD  ADD 5EEc           	   #     #    SU R                    SU R                   U 3nUS:X  a  [        R                  " XTUSS9nO[	        SU 35      eUR
                  S:w  a$  [        UR
                  UR                  5       5      eUR                  5        Hp  nUR                  S5      nS	U;   a    g UR                  S
5      (       d  M4  [        R                  " USS  5      n[        S[        R                  " USS95        Uv   Mr     g 7f)Nr   r   r   T)r   r   streamr   r   zutf-8z[DONE]zdata:    zPartial response from serverr   r   )r2   r1   r   r   r   r   r%   r   
iter_linesdecode
startswithloadsr   r   )	r*   r   r   r   r   r   r   
line_byteslines	            r#   make_stream_request!ServerProcess.make_stream_request  s      (()4+;+;*<TFCV}}STRH5fX>??3&h22HMMODD"--/J$$W-D4**zz$qr(+4djja6PQ
 0s   B>DADc                    UR                  SS5      nU(       Ga-  / n/ n/ n	S n
SnSnSnSnU R                  XX45       GHw  nUS   (       GaH  [        US   5      S:X  d   S[        US   5       35       eUS   S   nUS   R                  S5      b8  [        US   S   5      S:  d   S	5       eUR                  US   S   5        US-  nUS   R                  S
5      b8  [        US   S
   5      S:  d   S5       eUR                  US   S
   5        US-  nUS   R                  S5      b  US   S   n
US   R                  S/ 5       GHD  nSU;  a  [	        SUS    35      eUS   [        U	5      :  a~  SU;   d   eUR                  S5      S:X  d   eSU;   a  SUS   ;   a  [        US   S   5      S:  d   SUR                  S5       35       eU	R                  [        SS[        SSS9S95        U	US      nUR                  S5      b  US   US'   US   nSU;  d
   SU 35       eUR                  S5      b!  US   R                  SS5      US   -   US   S'   UR                  S5      b  US   S==   US   -  ss'   US-  nUS-  nGMG     GMW  SU;   d
   SU 35       eSU;   a  GMp   SU 35       e   [        SU SU SU S U S!3	5        [        [        SU
[        S"U(       a  SR                  U5      OS U(       a  SR                  U5      OS U	(       a  U	OS S#9S$9/S%9n[        S&[        R                  " US'S(95        U$ U R                  XX4US)9nUR                  S*:X  d   S+UR                   35       eUR                  $ ),Nr   Fr   choicesr   zExpected 1 choice, got deltacontentz!Expected non empty content delta!reasoning_contentz+Expected non empty reasoning_content delta!finish_reason
tool_callsfunctionzExpected function type, got typeindexidr   z&Expected function call with name, got  )r   	arguments)r  r  r  z"Function call should not have id: r  usagez!Expected finish_reason in chunk: timingszStreamed response had z content parts, z reasoning_content parts, z tool call parts incl. z arguments parts	assistant)roler   r   r  )r  r  message)r   zFinal response from serverr   r   r   r   zServer returned error: )r   r   lenr   r   r   r   r   r   r   r   r   r   )r*   r   r   r   r   r   r   r   r   r  r  content_partsreasoning_content_partstool_call_partsarguments_partschunkchoicetc	tool_callfctr   r   s                         r#   make_any_requestServerProcess.make_any_request  sp    (E*!#G+-%'J+/MM&'#OO11&N##uY/0A5h9PQTUZ[dUeQfPg7hh5"9-a0Fg**95A"6'?9#=>BhFghBvgy'AB%*g**+>?K"6'?3F#GH1L|P{|L)00AT1UV/14/g**?;G(.w(H$Wo11,C%R/",/KBvJ<-X"YYg;#j/9#'2:-:#%66&>Z#??#?#-#3"Z.8PUXY[\fYghnYoUpstUt ^"HPZI[H\ ]^#t&--d#%%/)-)+.0*"/  %/r'{$;	66$<3.0hIdO n#3Z2TUXTY0ZZ776?6<Ej<Q<U<UV\^`<adghndo<oIj1&977;/;%j1+>#kBRR>+q0O'1,5 D@ #e+X/PQVPW-XX+$-Z1RSXRY/ZZ-_ O` *=/9IJaIbb|  ~M  }N  Ne  fu  ev  vF  G  H&3 $!,8?BGGG$4TL]bgg6G.Hcg5?zT	!	F .

6!0LMM((tg(VH''3.`2I(J^J^I_0``.== r"   )r   r0   r   rA   r}   r   r1   r   N)NN)br   r   r   r   r0   boolr   r1   r    r2   r   r4   r5   r7   r8   floatr:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r   r^   r_   r`   ra   rb   rc   rg   r   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r   r   r+   DEFAULT_HTTP_TIMEOUTr   r   r   r   r   Responser   DEFAULT_REQUEST_TIMEOUTr   r   r   r   r  r!   r   r"   r#   r.   r.   7   s^   E4K"K" 1M3:1 =M3:=$K$KD#NGT #Kt"!Jd
! IsTz !Jd
!"Kt" IsTz "Kt"GS4ZHcDjE3:D#*FC$J IsTz IsTz!%NC$J%GS4Z $L$+$GS4ZCtCtBd
.3t3%*td{*$)dTk)"'ND4K' %L$+%#Jt# %L$+%GS4ZGS4Z!Jd
!!Jd
! $M3:$&*t*#'JS	D '#(cDj( IsTz #'cDj'#'cDj'E4$;E4$;FJg;<tCJ59Iw*+d29 $M3:$%)d
)"Kt"!Jd
!!Jd
!%)d
) IsTz  %%HcDjL$"d"J#L#*#'+#*+%)d
)#'cDj'#L#*# (,GZ$+> ,@ FUS FUD FUP*<< < Sj4	<
 < < 
		<, #'# 7  Sj4	
   
F !#  Tk	
  
$6 !# 7X!X! X! Tk	X!
 X! X! 
X! X!r"   r.   r   c                       \ rS rSr\SS j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       r	\S\4S j5       r
\S\4S	 j5       r\S\4S
 j5       r\S\4S j5       r\S\4S j5       rSrg)ServerPreseti  r   Nc                     [         R                  R                  5        V Vs/ s H&  u  p[        U5      (       d  M  U S:w  d  M  U" 5       PM(     nn nU H*  nSUl        UR                  5         UR                  5         M,     gs  snn f )z:Load all server presets to ensure model files are cached. load_allFN)r!  __dict__itemscallabler;   r   r   )r   r   serversservers       r#   r#  ServerPreset.load_all  sx    
 !- 5 5 ; ; =(
 = $(J$6 FH = 	 (

 F"FNLLNKKM (
s   BBBc                      [        5       n SU l        SU l        S U l        SU l        SU l        SU l        SU l        SU l        SU l	        U $ )	NTzggml-org/test-model-stories260Kr6          r   @   r9   )
r.   r;   r4   r5   r7   rD   rB   rL   rG   r:   r(  s    r#   
tinyllama2ServerPreset.tinyllama2  sQ    @#*r"   c                      [        5       n SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l	        SU l
        U $ )	NTr3   "bert-bge-small/ggml-model-f16.ggufbert-bge-smallr+     r   r9   )r.   r;   r4   r5   r7   rD   rB   rC   rL   r:   rQ   r.  s    r#   bert_bge_smallServerPreset.bert_bge_small-  sX    0C-#' r"   c                      [        5       n SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l	        S	U l
        SU l        U $ )
NTr3   r2  r3     i,  r   rh   r9   )r.   r;   r4   r5   r7   rD   rB   rC   rL   rO   r:   rQ   r.  s    r#   bert_bge_small_with_fa#ServerPreset.bert_bge_small_with_fa<  s_    0C-	#' r"   c                      [        5       n SU l        SU l        S U l        SU l        SU l        SU l        SU l        SU l        SU l	        S	U l
        U $ )
NTz&ggml-org/test-model-stories260K-infillztinyllama-infill   r8  r   r-          r9   r.   r;   r4   r5   r7   rD   rB   rL   rG   r8   r:   r.  s    r#   tinyllama_infillServerPreset.tinyllama_infillL  sY    G#/ r"   c                      [        5       n SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        S	U l	        S
U l
        U $ )NTzggml-org/stories15M_MOEzstories15M_MOE-F16.ggufzstories15m-moer<  r8  r   r-  r=  r9   r>  r.  s    r#   stories15m_moeServerPreset.stories15m_moe[  sY    88- r"   c                      [        5       n SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l	        U $ )NTr3   z,jina-reranker-v1-tiny-en/ggml-model-f16.ggufzjina-rerankerr+  r   r9   )
r.   r;   r4   r5   r7   rD   rB   rL   r:   rR   r.  s    r#   jina_reranker_tinyServerPreset.jina_reranker_tinyj  sQ    0M,"&r"   c                      [        5       n SU l        S U l        SU l        SU l        SU l        SU l        SU l        SU l        SU l	        U $ )	NTzggml-org/tinygemma3-GGUF:Q8_0
tinygemma3r8  r,  r      r9   )
r.   r;   r5   r4   r7   rD   rB   rL   rG   r:   r.  s    r#   rH  ServerPreset.tinygemma3x  sQ    #>)r"   c                      [        5       n SU l        S U l        S U l        S U l        S U l        SU l        SU l        SU l        SU l	        SU l
        U $ )NTr8     r   r9   )r.   r;   r>   r7   r4   r5   rD   rB   rL   rG   r:   r.  s    r#   routerServerPreset.router  sY     !##r"   r   r  )r   r   r   r   staticmethodr#  r.   r/  r5  r9  r?  rB  rE  rH  rM  r!   r   r"   r#   r!  r!    s    
 
    M   M   m   M         M  r"   r!  function_list.r   c                 z  ^
^ S/[        U 5      -  m/ m
U
U4S jn[        5        n/ n[        U 5       H+  u  nu  pVUR                  XXV5      nUR	                  U5        M-     [        U5       H  nM     SSS5        T
(       a'  [        S5        T
 H  u  p[        SU SU	 35        M     T$ ! , (       d  f       N>= f)z
Run multiple functions in parallel and return results in the same order as calls. Equivalent to Promise.all in JS.

Example usage:

results = parallel_function_calls([
    (func1, (arg1, arg2)),
    (func2, (arg3, arg4)),
])
Nc                    >  U" U6 nUTU '   g ! [          a&  nTR                  U [        U5      45         S nAg S nAff = fr(   )r   r   r   )r  funcr   r   r   r   resultss        r#   worker'parallel_function_calls.<locals>.worker  sC    	/4[F#GEN 	/uc!fo..	/s   
 
>9>zExceptions occurred:zFunction at index z: )r  r   	enumeratesubmitr   r   r   )rP  rU  executorfuturesirS  r   futurer  errorr   rT  s             @@r#   parallel_function_callsr^    s     fs=))GJ/ 
	(7OA|__V;FNN6"  8
 #7+F , 
 $%&LE&ugRw78 ' N! 
	s   AB,,
B:regexr   c                     [         R                  " U [        R                  [        R                  -  [        R
                  -  S9R                  U5      S L$ )N)r   )recompiler   
IGNORECASE	MULTILINEDOTALLsearch)r_  r   s     r#   match_regexrg    sE    


--	0C0CCiFVFVV	

&,	r"   r   output_file_pathc                 &   U R                  S5      R                  5       nUc  SU 3OUn[        R                  R	                  U5      (       d5  [        SU  SU 35        [        R                  " XS9  [        SU 35        U$ [        SU 35        U$ )a  
Download a file from a URL to a local path. If the file already exists, it will not be downloaded again.

output_file_path is the local path to save the downloaded file. If not provided, the file will be saved in the root directory.

Returns the local path of the downloaded file.
/z./tmp/zDownloading z to )outzDone downloading to zFile already exists at )splitpopr   r   existsr   wgetdownload)r   rh  	file_nameoutput_files       r#   download_filers    s     		#""$I*:*BF9+&HXK77>>+&&SEk]34c+$[M23  	'}56r"   c                      [         R                  R                  S5      S:H  =(       d"    [         R                  R                  S5      S:H  $ )N
SLOW_TESTSr   ON)r   r   r   r   r"   r#   is_slow_test_allowedrw    s2    ::>>,'3.V"**..2NRV2VVr"   r(   )/r   r   r   r   dirnameabspath__file__TMP_DIRra  r   r   r   r   r   concurrent.futuresr   r   typingr   r   r	   r
   r   r   r   r   r   r   ro  r  r  r   r   r   r   r%   r.   setr   r   r!  r^  r   r  rg  rs  rw  r   r"   r#   <module>r     sE    	
'',,rwwrwwx'@A5
I 	    
   ?
 
 
           ) S! S!n (+u #m$ ,D DN%4hsCx6H%PSUXPX/6Y0Z+[ %`deh`i %Ps # $ s cDj C &Wr"   