ó
    �®žjP3  ã                   óÖ  • S SK r S SKrS SKrS SKJr  S SKJr  S SKrS SKJ	r	  S SK
Jr  S SKJr  S SKJr  S SKJrJrJrJrJr  S S	KJr  \R0                  " \5      rS
rSrSrS\R<                  4S jrS\ S-  S\ 4S jr!S\S\ 4S jr"S\ S-  S\4S jr#S\S\ S-  S\S-  4S jr$S\S\ S-  S\S-  4S jr%S\S\&S-  4S jr'SS.S\ S\&S\ 4S  jjr(S!\RR                  S\S-  4S" jr*S\ S-  S#\ S-  S\ S-  4S$ jr+  S0SSS&.S'\	R                  S(\ S)\S*\,S+\-\ \ 4   S-  S\ S-  S#\ S-  S\4S, jjjr.S%S/ SSS-.S'\	R                  S(\ S)\S*\,S+\-\ \ 4   S-  S.\/\   S\ S-  S#\ S-  S\4S/ jjr0g)1é    N)ÚBytesIO)ÚAny)ÚImage)ÚAnyUrl)ÚHTTPAdapter)ÚRetry)ÚApiImageRequestResultÚApiImageStreamingRequestResultÚOpenAiApiResponseÚOpenAiChatMessageÚVlmStopReason)ÚGenerationStopperé   gš™™™™™¹?)i­  éô  iö  i÷  iø  Úreturnc                  óÖ   • [        [        [        S[        S1[        [        SSS9	n [	        U S9n[
        R                  " 5       nUR                  SU5        UR                  SU5        U$ )	Nr   ÚPOSTTF)	ÚtotalÚconnectÚreadÚstatusÚallowed_methodsÚbackoff_factorÚstatus_forcelistÚrespect_retry_after_headerÚraise_on_status)Úmax_retrieszhttp://zhttps://)r   Ú_RETRY_TOTALÚ_RETRY_BACKOFF_FACTORÚ_RETRY_STATUS_FORCELISTr   ÚrequestsÚSessionÚmount)Úretry_strategyÚadapterÚsessions      Ú\/home/mande/repo/quber/.venv/lib/python3.13/site-packages/docling/utils/api_image_request.pyÚ_make_retry_sessionr(       sd   € ÜÜÜØÜØ˜Ü,Ü0Ø#'Øñ
€Nô  nÑ5€Gä×ÒÓ €GØ‡M�M�)˜WÔ%Ø‡M�M�*˜gÔ&Ø€Nó    Ú	argumentsc                 óè   ^^• U c  g [         R                  " U 5      n/ mS[        SS 4UU4S jjmT" U5        SR                  T5      $ ! [         R                   a    U R                  5       s $ f = f)NÚ Úobjr   c                 ór  >• [        U [        5      (       a  U  H  nT" U5        M     g [        U [        5      (       az  U R                  S5      n[        U[        5      (       a4  UR                  5       (       a  TR                  UR                  5       5        U R                  5        H  nT" U5        M     g g )NÚtext)Ú
isinstanceÚlistÚdictÚgetÚstrÚstripÚappendÚvalues)r-   Úitemr/   ÚvalueÚ_collect_textÚ	fragmentss       €€r'   r:   Ú8_extract_text_from_tool_arguments.<locals>._collect_text?   s„   ø€ Ü�cœ4× Ñ Û�Ù˜dÖ#ò ä˜œT×"Ñ"Ø—7‘7˜6“?ˆDÜ˜$¤×$Ñ$¨¯©¯©Ø× Ñ  §¡£Ô.ØŸ™ž�Ù˜eÖ$ò &ð	 #r)   Ú
)ÚjsonÚloadsÚJSONDecodeErrorr5   r   Újoin)r*   Úpayloadr:   r;   s     @@r'   Ú!_extract_text_from_tool_argumentsrC   4   s{   ù€ ØÑØð!Ü—*’*˜YÓ'ˆð €Ið	%œ3ð 	% 4÷ 	%ð 	%ñ �'ÔØ�9‰9�YÓÐøô# ×Ñó !Ø�‰Ó Ò ð!ús   ˆA
 Á
