Ë
    uPêj�p  ã                   ó   — d Z ddlZddlmZ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 ddlmZ erdd	lmZ  G d
„ dede¬«      Z	 	 ddeez  dedz  dedz  dedz  ddf
d„Z	 ddedededz  dee   deez  f
d„Zy)z<Helpers for handling MCP-aware `/chat/completions` requests.é    N)ÚTYPE_CHECKINGÚFinalÚcast)Ú	TypedDictÚUnpack)ÚLiteLLM_Proxy_MCP_Handler)ÚMCPRequestContext)ÚMessageÚModelResponse)ÚCustomStreamWrapper)ÚUserAPIKeyAuthc                   ó   — e Zd ZdZy)Ú_MCPCompletionKwargszXExtra keywords forwarded verbatim to ``litellm.acompletion``, which owns their contract.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    ús/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/responses/mcp/chat_completions_handler.pyr   r      s   „ Úbr   r   F)ÚtotalÚextra_itemsÚresponseÚopenai_toolsÚ
tool_callsÚtool_resultsÚreturnc                 ó˜  — t        | t        «      r<t        | d«      si | _        i }|r||d<   |r||d<   |r||d<   |r|| j                  d<   yt        | t        «      syt        | d«      r| j
                  sy| j
                  D ]E  }t        |dd«      }|€Œt        |d	d«      xs i }|r||d<   |r||d<   |r||d<   t        |d	|«       ŒG y)
aû  
    Add MCP metadata to response's provider_specific_fields.

    This function adds MCP-related information to the response so that
    clients can access which tools were available, which were called, and
    what results were returned.

    For ModelResponse: adds to choices[].message.provider_specific_fields
    For CustomStreamWrapper: stores in _hidden_params and automatically adds to
    final chunk's delta.provider_specific_fields via CustomStreamWrapper._add_mcp_metadata_to_final_chunk()
    Ú_hidden_paramsÚmcp_list_toolsÚmcp_tool_callsÚmcp_call_resultsÚmcp_metadataNÚchoicesÚmessageÚprovider_specific_fields)Ú
isinstancer   Úhasattrr   r   r$   ÚgetattrÚsetattr)r   r   r   r   r#   Úchoicer%   Úprovider_fieldss           r   Ú_add_mcp_metadata_to_responser-      s  € ô" �(Ô/Ô0ô �xÐ!1Ô2Ø&(ˆHÔ#à ˆÙØ-9ˆLÐ)Ñ*ÙØ-7ˆLÐ)Ñ*ÙØ/;ˆLÐ+Ñ,áØ6BˆH×#Ñ# NÑ3Øä�h¤Ô.Øä�8˜YÔ'¨x×/?Ò/?Øð ×"Ñ"ò JˆÜ")¨&°)¸TÓ"BˆØÑä% gÐ/IÈ4ÓPÒVÐTVˆOñ Ø4@�Ð 0Ñ1ÙØ4>�Ð 0Ñ1ÙØ6B�Ð 2Ñ3ô �GÐ7¸ÕIñJr   ÚmodelÚmessagesÚtoolsÚkwargsc              ‹   ó<  ‡#‡$‡%‡&K  — ddl m} t        j                  |«      \  }}|s |d| ||dœ|¤Žƒ d{  –—† S t	        j
                  ||¬«      }|j                  }|j                  rt        |j                  «      nd}	|j                  }
