Ë
    uPêj:>  ã                  óv  — U d Z ddlmZ g d¢ZddlZddl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mZ ddlZddlZdd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z)m*Z* ddl+m,Z, ddl-m.Z. erddlm/Z/ e!eee#e%dœZ0de1d<   d"d„Z2	 	 	 	 d#	 	 	 	 	 	 	 	 	 	 	 d$d„Z3e.	 	 	 	 	 d%	 	 	 	 	 	 	 	 	 	 	 	 	 d&d„«       Z4e
d'd„«       Z5	 	 d(	 	 	 	 	 	 	 	 	 	 	 d)d„Z6e.	 	 d(	 	 	 	 	 	 	 	 	 	 	 d)d„«       Z7e.	 	 d(	 	 	 	 	 	 	 	 	 	 	 d*d „«       Z8e.	 	 	 	 	 d%	 	 	 	 	 	 	 	 	 	 	 	 	 d+d!„«       Z9y),zƒ
RAG Ingest API for LiteLLM.

Provides an all-in-one API for document ingestion:
Upload -> (OCR) -> Chunk -> Embed -> Vector Store
é    )Úannotations)ÚaingestÚaqueryÚingestÚqueryN)Ú	CoroutineÚIterator)Úcontextmanager)Úpartial)ÚTYPE_CHECKINGÚAnyÚFinal)Úis_internal_call)Úvector_store_search_cost)ÚLogging)ÚBaseRAGIngestion)ÚBedrockRAGIngestion)ÚGeminiRAGIngestion)ÚOpenAIRAGIngestion)ÚS3VectorsRAGIngestion)ÚVertexAIRAGIngestion)ÚRAGQuery)ÚRAGIngestOptionsÚRAGIngestResponse)ÚModelResponse)Úclient)ÚRouter)ÚopenaiÚbedrockÚgeminiÚ
s3_vectorsÚ	vertex_aiz(Final[dict[str, type[BaseRAGIngestion]]]ÚINGESTION_REGISTRYc                óœ   — t         j                  | «      }|€4dj                  t         j                  «       «      }t	        d| › d|› �«      ‚|S )zý
    Get the ingestion class for a given provider.

    Args:
        provider: The vector store provider name (e.g., 'openai')

    Returns:
        The ingestion class for the provider

    Raises:
        ValueError: If provider is not supported
    z, z
Provider 'z;' is not supported for RAG ingestion. Supported providers: )r#   ÚgetÚjoinÚkeysÚ
ValueError)ÚproviderÚingestion_classÚ	supporteds      úU/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/rag/main.pyÚget_ingestion_classr-   5   sS   € ô 0×3Ñ3°HÓ=€OØÐØŸ9™9Ô%7×%<Ñ%<Ó%>Ó?ˆ	Ü˜: h ZÐ/jÐktÐjuÐvÓwÐwØÐó    c              ƒ  ó¾   K  — | j                  d«      xs i }|j                  dd«      }t        |«      } || |¬«      }|j                  |||¬«      ƒ d{  –—† S 7 Œ­w)a§  
    Execute the RAG ingest pipeline using provider-specific implementation.

    Args:
        ingest_options: Configuration for the ingest pipeline
        file_data: Tuple of (filename, content_bytes, content_type)
        file_url: URL to fetch file from
        file_id: Existing file ID to use
        router: Optional LiteLLM router for load balancing

    Returns:
        RAGIngestResponse with status and IDs
    Úvector_storeÚcustom_llm_providerr   )Úingest_optionsÚrouter)Ú	file_dataÚfile_urlÚfile_idN)r%   r-   r   )	r2   r4   r5   r6   r3   Úvector_store_configr)   r*   Ú	ingestions	            r,   Ú_execute_ingest_pipeliner9   I   s|   è ø€ ð* "0×!3Ñ!3°NÓ!CÒ!IÀrÐØ)×-Ñ-Ð.CÀXÓN€Hô 1°Ó:€Oñ 'Ø%Øô€Ið ×!Ñ!ØØØð "ó ÷ ð ð ús   ‚AAÁAÁAc           
   ‹  óî  K  — t        «       }	 t        j                  «       }d|d<   t        t        f| |||||dœ|¤Ž}	t        j                  «       }
