o
    Jjg                     @  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.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/)since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_splitter
input_textstr	input_key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*   stuff_chainr+   r   r,   r,   R/var/www/html/zoom/venv/lib/python3.10/site-packages/langchain/chains/mapreduce.pyfrom_params/   s0   

zMapReduceChain.from_paramsTforbid)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  r5   )z3Return output key.

        :meta private:
        )r!   r6   r,   r,   r/   output_keys^   r9   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 ))page_contentr   ).0textr,   r,   r/   
<listcomp>o   s    z(MapReduceChain._call.<locals>.<listcomp>)r$   )
r	   get_noop_managerpopr   r   
split_textr   run	get_childr!   )	r7   r;   r=   _run_managerdoc_texttextsdocs_inputs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)   r4   )N)r;   r<   r=   r>   r)   r<   )__name__
__module____qualname____doc____annotations__r   r!   classmethodr0   r   model_configpropertyr8   r:   rN   r,   r,   r,   r/   r      s.   
 !
r   N)%rR   
__future__r   typingr   r   r   r   r   langchain_core._apir   langchain_core.callbacksr	   r
   langchain_core.documentsr   langchain_core.language_modelsr   langchain_core.promptsr   langchain_text_splittersr   pydanticr   langchain.chainsr   langchain.chains.baser   'langchain.chains.combine_documents.baser   -langchain.chains.combine_documents.map_reducer   (langchain.chains.combine_documents.stuffr   langchain.chains.llmr   r   r,   r,   r,   r/   <module>   s,    
