o
    `+ i                      @  s   d 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mZ ddlm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 ddlmZmZ er\ddlmZ dZ G dd deZ!dS )z2Chain for interacting with Elasticsearch Database.    )annotations)TYPE_CHECKINGAnyOptional)CallbackManagerForChainRun)BaseLanguageModel)BaseOutputParserStrOutputParser)SimpleJsonOutputParser)BasePromptTemplate)Runnable)
ConfigDictmodel_validator)Self)Chain)ANSWER_PROMPT
DSL_PROMPT)Elasticsearchintermediate_stepsc                   @  s  e Zd ZU dZded< 	 ded< 	 dZded< 	 dZd	ed
< 	 dZded< dZded< dZ	ded< dZ
ded< dZd	ed< dZded< 	 edddZedddBdd ZedCd"d#ZedCd$d%ZdCd&d'ZdDd)d*ZdEd,d-Z	dFdGd2d3ZedHd4d5Zedddd6dId@dAZdS )JElasticsearchDatabaseChaina  Chain for interacting with Elasticsearch Database.

    Example:
        .. code-block:: python

            from langchain.chains import ElasticsearchDatabaseChain
            from langchain_community.llms import OpenAI
            from elasticsearch import Elasticsearch

            database = Elasticsearch("http://localhost:9200")
            db_chain = ElasticsearchDatabaseChain.from_llm(OpenAI(), database)
    r   query_chainanswer_chainNr   database
   inttop_kzOptional[list[str]]ignore_indicesinclude_indicesquestionstr	input_keyresult
output_key   sample_documents_in_index_infoFboolreturn_intermediate_stepsTZforbid)Zarbitrary_types_allowedextraafter)modereturnr   c                 C  s   | j r| jrd}t|| S )Nz;Cannot specify both 'include_indices' and 'ignore_indices'.)r   r   
ValueError)selfmsg r.   x/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/langchain/chains/elasticsearch_database/base.pyvalidate_indices<   s   z+ElasticsearchDatabaseChain.validate_indices	list[str]c                 C  s   | j gS )z?Return the singular input key.

        :meta private:
        )r    r,   r.   r.   r/   
input_keysC   s   z%ElasticsearchDatabaseChain.input_keysc                 C  s   | j s| jgS | jtgS )z@Return the singular output key.

        :meta private:
        )r&   r"   INTERMEDIATE_STEPS_KEYr2   r.   r.   r/   output_keysK   s   
z&ElasticsearchDatabaseChain.output_keysc                   sN   dd  j jjddD } jr fdd|D } jr% fdd|D }|S )Nc                 S  s   g | ]}|d  qS indexr.   .0r7   r.   r.   r/   
<listcomp>V   s    z<ElasticsearchDatabaseChain._list_indices.<locals>.<listcomp>jsonformatc                   s   g | ]	}| j v r|qS r.   )r   r9   ir2   r.   r/   r:   [       c                   s   g | ]	}| j vr|qS r.   )r   r>   r2   r.   r/   r:   ]   r@   )r   catindicesr   r   )r,   Zall_indicesr.   r2   r/   _list_indicesU   s   z(ElasticsearchDatabaseChain._list_indicesrB   c                   s   | j jjd|d | jdkrA  D ],\}}| j j|di i| jdd d }dd |D }t|d	 d
| d  | d< qd fdd D S )N,r6   r   Z	match_all)r7   querysizehitsc                 S  s   g | ]}t |d  qS )_source)r   )r9   hitr.   r.   r/   r:   j   s    zAElasticsearchDatabaseChain._get_indices_infos.<locals>.<listcomp>z

/*

z
*/mappingsz

c                   s    g | ]}d  | | d qS )zMapping for index {}:
{}rK   r<   r8   rK   r.   r/   r:   m   s    )r   rB   Zget_mappingjoinr$   itemssearchr   )r,   rB   kvrG   r.   rL   r/   _get_indices_infosa   s&   
$
z-ElasticsearchDatabaseChain._get_indices_infosrE   c                 C  s   | j jd||d}t|S )NrD   )r7   body)r   rO   rM   r   )r,   rB   rE   r!   r.   r.   r/   _searchs   s   z"ElasticsearchDatabaseChain._searchinputsdict[str, Any]run_manager$Optional[CallbackManagerForChainRun]c              
   C  s  |pt  }|| j  d}|j|| jd |  }| |}|t| j|dgd}g }z|	| | j
j|d| id}	|j|	d| jd |	|	 |	d	|	i | j||	d
}
|	t|
 |jd| jd |j|
d| jd |jd| jd |
|d}|	| | jj|d| id}|	| |j|d| jd | j|i}| jr||t< W |S W |S  ty } z||_ d }~ww )Nz	
ESQuery:)verbosez

ESResult:)inputr   indices_infostop	callbacks)configgreen)colorrY   es_cmd)rB   rE   z
ESResult: yellowz
Answer:)datarZ   )r   Zget_noop_managerr    Zon_textrY   rC   rR   r   r   appendr   ZinvokeZ	get_childrT   r   r"   r&   r4   	Exceptionr   )r,   rU   rW   Z_run_managerZ
input_textrB   r[   Zquery_inputsr   ra   r!   Zanswer_inputsZfinal_resultZchain_resultexcr.   r.   r/   _callw   s\   








z ElasticsearchDatabaseChain._callc                 C  s   dS )NZelasticsearch_database_chainr.   r2   r.   r.   r/   _chain_type   s   z&ElasticsearchDatabaseChain._chain_type)query_promptanswer_promptquery_output_parserllmr   r   ri   Optional[BasePromptTemplate]rj   rk   Optional[BaseOutputParser]kwargsc          	      K  sJ   |pt }|pt }||B |B }|pt}||B t B }| d|||d|S )a)  Convenience method to construct ElasticsearchDatabaseChain from an LLM.

        Args:
            llm: The language model to use.
            database: The Elasticsearch db.
            query_prompt: The prompt to use for query construction.
            answer_prompt: The prompt to use for answering user question given data.
            query_output_parser: The output parser to use for parsing model-generated
                ES query. Defaults to SimpleJsonOutputParser.
            kwargs: Additional arguments to pass to the constructor.
        )r   r   r   Nr.   )r   r
   r   r	   )	clsrl   r   ri   rj   rk   ro   r   r   r.   r.   r/   from_llm   s   
z#ElasticsearchDatabaseChain.from_llm)r*   r   )r*   r1   )rB   r1   r*   r   )rB   r1   rE   r   r*   r   )N)rU   rV   rW   rX   r*   rV   )r*   r   )rl   r   r   r   ri   rm   rj   rm   rk   rn   ro   r   r*   r   )__name__
__module____qualname____doc____annotations__r   r   r   r   r    r"   r$   r&   r   Zmodel_configr   r0   propertyr3   r5   rC   rR   rT   rg   rh   classmethodrq   r.   r.   r.   r/   r      sN   
 
	

8r   N)"ru   
__future__r   typingr   r   r   Zlangchain_core.callbacksr   Zlangchain_core.language_modelsr   Zlangchain_core.output_parsersr   r	   Z"langchain_core.output_parsers.jsonr
   Zlangchain_core.promptsr   Zlangchain_core.runnablesr   Zpydanticr   r   Ztyping_extensionsr   Zlangchain.chains.baser   Z/langchain.chains.elasticsearch_database.promptsr   r   Zelasticsearchr   r4   r   r.   r.   r.   r/   <module>   s"    