U
    h                     @  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! 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)ReduceDocumentsChain)Chain)BaseCombineDocumentsChain)MapReduceDocumentsChain)StuffDocumentsChain)LLMChainz0.2.13z1.0zRefer here for a recommended map-reduce implementation using langgraph: https://langchain-ai.github.io/langgraph/how-tos/map-reduce/. See also migration guide: https://python.langchain.com/v0.2/docs/versions/migrating_chains/map_reduce_chain/)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ddddd dddZG dd dZ	e
ddddZe
ddddZd"dd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_keyNr   r   r
   zOptional[Mapping[str, Any]]r   )llmpromptr   	callbackscombine_chain_kwargsreduce_chain_kwargskwargsreturnc                 K  sh   t |||d}tf ||d|r"|ni }	t|	d}
tf ||
|d|rJ|ni }| f |||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   )r   r   r   r   )clsr   r   r   r   r    r!   r"   r$   Zstuff_chainr%   r    r'   >/tmp/pip-unpacked-wheel-bo69hh5q/langchain/chains/mapreduce.pyfrom_params.   s0    

zMapReduceChain.from_paramsc                   @  s   e Zd ZdZdZdS )zMapReduceChain.ConfigTZforbidN)__name__
__module____qualname__Zarbitrary_types_allowedextrar'   r'   r'   r(   ConfigP   s   r.   z	List[str])r#   c                 C  s   | j gS )z2Expect input key.

        :meta private:
        )r   selfr'   r'   r(   
input_keysT   s    zMapReduceChain.input_keysc                 C  s   | j gS )z3Return output key.

        :meta private:
        )r   r/   r'   r'   r(   output_keys\   s    zMapReduceChain.output_keyszDict[str, str]z$Optional[CallbackManagerForChainRun])inputsrun_managerr#   c           	      C  s`   |p
t  }|| j}| j|}dd |D }|| 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>m   s     z(MapReduceChain._call.<locals>.<listcomp>)r   )
r	   Zget_noop_managerpopr   r   Z
split_textr   runZ	get_childr   )	r0   r3   r4   Z_run_managerZdoc_textZtextsZdocsZ_inputsoutputsr'   r'   r(   _calld   s      zMapReduceChain._call)NNN)N)r*   r+   r,   __doc____annotations__r   r   classmethodr)   r.   propertyr1   r2   r;   r'   r'   r'   r(   r      s"   
    !
 r   N)#r<   
__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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(   
