Ë
    µŒj3(  ã                   óŠ  — d dl Z d dl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 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 d dl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% d dl&m'Z'  e jP                  e)«      Z* G d„ de«      Z+ edgd¬«      Z, edgd¬«      Z- G d„ deee.      «      Z/ G d„ de«      Z0y)é    N)ÚAnyÚListÚOptional)ÚLLMChain)ÚConditionalPromptSelector)Ú#AsyncCallbackManagerForRetrieverRunÚCallbackManagerForRetrieverRun)ÚDocument)ÚBaseLLM)ÚBaseOutputParser)ÚBasePromptTemplateÚPromptTemplate)ÚBaseRetriever)ÚVectorStore)ÚRecursiveCharacterTextSplitterÚTextSplitter)Ú	BaseModelÚField)ÚAsyncHtmlLoader)ÚHtml2TextTransformer)ÚLlamaCpp)ÚGoogleSearchAPIWrapperc                   ó6   — e Zd ZU dZ edd¬«      Zee   ed<   y)ÚSearchQueriesz/Search queries to research for the user's goal..z+List of search queries to look up on Google©ÚdescriptionÚqueriesN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   ÚstrÚ__annotations__© ó    úu/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/retrievers/web_research.pyr   r      s    … Ù9áØÐFô€GˆT�#‰Yô r%   r   Úquestiona!  <<SYS>> 
 You are an assistant tasked with improving Google search results. 
 <</SYS>> 

 [INST] Generate THREE Google search queries that are similar to this question. The output should be a numbered list of questions and each should have a question mark at the end: 

 {question} [/INST])Úinput_variablesÚtemplatez÷You are an assistant tasked with improving Google search results. Generate THREE Google search queries that are similar to this question. The output should be a numbered list of questions and each should have a question mark at the end: {question}c                   ó&   — e Zd ZdZdedee   fd„Zy)ÚQuestionListOutputParserz/Output parser for a list of numbered questions.ÚtextÚreturnc                 ó2   — t        j                  d|«      }|S )Nz\d+\..*?(?:\n|$))ÚreÚfindall)Úselfr,   Úliness      r&   ÚparsezQuestionListOutputParser.parse8   s   € Ü—
‘
Ð.°Ó5ˆØˆr%   N)r   r   r    r!   r"   r   r3   r$   r%   r&   r+   r+   5   s   „ Ù9ð˜#ð  $ s¡)ô r%   r+   c                   óÊ  ‡ — e Zd ZU dZ edd¬«      Zeed<   eed<    edd¬«      Z	e
ed<    ed	d
¬«      Zeed<    e edd¬«      d¬«      Zeed<    eed¬«      Zee   ed<    edd¬«      Zeed<   dZeed<   	 deddfˆ fd„Zedd	 edd¬«      ddfdedede
dee   dededededd fd„«       Zd edefd!„Zd&d ededee   fd"„Z d ed#e!dee"   fd$„Z#d ed#e$dee"   fd%„Z%ˆ xZ&S )'ÚWebResearchRetrieverz`Google Search API` retriever..z"Vector store for storing web pagesr   ÚvectorstoreÚ	llm_chainzGoogle Search API WrapperÚsearché   z!Number of pages per Google searchÚnum_search_resultsiÜ  é2   )Ú
chunk_sizeÚchunk_overlapz1Text splitter for splitting web pages into chunksÚtext_splitterzList of processed URLs)Údefault_factoryr   Úurl_databaseFz_Whether to use the http_proxy/https_proxy env variables or check .netrc for proxy configurationÚ	trust_envÚallow_dangerous_requestsÚkwargsr-   Nc                 ób   •— |j                  dd«      }|st        d«      ‚t        ‰| �  di |¤Ž y)zInitialize the retriever.rB   FaÝ  WebResearchRetriever crawls URLs surfaced through the provided search engine. It is possible that some of those URLs will end up pointing to machines residing on an internal network, leadingto an SSRF (Server-Side Request Forgery) attack. To protect yourself against that risk, you can run the requests through a proxy and prevent the crawler from accidentally crawling internal resources.If've taken the necessary precautions, you can set `allow_dangerous_requests` to `True`.Nr$   )ÚgetÚ
ValueErrorÚsuperÚ__init__)r1   rC   rB   Ú	__class__s      €r&   rH   zWebResearchRetriever.__init___   s<   ø€ à#)§:¡:Ð.HÈ%Ó#PÐ Ù'Üð	8óð ô 	‰ÑÑ"˜6Ó"r%   é–   ÚllmÚpromptc	           	      ó¤   — |s*t        t        d„ t        fg¬«      }	|	j                  |«      }t	        ||t        «       ¬«      }
 | ||
