a
    ag8                      @  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rd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                
   @  sH  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dddd Zed!dd"d#Zed!dd$d%Zd!dd&d'Zd!dd(d)d*Zd!ddd+d,d-Zd=d.d/d.d0d1d2Zeddd3d4Zedddd5d6d7d8d8d9dd d:d;d<ZdS )>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)moder   )returnc                 C  s   | j r| jrtd| S )Nz;Cannot specify both 'include_indices' and 'ignore_indices'.)r   r   
ValueErrorself r0   z/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain/chains/elasticsearch_database/base.pyvalidate_indices<   s
    z+ElasticsearchDatabaseChain.validate_indicesz	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 dS )z@Return the singular output key.

        :meta private:
        N)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r2 fdd|D } jrJ fdd|D }|S )Nc                 S  s   g | ]}|d  qS indexr0   .0r7   r0   r0   r1   
<listcomp>X   s   z<ElasticsearchDatabaseChain._list_indices.<locals>.<listcomp>jsonformatc                   s   g | ]}| j v r|qS r0   )r   r9   ir.   r0   r1   r:   ]       c                   s   g | ]}| j vr|qS r0   )r   r>   r.   r0   r1   r:   _   r@   )r   catindicesr   r   )r/   Zall_indicesr0   r.   r1   _list_indicesW   s    z(ElasticsearchDatabaseChain._list_indices)rB   r,   c                   s   | j jjd|d | jdkr  D ]X\}}| 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   hitr0   r0   r1   r:   l   r@   zAElasticsearchDatabaseChain._get_indices_infos.<locals>.<listcomp>z

/*

z
*/mappingsz

c                   s    g | ]}d  | | d qS )zMapping for index {}:
{}rK   r<   r8   rK   r0   r1   r:   o   s   )r   rB   Zget_mappingjoinr&   itemssearchr!   )r/   rB   kvrG   r0   rL   r1   _get_indices_infosc   s&    
$
z-ElasticsearchDatabaseChain._get_indices_infos)rB   rE   r,   c                 C  s   | j jd||d}t|S )NrD   )r7   body)r   rO   rM   r!   )r/   rB   rE   r#   r0   r0   r1   _searchu   s    z"ElasticsearchDatabaseChain._searchzDict[str, Any]z$Optional[CallbackManagerForChainRun])inputsrun_managerr,   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rX||t< |W S  ty } z||_|W Y d }~n
d }~0 0 d S )Nz	
ESQuery:)verbosez

ESResult:)inputr   indices_infostop	callbacks)configgreen)colorrW   es_cmd)rB   rE   z
ESResult: yellowz
Answer:)datarX   )r   Zget_noop_managerr"   Zon_textrW   rC   rR   r!   r   appendr   ZinvokeZ	get_childrT   r   r$   r(   r4   	Exceptionr   )r/   rU   rV   Z_run_managerZ
input_textrB   rY   Zquery_inputsr   r_   r#   Zanswer_inputsZfinal_resultZchain_resultexcr0   r0   r1   _cally   sT    







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_parserr	   r   zOptional[BasePromptTemplate]zOptional[BaseOutputParser])llmr   rg   rh   ri   kwargsr,   c          	      K  sJ   |pt }|pt }||B |B }|p$t}||B t B }| f |||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   )r   r   r   r   )	clsrj   r   rg   rh   ri   rk   r   r   r0   r0   r1   from_llm   s    
z#ElasticsearchDatabaseChain.from_llm)N)__name__
__module____qualname____doc____annotations__r   r   r   r   r"   r$   r&   r(   r   Zmodel_configr   r2   propertyr3   r5   rC   rR   rT   re   rf   classmethodrm   r0   r0   r0   r1   r      sB   

 7r   N)$rq   
__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   r4   r   r0   r0   r0   r1   <module>   s    