|j                  }|j                  }|j                  }t        j                  |||j                  |
||	¬«      ƒ d{  –—† \  }}t        j                  |d¬«      }|s|r||z   nd}t        j                   |¬	«      }|j#                  «       D ��ci c]  \  }}|dvsŒ||“Œ }}}| ||d
dœ|¥}|s5 |di |¤Žƒ d{  –—† }t%        |t&        t(        f«      rt+        ||¬«       |S |j-                  dd«      }|j/                  dd«      }|rËt1        |«      }d
|d<   |�||d<    |di |¤Žƒ d{  –—† }t%        |t(        «      st%        |t&        «      rt+        ||¬«       |S ddlmŠ& ddlmŠ$  G ˆ$ˆ&fd„d«      Š# ‰#|||||
||||j:                  |j                  |||	¬«      } G ˆ#ˆ%fd„dt(        «      } G d„ d«      Š%t=        t(         |||«      «      S t1        |«      }d|d<   |�||d<    |di |¤Žƒ d{  –—† }t%        |t&        «      s|S t        j>                  |¬«      }|st+        ||¬«       |S t        j@                  ||||
||||j:                  |j                  |	¬«
      ƒ d{  –—† } | st+        |||¬«       |S t        jB                  ||| ¬«      }!t1        |«      }"|!|"d<   ||"d<    |di |"¤Žƒ d{  –—† }t%        |t&        t(        f«      rt+        |||| ¬«       |S 7 �ŒM7 �Œ­c c}}w 7 �Œ87 �ŒÉ7 �Œ7 Œ�7 ŒB­w) an  
    Async completion with MCP integration.

    This function handles MCP tool integration following the same pattern as aresponses_api_with_mcp.
    It's designed to be called from the synchronous completion() function and return a coroutine.

    When MCP tools with server_url="litellm_proxy" are provided, this function will:
    1. Get available tools from the MCP server manager
    2. Transform them to OpenAI format
    3. Call acompletion with the transformed tools
    4. If require_approval="never" and tool calls are returned, automatically execute them
    5. Make a follow-up call with the tool results
    r   )Úacompletion)r.   r/   r0   N)r1   r0   )Úuser_api_key_authÚmcp_tools_with_litellm_proxyÚlitellm_trace_idÚmcp_auth_headerÚmcp_server_auth_headersÚrequest_tagsÚchat)Útarget_format)r5   T)r.   r/   r0   Ú_skip_mcp_handler©r   r   ÚstreamFÚmock_tool_calls)Ústream_chunk_builder)ÚModelResponseStreamc                   óf   •— e Zd ZdZˆ fd„Zd„ ZdW ° dW ° fd„ZdW ° dW ° fd„Zd„ Zd	„ Z	ˆfd
„Z
d„ Zy)ú2acompletion_with_mcp.<locals>.MCPStreamingIteratorz_Custom iterator that collects chunks, detects tool calls, and adds MCP metadata to final chunk.c                 ó:  •— || _         || _        || _        || _        || _        || _        || _        || _        |	| _        |
| _	        || _
        || _        || _        g | _        d | _        d | _        d | _        d| _        d| _        d | _        d | _        d| _        y )NF)Ústream_wrapperr/   Útool_server_mapr4   r7   r8   Úoauth2_headersÚraw_headersÚlitellm_call_idr6   r   Úbase_call_argsr9   Úcollected_chunksr   r   Úcomplete_responseÚstream_exhaustedÚtool_execution_doneÚfollow_up_streamÚfollow_up_iteratorÚfollow_up_exhausted)ÚselfrE   r/   rF   r4   r7   r8   rG   rH   rI   r6   r   rJ   r9   rA   s                 €r   Ú__init__z;acompletion_with_mcp.<locals>.MCPStreamingIterator.__init__Î   s³   ø€ ð  '5�Ô#Ø (�”Ø'6�Ô$Ø):�Ô&Ø'6�Ô$Ø/F�Ô,Ø&4�Ô#Ø#.�Ô Ø'6�Ô$Ø(8�Ô%Ø$0�Ô!Ø&4�Ô#Ø$0�Ô!ØCE�Ô%Ø/3�”Ø15�Ô!Ø?C�Ô&Ø(-�Ô%Ø+0�Ô(Ø(,�Ô%Ø*.�Ô'Ø+0�Õ(r   c                 ó   — | S ©Nr   ©rR   s    r   Ú	__aiter__z<acompletion_with_mcp.<locals>.MCPStreamingIterator.__aiter__õ   ó   € Ø�r   Úchunkr   c                 ób  — ddl m}m} | j                  s|S t	        |d«      rŒ|j
                  r€|j
                  D ]q  }t        ||«      sŒt	        |d«      sŒ|j                  sŒ*t        |j                  dd«      xs i }t        |«      }| j                  |d<    ||j                  |«       Œs |S )z&Add mcp_list_tools to the first chunk.r   ©ÚStreamingChoicesÚadd_provider_specific_fieldsr$   Údeltar&   Nr    )
