Ë
    ´ŒjZ/  ã                  óÊ   — d 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 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lmZ  eddd¬«       G d„ de«      «       Zy)zOCombining documents by mapping a chain over them first, then combining results.é    )Úannotations)ÚAnyÚOptional)Ú
deprecated)Ú	Callbacks)ÚDocument)ÚRunnableConfig)Úcreate_model)Ú	BaseModelÚ
ConfigDictÚmodel_validator)ÚBaseCombineDocumentsChain)ÚReduceDocumentsChain)ÚLLMChainz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/map_reduce_chain/)ÚsinceÚremovalÚmessagec                  ó‚  ‡ — e Zd ZU dZded<   	 ded<   	 ded<   	 dZd	ed
<   	 	 d	 	 	 dˆ fd„Zedˆ fd„«       Z e	dd¬«      Z
 ed¬«      edd„«       «       Z ed¬«      edd„«       «       Z ed¬«      edd„«       «       Zedd„«       Zedd„«       Z	 	 d	 	 	 	 	 	 	 	 	 d d„Z	 	 d	 	 	 	 	 	 	 	 	 d d„Zed!d„«       Zˆ xZS )"ÚMapReduceDocumentsChaina-  Combining documents by mapping a chain over them, then combining results.

    We first call `llm_chain` on each document individually, passing in the
    `page_content` and any other kwargs. This is the `map` step.

    We then process the results of that `map` step in a `reduce` step. This should
    likely be a ReduceDocumentsChain.

    Example:
        .. code-block:: python

            from langchain.chains import (
                StuffDocumentsChain,
                LLMChain,
                ReduceDocumentsChain,
                MapReduceDocumentsChain,
            )
            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}"
            )
            llm_chain = LLMChain(llm=llm, prompt=prompt)
            # We now define how to combine these summaries
            reduce_prompt = PromptTemplate.from_template(
                "Combine these summaries: {context}"
            )
            reduce_llm_chain = LLMChain(llm=llm, prompt=reduce_prompt)
            combine_documents_chain = StuffDocumentsChain(
                llm_chain=reduce_llm_chain,
                document_prompt=document_prompt,
                document_variable_name=document_variable_name
            )
            reduce_documents_chain = ReduceDocumentsChain(
                combine_documents_chain=combine_documents_chain,
            )
            chain = MapReduceDocumentsChain(
                llm_chain=llm_chain,
                reduce_documents_chain=reduce_documents_chain,
            )
            # If we wanted to, we could also pass in collapse_documents_chain
            # which is specifically aimed at collapsing documents BEFORE
            # the final call.
            prompt = PromptTemplate.from_template(
                "Collapse this content: {context}"
            )
            llm_chain = LLMChain(llm=llm, prompt=prompt)
            collapse_documents_chain = StuffDocumentsChain(
                llm_chain=llm_chain,
                document_prompt=document_prompt,
                document_variable_name=document_variable_name
            )
            reduce_documents_chain = ReduceDocumentsChain(
                combine_documents_chain=combine_documents_chain,
                collapse_documents_chain=collapse_documents_chain,
            )
            chain = MapReduceDocumentsChain(
                llm_chain=llm_chain,
                reduce_documents_chain=reduce_documents_chain,
            )
    r   Ú	llm_chainr   Úreduce_documents_chainÚstrÚdocument_variable_nameFÚboolÚreturn_intermediate_stepsc           	     ó”   •— | j                   r-t        	 di | j                  t        d fdt        t           d fi¤ŽS t
        ‰| �  |«      S )NÚintermediate_steps)ÚMapReduceDocumentsOutput)r   r
   Ú
output_keyr   ÚlistÚsuperÚget_output_schema)ÚselfÚconfigÚ	__class__s     €úw/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain/chains/combine_documents/map_reduce.pyr"   z)MapReduceDocumentsChain.get_output_schemar   sW   ø€ ð ×)Ò)ÜØ*ñð —O‘O¤c¨4 [Ø(¬4´©9°dÐ*;ðñð ô ‰wÑ(¨Ó0Ð0ó    c                ó@   •— t         ‰| �  }| j                  rg |¢d‘}|S )z2Expect input key.

        :meta private:
        r   )r!   Úoutput_keysr   )r#   Ú_output_keysr%   s     €r&   r)   z#MapReduceDocumentsChain.output_keys�   s.   ø€ ô ‘wÑ*ˆØ×)Ò)Ø@˜\Ð@Ð+?Ð@ˆLØÐr'   TÚforbid)Úarbitrary_types_allowedÚextraÚbefore)Úmodec                óª   — d|v rNd|v rd}t        |«      ‚|d   }|j                  d«      }t        ||¬«      }||d<   |d= |j                  dd«       |S )úFor backwards compatibility.Úcombine_document_chainr   z´Both `reduce_documents_chain` and `combine_document_chain` cannot be provided at the same time. `combine_document_chain` is deprecated, please only provide `reduce_documents_chain`Úcollapse_document_chain)Úcombine_documents_chainÚcollapse_documents_chainN)Ú
