
    9|h8                         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#y)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                  n   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      d'd       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.d&       Zy)/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)modec                L    | j                   r| j                  rt        d      | S )Nz;Cannot specify both 'include_indices' and 'ignore_indices'.)r!   r    
ValueErrorselfs    k/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain/chains/elasticsearch_database/base.pyvalidate_indicesz+ElasticsearchDatabaseChain.validate_indices<   s*    D$7$7M      c                    | j                   gS )z?Return the singular input key.

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

        :meta private:
        )r*   r&   INTERMEDIATE_STEPS_KEYr2   s    r4   output_keysz&ElasticsearchDatabaseChain.output_keysL   s*     --OO$$OO%;<<r6   c                8   | j                   j                  j                  d      D cg c]  }|d   	 }}| j                  r|D cg c]  }|| j                  v s| }}| j                  r|D cg c]  }|| j                  vs| }}|S c c}w c c}w c c}w )Njson)formatindex)r   catindicesr!   r    )r3   r?   all_indicesis       r4   _list_indicesz(ElasticsearchDatabaseChain._list_indicesW   s    (,(9(9(A(A(A(P
$E'N
 
 &1OQ$:N:N5N1OKO&1RQd>Q>Q5Q1RKR

 PRs   BBB1BBc           
         | j                   j                  j                  dj                  |            }| j                  dkD  r|j                         D ]y  \  }}| j                   j                  |di i| j                        d   d   }|D cg c]  }t        |d          }}t        |      dz   d	j                  |      z   d
z   ||   d<   { dj                  |D cg c]  }dj                  |||   d          c}      S c c}w c c}w )N,)r?   r   	match_all)r?   querysizehits_sourcez

/*

z
*/mappingsz

zMapping for index {}:
{})	r   rA   get_mappingjoinr(   itemssearchr#   r>   )r3   rA   rM   kvrJ   hitr?   s           r4   _get_indices_infosz-ElasticsearchDatabaseChain._get_indices_infosc   s&   ==((44388G;L4M..2 ( Y1}}++&+<< ,  	 !	"
 8<<C	N+<<*-a&:*=		$*ORX*XJ'Y {{ & ,225(5/*:UV
 	
 =s   D Dc                p    | j                   j                  dj                  |      |      }t        |      S )NrF   )r?   body)r   rQ   rO   r#   )r3   rA   rH   r%   s       r4   _searchz"ElasticsearchDatabaseChain._searchu   s.    %%CHHW,=E%J6{r6   c                z   |xs t        j                         }|| j                      d}|j                  || j                         | j                         }| j                  |      }|t        | j                        |dgd}g }	 |j                  |       | j                  j                  |d|j                         i      }	|j                  |	d| j                         |j                  |	       |j                  d	|	i       | j                  ||	
      }
|j                  t        |
             |j                  d| j                         |j                  |
d| j                         |j                  d| j                         |
|d}|j                  |       | j                  j                  |d|j                         i      }|j                  |       |j                  |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)colorrZ   es_cmd)rA   rH   z
ESResult: yellowz
Answer:)datar[   )r	   get_noop_managerr$   on_textrZ   rD   rU   r#   r   appendr   invoke	get_childrX   r   r&   r*   r:   	Exceptionr   )r3   inputsrun_manager_run_manager
input_textrA   r\   query_inputsr   rb   r%   answer_inputsfinal_resultchain_resultexcs                  r4   _callz ElasticsearchDatabaseChain._cally   s-   
 #S&@&Q&Q&St~~./z:
Z>$$&..w7_("O	
 $&$	%%l3%%,,#\%;%;%=> - F
   w M%% %%x&89\\'\@F%%c&k2   F  x N  dll C+1J"GM%%m4,,33#\%;%;%=> 4 L
 %%l3  Wdll S,0OO\+JL--7I34 	 &8C"I		s   FH# #	H:,	H55H:c                     y)Nelasticsearch_database_chain r2   s    r4   _chain_typez&ElasticsearchDatabaseChain._chain_type   s    -r6   )query_promptanswer_promptquery_output_parserc                   |xs t         }|xs
 t               }||z  |z  }|xs 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   rw   )r   r   r   r   )	clsllmr   ry   rz   r{   kwargsr   r   s	            r4   from_llmz#ElasticsearchDatabaseChain.from_llm   sn    , $1z1M5K5M"S(+>>%6$s*_->> 
#%
 	
 	
r6   )returnr   )r   	List[str])rA   r   r   r#   )rA   r   rH   r#   r   r#   )N)rk   Dict[str, Any]rl   z$Optional[CallbackManagerForChainRun]r   r   )r   r#   )r~   r
   r   r   ry   Optional[BasePromptTemplate]rz   r   r{   zOptional[BaseOutputParser]r   r   r   r   )__name__
__module____qualname____doc____annotations__r   r   r    r!   r$   r&   r(   r*   r   model_configr   r5   propertyr8   r;   rD   rU   rX   rt   rx   classmethodr   rw   r6   r4   r   r      sv    *0HcSE3O4*.N'.+/O(/IsJ*+"C+&+t+V $L
 '" #     = =

$ =A55 :5 
	5n . .  6:6::>

  

 3
 4
 8
 
 
$
 
r6   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   rw   r6   r4   <module>r      sI    8 " ; ; ? < K E 5 - 0 " ' U+- {
 {
r6   