o
    Jjg8                      @  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_stepsTforbid)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 r2   d/var/www/html/zoom/venv/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"   r0   r2   r2   r3   
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_KEYr0   r2   r2   r3   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 indexr2   .0r:   r2   r2   r3   
<listcomp>X   s    z<ElasticsearchDatabaseChain._list_indices.<locals>.<listcomp>jsonformatc                   s   g | ]	}| j v r|qS r2   )r   r<   ir0   r2   r3   r=   ]       c                   s   g | ]	}| j vr|qS r2   )r   rA   r0   r2   r3   r=   _   rC   )r   catindicesr   r   )r1   all_indicesr2   r0   r3   _list_indicesW   s   z(ElasticsearchDatabaseChain._list_indicesrE   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,r9   r   	match_all)r:   querysizehitsc                 S  s   g | ]}t |d  qS )_source)r!   )r<   hitr2   r2   r3   r=   l   s    zAElasticsearchDatabaseChain._get_indices_infos.<locals>.<listcomp>z

/*

z
*/mappingsz

c                   s    g | ]}d  | | d qS )zMapping for index {}:
{}rP   r?   r;   rP   r2   r3   r=   o   s    )r   rE   get_mappingjoinr&   itemssearchr!   )r1   rE   kvrL   r2   rQ   r3   _get_indices_infosc   s&   
$
z-ElasticsearchDatabaseChain._get_indices_infosrJ   c                 C  s   | j jd||d}t|S )NrH   )r:   body)r   rU   rS   r!   )r1   rE   rJ   r#   r2   r2   r3   _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)colorr_   es_cmd)rE   rJ   z
ESResult: yellowz
Answer:)datar`   )r   get_noop_managerr"   on_textr_   rG   rX   r!   r   appendr   invoke	get_childrZ   r   r$   r(   r7   	Exceptionr   )r1   r[   r]   _run_manager
input_textrE   ra   query_inputsr   rg   r#   answer_inputsfinal_resultchain_resultexcr2   r2   r3   _cally   sX   







z ElasticsearchDatabaseChain._callc                 C  s   dS )Nelasticsearch_database_chainr2   r0   r2   r2   r3   _chain_type   s   z&ElasticsearchDatabaseChain._chain_type)query_promptanswer_promptquery_output_parserllmr	   r   rz   Optional[BasePromptTemplate]r{   r|   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   Nr2   )r   r   r   r   )	clsr}   r   rz   r{   r|   r   r   r   r2   r2   r3   from_llm   s   
z#ElasticsearchDatabaseChain.from_llm)r.   r   )r.   r5   )rE   r5   r.   r!   )rE   r5   rJ   r!   r.   r!   )N)r[   r\   r]   r^   r.   r\   )r.   r!   )r}   r	   r   r   rz   r~   r{   r~   r|   r   r   r   r.   r   )__name__
__module____qualname____doc____annotations__r   r   r   r   r"   r$   r&   r(   r   model_configr   r4   propertyr6   r8   rG   rX   rZ   rw   ry   classmethodr   r2   r2   r2   r3   r      sN   
 



7r   N)$r   
__future__r   typingr   r   r   r   r   langchain_core.callbacksr   langchain_core.language_modelsr	   langchain_core.output_parsersr
   r   "langchain_core.output_parsers.jsonr   langchain_core.promptsr   langchain_core.runnablesr   pydanticr   r   typing_extensionsr   langchain.chains.baser   /langchain.chains.elasticsearch_database.promptsr   r   elasticsearchr   r7   r   r2   r2   r2   r3   <module>   s"    