|||||¬«      S )að  Initialize from llm using default template.

        Args:
            vectorstore: Vector store for storing web pages
            llm: llm for search question generation
            search: GoogleSearchAPIWrapper
            prompt: prompt to generating search questions
            num_search_results: Number of pages per Google search
            text_splitter: Text splitter for splitting web pages into chunks
            trust_env: Whether to use the http_proxy/https_proxy env variables
                or check .netrc for proxy configuration
            allow_dangerous_requests: A flag to force users to acknowledge
                the risks of SSRF attacks when using this retriever

        Returns:
            WebResearchRetriever
        c                 ó"   — t        | t        «      S ©N)Ú
isinstancer   )rK   s    r&   Ú<lambda>z/WebResearchRetriever.from_llm.<locals>.<lambda>•   s   € ¤¨C´Ô!:r%   )Údefault_promptÚconditionals)rK   rL   Úoutput_parser)r6   r7   r8   r:   r>   rA   rB   )r   ÚDEFAULT_SEARCH_PROMPTÚDEFAULT_LLAMA_SEARCH_PROMPTÚ
get_promptr   r+   )Úclsr6   rK   r8   rL   r:   r>   rA   rB   ÚQUESTION_PROMPT_SELECTORr7   s              r&   Úfrom_llmzWebResearchRetriever.from_llmq   sr   € ñ@ Ü'@Ü4á:Ô<WÐXðô(Ð$ð .×8Ñ8¸Ó=ˆFô ØØÜ2Ó4ô
ˆ	ñ Ø#ØØØ1Ø'ØØ%=ô
ð 	
r%   Úqueryc                 ó°   — |d   j                  «       r4|j                  d«      }|dk7  r||dz   d  }|j                  d«      r|d d }|j                  «       S )Nr   Ú"éÿÿÿÿr9   )ÚisdigitÚfindÚendswithÚstrip)r1   r[   Úfirst_quote_poss      r&   Úclean_search_queryz'WebResearchRetriever.clean_search_query«   s^   € ð
 �‰8×ÑÔà#Ÿj™j¨›oˆOØ "Ò$à˜o°Ñ1Ð3Ð4�à—>‘> #Ô&Ø! # 2˜J�EØ�{‰{‹}Ðr%   c                 ó`   — | j                  |«      }| j                  j                  ||«      }|S )z3Returns num_search_results pages per Google search.)rd   r8   Úresults)r1   r[   r:   Úquery_cleanÚresults        r&   Úsearch_toolz WebResearchRetriever.search_tool»   s.   € à×-Ñ-¨eÓ4ˆØ—‘×$Ñ$ [Ð2DÓEˆØˆr%   Úrun_managerc          
      ó8  — t         j                  d«       | j                  d|i«      }t         j                  d|› �«       |d   }t         j                  d|› �«       t         j                  d«       g }|D ]y  }| j                  || j                  «      }t         j                  d«       t         j                  d|› �«       |D ])  }|j                  dd	«      sŒ|j                  |d   «       Œ+ Œ{ t        |«      }t        |j                  | j                  «      «      }	t         j                  d
|	› �«       |	r²t        |	d| j                  ¬«      }
t        «       }t         j                  d«       |
j                  «       }t        |j                  |«      «      }| j                   j#                  |«      }| j$                  j'                  |«       | j                  j)                  |	«       t         j                  d«       g }|D ],  }|j)                  | j$                  j+                  |«      «       Œ. |D �ci c];  }|j,                  t/        t1        |j2                  j5                  «       «      «      f|“Œ= }}t        |j7                  «       «      }|S c c}w )zµSearch Google for documents related to the query input.

        Args:
            query: user query

        Returns:
            Relevant documents from all various urls.
        z*Generating questions for Google Search ...r'   z#Questions for Google Search (raw): r,   zQuestions for Google Search: zSearching for relevant urls...zSearch results: ÚlinkNzNew URLs to load: T)Úignore_load_errorsrA   zIndexing new urls...z*Grabbing most relevant splits from urls...)ÚloggerÚinfor7   ri   r:   rE   ÚappendÚsetÚlistÚ
