Ë
    uPêj7^  ã                   ó¾  — U d Z ddlZddlZddlZddlmZmZ ddlmZm	Z	m
Z
mZmZ ddlmZ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 eZeed<   dZe
ed<    G d„ de«      Z dee   dz  ddde!fd„Z"de#e$   de%e$ef   fd„Z&dee   dz  de'e#e   e#e$   f   fd„Z(de#e$   de#e$   de'e#e$   e#e   f   fd„Z)dAdede$dedefd„Z*dede$fd„Z+de#e   de$fd „Z,de#e   de#e%e$ef      fd!„Z-	 	 dBd"e$de#e$   de#e   dz  d#e!de%e$ef   f
d$„Z.de#e   d%e$de#e%e$ef      fd&„Z/d'e$de#e   de%e$ef   fd(„Z0d)ede$fd*„Z1	 dAd+ed,e%e$ef   d-e%e$ef   d.edz  def
d/„Z2d0„ Z3d1e%e$ef   de'e!e%e$ef   f   fd2„Z4d3ed4e$de'e$e$f   fd5„Z5d6e d7ede#e$   fd8„Z6d9ee   d:e#e$   d7ed;e$de'e#e   e#e$   e#e   f   f
d<„Z7d7ed.ed=e#e   de#e   fd>„Z8	 dAd7ed?e$dee   dz  d1e	def
d@„Z9y)Ca  
Emulated file_search for providers that don't support the tool natively.

Flow:
  1. Convert file_search tools to a single function tool definition.
  2. Call the provider with the function tool.
  3. If the provider issues a file_search function_call, execute vector search
     via litellm.vector_stores.main.asearch().
  4. Feed results back and get the final answer.
  5. Wrap everything in OpenAI Responses-API format:
       [file_search_call output item] + [message output item with file_citation annotations]
é    N)ÚIterableÚSequence)ÚTYPE_CHECKINGÚAnyÚFinalÚ	TypeAliasÚcast)ÚNotRequiredÚReadOnlyÚ	TypedDict)Úis_internal_call)Úverbose_logger)ÚResponseOutputItemÚResponsesAPIResponse)ÚVectorStoreSearchResult)ÚBaseResponsesAPIConfigÚ	ToolParamÚlitellm_file_searchÚFILE_SEARCH_FUNCTION_NAMEc                   óP   — e Zd ZU eee      ed<   eee      ed<   eee      ed<   y)ÚFileSearchToolCallArgsÚqueriesÚqueryÚvector_store_idN)Ú__name__Ú
__module__Ú__qualname__r   r
   ÚobjectÚ__annotations__© ó    ús/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/responses/file_search/emulated_handler.pyr   r   $   s2   … Ø�k &Ñ)Ñ*Ó*Ø�K Ñ'Ñ(Ó(Ø˜k¨&Ñ1Ñ2Ô2r!   r   ÚtoolsÚprovider_configzBaseResponsesAPIConfig | NoneÚreturnc                 ó`   — | syt        d„ | D «       «      }|sy|du xs |j                  «        S )zWReturn True when there is a file_search tool and the provider can't handle it natively.Fc              3   óh   K  — | ]*  }t        |t        «      xr |j                  d «      dk(  –— Œ, y­w)ÚtypeÚfile_searchN)Ú
isinstanceÚdictÚget©Ú.0Úts     r"   ú	<genexpr>z2should_use_emulated_file_search.<locals>.<genexpr>6   s-   è ø€ Ò^ÐSTœ
 1¤dÓ+ÒN°·±°f³ÀÑ0NÓNÑ^ùs   ‚02N)ÚanyÚsupports_native_file_search)r#   r$   Úhas_fss      r"   Úshould_use_emulated_file_searchr4   /   s=   € ñ
 ØÜÑ^ÐX]Ô^Ó^€FÙØØ˜dÐ"ÒW¨/×*UÑ*UÓ*WÐ&WÐWr!   Úvector_store_idsc           	      ó<   — dt         dddddiddœdd	| d
