
    Ng8                         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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                  v   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          Z ed          d9d            Zed:d!            Zed:d"            Zd:d#Zd;d%Zd<d'Z	 d=d>d,Zed?d-            Zedddd.d@d8            ZdS )A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                @    | j         r| j        rt          d          | S )Nz;Cannot specify both 'include_indices' and 'ignore_indices'.)r!   r    
ValueErrorselfs    h/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain/chains/elasticsearch_database/base.pyvalidate_indicesz+ElasticsearchDatabaseChain.validate_indices<   s3     	D$7 	M       	List[str]c                    | j         gS )z?Return the singular input key.

        :meta private:
        )r$   r3   s    r5   
input_keysz%ElasticsearchDatabaseChain.input_keysD   s     r7   c                <    | j         s| j        gS | j        t          gS )z@Return the singular output key.

        :meta private:
        )r*   r&   INTERMEDIATE_STEPS_KEYr3   s    r5   output_keysz&ElasticsearchDatabaseChain.output_keysL   s(     - 	=O$$O%;<<r7   c                     d  j         j                            d          D             } j        r fd|D             } j        r fd|D             }|S )Nc                    g | ]
}|d          S index ).0rA   s     r5   
<listcomp>z<ElasticsearchDatabaseChain._list_indices.<locals>.<listcomp>X   s)     
 
 
$E'N
 
 
r7   jsonformatc                &    g | ]}|j         v |S rB   )r!   rC   ir4   s     r5   rD   z<ElasticsearchDatabaseChain._list_indices.<locals>.<listcomp>]   s&    OOOQ$:N5N5N15N5N5Nr7   c                &    g | ]}|j         v|S rB   )r    rI   s     r5   rD   z<ElasticsearchDatabaseChain._list_indices.<locals>.<listcomp>_   s&    RRRQd>Q5Q5Q15Q5Q5Qr7   )r   catindicesr!   r    )r4   all_indicess   ` r5   _list_indicesz(ElasticsearchDatabaseChain._list_indicesW   s    
 
(,(9(A(A(A(P(P
 
 
  	POOOOkOOOK 	SRRRRkRRRKr7   rM   c                   | j         j                            d                    |                    | j        dk    r                                D ]u\  }}| j                             |di i| j                  d         d         }d |D             }t          |          dz   d	                    |          z   d
z   |         d<   vd                    fdD                       S )N,r@   r   	match_all)rA   querysizehitsc                8    g | ]}t          |d                    S )_source)r#   )rC   hits     r5   rD   zAElasticsearchDatabaseChain._get_indices_infos.<locals>.<listcomp>l   s$    <<<C	N++<<<r7   z

/*

z
*/mappingsz

c                T    g | ]$}d                      ||         d                   %S )zMapping for index {}:
{}rZ   rF   )rC   rA   rZ   s     r5   rD   zAElasticsearchDatabaseChain._get_indices_infos.<locals>.<listcomp>o   sB        ,225(5/*:UVV  r7   )r   rM   get_mappingjoinr(   itemssearchr#   )r4   rM   kvrU   rZ   s        @r5   _get_indices_infosz-ElasticsearchDatabaseChain._get_indices_infosc   s   =(44388G;L;L4MM.22 (( Y Y1}++&+< ,   	 !	"
 =<t<<<*-a&&:*=		$*ORX*XJ''{{   %  
 
 	
r7   rS   c                ~    | j                             d                    |          |          }t          |          S )NrQ   )rA   body)r   r_   r]   r#   )r4   rM   rS   r%   s       r5   _searchz"ElasticsearchDatabaseChain._searchu   s4    %%CHHW,=,=E%JJ6{{r7   inputsDict[str, Any]run_manager$Optional[CallbackManagerForChainRun]c                   |pt          j                    }|| j                  d}|                    || j                   |                                 }|                     |          }|t          | j                  |dgd}g }	 |	                    |           | j
                            |d|                                i          }	|                    |	d| j                   |	                    |	           |	                    d	|	i           |                     ||	
          }
|	                    t          |
                     |                    d| j                   |                    |
d| j                   |                    d| j                   |
|d}|	                    |           | j                            |d|                                i          }|	                    |           |                    |d| j                   | j        |i}| j        r
||t"          <   |S # t$          $ r}||_        |d }~ww xY w)Nz	
ESQuery:)verbosez

ESResult:)inputr   indices_infostop	callbacks)configgreen)colorrk   es_cmd)rM   rS   z
ESResult: yellowz
Answer:)datarl   )r	   get_noop_managerr$   on_textrk   rO   rb   r#   r   appendr   invoke	get_childre   r   r&   r*   r<   	Exceptionr   )r4   rf   rh   _run_manager
input_textrM   rm   query_inputsr   rs   r%   answer_inputsfinal_resultchain_resultexcs                  r5   _callz ElasticsearchDatabaseChain._cally   s   
 #S&@&Q&S&St~.:::
Z>>>$$&&..w77__("O	
 
 $&$	%%l333%,,#\%;%;%=%=> -  F
   w MMM%%   %%x&8999\\'\@@F%%c&kk222   FFF  x NNN  dl CCC+1J"G"GM%%m444,33#\%;%;%=%=> 4  L
 %%l333  Wdl SSS,0O\+JL- J7I34 	 	 	 &8C"I		s   F3H< <
I	IIc                    dS )Nelasticsearch_database_chainrB   r3   s    r5   _chain_typez&ElasticsearchDatabaseChain._chain_type   s    --r7   )query_promptanswer_promptquery_output_parserllmr
   r   r   Optional[BasePromptTemplate]r   r   Optional[BaseOutputParser]kwargsc                   |pt           }|pt                      }||z  |z  }|pt          }||z  t                      z  } | 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   rB   )r   r   r   r   )	clsr   r   r   r   r   r   r   r   s	            r5   from_llmz#ElasticsearchDatabaseChain.from_llm   s    , $1z1M5K5M5M"S(+>>%6$s*_->->>s 
#%
 
 	
 
 	
r7   )r0   r   )r0   r8   )rM   r8   r0   r#   )rM   r8   rS   r#   r0   r#   )N)rf   rg   rh   ri   r0   rg   )r0   r#   )r   r
   r   r   r   r   r   r   r   r   r   r   r0   r   )__name__
__module____qualname____doc____annotations__r   r   r    r!   r$   r&   r(   r*   r   model_configr   r6   propertyr:   r=   rO   rb   re   r   r   classmethodr   rB   r7   r5   r   r      s
          *0HSEOOOO4*.N....+/O////IJ*+"++++&+++++V: $  L
 _'"""   #"       X  = = = X=
 
 
 

 
 
 
$    =A5 5 5 5 5n . . . X.  6:6::>
 
 
 
 
 [
 
 
r7   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   r<   r   rB   r7   r5   <module>r      sk   8 8 " " " " " " ; ; ; ; ; ; ; ; ; ; ; ; ; ; ? ? ? ? ? ? < < < < < < K K K K K K K K E E E E E E 5 5 5 5 5 5 - - - - - - 0 0 0 0 0 0 0 0 " " " " " " ' ' ' ' ' ' U U U U U U U U ,++++++- {
 {
 {
 {
 {
 {
 {
 {
 {
 {
r7   