differencer@   r   rA   r   ÚloadÚtransform_documentsr>   Úsplit_documentsr6   Úadd_documentsÚextendÚsimilarity_searchÚpage_contentÚtupleÚsortedÚmetadataÚitemsÚvalues)r1   r[   rj   rh   Ú	questionsÚurls_to_lookÚsearch_resultsÚresÚurlsÚnew_urlsÚloaderÚ	html2textÚdocsÚdocÚunique_documents_dictÚunique_documentss                   r&   Ú_get_relevant_documentsz,WebResearchRetriever._get_relevant_documentsÁ   sD  € ô  	�‰Ð@ÔAØ—‘ ¨UÐ 3Ó4ˆÜ�‰Ð9¸&¸ÐBÔCØ˜6‘Nˆ	Ü�‰Ð3°I°;Ð?Ô@ô 	�‰Ð4Ô5ØˆÛˆEà!×-Ñ-¨e°T×5LÑ5LÓMˆNÜ�K‰KÐ8Ô9Ü�K‰KÐ*¨>Ð*:Ð;Ô<Û%�Ø—7‘7˜6 4Õ(Ø ×'Ñ'¨¨F©Õ4ñ &ð ô �<Ó ˆô ˜Ÿ™¨×(9Ñ(9Ó:Ó;ˆä�‰Ð(¨¨
Ð3Ô4áÜ$Ø¨T¸T¿^¹^ôˆFô -Ó.ˆIÜ�K‰KÐ.Ô/Ø—;‘;“=ˆDÜ˜	×5Ñ5°dÓ;Ó<ˆDØ×%Ñ%×5Ñ5°dÓ;ˆDØ×Ñ×*Ñ*¨4Ô0Ø×Ñ×$Ñ$ XÔ.ô 	�‰Ð@ÔAØˆÛˆEØ�K‰K˜×(Ñ(×:Ñ:¸5ÓAÕBð ñ
 UYó!
ÙTXÈSˆS×Ñœu¤V¨C¯L©L×,>Ñ,>Ó,@Ó%AÓBÐCÀSÑHÐTXð 	ð !
ô  Ð 5× <Ñ <Ó >Ó?ÐØÐùò	!
s   È:A Jc             ƒ   ó   K  — t         ‚­wrO   )ÚNotImplementedError)r1   r[   rj   s      r&   Ú_aget_relevant_documentsz-WebResearchRetriever._aget_relevant_documents  s   è ø€ ô "Ð!ùs   ‚	)r9   )'r   r   r    r!   r   r6   r   r#   r   r8   r   r:   Úintr   r>   r   rr   r@   r   r"   rA   ÚboolrB   r   rH   Úclassmethodr   r   r   rZ   rd   Údictri   r	   r
   rŒ   r   r�   Ú__classcell__)rI   s   @r&   r5   r5   =   sØ  ø… Ù(ñ  %ØÐ=ô €K�ó ð ÓÙ%*¨3Ð<WÔ%X€FÐ"ÓXÙ# AÐ3VÔWÐ˜ÓWÙ"'Ù&°$ÀbÔIØGô#€M�<ó ñ $ØÐ*Bô€L�$�s‘)ó ñ Øð/ô€Iˆtó ð &+Ð˜dÓ*ðð# ð #¨õ #ð$ ð 04Ø"#Ù8VØ¨3ô9
ð  Ø).ñ7
à ð7
ð ð7
ð 'ð	7
ð
 Ð+Ñ,ð7
ð  ð7
ð 6ð7
ð ð7
ð #'ð7
ð 
 ò7
ó ð7
ðr¨ð °ó ñ  ð ¸#ð ÀdÈ4Ájó ðB àðB ð 4ð	B ð
 
ˆh‰óB ðH"àð"ð 9ð	"ð
 
ˆh‰÷"r%   r5   )1Úloggingr/   Útypingr   r   r   Úlangchain.chainsr   Ú langchain.chains.prompt_selectorr   Úlangchain_core.callbacksr   r	   Úlangchain_core.documentsr
   Úlangchain_core.language_modelsr   Úlangchain_core.output_parsersr   Úlangchain_core.promptsr   r   Úlangchain_core.retrieversr   Úlangchain_core.vectorstoresr   Úlangchain_text_splittersr   r   Úpydanticr   r   Ú$langchain_community.document_loadersr   Ú)langchain_community.document_transformersr   Úlangchain_community.llmsr   Úlangchain_community.utilitiesr   Ú	getLoggerr   rn   r   rV   rU   r"   r+   r5   r$   r%   r&   Ú<module>r§      s³   ðÛ Û 	ß &Ñ &å %Ý F÷õ .Ý 2Ý :ß EÝ 3Ý 3ß Qß %å @Ý JÝ -Ý @à	ˆ×	Ñ	˜8Ó	$€ô�Iô ñ -Ø�LðLôÐ ñ 'Ø�Lð6ôÐ ôÐ/°°S±	Ñ:ô ôN"˜=õ N"r%   