œdœdgdœdœS )aõ  
    Create a Responses API function-tool definition that describes file search.
    The function accepts one or more natural-language queries (like OpenAI's native
    file_search); LiteLLM runs the actual vector search against the configured
    vector stores.

    Note: Uses Responses API format (name/description/parameters at top level),
    NOT Chat Completion format (nested under "function"), so that the
    LiteLLMCompletionResponsesConfig transformation picks up name and description.
    ÚfunctionzøSearch the knowledge base for information relevant to the query. Use this whenever you need to look up specific facts, documents, or content from the vector store. You can provide multiple queries to search for different aspects of the information.r   Úarrayr(   Ústringz†One or more search queries to look up in the vector store. Multiple queries help find comprehensive information from different angles.)r(   ÚitemsÚdescriptionz!ID of the vector store to search.)r(   r;   Úenum)r   r   r   )r(   Ú
propertiesÚrequired)r(   Únamer;   Ú
parameters)r   )r5   s    r"   Ú_build_function_toolrA   A   sW   € ð Ü)ðBð ð $Ø$ hÐ/ð,ñ	ð %Ø#FØ,ñ$ñð  #˜ñ%
ñð r!   c                 óT  — g }g }| xs g D ]^  }t        |t        «      r;|j                  d«      dk(  r'|j                  d«      xs g }|j                  |«       ŒN|j	                  |«       Œ` t        t        j                  |«      «      }|r|j	                  t        |«      «       ||fS )z�
    Replace all file_search tools with a single function tool.

    Returns:
        (new_tools_list, all_vector_store_ids)
    r(   r)   r5   )r*   r+   r,   ÚextendÚappendÚlistÚfromkeysrA   )r#   Únon_file_searchr5   ÚtoolÚidsÚ
unique_idss         r"   Ú_replace_file_search_toolsrK   l   s¤   € ð ,.€OØ)+Ðà’˜ò )ˆÜ�dœDÔ! d§h¡h¨vÓ&6¸-Ò&GØ—(‘(Ð-Ó.Ò4°"ˆCØ×#Ñ# CÕ(à×"Ñ" 4Õ(ð)ô $(¬¯©Ð6FÓ(GÓ#H€JÙØ×ÑÔ3°JÓ?Ô@à˜JÐ&Ð&r!   r   c           	   ƒ   ób  K  — ddl mc m} g }|}| D ]f  }|D ]_  }	 |j                  ||¬«      ƒ d{  –—† }t	        |t
        «      r|j                  d«      nt        |dd«      }|r|j                  |«       Œa Œh | |fS 7 ŒM# t        $ r"}	t        j                  d|||	«       Y d}	~	Œ�d}	~	ww xY w­w)a%  
    Run `asearch` against all vector stores for all queries and collect results.

    Args:
        queries: List of search queries to execute (like OpenAI's multi-query approach)
        vector_store_ids: Vector store IDs to search

    Returns:
        (queries_list, combined_results)
    r   N)r   r   ÚdatazLfile_search emulated: search failed for query='%s', vector_store_id='%s': %s)Úlitellm.vector_stores.mainÚvector_storesÚmainÚasearchr*   r+   r,   ÚgetattrrC   Ú	Exceptionr   Úwarning)