ValueErrorÚgetr   Úpop)ÚclsÚvaluesÚmsgÚcombine_chainÚcollapse_chainÚreduce_chains         r&   Úget_reduce_chainz(MapReduceDocumentsChain.get_reduce_chain‘   s   € ð $ vÑ-Ø'¨6Ñ1ðRð ô
 ! “oÐ%Ø"Ð#;Ñ<ˆMØ#ŸZ™ZÐ(AÓBˆNÜ/Ø(5Ø)7ôˆLð 0<ˆFÐ+Ñ,ØÐ/Ð0Ø�J‰JÐ0°$Ô7àˆr'   c                ó$   — d|v r|d   |d<   |d= |S )r1   Úreturn_map_stepsr   © )r9   r:   s     r&   Úget_return_intermediate_stepsz5MapReduceDocumentsChain.get_return_intermediate_steps©   s+   € ð  Ñ'Ø28Ð9KÑ2Lˆ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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: )r6   ÚpromptÚinput_variablesÚlen)r9   r:   r;   Úllm_chain_variabless       r&   Ú"get_default_document_variable_namez:MapReduceDocumentsChain.get_default_document_variable_name²   sº   € ð ˜fÑ$Ø.ˆCÜ˜S“/Ð!à$ [Ñ1×8Ñ8×HÑHÐØ#¨6Ñ1ÜÐ&Ó'¨1Ò,Ø3FÀqÑ3I�Ð/Ñ0ð ˆð9ð ô ! “oÐ%ØÐ,Ñ-Ð5HÑHà)¨&Ð1IÑ*JÐ)Kð L;Ø;NÐ:OðQð ô ˜S“/Ð!Øˆr'   c                ó  — t        | j                  t        «      rB| j                  j                  r| j                  j                  S | j                  j                  S dt        | j                  «      › d�}t        |«      ‚©z Kept for backward compatibility.z$`reduce_documents_chain` is of type z$ so it does not have this attribute.)Ú
isinstancer   r   r5   r4   Útyper6   ©r#   r;   s     r&   r3   z/MapReduceDocumentsChain.collapse_document_chainÌ   sw   € ô �d×1Ñ1Ô3GÔHØ×*Ñ*×CÒCØ×2Ñ2×KÑKÐKØ×.Ñ.×FÑFÐFà2Ü�D×/Ñ/Ó0Ð1ð 2ðð 	ô
 ˜‹oÐr'   c                óª   — t        | j                  t        «      r| j                  j                  S dt	        | j                  «      › d�}t        |«      ‚rL   )rM   r   r   r4   rN   r6   rO   s     r&   r2   z.MapReduceDocumentsChain.combine_document_chainÚ   sV   € ô �d×1Ñ1Ô3GÔHØ×.Ñ.×FÑFÐFà2Ü�D×/Ñ/Ó0Ð1ð 2ðð 	ô
 ˜‹oÐr'   c           	     óØ  — | j                   j                  |D �cg c]  }| j                  |j                  i|¥‘Œ c}|¬«      }| j                   j                  }t        |«      D ��	cg c]"  \  }}	t        |	|   ||   j                  ¬«      ‘Œ$ }
}}	 | j                  j                  |
f||dœ|¤Ž\  }}| j                  r|D �	cg c]  }	|	|   ‘Œ	 }}	||d<   ||fS c c}w c c}	}w c c}	w )úàCombine documents in a map reduce manner.

        Combine by mapping first chain over all documents, then reducing the results.
        This reducing can be done recursively if needed (if there are many documents).
        ©Ú	callbacks©Úpage_contentÚmetadata©Ú	token_maxrT   r   )r   Úapplyr   rV   r   Ú	enumerater   rW   r   Úcombine_docsr   ©r#   ÚdocsrY   rT   ÚkwargsÚdÚmap_resultsÚquestion_result_keyÚiÚrÚresult_docsÚresultÚextra_return_dictr   s                 r&   r\   z$MapReduceDocumentsChain.combine_docsæ   s$  € ð —n‘n×*Ñ*áNRÓSÉdÈˆd×)Ñ)¨1¯>©>ÐD¸VÒDÈdÑSØð +ó 