Úlitellm.types.utilsr\   r]   r   r(   r$   r'   r^   r)   Údict)rR   rY   r\   r]   r+   Úexisting_fieldsr,   s          r   Ú_add_mcp_list_tools_to_chunkzOacompletion_with_mcp.<locals>.MCPStreamingIterator._add_mcp_list_tools_to_chunkø   sª   € ÷ð
 ×(Ò(Ø �Lä˜5 )Ô,°·²Ø"'§-¡-ò X˜Ü% fÐ.>Õ?ÄGÈFÐT[ÕD\Ðag×amÓamä.5°f·l±lÐD^Ð`dÓ.eÒ.kÐik˜OÜ.2°?Ó.C˜Oð AE×@QÑ@Q˜OÐ,<Ñ=ñ 9¸¿¹ÀÕWðXð �r   c                 óè  — ddl m}m} t        |d«      rÝ|j                  rÑ|j                  D ]Â  }t        ||«      sŒt        |d«      sŒ|j                  sŒ*i }t        |j                  d«      r6t        |j                  dd«      }|�t        |t        «      rt        |«      ni }|}| j                  r| j                  |d<   | j                  r| j                  |d<    ||j                  |«       ŒÄ |S )	z;Add mcp_tool_calls and mcp_call_results to the final chunk.r   r[   r$   r^   r&   Nr!   r"   )r_   r\   r]   r(   r$   r'   r^   r)   r`   r   r   )rR   rY   r\   r]   r+   ra   Ú
attr_valuer,   s           r   Ú%_add_mcp_tool_metadata_to_final_chunkzXacompletion_with_mcp.<locals>.MCPStreamingIterator._add_mcp_tool_metadata_to_final_chunk  sâ   € ÷ô
 ˜5 )Ô,°·²Ø"'§-¡-ò X˜Ü% fÐ.>Õ?ÄGÈFÐT[ÕD\Ðag×amÓamð /1˜OÜ& v§|¡|Ð5OÔPÜ-4°V·\±\ÐC]Ð_cÓ-d 