r   r5   Úvs_mainÚall_resultsÚids_to_searchr   Úvs_idÚresponseÚresults_dataÚexcs
             r"   Ú_run_vector_searchesr\   Œ   sØ   è ø€ ÷ 1Ð0à8:€KØ+€Mð ò ˆØ"ò 	ˆEðØ!(§¡Ø$)Øð "1ó "÷ �ô 8BÀ(ÌDÔ7Q˜xŸ|™|¨FÔ3ÔW^Ð_gÐioÐquÓWv�ÙØ×&Ñ& |Ô4øñ	ðð$ �KÐÐðùô ò Ü×&Ñ&ØbØØØ÷	ñ ûðüs?   ‚B/›B±A?²ABÁ7B/Á?BÂ	B,Â
B'Â"B/Â'B,Â,B/ÚresultÚkeyÚdefaultc                 ó`   — t        | t        «      r| j                  ||«      S t        | ||«      S )zGRead a field from either a dict/TypedDict or an attribute-based object.)r*   r+   r,   rR   )r]   r^   r_   s      r"   Ú
_get_fieldra   º   s,   € ä�&œ$ÔØ�z‰z˜#˜wÓ'Ð'Ü�6˜3 Ó(Ð(r!   c                 óþ   — t        t        t           t        | d«      xs g «      }|D �cg c]1  }t	        |t
        «      r|j                  dd«      nt        |dd«      ‘Œ3 }}dj                  d„ |D «       «      S c c}w )z?Concatenate the text of every content chunk on a search result.ÚcontentÚtextÚ ú c              3   ó&   K  — | ]	  }|sŒ|–— Œ y ­w©Nr    r-   s     r"   r0   z'_joined_content_text.<locals>.<genexpr>Å   s   è ø€ Ò0˜!ªa”AÑ0ùs   ‚Š)	r	   r   r   ra   r*   r+   r,   rR   Újoin)r]   Úcontent_itemsÚcÚtext_chunkss       r"   Ú_joined_content_textrm   Á   st   € ä¤¬Ñ 0´*¸VÀYÓ2OÒ2UÐSUÓV€MØhuÖvÐcd¬z¸!¼TÔ/B˜!Ÿ%™% ¨Ô+ÌÐPQÐSYÐ[]ÓH^Ñ^Ðv€KÐvØ�8‰8Ñ0˜{Ô0Ó0Ð0ùò ws   ª6A:Úresultsc                 ó2  — | syg }t        | d«      D ]s  \  }}t        |d«      }t        |d«      }t        |d«      }t        |«      }d|› �}|r|d|› �z  }|r|d|› �z  }|�	|d	|d
›�z  }|dz  }|j                  |› d|› �«       Œu dj	                  |«      S )zISerialize search results into a string to pass back as the tool's output.z%No results found in the vector store.é   ÚscoreÚfile_idÚfilenamez[Result z | z | file_id=z	 | score=z.3fú]ú
z

)Ú	enumeratera   rm   rD   ri   )	rn   ÚpartsÚir]   rq   rr   rs   rd   Úheaders	            r"   Ú%_format_search_results_as_tool_outputrz   È   sÔ   € ñ Ø6à €EÜ˜w¨Ó*ò *‰	ˆˆ6Ü˜6 7Ó+ˆÜ˜V YÓ/ˆÜ˜f jÓ1ˆÜ# FÓ+ˆà˜A˜3�ˆÙØ˜˜H˜:Ð&Ñ&ˆFÙØ˜ G 9Ð-Ñ-ˆFØÐØ˜	 %¨ Ð-Ñ-ˆFØ�#‰ˆà�‰˜�x˜r $ Ð(Õ)ð*ð" �;‰;�uÓÐr!   c                 óÈ   — g }| D ]Z  }t        |d«      xs d}t        |«      }|j                  |t        |d«      xs dt        |d«      |t        |d«      xs i dœ«       Œ\ |S )ur  
    Convert VectorStoreSearchResult objects to the format expected in
    file_search_call.search_results (mirrors OpenAI's include= format).

    All chunks are returned â€” no deduplication by file_id â€” matching the
    behaviour of OpenAI's native file_search which surfaces every relevant
    chunk even when multiple chunks originate from the same document.
    rr   re   rs   rq   Ú
attributes)rr   rs   rq   rd   r|   )ra   rm   rD   )rn   Ú	formattedr]   rr   rd   s        r"   Ú!_build_search_results_for_includer~   ä   s|   € ð 13€IØò 
ˆÜ˜V YÓ/Ò5°2ˆÜ# FÓ+ˆØ×Ñà"Ü& v¨zÓ:Ò@¸bÜ# F¨GÓ4ØÜ(¨°Ó>ÒDÀ"ñõ	
ð
ð Ðr!   Úcall_idÚinclude_search_resultsc                 ó4   — d}|r|rt        |«      }d| d||dœS )a‹  Build the file_search_call output item (mirrors OpenAI's format).

    Args:
        call_id: Unique ID for this file_search call.
        queries: List of search queries used.
        results: The raw search results (used when include_search_results=True).
        include_search_results: Populate search_results when the caller passed
            ``include=["file_search_call.results"]``.
    NÚfile_search_callÚ	completed)r(   ÚidÚstatusr   Úsearch_results)r~   )r   r   rn   r€   r†   s        r"   Ú_build_file_search_call_outputr‡   ÿ   s1   € ð €NÙ¡'Ü:¸7ÓCˆà"ØØØØ(ñð r!   rd   c                 óÖ   — g }t        |«      }t        «       }| D ]L  }t        |d«      }t        |d«      }|r||v rŒ"|j                  |«       |j	                  d|||xs ddœ«       ŒN |S )z~
    Build file_citation annotations for the text.
    Each result with a file_id gets a citation at the end of the text.
    rr   rs   Úfile_citationre   )r(   Úindexrr   rs   )ÚlenÚsetra   ÚaddrD   )rn   rd   ÚannotationsrŠ   Úseen_file_idsr]   rr   rs   s           r"   Ú _build_file_citation_annotationsr�     s†   € ð 35€KÜ�t“9€EÜ(+«€Màò 
ˆÜ˜V YÓ/ˆÜ˜f jÓ1ˆÙ˜' ]Ñ2ØØ×Ñ˜'Ô"Ø×Ñà'ØØ"Ø$šN¨ñ	õ	
ð
ð Ðr!   Úresponse_textc                 ó0   — t        || «      }ddd| |dœgdœS )zFBuild the message output item with optional file_citation annotations.ÚmessageÚ	assistantÚoutput_text)r(   rd   rŽ   )r(   Úrolerc   )r�   )r‘   rn   rŽ   s      r"   Ú_build_message_outputr—   8  s5   € ô
 :¸'À=ÓQ€KàØð &Ø%Ø*ñð
ñ
ð 
r!   rY   c                 óè  — | j                   D ]ã  }t        |t        «      r|j                  d«      nt	        |dd«      }|dk(  sŒ7t        |t        «      r|j                  d«      nt	        |dg «      }|xs g D ]v  }t        |t        «      r|j                  d«      nt	        |dd«      }|dk(  sŒ7t        |t        «      r|j                  d«      nt	        |dd«      }|�t        |«      ndc c S  Œå y)z7Pull the assistant's text from the provider's response.r(   Nr“   rc   r•   rd   re   )Úoutputr*   r+   r,   rR   Ústr)rY   ÚitemÚ	item_typerc   ÚblockÚ
block_typeÚraws          r"   Ú#_extract_text_from_responses_outputr    K  sà   € à—‘ò ?ˆÜ(2°4¼Ô(>�D—H‘H˜VÔ$ÄGÈDÐRXÐZ^ÓD_ˆ	Ø˜	Ó!Ü-7¸¼dÔ-C�d—h‘h˜yÔ)ÌÐQUÐW`ÐbdÓIeˆGØ š Bò ?�Ü2<¸UÄDÔ2I˜UŸY™Y vÔ.ÌwÐW\Ð^dÐfjÓOk�
Ø Ó.Ü/9¸%ÄÔ/F˜%Ÿ)™) FÔ+ÌGÐTYÐ[aÐceÓLf�CØ'* œ3˜sœ8¸BÔ>ñ	?ð	?ð r!   Úoriginal_responseÚfile_search_call_outputÚmessage_outputÚfirst_responsec                 ó¤  — ||g}t        t        | ddt        j                  «       j                  › �«      dt        | dt        t        j                  «       «      «      dt        | dd«      t        t        t        t        t        t        f   z     |«      t        | dd	«      d	¬
«      }t        | d«      r�t        t        | d«      xs i «      }|�{t        |d«      rot        |d«      xs i }t        |t        «      r|j                  d«      nt        |dd	«      }|�/t        |t        «      r|j                  d«      nd}	|	xs d|z   |d<   ||_        |S )a^  
    Return a new ResponsesAPIResponse with:
      output[0] = file_search_call item
      output[1] = message item (with citations)

    When first_response is provided, its response_cost is accumulated into the
    synthesized _hidden_params so that billing callbacks see the total cost of
    both provider calls that the emulated flow makes.
    r„   Úresp_rY   Ú
