o
    `+ i$                     @  s   d 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 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)Mapping)Any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&   f/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/langchain/chains/mapreduce.pyfrom_params0   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_keysW      zMapReduceChain.input_keysc                 C  r,   )z3Return output key.

        :meta private:
        )r   r-   r&   r&   r(   output_keys_   r0   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>p   s    z(MapReduceChain._call.<locals>.<listcomp>)r   )
r   Zget_noop_managerpopr   r   Z
split_textr   runZ	get_childr   )	r.   r2   r4   Z_run_managerZdoc_textZtextsdocsZ_inputsZoutputsr&   r&   r(   _callg   s   
zMapReduceChain._call)NNN)r   r   r   r   r   r   r   r   r   r    r!   r    r"   r   r#   r   )r#   r+   )N)r2   r3   r4   r5   r#   r3   )__name__
__module____qualname____doc____annotations__r   r   classmethodr)   r   Zmodel_configpropertyr/   r1   r<   r&   r&   r&   r(   r      s.   
 !
r   N)$r@   
__future__r   collections.abcr   typingr   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.    