t        |
j                  |	«      }|j                  d|«      ƒ d{  –—† }t        j                  |«      r|ƒ d{  –—† }|S |}|S 7 Œ)7 Œ# t        $ r>}t        j                  d| j                  di «      j                  d«      |||¬«      ‚d}~ww xY w­w)aß  
    Async: Ingest a document into a vector store.

    Args:
        ingest_options: Configuration for the ingest pipeline
        file_data: Tuple of (filename, content_bytes, content_type)
        file: Dict with {filename, content (base64), content_type} - for JSON API
        file_url: URL to fetch file from
        file_id: Existing file ID to use

    Example:
        ```python
        response = await litellm.aingest(
            ingest_options={
                "vector_store": {
                    "custom_llm_provider": "openai",
                    "litellm_credential_name": "my-openai-creds",  # optional
                }
            },
            file_url="https://example.com/doc.pdf",
        )
        ```
    Tr   )r2   r4   Úfiler5   r6   ÚtimeoutNr0   r1   ©Úmodelr1   Úoriginal_exceptionÚcompletion_kwargsÚextra_kwargs)ÚlocalsÚasyncioÚget_event_loopr   r   ÚcontextvarsÚcopy_contextÚrunÚrun_in_executorÚiscoroutineÚ	ExceptionÚlitellmÚexception_typer%   )r2   r4   r;   r5   r6   r<   ÚkwargsÚ
local_varsÚloopÚfuncÚctxÚfunc_with_contextÚinit_responseÚresponseÚes                  r,   r   r   u   s  è ø€ ôB ›€Jð 
Ü×,Ñ,Ó.ˆØ ˆˆyÑäÜð	
à)ØØØØØñ	
ð ñ	
ˆô !×-Ñ-Ó/ˆÜ#*¨3¯7©7°DÓ#9ÐØ%)×%9Ñ%9¸$Ð@QÓ%R×Rˆä×Ñ˜}Ô-Ø*×*ˆHð ˆð %ˆHàˆð  Søð +ùô
 ò 