ˆð
 #Ÿn™n×7Ñ7Ðô " +Ô.ô
ñ /‘��1ô  !Ð$7Ñ"8À4ÈÁ7×CSÑCSÖTà.ð 	ñ 
ð
 %M D×$?Ñ$?×$LÑ$LØð%
àØñ%
ð ñ	%
Ñ!ˆÐ!ð ×)Ò)ÙBMÓ!NÁ+¸Q !Ð$7Ó"8À+ÐÐ!NØ6HÐÐ2Ñ3ØÐ(Ð(Ð(ùò% Tùó
ùò "Os   š!CÁ('C!ÃC'c           	   ‹  ó  K  — | j                   j                  |D �cg c]  }| j                  |j                  i|¥‘Œ c}|¬«      ƒ d{  –—† }| j                   j                  }t        |«      D ��	cg c]"  \  }}	t        |	|   ||   j                  ¬«      ‘Œ$ }
}}	 | j                  j                  |
f||dœ|¤Žƒ d{  –—† \  }}| j                  r|D �	cg c]  }	|	|   ‘Œ	 }}	||d<   ||fS c c}w 7 Œ©c c}	}w 7 Œ;c c}	w ­w)rR   rS   NrU   rX   r   )r   Úaapplyr   rV   r   r[   r   rW   r   Úacombine_docsr   r]   s                 r&   rj   z%MapReduceDocumentsChain.acombine_docs  s<  è ø€ ð !ŸN™N×1Ñ1áNRÓSÉdÈˆd×)Ñ)¨1¯>©>ÐD¸VÒDÈdÑSØð 2ó 
÷ 
ˆð
 #Ÿn™n×7Ñ7Ðô " +Ô.ô
ñ /‘��1ô  !Ð$7Ñ"8À4ÈÁ7×CSÑCSÖTà.ð 	ñ 
ð
 +T¨$×*EÑ*E×*SÑ*SØð+
àØñ+
ð ñ	+
÷ %
Ñ!ˆÐ!ð ×)Ò)ÙBMÓ!NÁ+¸Q !Ð$7Ó"8À+ÐÐ!NØ6HÐÐ2Ñ3ØÐ(Ð(Ð(ùò% Tð
úó
ð
%
úò "OùsK   ‚Dœ!C.½DÁ	C3Á
(DÁ2'C5Â&DÂ?C;Ã DÃC=Ã#DÃ5DÃ=Dc                 ó   — y)NÚmap_reduce_documents_chainrB   )r#   s    r&   Ú_chain_typez#MapReduceDocumentsChain._chain_type*  s   € à+r'   )N)r$   zOptional[RunnableConfig]Úreturnztype[BaseModel])rn   z	list[str])r:   Údictrn   r   )rn   r   )NN)
r^   zlist[Document]rY   zOptional[int]rT   r   r_   r   rn   ztuple[str, dict])rn   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r"   Úpropertyr)   r   Úmodel_configr   Úclassmethodr?   rC   rJ   r3   r2   r\   rj   rm   Ú__classcell__)r%   s   @r&   r   r      s˜  ø… ñHðT ÓØ7Ø5Ó5ðJàÓðIà&+Ð˜tÓ+Ø<ð ,0ð1à(ð1ð 
õ1ð ôó ðñ Ø $Øô€Lñ
 ˜(Ô#Øòó ó $ðñ, ˜(Ô#Øòó ó $ðñ ˜(Ô#Øòó ó $ðð0 òó ðð ò	ó ð	ð $(Ø#ð	 )àð )ð !ð )ð ð	 )ð
 ð )ð 
ó )ðJ $(Ø#ð	 )àð )ð !ð )ð ð	 )ð
 ð )ð 
ó )ðD ò,ó ô,r'   r   N)rs   Ú
__future__r   Útypingr   r   Úlangchain_core._apir   Úlangchain_core.callbacksr   Úlangchain_core.documentsr   Úlangchain_core.runnables.configr	   Úlangchain_core.utils.pydanticr
   Úpydanticr   r   r   Ú'langchain.chains.combine_documents.baser   Ú)langchain.chains.combine_documents.reducer   Úlangchain.chains.llmr   r   rB   r'   r&   Ú<module>r„      s\   ðÙ Uå "ç  å *Ý .Ý -Ý :Ý 6ß ;Ñ ;å MÝ JÝ )ñ Ø
Øð	Xô	ôP,Ð7ó P,óñP,r'   