Ø#-Ð#9äJTÐU_ÔaeÔJf´d¸:Ô6FÐln Oà.=˜Oð  $ŸšØDHÇOÁO Ð0@Ñ AØ#×0Ò0ØFJ×FWÑFW Ð0BÑ Cñ 9¸¿¹ÀÕWð+Xð. �r   c              “   óÒ   K  — 	 	 | j                   j                  «       ƒ d {  –—†  Œ#7 Œ# t        $ r Y y t        $ r' t	        j
                  d«      j                  d«       Y y w xY w­w)NÚLiteLLMzRError draining inner MCP stream after final chunk; spend logging may be incomplete)Ú_stream_iteratorÚ	__anext__ÚStopAsyncIterationÚ	ExceptionÚloggingÚ	getLoggerÚ	exceptionrV   s    r   Ú_drain_inner_streamzFacompletion_with_mcp.<locals>.MCPStreamingIterator._drain_inner_stream3  sc   è ø€ ðØØ"×3Ñ3×=Ñ=Ó?×?Ð?ð Ø?ùÜ)ò ÙÜ ò Ü×%Ñ% iÓ0×:Ñ:Ølöðüs2   ‚A'„* ¢(£* ª	A$³A'µ,A$Á!A'Á#A$Á$A'c              “   óÀ  K  — | j                   �s�t        | d«      s@| j                  j                  «       | _        t        | j                  | j                  ¬«       	 | j                  j                  «       ƒ d {  –—† }| j                  j                  |«       t        | j                  «      dk(  r| j                  |«      }t        |d«      xrD |j                  xr6 t        |j                  d   d«      xr |j                  d   j                  d u}|rxd| _         | j                  «       ƒ d {  –—†  | j                  |«      }| j                   r$| j"                  r| j%                  «       ƒ d {  –—†  | j'                  «       ƒ d {  –—†  |S | j*                  r‹| j,                  s| j.                  s6| j*                  j                  «       | _        dd	lm} |j5                  d
«       	 | j.                  j                  «       ƒ d {  –—† }dd	lm} |j5                  d|«       |S | j                   r;| j                   r/| j"                  r#| j*                  €dd	lm} |j7                  d«       t(        ‚7 �Œû7 �ŒG7 �Œ	7 Œó# t(        $ rž d| _         | j                  «       ƒ d {  –—†7   | j                  rn| j                  d   }| j                  |«      }| j                   r%| j"                  r| j%                  «       ƒ d {  –—†7   | j'                  «       ƒ d {  –—†7   |cY S Y �Œ•w xY w7 �Œ!# t(        $ r% d| _        dd	lm} |j5                  d«       t(        ‚w xY w­w)Nrh   r=   é   r$   r   Úfinish_reasonTéÿÿÿÿ©Úverbose_loggerz!Follow-up stream iterator createdzFollow-up chunk yielded: %szFollow-up stream exhaustedz<Follow-up stream was not created despite having tool results)rM   r(   rE   rW   rh   r-   r   ri   rK   ÚappendÚlenrb   r$   rr   Ú_process_tool_callsre   r   rL   Ú_prepare_follow_up_callro   rj   rO   rQ   rP   Úlitellm._loggingru   ÚdebugÚwarning)rR   rY   Úis_finalÚfinal_chunkru   s        r   ri   z<acompletion_with_mcp.<locals>.MCPStreamingIterator.__anext__>  s  è ø€ à×,Ó,ä" 4Ð);Ô<Ø04×0CÑ0C×0MÑ0MÓ0O˜Ô-ä5Ø%)×%8Ñ%8Ø)-×):Ñ):õð
)/Ø&*×&;Ñ&;×&EÑ&EÓ&G× G˜Ø×-Ñ-×4Ñ4°UÔ;ô ˜t×4Ñ4Ó5¸Ò:Ø$(×$EÑ$EÀeÓ$L˜Eô $ E¨9Ó5ò KØ %§¡òKä '¨¯©°aÑ(8¸/Ó JòKð !&§¡¨aÑ 0× >Ñ >ÀdÐ Jð	 !ñ $Ø48˜DÔ1Ø"&×":Ñ":Ó"<×<Ð<Ø$(×$NÑ$NÈuÓ$U˜EØ#×0Ò0°T×5KÒ5KØ&*×&BÑ&BÓ&D× DÐ Dð
 #'×":Ñ":Ó"<×<Ð<à$˜ð  ×(Ò(°×1IÒ1IØ×2Ò2Ø26×2GÑ2G×2QÑ2QÓ2S˜Ô/ÝCà&×,Ñ,Ð-PÔQð1Ø&*×&=Ñ&=×&GÑ&GÓ&I× I˜ÝCà&×,Ñ,Ð-JÈEÔRØ$˜ð ×)Ò)Ø×)Ò)Ø×.Ò.Ø×-Ñ-Ð5å?à"×*Ñ*Ð+iÔjä(Ð(ðW !Hùð" =ùð !Eùð
 =ùô .ò /Ø04˜Ô-à"×6Ñ6Ó8×8Ñ8à×0Ò0Ø*.×*?Ñ*?ÀÑ*C˜KØ*.×*TÑ*TÐU`Ó*a˜Kà#×0Ò0°T×5KÒ5KØ&*×&BÑ&BÓ&D× DÑ DØ"&×":Ñ":Ó"<×<Ñ<Ø#.Ò.ò 1ð/úð. !Júô
 .ò 1Ø37˜Ô0ÝCà&×,Ñ,Ð-IÔJä0Ð0ð1üsÅ   ‚AMÁJ  Á:I5Á;B6J  Ä1I8Ä2A J  Å2I;Å3J  Æ
I>ÆJ  ÆAMÇ,L- È	L*È
L- È'AMÉ5J  É8J  É;J  É>J  Ê #L'Ê#J&Ê$AL'Ì LÌL'ÌLÌL'Ì!MÌ&L'Ì'MÌ*L- Ì-.MÍMc              “   ó0  •K  — | j                   ryd| _         | j                  sy ‰| j                  | j                  ¬«      }t        |t        «      rÀ|| _        t        j                  |¬«      | _        | j                  r‘t        j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                   | j"                  | j$                  ¬«
      ƒ d{  –—† | _        yyy7 Œ­w)z-Process tool calls after streaming completes.NT)Úchunksr/   ©r   ©