Ü×$Ñ$ØØ .× 2Ñ 2°>À2Ó F× JÑ JÐK`Ó aØ Ø(Øô
ð 	
ûð
üsY   ‚C5ŽA/B+ Á=B'Á>B+ ÂB)ÂB+ Â"C5Â#B+ Â&C5Â'B+ Â)B+ Â+	C2Â49C-Ã-C2Ã2C5c               #  óÆ   K  — t        j                  «       } t        j                  d«       	 d–— t        j                  | «       y# t        j                  | «       w xY w­w)aÆ  
    Suppress a sub-call's own billing event so the parent aquery event bills it.

    Every suppressed sub-call's cost must be folded into the parent event:
    into the response's hidden response_cost on the non-streaming path, or via
    the logging object's additional_response_cost on the streaming path (the
    streamed cost is computed from assembled chunks after this pipeline
    returns, so there is no response object to fold into here).
    TN)r   r%   Úset)Úpreviouss    r,   Ú_suppressed_sub_call_billingrY   º   sI   è ø€ ô '×*Ñ*Ó,€HÜ×Ñ˜Ôð'Ûä×Ñ˜XÕ&øÔ×Ñ˜XÕ&üs   ‚*A!­A ±A!ÁAÁA!c              ‹  óü  K  — |j                  dd«      }t        j                  |«      }|st        d«      ‚t	        «       5  t        j                  j                  d|d   ||j                  dd«      |j                  dd«      d	œ|¤Žƒ d{  –—† }ddd«       |j                  dd«      }		 t        t        d
|	v r|	nd|	¬«      «      }
d}d}j                  dg «      }|r¹|j                  d«      r¨t        j                  |«      }|r‘t	        «       5  t        j                  |d   |||j                  dd«      ¬«      ƒ d{  –—† }ddd«       t        |dd«      }t        |t         «      r|j                  d«      }|xs d}t        j"                  ||«      }t        j$                  |«      }|dd |gz   |d   gz   }t	        «       5  |� |j&                  d| ||dœ|¤Žƒ d{  –—† }n!t        j&                  d| ||dœ|¤Žƒ d{  –—† }ddd«       |
|z   }|sgt        t(        «      rWt        j*                  |||¬«      }|dkD  r8t        |dd«      }t        |t         «      r|j                  d«      }|�||z   |d<   |S |dkD  r0|j                  d«      }t        |t,        «      r||j.                  d<   S 7 �Œ-# 1 sw Y   �Œ-xY w# t        $ r d}
Y �Œw xY w7 �Œ˜# 1 sw Y   �Œ˜xY w7 �Œ7 Œæ# 1 sw Y   ŒåxY w­w)z)
    Execute the RAG query pipeline.
    r3   Nz(No query found in messages for RAG queryÚvector_store_idÚtop_ké
   r1   r   )r[   r   Úmax_num_resultsr1   ú/)r>   r1   rT   g        ÚdataÚenabledr>   Útop_né   )r>   r   Ú	documentsrb   Ú_hidden_paramsÚresponse_costéÿÿÿÿ)r>   ÚmessagesÚstream)rT   Úsearch_resultsÚrerank_resultsr   Úlitellm_logging_objÚadditional_response_cost© )Úpopr   Úextract_query_from_messagesr(   rY   rK   Úvector_storesÚasearchr%   Úsumr   rJ   Úextract_documents_from_searchÚarerankÚgetattrÚ
isinstanceÚdictÚget_top_chunks_from_rerankÚbuild_context_messageÚacompletionr   Úadd_search_results_to_responseÚLiteLLMLoggingObjÚmodel_call_details)r>   rh   Úretrieval_configÚrerankri   rM   r3   Ú
query_textÚsearch_responseÚsearch_providerÚsearch_costÚrerank_responseÚrerank_costÚcontext_chunksrd   Úrerank_hidden_paramsÚrerank_response_costÚcontext_messageÚmodified_messagesrT   Úsub_call_costÚhidden_paramsÚcompletion_response_costÚlogging_objs                           r,   Ú_execute_query_pipeliner�   Í   s^  è ø€ ð $*§:¡:¨h¸Ó#=€Fô !×<Ñ<¸XÓF€JÙÜÐCÓDÐDô 
&Ó	'ñ 
Ü'.×'<Ñ'<×'DÑ'Dð (
Ø,Ð->Ñ?ØØ,×0Ñ0°¸"Ó=Ø 0× 4Ñ 4Ð5JÈHÓ Uñ	(
ð
 ñ(
÷ "
ˆ÷
ð .×1Ñ1Ð2GÈÓR€Oð	ÜÜ$Ø),°Ñ)?‘oÀTØ$3Ø(ôó
ˆð €OØ€KØ$×(Ñ(¨°Ó4€Nñ �&—*‘*˜YÔ'Ü#×AÑAÀ/ÓRˆ	ÙÜ-Ó/ñ Ü(/¯©Ø  ™/Ø$Ø'Ø Ÿ*™* W¨aÓ0ô	)÷ #�÷ô +2°/ÐCSÐUYÓ*ZÐ ÜÐ.´Ô5Ø<P×<TÑ<TÐUdÓ<eÐ$Ø2Ò9°c�Ü%×@Ñ@ÀÐRaÓbˆNô &×;Ñ;¸NÓK€OØ'¨¨˜}°Ð/@Ñ@ÀHÈRÁLÀ>ÑQÐô 
&Ó	'ñ ØÐØ/˜V×/Ñ/ð ØØ*Øñð ñ	÷ ‰Hô %×0Ñ0ð ØØ*Øñð ñ	÷ ˆH÷ð" '¨Ñ4€MÙ”j ¬=Ô9Ü×:Ñ:ØØ*Ø*ô
ˆð
 ˜1ÒÜ#*¨8Ð5EÀtÓ#LˆMÜ˜-¬Ô.Ø@M×@QÑ@QÐRaÓ@bÐ(Ø+Ð7Ø5MÐP]Ñ5]�M /Ñ2ð €Oð 
˜Ò	Ø%+§Z¡ZÐ0EÓ%FˆÜ�kÔ#4Ô5ØIVˆK×*Ñ*Ð+EÑFà€Oðc"
ù÷
ñ 
ûô$ ò Ø‹ðúð#ù÷ñ úð(ùðø÷ð üs½   ‚?K<ÁAJ<ÂJ9ÂJ<ÂK<Â,K	 Ã	A
K<Ä0KÅKÅKÅBK<Ç	K0Ç%K+Ç&!K0ÈK.ÈK0ÈB-K<Ê9J<Ê<KËK<Ë	KËK<ËKËK<ËKËK(Ë#K<Ë+K0Ë.K0Ë0K9Ë5K<c           	   ‹  óÌ  K  — t        «       }	 t        j                  «       }d|d<   t        t        f| ||||dœ|¤Ž}t        j                  «       }	t        |	j                  |«      }
|j                  d|
«      ƒ d{  –—† }t        j                  |«      r|ƒ d{  –—† }|S |}|S 7 Œ)7 Œ# t        $ r.}t        j                  | |j                  d«      |||¬«      ‚d}~ww xY w­w)z&
    Async: Query a RAG pipeline.
    Tr   ©r>   rh   r   r€   ri   Nr1   r=   )rB   rC   rD   r   r   rE   rF   rG   rH   rI   rJ   rK   rL   r%   )r>   rh   r   r€   ri   rM   rN   rO   rP   rQ   rR   rS   rT   rU   s                 r,   r   r   7  s  è ø€ ô ›€Jð
Ü×,Ñ,Ó.ˆØˆˆxÑäÜð
àØØ-ØØñ
ð ñ
ˆô !×-Ñ-Ó/ˆÜ#*¨3¯7©7°DÓ#9ÐØ%)×%9Ñ%9¸$Ð@QÓ%R×Rˆä×Ñ˜}Ô-Ø*×*ˆHð ˆð %ˆHàˆð  Søð +ùô
 ò 
Ü×$Ñ$ØØ 0× 4Ñ 4Ð5JÓ KØ Ø(Øô
ð 	
ûð
üsY   ‚C$ŽA.B* Á<B&Á=B* ÂB(ÂB* Â!C$Â"B* Â%C$Â&B* Â(B* Â*	C!Â3)CÃC!Ã!C$c                ó>  — t        «       }	 |j                  dd«      du }|rt        d| ||||dœ|¤ŽS t        j                  «       j                  t        d| ||||dœ|¤Ž«      S # t        $ r.}t        j                  | |j                  d«      |||¬«      ‚d}~ww xY w)	z
    Query a RAG pipeline.
    r   FTr’   r1   r=   Nrn   )
rB   ro   r�   rC   rD   Úrun_until_completerJ   rK   rL   r%   )	r>   rh   r   r€   ri   rM   rN   Ú	_is_asyncrU   s	            r,   r   r   f  s×   € ô ›€Jð
Ø!Ÿ:™: h°Ó6¸$Ð>ˆ	áÜ*ð ØØ!Ø!1ØØñð ñð ô ×)Ñ)Ó+×>Ñ>Ü'ð ØØ%Ø%5Ø!Ø!ñð ñó	ð 	øô ò 
Ü×$Ñ$ØØ 0× 4Ñ 4Ð5JÓ KØ Ø(Øô
ð 	
ûð
ús   Œ&A% ³1A% Á%	BÁ.)BÂBc           	     ó$  — ddl }t        «       }	 |j                  dd«      du }	|j                  d«      }
|�N|€L|j                  dd«      }|j                  d	d
«      }|j                  dd«      }|j	                  |«      }|||f}|	rt        | ||||
¬«      S t        j                  «       j                  t        | ||||
¬«      «      S # t        $ r>}t        j                  d| j                  di «      j                  d«      |||¬«      ‚d}~ww xY w)aÞ  
    Ingest a document into a vector store.

    Args:
        ingest_options: Configuration for the ingest pipeline
        file_data: Tuple of (filename, content_bytes, content_type)
        file: Dict with {filename, content (base64), content_type} - for JSON API
        file_url: URL to fetch file from
        file_id: Existing file ID to use

    Example:
        ```python
        response = litellm.ingest(
            ingest_options={
                "vector_store": {
                    "custom_llm_provider": "openai",
                    "litellm_credential_name": "my-openai-creds",  # optional
                }
            },
            file_data=("doc.txt", b"Hello world", "text/plain"),
        )
        ```
    r   Nr   FTr3   ÚfilenameÚdocumentÚcontentÚ Úcontent_typezapplication/octet-stream)r2   r4   r5   r6   r3   r0   r1   r=   )Úbase64rB   ro   r%   Ú	b64decoder9   rC   rD   r”   rJ   rK   rL   )r2   r4   r;   r5   r6   r<   rM   rœ   rN   r•   r3   r—   Úcontent_b64r›   Úcontent_bytesrU   s                   r,   r   r   ”  s2  € óB ä›€Jð%
Ø!Ÿ:™: i°Ó7¸4Ð?ˆ	Ø'-§z¡z°(Ó';ˆð Ð 	Ð 1Ø"Ÿh™h z°:Ó>ˆHØ!%§¡¨)°RÓ!8ˆKØ"&§(¡(¨>Ð;UÓ"VˆLØ#)×#3Ñ#3°KÓ#@ˆMØ! =°,Ð?ˆIáÜ+Ø-Ø#Ø!ØØôð ô ×)Ñ)Ó+×>Ñ>Ü(Ø#1Ø'Ø%Ø#Ø!ôóð øô ò 
Ü×$Ñ$ØØ .× 2Ñ 2°>À2Ó F× JÑ JÐK`Ó aØ Ø(Øô
ð 	
ûð
ús   �BC Â0C Ã	DÃ9D
Ä
D)r)   ÚstrÚreturnztype[BaseRAGIngestion])NNNN)r2   r   r4   útuple[str, bytes, str] | Noner5   ú
str | Noner6   r£   r3   zRouter | Noner¡   r   )NNNNN)r2   údict[str, Any]r4   r¢   r;   údict[str, str] | Noner5   r£   r6   r£   r<   úfloat | httpx.Timeout | Noner¡   r   )r¡   zIterator[None])NF)r>   r    rh   ú	list[Any]r   r¤   r€   údict[str, Any] | Noneri   Úboolr¡   r   )r>   r    rh   r§   r   r¤   r€   r¨   ri   r©   r¡   z2ModelResponse | Coroutine[Any, Any, ModelResponse])r2   r¤   r4   r¢   r;   r¥   r5   r£   r6   r£   r<   r¦   r¡   z:RAGIngestResponse | Coroutine[Any, Any, RAGIngestResponse]):Ú__doc__Ú
__future__r   Ú__all__rC   rE   Úcollections.abcr   r	   Ú
contextlibr
   Ú	functoolsr   Útypingr   r   r   ÚhttpxrK   Úlitellm._internal_contextr   Úlitellm.cost_calculatorr   Ú*litellm.litellm_core_utils.litellm_loggingr   r}   Ú$litellm.rag.ingestion.base_ingestionr   Ú'litellm.rag.ingestion.bedrock_ingestionr   Ú&litellm.rag.ingestion.gemini_ingestionr   Ú&litellm.rag.ingestion.openai_ingestionr   Ú*litellm.rag.ingestion.s3_vectors_ingestionr   Ú)litellm.rag.ingestion.vertex_ai_ingestionr   Úlitellm.rag.rag_queryr   Úlitellm.types.ragr   r   Úlitellm.types.utilsr   Úlitellm.utilsr   r   r#   Ú__annotations__r-   r9   r   rY   r�   r   r   r   rn   r.   r,   ú<module>rÀ      sÀ  ðòõ #â
2€ã Û ß /Ý %Ý ß ,Ñ ,ã ã Ý 6Ý <Ý SÝ AÝ GÝ EÝ EÝ LÝ JÝ *÷õ .Ý  áÝð
 !Ø"Ø Ø'Ø%ñ@Ð Ð<ó óð, 04ØØØ ð&Ø$ð&à,ð&ð ð&ð ð	&ð
 ð&ð ó&ðX ð 04Ø"&ØØØ,0ðA
Ø"ðA
à,ðA
ð  ðA
ð ð	A
ð
 ðA
ð *ðA
ð òA
ó ðA
ðH ò'ó ð'ð, %)ØðgØðgàðgð %ðgð "ð	gð
 ðgð ógðT ð
 %)Øð+
Øð+
àð+
ð %ð+
ð "ð	+
ð
 ð+
ð ò+
ó ð+
ð\ ð
 %)Øð*
Øð*
àð*
ð %ð*
ð "ð	*
ð
 ð*
ð 8ò*
ó ð*
ðZ ð 04Ø"&ØØØ,0ðH
Ø"ðH
à,ðH
ð  ðH
ð ð	H
ð
 ðH
ð *ðH
ð @òH
ó ñH
r.   