$A1Á0A1Úmessagec                 ó$  • U R                   b  U R                   R                  5       $ U R                  =(       d    /  HP  nUR                  S5      n[	        U[
        5      (       d  M+  [        UR                  S5      5      nU(       d  MN  Us  $    g)NÚfunctionr*   r,   )Úcontentr5   Ú
tool_callsr3   r0   r2   rC   )rD   Ú	tool_callrF   Úgenerated_texts       r'   Ú_extract_generated_textrK   N   sx   € Ø‡�Ñ"Ø�‰×$Ñ$Ó&Ð&à×'Ñ'×-¨2Ò-ˆ	Ø—=‘= Ó,ˆÜ˜(¤D×)Ñ)Ùä:¸8¿<¹<ÈÓ;TÓUˆßˆ>Ø!Ò!ñ .ð r)   Úfinish_reasonc                 ó¤   • U S:X  a%  [         R                  S5        [        R                  $ U S:X  a  [        R                  $ [        R
                  $ )NÚcontent_filterz7API response was filtered due to content safety policy.Úlength)Ú_logÚwarningr   ÚCONTENT_FILTEREDÚLENGTHÚEND_OF_SEQUENCE)rL   s    r'   Ú_map_stop_reasonrU   ^   sD   € ØÐ(Ó(Ü�‰ÐNÔOÜ×-Ñ-Ð-Ø	˜(Ó	"Ü×#Ñ#Ð#ä×,Ñ,Ð,r)   Úresponse_payloadÚkeyc                 ó¬   • Ub  [        U [        5      (       d  g U nUR                  S5       H#  n[        U[        5      (       a  X2;  a    g X#   nM%     U$ )NÚ.)r0   r2   Úsplit)rV   rW   ÚcurrentÚparts       r'   Ú_extract_response_valuer]   h   sQ   € Ø