rF   r   r4   r7   r8   rG   rH   rI   r6   r9   )rN   rK   r/   r'   r   rL   r   Ú&_extract_tool_calls_from_chat_responser   Ú_execute_tool_callsrF   r4   r7   r8   rG   rH   rI   r6   r9   r   )rR   rL   r@   s     €r   rx   zFacompletion_with_mcp.<locals>.MCPStreamingIterator._process_tool_calls˜  sø   øè ø€ à×+Ò+Øà+/�Ô(à×,Ò,Øñ ,@Ø×0Ñ0Ø!Ÿ]™]ô,Ð!ô
 Ð/´Ô?Ø->�DÔ*ä&?×&fÑ&fØ!2ô'�D”Oð —’ä2K×2_Ñ2_Ø,0×,@Ñ,@Ø'+§¡Ø.2×.DÑ.DØ,0×,@Ñ,@Ø48×4PÑ4PØ+/×+>Ñ+>Ø(,×(8Ñ(8Ø,0×,@Ñ,@Ø-1×-BÑ-BØ)-×):Ñ):ô3÷ -˜Õ)ð 'ð @ð-ús   ƒDDÄDÄDc              “   óú  K  — | j                   �y| j                  r| j                  syt        j                  | j
                  | j                  | j                  ¬«      }t        | j                  «      }||d<   d|d<   d|d<   ddl} |j                  di |¤Žƒ d{  –—† }t        |t        «      r|| _         ddlm} |j                  d	«       yddlm} |j                  d
