Ë
    ´Œj-%  ã                  óÆ   — d 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mZmZ dd
lmZ ddlmZ dd„Z eddd¬«       G d„ de«      «       Zy)zLCombine documents by doing a first pass and then refining on more documents.é    )Úannotations)ÚAny)Ú
deprecated)Ú	Callbacks)ÚDocument)ÚBasePromptTemplateÚformat_document©ÚPromptTemplate)Ú
ConfigDictÚFieldÚmodel_validator)ÚBaseCombineDocumentsChain)ÚLLMChainc                 ó   — t        dgd¬«      S )NÚpage_contentz{page_content})Úinput_variablesÚtemplater
   © ó    ús/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain/chains/combine_documents/refine.pyÚ_get_default_document_promptr      s   € Ü¨>Ð*:ÐEUÔVÐVr   z0.3.1z1.0z«This class is deprecated. Please see the migration guide here for a recommended replacement: https://python.langchain.com/docs/versions/migrating_chains/refine_docs_chain/)ÚsinceÚremovalÚmessagec                  ó`  ‡ — e Zd ZU dZded<   	 ded<   	 ded<   	 ded<   	  ee¬«      Zd	ed
<   	 dZded<   	 e	dˆ fd„«       Z
 edd¬«      Z ed¬«      edd„«       «       Z ed¬«      edd„«       «       Z	 d	 	 	 	 	 	 	 dd„Z	 d	 	 	 	 	 	 	 dd„Zd d„Zd!d„Z	 	 	 	 	 	 d"d„Ze	d#d„«       Zˆ xZS )$ÚRefineDocumentsChaina&	  Combine documents by doing a first pass and then refining on more documents.

    This algorithm first calls `initial_llm_chain` on the first document, passing
    that first document in with the variable name `document_variable_name`, and
    produces a new variable with the variable name `initial_response_name`.

    Then, it loops over every remaining document. This is called the "refine" step.
    It calls `refine_llm_chain`,
    passing in that document with the variable name `document_variable_name`
    as well as the previous response with the variable name `initial_response_name`.

    Example:
        .. code-block:: python

            from langchain.chains import RefineDocumentsChain, LLMChain
            from langchain_core.prompts import PromptTemplate
            from langchain_community.llms import OpenAI

            # This controls how each document will be formatted. Specifically,
            # it will be passed to `format_document` - see that function for more
            # details.
            document_prompt = PromptTemplate(
                input_variables=["page_content"],
                 template="{page_content}"
            )
            document_variable_name = "context"
            llm = OpenAI()
            # The prompt here should take as an input variable the
            # `document_variable_name`
            prompt = PromptTemplate.from_template(
                "Summarize this content: {context}"
            )
            initial_llm_chain = LLMChain(llm=llm, prompt=prompt)
            initial_response_name = "prev_response"
            # The prompt here should take as an input variable the
            # `document_variable_name` as well as `initial_response_name`
            prompt_refine = PromptTemplate.from_template(
                "Here's your first summary: {prev_response}. "
                "Now add to it based on the following context: {context}"
            )
            refine_llm_chain = LLMChain(llm=llm, prompt=prompt_refine)
            chain = RefineDocumentsChain(
                initial_llm_chain=initial_llm_chain,
                refine_llm_chain=refine_llm_chain,
                document_prompt=document_prompt,
                document_variable_name=document_variable_name,
                initial_response_name=initial_response_name,
            )
    r   Úinitial_llm_chainÚrefine_llm_chainÚstrÚdocument_variable_nameÚinitial_response_name)Údefault_factoryr   Údocument_promptFÚboolÚreturn_intermediate_stepsc                ó@   •— t         ‰| �  }| j                  rg |¢d‘}|S )z2Expect input key.

        :meta private:
        Úintermediate_steps)ÚsuperÚoutput_keysr&   )ÚselfÚ_output_keysÚ	__class__s     €r   r*   z RefineDocumentsChain.output_keysd   s.   ø€ ô ‘wÑ*ˆØ×)Ò)Ø@˜\Ð@Ð+?Ð@ˆLØÐr   TÚforbid)Úarbitrary_types_allowedÚextraÚbefore)Úmodec                ó$   — d|v r|d   |d<   |d= |S )zFor backwards compatibility.Úreturn_refine_stepsr&   r   )ÚclsÚvaluess     r   Úget_return_intermediate_stepsz2RefineDocumentsChain.get_return_intermediate_stepst   s+   € ð ! FÑ*Ø28Ð9NÑ2OˆFÐ.Ñ/ØÐ,Ð-Øˆr   c                óæ   — d|vrd}t        |«      ‚|d   j                  j                  }d|vr%t        |«      dk(  r
|d   |d<   |S d}t        |«      ‚|d   |vrd|d   › d|› �}t        |«      ‚|S )	z4Get default document variable name, if not provided.r   z"initial_llm_chain must be providedr!   é   r   zWdocument_variable_name must be provided if there are multiple llm_chain input_variableszdocument_variable_name z- was not found in llm_chain input_variables: )Ú
ValueErrorÚpromptr   Úlen)r5   r6   ÚmsgÚllm_chain_variabless       r   Ú"get_default_document_variable_namez7RefineDocumentsChain.get_default_document_variable_name}   s»   € ð  fÑ,Ø6ˆCÜ˜S“/Ð!à$Ð%8Ñ9×@Ñ@×PÑPÐØ#¨6Ñ1ÜÐ&Ó'¨1Ò,Ø3FÀqÑ3I�Ð/Ñ0ð ˆð9ð ô ! “oÐ%ØÐ,Ñ-Ð5HÑHà)¨&Ð1IÑ*JÐ)Kð L;Ø;NÐ:OðQð ô ˜S“/Ð!Øˆr   c                ó0  —  | j                   |fi |¤Ž} | j                  j                  dd|i|¤Ž}|g}|dd D ]I  }| j                  ||«      }i |¥|¥} | j                  j                  dd|i|¤Ž}|j                  |«       ŒK | j                  ||«      S )aõ  Combine by mapping first chain over all, then stuffing into final chain.

        Args:
            docs: List of documents to combine
            callbacks: Callbacks to be passed through
            **kwargs: additional parameters to be passed to LLM calls (like other
                input variables besides the documents)

        Returns:
            The first element returned is the single string output. The second
            element returned is a dictionary of other keys to return.
        Ú	callbacksr9   Nr   )Ú_construct_initial_inputsr   ÚpredictÚ_construct_refine_inputsr   ÚappendÚ_construct_result©	r+   ÚdocsrA   ÚkwargsÚinputsÚresÚrefine_stepsÚdocÚbase_inputss	            r   Úcombine_docsz!RefineDocumentsChain.combine_docs—   s¶   € ð$ 0�×/Ñ/°Ñ?¸Ñ?ˆØ,ˆd×$Ñ$×,Ñ,ÑK°yÐKÀFÑKˆØ�uˆØ˜˜“8ˆCØ×7Ñ7¸¸SÓAˆKØ.˜Ð. vÐ.ˆFØ/�$×'Ñ'×/Ñ/ÑN¸)ÐNÀvÑNˆCØ×Ñ Õ$ð	 ð
 ×%Ñ% l°CÓ8Ð8r   c              ‹  ó`  K  —  | j                   |fi |¤Ž} | j                  j                  dd|i|¤Žƒ d{  –—† }|g}|dd D ]Q  }| j                  ||«      }i |¥|¥} | j                  j                  dd|i|¤Žƒ d{  –—† }|j                  |«       ŒS | j                  ||«      S 7 Œr7 Œ+­w)a  Async combine by mapping a first chain over all, then stuffing
         into a final chain.

        Args:
            docs: List of documents to combine
            callbacks: Callbacks to be passed through
            **kwargs: additional parameters to be passed to LLM calls (like other
                input variables besides the documents)

        Returns:
            The first element returned is the single string output. The second
            element returned is a dictionary of other keys to return.
        rA   Nr9   r   )rB   r   ÚapredictrD   r   rE   rF   rG   s	            r   Úacombine_docsz"RefineDocumentsChain.acombine_docs³   sÍ   è ø€ ð& 0�×/Ñ/°Ñ?¸Ñ?ˆØ3�D×*Ñ*×3Ñ3ÑR¸iÐRÈ6ÑR×RˆØ�uˆØ˜˜“8ˆCØ×7Ñ7¸¸SÓAˆKØ.˜Ð. vÐ.ˆFØ6˜×-Ñ-×6Ñ6ÑUÀÐUÈfÑU×UˆCØ×Ñ Õ$ð	 ð
 ×%Ñ% l°CÓ8Ð8ð Søð
 Vús"   ‚5B.·B*¸AB.Â B,Â*B.Â,B.c                ó6   — | j                   rd|i}||fS i }||fS )Nr(   )r&   )r+   rL   rK   Úextra_return_dicts       r   rF   z&RefineDocumentsChain._construct_resultÐ   s8   € Ø×)Ò)Ø!5°|Ð DÐð Ð%Ð%Ð%ð !#ÐØÐ%Ð%Ð%r   c                ó^   — | j                   t        || j                  «      | j                  |iS ©N)r!   r	   r$   r"   )r+   rM   rK   s      r   rD   z-RefineDocumentsChain._construct_refine_inputs×   s/   € à×'Ñ'¬¸¸d×>RÑ>RÓ)SØ×&Ñ&¨ð
ð 	
r   c                ó  — d|d   j                   i}|j                  |d   j                  «       | j                  j                  D �ci c]  }|||   “Œ
 }}| j
                   | j                  j                  di |¤Ži}i |¥|¥S c c}w )Nr   r   r   )r   ÚupdateÚmetadatar$   r   r!   Úformat)r+   rH   rI   Ú	base_infoÚkÚdocument_inforN   s          r   rB   z.RefineDocumentsChain._construct_initial_inputsÝ   s›   € ð
 $ T¨!¡W×%9Ñ%9Ð:ˆ	Ø×Ñ˜˜a™×)Ñ)Ô*Ø26×2FÑ2F×2VÒ2VÓWÑ2V¨Q˜˜I a™L™Ð2VˆÐWà×'Ñ'Ð)D¨×)=Ñ)=×)DÑ)DÑ)UÀ}Ñ)Uð
ˆð )�+Ð( Ð(Ð(ùò	 Xs   ÁBc                 ó   — y)NÚrefine_documents_chainr   )r+   s    r   Ú_chain_typez RefineDocumentsChain._chain_typeê   s   € à'r   )Úreturnú	list[str])r6   Údictra   r   rV   )rH   úlist[Document]rA   r   rI   r   ra   útuple[str, dict])rL   rb   rK   r    ra   re   )rM   r   rK   r    ra   údict[str, Any])rH   rd   rI   r   ra   rf   )ra   r    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r$   r&   Úpropertyr*   r   Úmodel_configr   Úclassmethodr7   r?   rO   rR   rF   rD   rB   r`   Ú__classcell__)r-   s   @r   r   r      s`  ø… ñ0ðd  ÓØ/ØÓØ)ØÓðQàÓØLÙ*/Ø4ô+€OÐ'ó ð SØ&+Ð˜tÓ+Ø?àôó ðñ Ø $Øô€Lñ
 ˜(Ô#Øòó ó $ðñ ˜(Ô#Øòó ó $ðð6  $ð9àð9ð ð9ð ð	9ð
 
ó9ð>  $ð9àð9ð ð9ð ð	9ð
 
ó9ó:&ó
ð)àð)ð ð)ð 
ó	)ð ò(ó ô(r   r   N)ra   r   )rj   Ú
__future__r   Útypingr   Úlangchain_core._apir   Úlangchain_core.callbacksr   Úlangchain_core.documentsr   Úlangchain_core.promptsr   r	   Úlangchain_core.prompts.promptr   Úpydanticr   r   r   Ú'langchain.chains.combine_documents.baser   Úlangchain.chains.llmr   r   r   r   r   r   Ú<module>rz      sc   ðÙ Rå "å å *Ý .Ý -ß FÝ 8ß 7Ñ 7õõ *óWñ Ø
Øð	Yô	ôK(Ð4ó K(óñK(r   