�{œ*Ð%5´t×<Ñ<Øà#€GØ—	‘	˜#–ˆÜ˜'¤4×(Ñ(¨DÓ,?ÙØ‘-Šñ ð €Nr)   Úusage_response_keyc                 ó   • [        X5      $ ©N)r]   )rV   r^   s     r'   Ú_extract_response_usagera   t   s   € ô #Ð#3ÓHÐHr)   Úusagec                 ó~   • [        U [        5      (       a(  U R                  S5      n[        U[        5      (       a  U$ g )NÚtotal_tokens)r0   r2   r3   Úint)rb   rd   s     r'   Ú_extract_total_tokensrf   z   s3   € Ü�%œ×ÑØ—y‘y Ó0ˆÜ�l¤C×(Ñ(ØÐØr)   r   )Úlimitr/   rg   c                óT   • U R                  5       n[        U5      U::  a  U$ US U  S3$ )Nz...)r5   Úlen)r/   rg   Ústrippeds      r'   Ú_response_previewrk   ‚   s3   € Ø�z‰z‹|€HÜ
ˆ8ƒ}˜ÓØˆØ�v˜ÐÐ˜sÐ#Ð#r)   Úresponsec           
      óØ  • U R                   R                  5       (       d;  [        R                  SU R                  U R
                  R                  S5      5        g  [        R                  " U R                   5      $ ! [        R                   aY  n[        R                  SUU R                  U R
                  R                  S5      [        U R                   5      5         S nAg S nAff = f)Nz6API response body was empty. status=%s content_type=%súcontent-typezIAPI response body was not JSON: %s. status=%s content_type=%s response=%r)r/   r5   rP   ÚerrorÚstatus_codeÚheadersr3   r>   r?   r@   rk   )rl   Úes     r'   Ú_parse_response_jsonrs   ‰   s´   € Ø�=‰=×Ñ× Ñ Ü�
‰
ØDØ× Ñ Ø×Ñ× Ñ  Ó0ô	
ð
 ð
Ü�zŠz˜(Ÿ-™-Ó(Ð(øÜ×Ñó Ü�
‰
ØWØØ× Ñ Ø×Ñ× Ñ  Ó0Ü˜hŸm™mÓ,ô	
ô ûðús   ÁA< Á<C)ÂAC$Ã$C)Útoken_extract_keyc                 ó   • Ub  U$ U $ r`   © ©r^   rt   s     r'   Ú_resolve_usage_response_keyrx   Ÿ   s   € ð Ñ$Ø Ð ØÐr)   é   rw   ÚimageÚpromptÚurlÚtimeoutrq   c                óÚ  • [        5       nU R                  5       n U R                  S5      n Sn	 U R                  US5        U	(       Gaî   [        R                  " UR                  5       5      R                  S5      nSS	S
SU 30S.SUS./S./nSU0UEnU=(       d    0 n[        5        nUR                  [        U5      UUUS9nS S S 5        WR                  (       di  [
        R                  SUR                   UR"                  R%                  S5      ['        UR(                  5      5        [+        SS[,        R.                  5      $ [1        U5      nUc  [+        SS[,        R.                  5      $ [3        UUS9n[5        UU5      n[6        R8                  " U5      n[;        UR<                  S   R>                  5      n[A        U5      nUc#  URB                  b  URB                  RD                  n[G        UR<                  S   RH                  5      n[+        UUUUUR<                  S   RJ                  S9$ [+        SS[,        R.                  5      $ ! [         a2  n
Sn	[
        R                  SU R                   SU
 35         S n
A
GNHS n
A
ff = f! , (       d  f       GNÑ= f! [         a=  n
[
        R                  SU
 35        [+        SS[,        R.                  5      s S n
A
$ S n
A
ff = f)NÚRGBATÚPNGFzError, corrupted PNG of size: z: úutf-8ÚuserÚ	image_urlr|   údata:image/png;base64,©Útyperƒ   r/   ©r†   r/   ©ÚrolerG   Úmessages)rq   r>   r}   z<Error calling the API. status=%s content_type=%s response=%rrn   r,   r   rw   )r/   Ú
num_tokensÚstop_reasonrb   Úlogprobsz"Error, could not process request: )&r   ÚcopyÚconvertÚsaveÚ	ExceptionrP   ro   ÚsizeÚbase64Ú	b64encodeÚgetvalueÚdecoder(   Úpostr4   Úokrp   rq   r3   rk   r/   r	   r   ÚUNSPECIFIEDrs   rx   ra   r   Úmodel_validaterK   ÚchoicesrD   rf   rb   rd   rU   rL   r�   )rz   r{   r|   r}   rq   r^   rt   ÚparamsÚimg_ioÚ
good_imagerr   Úimage_base64rŠ   rB   r&   ÚrrV   Ú	usage_keyrb   Úapi_resprJ   r‹   rŒ   s                          r'   Úapi_image_requestr£   ¨   sÌ  € ô ‹Y€Fà�
‰
‹ð 
ð �M‰M˜&Ó!€EØ€JðGØ�
‰
�6˜5Ô!÷
 ðF	KÜ!×+Ò+¨F¯O©OÓ,=Ó>×EÑEÀgÓNˆLð #ð %0à %Ð)?À¸~Ð'Nð*ñð %+Ø$*ñð ñðˆHð& ˜HðàðˆGð
 —m ˆGä$Ô&¨'Ø—L‘LÜ˜“HØ#Ø Ø#ð	 !ð �÷ 'ð —4—4Ü—
‘
ØRØ—M‘MØ—I‘I—M‘M .Ó1Ü% a§f¡fÓ-ô	ô -¨R°´M×4MÑ4MÓNÐNä3°AÓ6ÐØÑ'Ü,¨R°´M×4MÑ4MÓNÐNä3Ø#5Ø"3ñˆIô ,Ð,<¸iÓHˆEä(×7Ò7Ð8HÓIˆHÜ4°X×5EÑ5EÀaÑ5H×5PÑ5PÓQˆNÜ.¨uÓ5ˆJØÑ! h§n¡nÑ&@Ø%Ÿ^™^×8Ñ8�
Ü*¨8×+;Ñ+;¸AÑ+>×+LÑ+LÓMˆKä(Ø#Ø%Ø'ØØ!×)Ñ)¨!Ñ,×5Ñ5ñð ô % R¨¬M×,EÑ,EÓFÐFøô[ ó GØˆ
Ü�
‰
Ð3°E·J±J°<¸rÀ!ÀÐE×FÒFûðGú÷B 'Ö&ûôP ó 	KÜ�J‰JÐ;¸A¸3Ð?Ô@Ü(¨¨Q´×0IÑ0IÓJÕJûð	Kús\   ¯I Á
A!J# Â+JÃBJ# Å	(J# Å2CJ# É
JÉ'J	Ê	JÊ
J ÊJ# Ê#
K*Ê-2K%ËK*Ë%K*)r}   rq   Úgeneration_stoppersr^   rt   r¤   c          
      ó¾  • [        5       n	U R                  U	S5        [        R                  " U	R	                  5       5      R                  S5      n
SSSSU
 30S.SUS	./S
./nUSS.UEn[        R                  S[        R                  " USS9 35        SS0U=(       d    0 EnSU;   a  [        US   5      US'   [        5        nUR                  [        U5      XÜUSS9 nUR                  (       d%  [        R                  SU SUR                   35        UR!                  5         / nSnSn[#        UUS9nUR%                  SS9 GHP  nU(       d  M  UR'                  S5      (       d  M%  U[)        S5      S R+                  5       nUS:X  a    GO [        R,                  " U5      n US   S   R1                  S 5      =(       d    0 nUR1                  S!5      =(       d    S"n[7        UU5      nUb  Un[9        U5      nU(       d  MÁ  UR;                  U5        U Hx  n[=        S$UR?                  5       5      nS"RA                  U5      U* S nURC                  U5      (       d  MJ  [E        S"RA                  U5      UUS%9s  s  sSSS5        sSSS5        $    GMS     [E        S"RA                  U5      UUS%9sSSS5        sSSS5        $ ! [        R.                   a    [        R                  SUSS 5         GM²  f = f! [2        [4        4 a#  n[        R                  S#U5        S"n SnAGNHSnAff = f! , (       d  f       O= f SSS5        g! , (       d  f       g= f)&a*  
Stream a chat completion from an OpenAI-compatible server (e.g., vLLM).
Parses SSE lines: 'data: {json}\n\n', terminated by 'data: [DONE]'.
Accumulates text and calls stopper.should_stop(window) as chunks arrive.
If stopper triggers, the HTTP connection is closed to abort server-side generation.
r€   r�   r‚   rƒ   r|   r„   r…   r/   r‡   rˆ   T)rŠ   ÚstreamzAPI streaming request payload: é   )ÚindentÚAcceptztext/event-streamÚtemperaturezX-Temperature)rq   r>   r}   r¦   zError calling the API z! in streaming mode. Response was Nrw   )Údecode_unicodezdata:z[DONE]zSkipping non-JSON SSE chunk: %réÈ   r›   r   ÚdeltarG   r,   zUnexpected SSE chunk shape: %sé   )r/   r‹   rb   )#r   r�   r“   r”   r•   r–   rP   Údebugr>   Údumpsr4   r(   r—   r˜   ro   r/   Úraise_for_statusrx   Ú
iter_linesÚ
startswithri   r5   r?   r@   r3   ÚKeyErrorÚ
IndexErrorra   rf   r6   ÚmaxÚlookback_tokensrA   Úshould_stopr
   )rz   r{   r|   r}   rq   r¤   r^   rt   rœ   r�   Ú	image_b64rŠ   rB   Úhdrsr&   r    Ú	full_textÚusage_payloadr‹   r¡   Úraw_lineÚdatar-   r­   Úpiecerr   rb   ÚstopperÚlookbackÚwindows                                 r'   Úapi_image_request_streamingrÃ     sc  € ô$ ‹Y€FØ	‡J�Jˆv�uÔÜ× Ò  §¡Ó!2Ó3×:Ñ:¸7ÓC€Ið ð (Ø"'Ð+AÀ)ÀÐ)MÐ!Nñð  ¨Ñ0ðñ		
ð€Hð Øñð ð€Gô 	‡J�JÐ0´·²¸GÈAÑ1NÐ0OÐPÔQð Ð)Ð=¨g¯m¸Ð=€Dð ˜ÓÜ # F¨=Ñ$9Ó :ˆˆ_Ñô 
Ô	 'Ø�\‰\Ü�‹H˜d¸'È$ð ñ 
àØ—4—4Ü—
‘
Ø,¨S¨Eð 2$Ø$%§F¡F 8ð-ôð ×ÑÔ àˆIØ ˆMØˆJÜ3Ø#5Ø"3ñˆIð ŸL™L¸˜LÔ=�ÞÙØ×*Ñ*¨7×3Ñ3áà¤ G£ Ð/×5Ñ5Ó7�Ø˜8Ó#ÚðÜŸ*š* TÓ*�CðØ 	™N¨1Ñ-×1Ñ1°'Ó:×@¸b�EØ!ŸI™I iÓ0×6°B�Eô
 0°°YÓ?�ØÑ$Ø$)�MÜ!6°uÓ!=�Jç�5Ø×$Ñ$ UÔ+Û#6˜ô $' q¨'×*AÑ*AÓ*CÓ#D˜Ø!#§¡¨Ó!3°X°I°JÐ!?˜Ø"×.Ñ.¨v×6Ó6ô
 $BØ%'§W¡W¨YÓ%7Ø+5Ø&3ñ$ó ÷{
ð 
÷ 
Ñ	ôh $7ñE >ôd 2Ø—W‘W˜YÓ'Ø%Ø#ñ÷G
ð 
÷ 
Ñ	øô> ×+Ñ+ó Ü—J‘JÐ@À$ÀtÈÀ*ÔMÛðûô !¤*Ð-ó Ü—J‘JÐ?ÀÔCØ–Eûðú÷Q
õ 
úð 
÷ 
×	Ö	ús†   ÃMÃ!B0L3ÆKÆ):K=Ç#!L3ÈAL3É%L3Ê	MÊ L3Ê5	MË-K:	Ë5L3Ë9K:	Ë:L3Ë=L0	ÌL+	Ì%L3Ì+L0	Ì0L3Ì3
M	Ì=MÍ
M)ry   N)1r“   r>   ÚloggingÚior   Útypingr   r!   ÚPILr   Úpydanticr   Úrequests.adaptersr   Úurllib3.util.retryr   Údocling.datamodel.base_modelsr	   r
   r   r   r   Ú%docling.models.utils.generation_utilsr   Ú	getLoggerÚ__name__rP   r   r   r    r"   r(   r4   rC   rK   rU   r]   ra   re   rf   rk   ÚResponsers   rx   Úfloatr2   r£   r1   rÃ   rv   r)   r'   Ú<module>rÑ      sœ  ðó Û Û Ý Ý ã Ý Ý Ý )Ý $÷õ õ Dà×Ò˜Ó"€à€ØÐ Ø3Ð ð˜X×-Ñ-ô ð( °°t±ð  Àô  ð4Ð%6ð ¸3ô ð - C¨$¡Jð -°=ô -ð	¨cð 	¸¸d¹
ð 	ÀsÈTÁzô 	ðIØðIØ/2°T©zðIàˆ4�ZôIð ð ¨¨t©ô ð 25ò $˜Cð $¨3ð $¸õ $ð 8×#4Ñ#4ð ¸¸t¹ô ð,Ø˜d™
ðà˜T‘zðð 	ˆ4�Zôð Ø%)ð`Gð &-Ø$(ò`GØ�;‰;ð`Gàð`Gð 
ð`Gð ð	`Gð
 �#�s�(‰^˜dÑ"ð`Gð ˜d™
ð`Gð ˜T‘zð`Gð ö`GðP Ø%)Ø35Ø%,Ø$(ò}Ø�;‰;ð}àð}ð 
ð}ð
 ð}ð �#�s�(‰^˜dÑ"ð}ð Ð/Ñ0ð}ð ˜d™
ð}ð ˜T‘zð}ð $ö}r)   