created_atrƒ   Úmodelre   ÚusageN)r„   r   r§   r…   r¨   r™   r©   ÚerrorÚ_hidden_paramsÚresponse_costr   )r   rR   ÚuuidÚuuid4ÚhexÚintÚtimer	   rE   r   r+   rš   r   Úhasattrr*   r,   r«   )
r¡   r¢   r£   r¤   Úsynthesized_outputÚsynthesizedÚhiddenÚfirst_hiddenÚ
first_costÚcurrent_costs
             r"   Ú"_synthesize_responses_api_responser¹   Y  sR  € ð ;RÐSaÐ9bÐÜ-ÜÐ$ d¨e´D·J±J³L×4DÑ4DÐ3EÐ,FÓGØÜÐ,¨l¼CÄÇ	Á	ÃÓ<LÓMØÜÐ'¨°"Ó5Ü”DÔ+¬d´3¼°;Ñ.?Ñ?Ñ@ÐBTÓUÜÐ'¨°$Ó7Øô	€Kô Ð Ð"2Ô3ÜœWÐ%6Ð8HÓIÒOÈRÓPˆØÐ%¬'°.ÐBRÔ*SÜ*1°.ÐBRÓ*SÒ*YÐWYˆLô ˜l¬DÔ1ð × Ñ  Ô1ä˜\¨?¸DÓAð ð
 Ð%ÜEOÐPVÔX\ÔE] f§j¡j°Ô&AÐcd�Ø+7Ò+<¸1À
