
    iL3                     N   S SK r 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J	r	  S SK
JrJrJrJrJrJrJr  S SKJrJrJr  S SKJr  S SKJrJr  S S	KJrJrJ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(  S SK)J*r*  S SK+J,r,  S r-Sr.S\/4S jr0SS\\/   S\/4S jjr1 " S S\5      r2g)    N)ArgumentParser)iglob)Path)AnyCallableDictListOptionalUnioncast)SettingsSimpleDirectoryReaderVectorStoreIndex)BaseEmbedding)ResponseStreamingResponse)	BaseModelFieldfield_validator)CondenseQuestionChatEngine)IngestionPipeline)LLM)RetrieverQueryEngine)
BaseReader)CompactAndRefine)get_cache_dirc                  P     SSK Jn   U " SSS9$ ! [         a    [        S5      ef = f)Nr   OpenAIzgpt-3.5-turboT)model	streamingz]`llama-index-llms-openai` package not found, please run `pip install llama-index-llms-openai`)llama_index.llms.openair   ImportErrorr   s    R/home/james-whalen/.local/lib/python3.13/site-packages/llama_index/cli/rag/base.py_try_load_openai_llmr%      s8    
2Ot<< 
?
 	

s    %zfiles_history.txtreturnc                  @    [        [        [        5       5      S-  5      $ )Nrag_cli)strr   r        r$   default_ragcli_persist_dirr,   -   s    tMO$y011r+   	query_strc                     U =(       d    S$ )N r*   )r-   s    r$   query_inputr0   1   s    ?r+   c                      \ rS rSr% Sr\" SS9r\\S'   \" SSS9r	\
\S	'   \" S
\S9r\\S'   \" SS S9r\\S'   \" SSS9r\\   \S'   \" SSS9r\\\\4      \S'    " S S5      r\" SSS9S\S\\\4   S\\   4S j5       r      S*S\\\      S\\   S\
S	\
S\
S \
S!\\\4   SS4S" jjrS\SS4S# jrS+S$ jr\S%\\ \4   S&\\!/ S 4      SS4S' j5       r"S+S( jr#S)r$g),RagCLI5   zV
CLI tool for chatting with output of a IngestionPipeline via a RetrieverQueryEngine.
z,Ingestion pipeline to run for RAG ingestion.descriptioningestion_pipeline:Whether to print out verbose information during execution.F)r5   defaultverbosez(Directory to persist ingestion pipeline.)r5   default_factorypersist_dirz.Language model to use for response generation.c                      [        5       $ N)r%   r*   r+   r$   <lambda>RagCLI.<lambda>G   s     4 6r+   llmz Chat engine to use for chatting.Nchat_enginez5File extractor to use for extracting text from files.file_extractorc                       \ rS rSrSrSrg)RagCLI.ConfigR   Tr*   N)__name__
__module____qualname____firstlineno__arbitrary_types_allowed__static_attributes__r*   r+   r$   ConfigrD   R   s    "&r+   rL   before)modevaluesr&   c                    Ub  U$ [        [        US   5      nUR                  c  g[        [        US   5      n[        [        US   5      nSnUR
                  b,  UR
                   H  n[        U[        5      (       d  M  Un  O   U[        l	        U[        l
        [        R                  " UR                  US9R                  SS9n[        SXTS	9n	[        XS
9n
[         R"                  " XUS9$ )zE
If chat_engine is not provided, create one from ingestion_pipeline.
Nr6   r9   r@   )embed_model   )similarity_top_kT)r!   r@   r9   )	retrieverresponse_synthesizer)query_enginer@   r9   )r   r   vector_storeboolr   transformations
isinstancer   r   r@   rQ   r   from_vector_storeas_retrieverr   r   r   from_defaults)clsrA   rO   r6   r9   r@   rQ   transformationrT   rU   rV   s              r$   #chat_engine_from_ingestion_pipeline*RagCLI.chat_engine_from_ingestion_pipelineU   s    "!"3V<P5QR**2tVI./3u& --9"4"D"Dnm<<"0K #E
 *$66++

,,
* 	  0 
 ,
 *77%
 	