t!        |«      «       d| _         y7 Œ\­w)z6Prepare and initiate follow-up call with tool results.N©Úoriginal_messagesr   r   r/   Tr>   r<   r   rt   z%Follow-up stream created successfullyz3Follow-up response is not a CustomStreamWrapper: %sr   )rO   r   rL   r   Ú#_create_follow_up_messages_for_chatr/   r`   rJ   Úlitellmr3   r'   r   rz   ru   r{   r|   Útype)rR   Úfollow_up_messagesÚfollow_up_call_argsr‰   Úfollow_up_responseru   s         r   ry   zJacompletion_with_mcp.<locals>.MCPStreamingIterator._prepare_follow_up_call¾  s  è ø€ à×(Ñ(Ð4Øà×(Ò(°×0FÒ0FØô -F×,iÑ,iØ&*§m¡mØ!×3Ñ3Ø!%×!2Ñ!2ô-Ð"ô .2°$×2EÑ2EÓ-FÐ#Ø2DÐ# JÑ/Ø04Ð# HÑ-à;?Ð#Ð$7Ñ8ó à2E°'×2EÑ2EÑ2\ÐH[Ñ2\×,\Ð"ô Ð0Ô2EÔFØ,>�DÔ)Ý?à"×(Ñ(Ð)PÕQõ @à"×*Ñ*ØMÌtÐTfÓOgôð -1�DÕ)ð -]ús   ‚BC;ÂC9ÂAC;N)r   r   r   r   rS   rW   rb   re   ro   ri   rx   ry   )rA   r@   s   €€r   ÚMCPStreamingIteratorrC   Ë   sS   ø„ Ùqô%1òNðÑ:Mð ÑReó ð4ÑCVð Ñ[nó òB	òX)ôt$óL)1r   rŽ   )rE   r/   rF   r4   r7   r8   rG   rH   rI   r6   r   rJ   r9   c                   óR   •‡ — e Zd ZdedW °fˆ fd„Zd„ Zˆfd„Zd„ Zdede	fd	„Z
ˆ xZS )
ú.acompletion_with_mcp.<locals>.MCPStreamWrapperÚoriginal_wrapperÚcustom_iteratorc                 ó&  •— t         ‰| �  d t        |dd«      |j                  t        |dd «      t        |dd «      t        |dd «      t        |dd «      ¬«       || _        || _        t        |d«      r|j                  | _        d | _        d | _	        y )	Nr.   ÚunknownÚcustom_llm_providerÚstream_optionsÚ	make_callÚ_response_headers)Úcompletion_streamr.   Úlogging_objr•   r–   r—   r˜   r   )
ÚsuperrS   r)   rš   Ú_original_wrapperÚ_custom_iteratorr(   r   Ú_sync_iteratorÚ
_sync_loop)rR   r‘   r’   Ú	__class__s      €r   rS   z7acompletion_with_mcp.<locals>.MCPStreamWrapper.__init__ý  s¢   ø€ ä‘Ñ Ø&*Ü!Ð"2°G¸YÓGØ 0× <Ñ <Ü(/Ð0@ÐBWÐY]Ó(^Ü#*Ð+;Ð=MÈtÓ#TÜ%Ð&6¸ÀTÓJÜ&-Ð.>Ð@SÐUYÓ&Zð !ô ð *:�Ô&Ø(7�Ô%äÐ+Ð-=Ô>Ø*:×*IÑ*I�DÔ'à&*�Ô#Ø"&�•r   c                 ó   — | j                   S rU   )r�   rV   s    r   rW   z8acompletion_with_mcp.<locals>.MCPStreamWrapper.__aiter__  s   € Ø×,Ñ,Ð,r   c                 ó*  •— | j                   €<dd l}	 |j                  «       | _         ‰| j                  | j                  «      | _         | j                   S # t        $ r3 |j                  «       | _        |j                  | j                  «       Y Œiw xY w)Nr   )rž   ÚasyncioÚget_event_looprŸ   ÚRuntimeErrorÚnew_event_loopÚset_event_loopr�   )rR   r£   Ú_SyncIteratorWrappers     €r   Ú__iter__z7acompletion_with_mcp.<locals>.MCPStreamWrapper.__iter__  s‡   ø€ à×&Ñ&Ð.Û"ð@Ø*1×*@Ñ*@Ó*B˜œñ +?¸t×?TÑ?TÐVZ×VeÑVeÓ*f�DÔ'Ø×*Ñ*Ð*øô	 (ò @Ø*1×*@Ñ*@Ó*B˜œØ×.Ñ.¨t¯©Ö?ð@ús   “A Á9BÂBc                 ód   — | j                   €| j                  «        t        | j                   «      S rU   )rž   r©   ÚnextrV   s    r   Ú__next__z7acompletion_with_mcp.<locals>.MCPStreamWrapper.__next__!  s(   € à×&Ñ&Ð.Ø—M‘M”OÜ˜D×/Ñ/Ó0Ð0r   Únamer   c                 ó.   — t        | j                  |«      S rU   )r)   rœ   )rR   r­   s     r   Ú__getattr__z:acompletion_with_mcp.<locals>.MCPStreamWrapper.__getattr__'  s   € ä˜t×5Ñ5°tÓ<Ð<r   )r   r   r   r   rS   rW   r©   r¬   ÚstrÚobjectr¯   Ú__classcell__)r    rŽ   r¨   s   @€€r   ÚMCPStreamWrapperr�   ü  s:   ù„ ð'Ð1Dð 'ÑWkõ 'ò(-ô+ò1ð=¨ð =°÷ =r   r³   c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)ú2acompletion_with_mcp.<locals>._SyncIteratorWrapperc                 ó.   — || _         || _        d | _        y rU   )Ú_async_iteratorÚ_loopÚ	_iterator)rR   Úasync_iteratorÚloops      r   rS   z;acompletion_with_mcp.<locals>._SyncIteratorWrapper.__init__-  s   € Ø'5�Ô$Ø!�”
Ø!%�•r   c                 ó   — | S rU   r   rV   s    r   r©   z;acompletion_with_mcp.<locals>._SyncIteratorWrapper.__iter__2  rX   r   c                 óD  — | j                   €N| j                  j                  «       }t        |d«      r!| j                  j                  |«      | _         n|| _         	 | j                  j                  | j                   j                  «       «      S # t        $ r t        ‚w xY w)NÚ	__await__)	r¹   r·   rW   r(   r¸   Úrun_until_completeri   rj   ÚStopIteration)rR   Úaiter_results     r   r¬   z;acompletion_with_mcp.<locals>._SyncIteratorWrapper.__next__5  s…   € Ø—>‘>Ð)à*.×*>Ñ*>×*HÑ*HÓ*J�LÜ˜|¨[Ô9à)-¯©×)FÑ)FÀ|Ó)T˜�ð *6˜œð(ØŸ:™:×8Ñ8¸¿¹×9QÑ9QÓ9SÓTÐTøÜ)ò (Ü'Ð'ð(ús   Á2B ÂBN)r   r   r   rS   r©   r¬   r   r   r   r¨   rµ   ,  s   „ ò&ò
ó(r   r¨   r�   r‚   )r   r   r   r†   r/   )r   r   r   r   r   )"r‰   r3   r   Ú_parse_mcp_toolsr	   Úresolver4   r9   Úlistr7   r8   rG   rH   Ú+_process_mcp_tools_without_openai_transformr6   Ú_transform_mcp_tools_to_openaiÚ_should_auto_execute_toolsÚitemsr'   r   r   r-   ÚgetÚpopr`   Úlitellm.mainr@   r_   rA   rI   r   rƒ   r„   rˆ   )'r.   r/   r0   r1   Úlitellm_acompletionr5   Úother_toolsÚcontextr4   r9   r7   r8   rG   rH   Údeduplicated_mcp_toolsrF   r   Ú	all_toolsÚshould_auto_executeÚkÚvÚclean_kwargsrJ   r   r>   r?   Úinitial_call_argsÚinitial_streamÚiteratorr³   Úinitial_responser   r   r‹   rŒ   rŽ   rA   r¨   r@   s'                                      @@@@r   Úacompletion_with_mcprÙ   T   sV  ûè ø€ õ& ;ô 	"×2Ñ2°5Ó9ñØ$Øñ (á(ð 
ØØØñ
ð ñ	
÷ 
ð 	
ô '×.Ñ.°fÀEÔJ€GØ6=×6OÑ6OÐØ8?×8LÒ8Lœ$˜w×3Ñ3Ô4ÐRV€LØ$×4Ñ4€OØ%,×%DÑ%DÐØ#×2Ñ2€NØ ×,Ñ,€Kô (×SÑSØ+Ø%AØ ×1Ñ1Ø'Ø 7Ø!ô÷ 	ñØØô 4×RÑRØØô€Lñ 7CÁk�| kÒ1ÐX\€Iô ";×!UÑ!UØ%Aô"Ðð -3¯L©L«N×W¡D A q¸aÀÒ>V˜1˜a™4ÐW€LÑWð ØØØ!ñ	ð
 ð€Nñ Ù,Ñ>¨~Ñ>×>ˆÜ�h¤Ô0CÐ DÔEÜ)Ø!Ø)õð ˆð #ŸJ™J x°Ó7€FØ+×/Ñ/Ð0AÀ4ÓH€Oáä  Ó0ÐØ&*Ð˜(Ñ#ØÐ&Ø3BÐÐ/Ñ0ñ ':Ñ&NÐ<MÑ&N× Nˆä˜.Ô*=Ô>ä˜.¬-Ô8Ü-Ø+Ø!-õð "Ð!õ 	6Ý;÷\	1ô \	1ñ~ /Ø)ØØ+Ø/Ø+Ø$;Ø)Ø#Ø#×3Ñ3Ø$×5Ñ5Ø%Ø)Ø%ô