Ñ*J��Ñ'Ø%+ˆÔ"ØÐr!   c              ‹   óB   K  — ddl m}  |d| ||dœ|¤Žƒ d {  –—† S 7 Œ­w)Nr   )Ú
aresponses©Úinputr¨   r#   r    )Úlitellm.responses.mainr»   )r½   r¨   r#   Úkwargsr»   s        r"   Ú_call_aresponsesrÀ   ˆ  s&   è ø€ Ý1áÐL %¨u¸EÑLÀVÑL×LÐLÐLús   ‚˜™r¿   c                 óà   — | j                  d«      xs g }t        t        t        t           |«      «      }d|v }| j                  d«      }| }|rt        j                  d«       i | ¥ddi¥}||fS )NÚincludezfile_search_call.resultsÚstreamz[Streaming is not yet supported for emulated file_search. Disabling stream for this request.F)r,   rE   r	   r   r   r   Údebug)r¿   Úraw_includeÚinclude_itemsr€   Úoriginal_streamÚupdated_kwargss         r"   Ú"_prepare_emulated_file_search_callrÉ   Ž  s}   € ð  Ÿ™ IÓ.Ò4°"€KÜ)-¬d´8¼FÑ3CÀ[Ó.QÓ)R€MØ$>À-Ð$OÐà#ŸZ™Z¨Ó1€OØ(.€NÙÜ×ÑØiô	
ð 5˜FÐ4 H¨eÑ4ˆà! >Ð1Ð1r!   Ú	tool_callÚfallback_call_idc                 ó6  — t        | t        «      rJt        | j                  d«      xs | j                  d«      xs |«      }| j                  d«      xs d}||fS t	        | dd«      xs t	        | dd«      xs |}t        |«      }t	        | dd«      xs d}||fS )zOExtract (call_id, raw_arguments_string) from a dict or Pydantic tool_call item.r   r„   Ú	argumentsz{}N)r*   r+   rš   r,   rR   )rÊ   rË   r   Úraw_argsÚraw_call_ids        r"   Ú_extract_tool_call_fieldsrÐ      s¡   € ä�)œTÔ"Ü�i—m‘m IÓ.ÒY°)·-±-ÀÓ2EÒYÐIYÓZˆØ—=‘= Ó-Ò5°ˆð
 �HÐÐô % Y°	¸4Ó@ÒvÄGÈIÐW[Ð]aÓDbÒvÐfvˆÜ�kÓ"ˆÜ˜9 k°4Ó8Ò@¸DˆØ�HÐÐr!   Úargsr½   c                 óî   — | j                  d«      }|s0| j                  d«      }|rt        t        |«      gS t        |«      gS t        |t        «      st        |«      gS t        t        t           |«      S )zXPull the queries list out of parsed tool-call arguments, with backward-compat fallbacks.r   r   )r,   r	   rš   r*   rE   )rÑ   r½   Úqueries_from_callÚsingle_querys       r"   Ú_resolve_queries_from_argsrÕ   ¬  sk   € à#Ÿx™x¨	Ó2ÐÙà"Ÿh™h wÓ/ˆÙ,8””S˜,Ó'Ð(ÐJ¼sÀ5»z¸lÐJÜÐ'¬Ô.ÜÐ%Ó&Ð'Ð'Ü””S‘	Ð,Ó-Ð-r!   Úfile_search_callsÚ