r+   filesquestionchatclearcreate_llamakwargsc                   #    U(       a  [         R                  R                  U R                  5      (       ah  [	        SU R                   S35      nUR                  5       R                  5       S:w  a  [        S5        g [        R                  " U R                  5        [        SU R                   35        X@l        [        [        U R                  5      n
U R                  (       a  [        S	U R                  5        UGb:  / nU H  nUR                  [!        US
S95        M     / nU H  n[         R                  R#                  U5      n[         R                  R%                  U5      (       a  ['        US
U R(                  S9nO['        U/S
U R(                  S9nUR                  UR+                  US95        M     U
R-                  XMS9I Sh  vN   U
R/                  U R                  S9  [1        U R                   S[2         3S5       nU H   nUR5                  [7        U5      S-   5        M"     SSS5        U(       Gap  [        R8                  " S5      c  [        S5        GOL[;        U R                   S[2         35      nUR                  5       (       d  [        S5        GO[1        U5       nU Vs1 s H*  nUR                  5       (       d  M  UR                  5       iM,     nnSSS5        [=        W5      S:X  a  [        S5        O[=        U5      S:  a  [        S5        OUR?                  5       nSU;   a  [        S5        Oi[         R                  R                  U5      (       d  [        SU S35        O5[        SU S35        SS S!S"S#S$S%S&S'S(S)S*S+S,U/n[@        RB                  " US
S-9  Ub  U RE                  U5      I Sh  vN   U(       a  U RG                  5       I Sh  vN   gg! [         a%  n	[        SU R                   SU	 35         Sn	A	gSn	A	ff = f GNS! , (       d  f       GN= fs  snf ! , (       d  f       GNY= f N Nf7f).z-
Entrypoint for local document RAG CLI tool.
z,Are you sure you want to delete data within z? [y/N] yzAborted.NzError clearing z: zSuccessfully cleared z!Saving/Loading from persist_dir: T)	recursive)	input_dirfilename_as_idrB   )input_filesrl   rB   )show_progress)rn   	documents)r;   /a
npxzI`npx` is not installed. Please install it by calling `npm install -g npx`zLNo data has been ingested, please specify `--files` to create llama dataset.r      zMultiple files or folders were ingested, which is not supported by create-llama. Please call `llamaindex-cli rag --clear` to clear the cache first, then call `llamaindex-cli rag --files` again with a single folder or file*zGlob pattern is not supported by create-llama. Please call `llamaindex-cli rag --clear` to clear the cache first, then call `llamaindex-cli rag --files` again with a single folder or file.z	The path z does not exist. Please call `llamaindex-cli rag --clear` to clear the cache first, then call `llamaindex-cli rag --files` again with a single folder or file.z%Calling create-llama using data from z ...zcreate-llama@latestz
--frontendz
--templater!   z--frameworkfastapiz--uishadcnz--vector-dbnonez--enginecontext--files)check)$ospathexistsr;   inputstriplowerprintshutilrmtree	Exceptionr9   r   r   r6   extendr   abspathisdirr   rB   	load_dataarunpersistopenRAG_HISTORY_FILE_NAMEwriter)   whichr   lenpop
subprocessrunhandle_questionstart_chat_repl)selfrb   rc   rd   r9   re   rf   rg   responseer6   expanded_filespatternro   _filereaderffilehistory_file_pathlinestored_pathsr}   command_argss                          r$   
handle_cliRagCLI.handle_cli   s     ww~~d..// B4CSCSBTT\] >>#))+s2*%MM$"2"23 )$*:*:);<=!"3T5L5LM<<5t7G7GHN %%eGt&DE !I'.77==''2"''+'+':':F 3%*G'+'+':':F   !1!1!1!HI (" %)))UUU&&43C3C&D ))*!,A+BCSIQ!DGGCI,- " J ||E"*_ %)D,<,<+=Q?T>U)V$W!(//11L
 /0AAB'Sdjjl

'S 1<(A-P \*Q.h  ,//1$;!!m
 "$!5!5!"+D6 2m !m "$I$t"TU % 5 , , + - ) & ( - & * ) ) $,L" 'NN<tD&&x000&&((( M ! OD,<,<+=RsCD> V JI$ (T 10b 1(s   A=Q  O2  D1QP$<Q'P'5A?Q4P>9P9P9*P>,C QQQ+Q,Q2
P!<PQP!!Q'
P61Q9P>>
Q	QQc                    #    [        [        U R                  5      nUR                  U5      n[	        U[
        5      (       a  UR                  5         g [        [        U5      n[        U5        g 7fr=   )	r   r   rA   rd   rZ   r   print_response_streamr   r   )r   rc   rA   r   s       r$   r   RagCLI.handle_question  sU     5t7G7GH##H-h 122**,Hh/H(Os   A.A0c                    #    U R                   c  [        S5      e[        [        U R                   5      nUR	                  5         g7f)z+
Start a REPL for chatting with the agent.
Nzchat_engine is not defined.)rA   
ValueErrorr   r   streaming_chat_repl)r   rA   s     r$   r   RagCLI.start_chat_repl  s>      #:;;5t7G7GH'')s   AAparserinstance_generatorc                 &  ^ T(       a  UR                  SS[        SSS9  UR                  SS[        SS	S
9  UR                  SSSSS9  UR                  SSSSS9  UR                  SSSS9  UR                  SSSSS9  UR                  U4S jS9  g g )Nz-qz
--questionzThe question you want to ask.F)typehelprequiredz-frz   +zuThe name of the file(s) or directory you want to ask a question about,such as "file.pdf". Supports globs like "*.py".)r   nargsr   z-cz--chatz&If flag is present, opens a chat REPL.
store_true)r   actionz-vz	--verboser7   z--clearz'Clears out all currently embedded data.z--create-llamaz8Create a LlamaIndex application with your embedded data.)r   r   r   c           	      l   > [         R                  " T" 5       R                  " S0 [        U 5      D65      $ )Nr*   )asyncior   r   vars)argsr   s    r$   r>   (RagCLI.add_parser_args.<locals>.<lambda>H  s&    '++&(33Ad4jA#r+   )func)add_argumentr)   set_defaults)r^   r   r   s     `r$   add_parser_argsRagCLI.add_parser_args  s     4    F   	 =#	    Q#	    >#   
  O#	       U r+   c                    ^  [        SS9nUR                  SSSS9nUR                  SSS	9nT R                  UU 4S
 j5        UR	                  5       nUR                  U5        g)z
Entrypoint for CLI tool.
zLlamaIndex RAG Q&A tool.r4   commandscommandT)titledestr   ragz8Ask a question to a document / a directory of documents.)r   c                     > T $ r=   r*   )r   s   r$   r>   RagCLI.cli.<locals>.<lambda>X  s    dr+   N)r   add_subparsers
add_parserr   
parse_argsr   )r   r   
subparsersllamarag_parserr   s   `    r$   cli
RagCLI.cliM  sv      ,FG**9t + 

 %//R 0 
 	_l;  " 			$r+   )r9   )NNFFFF)r&   N)%rF   rG   rH   rI   __doc__r   r6   r   __annotations__r9   rX   r,   r;   r)   r@   r   rA   r
   r   rB   r   r   rL   r   r   r`   r	   r   r   r   classmethodr   r   r   r   r   rK   r*   r+   r$   r2   r2   5   s    -2B-)  PGT  >2K  D6C  9>69K45  7<K7NHT#z/23 
' ' ]2)
)
'+CH~)
	,	-)
 3)
Z &*"&"@)S	"@) 3-@) 	@)
 @) @) @) sCx.@) 
@)Dc d * 3nc)*3 %Xb(l%;<3 
	3 3jr+   r2   r=   )3r   r|   r   r   argparser   globr   pathlibr   typingr   r   r   r	   r
   r   r   llama_index.corer   r   r   %llama_index.core.base.embeddings.baser   %llama_index.core.base.response.schemar   r    llama_index.core.bridge.pydanticr   r   r   llama_index.core.chat_enginer   llama_index.core.ingestionr   llama_index.core.llmsr   llama_index.core.query_enginer   llama_index.core.readers.baser   &llama_index.core.response_synthesizersr   llama_index.core.utilsr   r%   r   r)   r,   r0   r2   r*   r+   r$   <module>r      s     	   #   C C C 
 @ O N C 8 % > 4 C 0	
 , 2C 28C= C hY hr+   