ˆ÷$-	=Ô2ô -	=÷`	(ñ 	(ô0 Ô'Ñ)9¸.È(Ó)SÓTÐTô ˜^Ó,ÐØ"'Ð�hÑØÐ"Ø/>ÐÐ+Ñ,ñ %8Ñ$LÐ:KÑ$L×LÐäÐ&¬Ô6ØÐô 2×XÑXÐbrÔs€JáÜ%Ø%Ø%õ	
ð  Ðô !:× MÑ MØ'ØØ+Ø'Ø 7Ø%ØØ×/Ñ/Ø ×1Ñ1Ø!ô!÷ €Lñ Ü%Ø%Ø%Ø!õ	
ð
  Ðô !:× ]Ñ ]Ø"Ø!Ø!ô!Ðô "& nÓ!5ÐØ&8Ð˜
Ñ#Ø$*Ð˜Ñ!á(Ñ?Ð+>Ñ?×?€HÜ�(œ]Ô,?Ð@ÔAÜ%ØØ%Ø!Ø%õ		
ð €Oðk
ùð&	ûó0 Xð ?ùð( !Oùðb Mùð øðB @ús“   †0N¶N·B"NÃNÃANÄ,N	Ä9N	Ä>NÅNÅA1NÇ	NÇ
C
NÊNÊA3NÌNÌ	ANÍNÍ,NÎNÎ	NÎNÎNÎNÎN)NNrU   )r   rl   Útypingr   r   r   Útyping_extensionsr   r   Ú/litellm.responses.mcp.litellm_proxy_mcp_handlerr   Ú%litellm.responses.mcp.request_contextr	   r_   r
   r   Úlitellm.utilsr   Úlitellm.proxy._typesr   r±   r   rÄ   r-   r°   rÙ   r   r   r   ú<module>rà      sß   ðÙ Bã ß -Ñ -ç /õõ Dß 6Ý -áÝ3ôc˜9¨E¸võ cð #Ø $ñ	:JØÐ1Ñ1ð:Jà˜‘+ð:Jð �t‘ð:Jð ˜‘+ð	:Jð
 
ó:Jð@ ñrØðràðrð �$‰;ðrð Ð)Ñ*ð	rð
 Ð(Ñ(ôrr   