all_vs_idsÚfile_search_call_idc              ƒ   óì  K  — g }g }g }| D ]Ä  }t        ||¬«      \  }}		 t        |	t        «      rt        j                  |	«      n|	}
t        |
|«      }|
j                  d«      }|rt        t        |«      gn|}t        ||¬«      ƒ d{  –—† \  }}|j                  |«       |j                  |«       |j                  d|t        |«      dœ«       ŒÆ |||fS # t        j
                  $ r i }
Y Œ¨w xY w7 Œi­w)zIRun the vector search for each file_search tool_call and collect results.)rË   r   )r   r5   NÚfunction_call_output)r(   r   r™   )rÐ   r*   rš   ÚjsonÚloadsÚJSONDecodeErrorrÕ   r,   r	   r\   rC   rD   rz   )rÖ   r×   r½   rØ   Útool_resultsÚall_queriesrV   rÊ   r   rÎ   rÑ   rÓ   Ú	vs_id_argÚvs_ids_for_callr   rn   s                   r"   Ú_execute_file_search_tool_callsrâ   ¸  s  è ø€ ð )+€LØ$&€KØ8:€Kà&ò 
ˆ	Ü5°iÐReÔfÑˆ�ð	ÜCMÈhÔX[ÔC\¬4¯:©:°hÔ+?ÐbjˆDô 7°t¸UÓCÐà—H‘HÐ.Ó/ˆ	Ù4=œ4¤ YÓ/Ñ0À:ˆä!5Ø%Ø,ô"
÷ 
Ñˆ�ð 	×Ñ˜7Ô#Ø×Ñ˜7Ô#à×Ñà.Ø"Ü?ÀÓHñõ	
ð)
ð8 ˜ kÐ1Ð1øô/ ×#Ñ#ò 	ØŠDð	úð
ús6   ‚C4Ÿ'CÁAC4ÂC2Â	AC4ÃC/Ã,C4Ã.C/Ã/C4rÞ   c                 óZ  — t        | t        t        f«      rt        | «      ndt        | «      dœg}g }|j                  D ]c  }t        |t
        «      r|j                  |«       Œ%t        |d«      r"|j                  |j                  d¬«      «       ŒS|j                  |«       Œe ||z   |z   S )a‚  Assemble the follow-up call input: original messages + first-response output + tool results.

    Including all output items (text blocks, reasoning, non-file-search calls) ensures providers
    like Anthropic that emit text before the tool call have complete conversation context.
    Serializes Pydantic model instances to plain dicts so the transformation layer can call .get().
    Úuser)r–   rc   Ú
