o
    Zh8                      @  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 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DictList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
td| S )Nz;Cannot specify both 'include_indices' and 'ignore_indices'.)r   r   
ValueErrorself r0   c/var/www/html/lang_env/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.   r0   r0   r1   
input_keysD   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_KEYr.   r0   r0   r1   output_keysL   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 indexr0   .0r8   r0   r0   r1   
<listcomp>X   s    z<ElasticsearchDatabaseChain._list_indices.<locals>.<listcomp>jsonformatc                   s   g | ]	}| j v r|qS r0   )r   r:   ir.   r0   r1   r;   ]       c                   s   g | ]	}| j vr|qS r0   )r   r?   r.   r0   r1   r;   _   rA   )r   catindicesr   r   )r/   Zall_indicesr0   r.   r1   _list_indicesW   s   z(ElasticsearchDatabaseChain._list_indicesrC   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,r7   r   Z	match_all)r8   querysizehitsc                 S  s   g | ]}t |d  qS )_source)r!   )r:   hitr0   r0   r1   r;   l   s    zAElasticsearchDatabaseChain._get_indices_infos.<locals>.<listcomp>z

/*

z
*/mappingsz

c                   s    g | ]}d  | | d qS )zMapping for index {}:
{}rL   r=   r9   rL   r0   r1   r;   o   s    )r   rC   Zget_mappingjoinr&   itemssearchr!   )r/   rC   kvrH   r0   rM   r1   _get_indices_infosc   s&   
$
z-ElasticsearchDatabaseChain._get_indices_infosrF   c                 C  s   | j jd||d}t|S )NrE   )r8   body)r   rP   rN   r!   )r/   rC   rF   r#   r0   r0   r1   _searchu   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  ty } z||_|d }~ww )Nz	
ESQuery:)verbosez

ESResult:)inputr   indices_infostop	callbacks)configgreen)colorrZ   es_cmd)rC   rF   z
ESResult: yellowz
Answer:)datar[   )r   Zget_noop_managerr"   Zon_textrZ   rD   rS   r!   r   appendr   ZinvokeZ	get_childrU   r   r$   r(   r5   	Exceptionr   )r/   rV   rX   Z_run_managerZ
input_textrC   r\   Zquery_inputsr   rb   r#   Zanswer_inputsZfinal_resultZchain_resultexcr0   r0   r1   _cally   sX   







z ElasticsearchDatabaseChain._callc                 C  s   dS )NZelasticsearch_database_chainr0   r.   r0   r0   r1   _chain_type   s   z&ElasticsearchDatabaseChain._chain_type)query_promptanswer_promptquery_output_parserllmr	   r   rj   Optional[BasePromptTemplate]rk   rl   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   Nr0   )r   r   r   r   )	clsrm   r   rj   rk   rl   rp   r   r   r0   r0   r1   from_llm   s   
z#ElasticsearchDatabaseChain.from_llm)r,   r   )r,   r3   )rC   r3   r,   r!   )rC   r3   rF   r!   r,   r!   )N)rV   rW   rX   rY   r,   rW   )r,   r!   )rm   r	   r   r   rj   rn   rk   rn   rl   ro   rp   r   r,   r   )__name__
__module____qualname____doc____annotations__r   r   r   r   r"   r$   r&   r(   r   Zmodel_configr   r2   propertyr4   r6   rD   rS   rU   rh   ri   classmethodrr   r0   r0   r0   r1   r      sN   
 



7r   N)$rv   
__future__r   typingr   r   r   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   r5   r   r0   r0   r0   r1   <module>   s"    