o
    Zh                     @  s   d Z ddlmZ ddlmZmZmZmZ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 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# e
ddddG dd deZ$dS )zMap-reduce chain.

Splits up a document, sends the smaller parts to the LLM with one prompt,
then combines the results with another one.
    )annotations)AnyDictListMappingOptional)
deprecated)CallbackManagerForChainRun	CallbacksDocument)BaseLanguageModel)BasePromptTemplate)TextSplitter)
ConfigDict)ReduceDocumentsChain)Chain)BaseCombineDocumentsChain)MapReduceDocumentsChain)StuffDocumentsChain)LLMChainz0.2.13z1.0a  Refer to migration guide here for a recommended implementation using LangGraph: https://python.langchain.com/docs/versions/migrating_chains/map_reduce_chain/. See also LangGraph guides for map-reduce: https://langchain-ai.github.io/langgraph/how-tos/map-reduce/.)ZsinceZremovalmessagec                   @  s   e Zd ZU dZded< 	 ded< 	 dZded< d	Zded
< e			d(d)ddZe	dddZ
ed*ddZed*d d!Z	d+d,d&d'ZdS )-MapReduceChainzMap-reduce chain.r   combine_documents_chainr   text_splitterZ
input_textstr	input_keyZoutput_text
output_keyNllmr   promptr   	callbacksr
   combine_chain_kwargsOptional[Mapping[str, Any]]reduce_chain_kwargskwargsr   returnc                 K  sh   t |||d}td||d|r|ni }	t|	d}
td||
|d|r%|ni }| d|||d|S )zDConstruct a map-reduce chain that uses the chain for map and reduce.)r   r   r    )	llm_chainr    )r   )r&   reduce_documents_chainr    )r   r   r    N )r   r   r   r   )clsr   r   r   r    r!   r#   r$   r&   Zstuff_chainr'   r   r(   r(   Q/var/www/html/lang_env/lib/python3.10/site-packages/langchain/chains/mapreduce.pyfrom_params/   s0   

zMapReduceChain.from_paramsTZforbid)Zarbitrary_types_allowedextra	List[str]c                 C     | j gS )z2Expect input key.

        :meta private:
        )r   selfr(   r(   r*   
input_keysV      zMapReduceChain.input_keysc                 C  r.   )z3Return output key.

        :meta private:
        )r   r/   r(   r(   r*   output_keys^   r2   zMapReduceChain.output_keysinputsDict[str, str]run_manager$Optional[CallbackManagerForChainRun]c           	      C  sd   |pt  }|| j}| j|}dd |D }i || jj|i}| jj|| d}| j	|iS )Nc                 S  s   g | ]}t |d qS ))Zpage_contentr   ).0textr(   r(   r*   
<listcomp>o   s    z(MapReduceChain._call.<locals>.<listcomp>)r    )
r	   Zget_noop_managerpopr   r   Z
split_textr   runZ	get_childr   )	r0   r4   r6   Z_run_managerZdoc_textZtextsdocsZ_inputsZoutputsr(   r(   r*   _callf   s   
zMapReduceChain._call)NNN)r   r   r   r   r   r   r    r
   r!   r"   r#   r"   r$   r   r%   r   )r%   r-   )N)r4   r5   r6   r7   r%   r5   )__name__
__module____qualname____doc____annotations__r   r   classmethodr+   r   Zmodel_configpropertyr1   r3   r>   r(   r(   r(   r*   r      s.   
 !
r   N)%rB   
__future__r   typingr   r   r   r   r   Zlangchain_core._apir   Zlangchain_core.callbacksr	   r
   Zlangchain_core.documentsr   Zlangchain_core.language_modelsr   Zlangchain_core.promptsr   Zlangchain_text_splittersr   Zpydanticr   Zlangchain.chainsr   Zlangchain.chains.baser   Z'langchain.chains.combine_documents.baser   Z-langchain.chains.combine_documents.map_reducer   Z(langchain.chains.combine_documents.stuffr   Zlangchain.chains.llmr   r   r(   r(   r(   r*   <module>   s,    