model_dumpT)Úexclude_none)	r*   rE   Útuplerš   r™   r+   rD   r²   rå   )r½   r¤   rÞ   Úoriginal_input_itemsÚfirst_response_output_itemsÚ_items         r"   Ú_build_follow_up_inputrë   â  sª   € ô " %¬$´¨Ô7ŒˆUŒÀvÔZ]Ð^cÓZdÑ>eÐ=fð ð 8:ÐØ×&Ñ&ò 6ˆÜ�eœTÔ"Ø'×.Ñ.¨uÕ5Ü�U˜LÔ)Ø'×.Ñ.¨u×/?Ñ/?ÈTÐ/?Ó/RÕSà'×.Ñ.¨uÕ5ð6ð  Ð"=Ñ=ÀÑLÐLr!   r¨   c           
   ‹   ó  K  — t        |¬«      \  }}t        |«      \  }}t        j                  «       }t        j                  d«       	 t        t        t        d| ||xs ddœ|¤Žƒ d{  –—† «      }	t        j                  |«       |	j                  D �
cg c]o  }
t        |
t        «      r,|
j                  d«      dk(  r|
j                  d«      t        k(  s/t        |
d«      r%t        |
d«      dk(  rt        |
dd«      t        k(  r|
‘Œq }}
|s^dt        j                  «       j                   dd	 › �}t#        |	«      }t%        |	t'        |t)        | «      gdd
¬«      t+        |g «      ¬«      S dt        j                  «       j                   dd	 › �}t-        ||| |¬«      ƒ d{  –—† \  }}}t/        | |	|¬«      }t        j                  d«       	 t        t        t        d||ddœ|¤Žƒ d{  –—† «      }t        j                  |«       t#        |«      }t%        |t'        ||xs t)        | «      g||¬«      t+        ||«      |	¬«      S 7 �ŒÞ# t        j                  |«       w xY wc c}
w 7 ŒÇ7 Œ€# t        j                  |«       w xY w­w)zß
    Emulated file_search for providers that don't support it natively.

    Replaces file_search tools with a function tool, intercepts the tool call,
    runs vector search, and synthesizes an OpenAI-format response.
    )r¿   TNr¼   r(   Úfunction_callr?   Úfs_é   F)r   r   rn   r€   )r¡   r¢   r£   )rÖ   r×   r½   rØ   )r½   r¤   rÞ   )r¡   r¢   r£   r¤   r    )rÉ   rK   r   r,   rŒ   r	   r   rÀ   r™   r*   r+   r   r²   rR   r­   r®   r¯   r    r¹   r‡   rš   r—   râ   rë   )r½   r¨   r#   r¿   Ú_include_search_resultsÚcall_kwargsÚtransformed_toolsr×   Ú_prev_internalr¤   r›   rÖ   r   r‘   rØ   rÞ   rß   rV   Úfollow_up_inputÚfinal_responses                       r"   Ú$aresponses_with_emulated_file_searchrö   ü  s±  è ø€ ô ,NÐU[Ô+\Ñ(Ð˜[ô %?¸uÓ$EÑ!Ð�zô
 -×0Ñ0Ó2€NÜ×Ñ˜Ôð-Ü6:Ü Ü"ð ØØØ'Ò/¨4ñð ñ	÷ ó7
ˆô 	×Ñ˜^Ô,ð
 #×)Ñ)ö àä�tœTÔ"Ø—‘˜Ó  OÒ3Ø—‘˜Ó Ô$=Ò=ô �D˜&Ô!Ü˜˜fÓ%¨Ò8Ü˜˜f dÓ+Ô/HÒHò 	ð Ðð  ñ ð œtŸz™z›|×/Ñ/°°Ð4Ð5Ð6ˆÜ;¸NÓKˆÜ1Ø,Ü$BØÜ˜U›˜ØØ',ô	%ô 1°ÀÓCô	
ð 		
ð $'¤t§z¡z£|×'7Ñ'7¸¸Ð'<Ð&=Ð!>ÐÜ3RØ+ØØØ/ô	4÷ .Ñ*€L�+˜{ô 4ØØ%Ø!ô€Oô ×Ñ˜Ôð-Ü6:Ü Ü"ð Ø%ØØñð ñ	÷ ó7
ˆô 	×Ñ˜^Ô,ô 8¸ÓG€Mä-Ø(Ü >Ø'ØÒ/¤C¨£J <ØØ#:ô	!
ô -¨]¸KÓHØ%ô
ð 
ð[úô 	×Ñ˜^Õ,üò ðB.øð(ùô 	×Ñ˜^Õ,üsu   ‚AJÁ
 I Á*I
Á+I Á3#JÂA4I%Ä
BJÆ"I*Æ#+JÇI. Ç+I,
Ç,I. Ç4AJÉI ÉI"É"	JÉ,I. É.JÊJrh   )NF):Ú__doc__rÛ   r±   r­   Úcollections.abcr   r   Útypingr   r   r   r   r	   Útyping_extensionsr
   r   r   Úlitellm._internal_contextr   Úlitellm._loggingr   Úlitellm.types.llms.openair   r   Úlitellm.types.vector_storesr   Ú.litellm.llms.base_llm.responses.transformationr   r   r   r   r   r   Úboolr4   rE   rš   r+   rA   rç   rK   r\   ra   rm   rz   r~   r‡   r�   r—   r    r¹   rÀ   rÉ   rÐ   rÕ   râ   rë   rö   r    r!   r"   ú<module>r     sö  ðòó Û Û ß .ß =Õ =ç >Ñ >å 6Ý +ß NÝ ?áÝUð €	ˆ9Ó à#8Ð ˜5Ó 8ô3˜Yô 3ð
XØ�IÑ Ñ%ð
Xà4ð
Xð 
ó
Xð$(¨4°©9ð (¸¸cÀ6¸kÑ9Jó (ðV'Ø�IÑ Ñ%ð'à
ˆ4�‰<˜˜c™Ð"Ñ#ó'ð@& Ø�#‰Yð& à˜3‘ið& ð ˆ4�‰9�dÐ2Ñ3Ð3Ñ4ó& ñ\)�vð ) Cð )°&ð )ÀFó )ð1 ð 1¨Có 1ðØÐ)Ñ*ðàóð8ØÐ)Ñ*ðà	ˆ$ˆs�Fˆ{Ñ
Ñóð< 59Ø#(ñ	Øðà�#‰Yðð Ð)Ñ*¨TÑ1ðð !ð	ð
 
ˆ#ˆvˆ+Ñóð6ØÐ)Ñ*ðà
ðð 
ˆ$ˆs�Fˆ{Ñ
Ñóð<ØðàÐ)Ñ*ðð 
ˆ#ˆvˆ+Ñóð&Ð2Fð È3ó ð$ 37ñ	'Ø+ð'à! # v +Ñ.ð'ð ˜˜f˜Ñ%ð'ð )¨4Ñ/ð	'ð
 ó'ò^Mð2Ø��f�Ñð2à
ˆ4��c˜6�kÑ"Ð"Ñ#ó2ð$	¨ð 	À3ð 	È5ÐQTÐVYÐQYÉ?ó 	ð	.Ð%;ð 	.ÀFð 	.ÈtÐTWÉyó 	.ð'2Ø Ñ'ð'2à�S‘	ð'2ð ð'2ð ð	'2ð
 ˆ4�‰<˜˜c™ DÐ)@Ñ$AÐAÑBó'2ðTMØðMà(ðMð �v‘,ðMð 
ˆ&�\ó	Mð: )-ñrØðràðrð �IÑ Ñ%ðrð
 ðrð ôrr!   