
    @h                         S r SSKJr  SSKJrJrJr  SSKJr  SSK	J
r
  SSKJrJr  SSKJr  SSKJr  SS	KJr  SS
KJrJr  SSKJr  SSKJr  SSKJrJr  \(       a  SSKJr  Sr  " S S\5      r!g)z2Chain for interacting with Elasticsearch Database.    )annotations)TYPE_CHECKINGAnyOptional)CallbackManagerForChainRun)BaseLanguageModel)BaseOutputParserStrOutputParser)SimpleJsonOutputParser)BasePromptTemplate)Runnable)
ConfigDictmodel_validator)Self)Chain)ANSWER_PROMPT
DSL_PROMPT)Elasticsearchintermediate_stepsc                     \ rS rSr% SrS\S'    S\S'    SrS\S'    S	rS
\S'    SrS\S'   Sr	S\S'   Sr
S\S'   SrS\S'   SrS
\S'   SrS\S'    \" SSS9r\" SS9S)S j5       r\S*S j5       r\S*S  j5       rS*S! jrS+S" jrS,S# jr S-     S.S$ jjr\S/S% j5       r\SSSS&.             S0S' jj5       rS(rg)1ElasticsearchDatabaseChain   a  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                d    U R                   (       a  U R                  (       a  Sn[        U5      eU $ )Nz;Cannot specify both 'include_indices' and 'ignore_indices'.)r    r   
ValueError)selfmsgs     d/var/www/html/shao/venv/lib/python3.13/site-packages/langchain/chains/elasticsearch_database/base.pyvalidate_indices+ElasticsearchDatabaseChain.validate_indices<   s'    D$7$7OCS/!    c                    U R                   /$ )z/Return the singular input key.

:meta private:
)r#   r1   s    r3   
input_keys%ElasticsearchDatabaseChain.input_keysC   s     r6   c                b    U R                   (       d  U R                  /$ U R                  [        /$ )z0Return the singular output key.

:meta private:
)r)   r%   INTERMEDIATE_STEPS_KEYr8   s    r3   output_keys&ElasticsearchDatabaseChain.output_keysK   s*     --OO$$!788r6   c                X   U R                   R                  R                  SS9 Vs/ sH  oS   PM	     nnU R                  (       a"  U Vs/ sH  o3U R                  ;   d  M  UPM     nnU R                  (       a"  U Vs/ sH  o3U R                  ;  d  M  UPM     nnU$ s  snf s  snf s  snf )Njson)formatindex)r   catindicesr    r   )r1   rB   all_indicesis       r3   _list_indices(ElasticsearchDatabaseChain._list_indicesU   s    (,(9(9(A(A(A(P
(Pu'N(P 	 
 &1Ok$:N:N5N1kKO&1Rkd>Q>Q5Q1kKR

 PRs   B
B" B"=B'B'c           
        U R                   R                  R                  SR                  U5      S9nU R                  S:  a  UR                  5        Hw  u  p4U R                   R                  US0 0U R                  S9S   S   nU Vs/ sH  n[        US   5      PM     nn[        U5      S-   S	R                  U5      -   S
-   X#   S'   My     SR                  U Vs/ sH  nSR                  XrU   S   5      PM     sn5      $ s  snf s  snf )N,)rB   r   	match_all)rB   querysizehits_sourcez

/*

z
*/mappingsz

zMapping for index {}:
{})	r   rD   get_mappingjoinr'   itemssearchr"   rA   )r1   rD   rQ   kvrN   hitrB   s           r3   _get_indices_infos-ElasticsearchDatabaseChain._get_indices_infosa   s   ==((44388G;L4M..2 (}}++&+<< ,  	 !	"
 8<<tC	N+t<*-a&:*=		$*ORX*XJ' ) {{ &%E ,2255/*:UV%
 	
 =s   	D D	c                j    U R                   R                  SR                  U5      US9n[        U5      $ )NrJ   )rB   body)r   rU   rS   r"   )r1   rD   rL   r$   s       r3   _search"ElasticsearchDatabaseChain._searchs   s.    %%CHHW,=E%J6{r6   c                N   U=(       d    [         R                  " 5       nXR                      S3nUR                  X@R                  S9  U R                  5       nU R                  U5      nU[        U R                  5      US/S.n/ n UR                  U5        U R                  R                  USUR                  5       0S9n	UR                  U	SU R                  S9  UR                  U	5        UR                  S	U	05        U R                  XYS
9n
UR                  [        U
5      5        UR                  SU R                  S9  UR                  U
SU R                  S9  UR                  SU R                  S9  XS.nUR                  U5        U R                  R                  USUR                  5       0S9nUR                  U5        UR                  USU R                  S9  U R                  U0nU R                   (       a  X["        '   U$ ! [$         a  nXl        e S nAff = f)Nz	
ESQuery:)verbosez

ESResult:)inputr   indices_infostop	callbacks)configgreen)colorr`   es_cmd)rD   rL   z
ESResult: yellowz
Answer:)datara   )r   get_noop_managerr#   on_textr`   rG   rY   r"   r   appendr   invoke	get_childr]   r   r%   r)   r<   	Exceptionr   )r1   inputsrun_manager_run_manager
input_textrD   rb   query_inputsr   rh   r$   answer_inputsfinal_resultchain_resultexcs                  r3   _call ElasticsearchDatabaseChain._callw   s#   
 #S&@&Q&Q&S~~./z:
Z>$$&..w7_("O	
 $&#	%%l3%%,,#\%;%;%=> - F
   w M%% %%x&89\\'\@F%%c&k2   F  x N  dll C+1"GM%%m4,,33#\%;%;%=> 4 L
 %%l3  Wdll S,0OO\+JL--7I34   	 &8"		s   FH 
H$HH$c                    g)Nelasticsearch_database_chain r8   s    r3   _chain_type&ElasticsearchDatabaseChain._chain_type   s    -r6   )query_promptanswer_promptquery_output_parserc                   U=(       d    [         nU=(       d
    [        5       nX1-  U-  nU=(       d    [        nXA-  [        5       -  nU " SUUUS.UD6$ )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   r
   )	clsllmr   r   r   r   kwargsr   r   s	            r3   from_llm#ElasticsearchDatabaseChain.from_llm   sj    , $1z1M5K5M"(+>>%6$*_->> 
#%
 	
 	
r6   r~   )returnr   )r   	list[str])rD   r   r   r"   )rD   r   rL   r"   r   r"   )N)rq   dict[str, Any]rr   z$Optional[CallbackManagerForChainRun]r   r   )r   r"   )r   r   r   r   r   Optional[BasePromptTemplate]r   r   r   zOptional[BaseOutputParser]r   r   r   r   )__name__
__module____qualname____firstlineno____doc____annotations__r   r   r   r    r#   r%   r'   r)   r   model_configr   r4   propertyr9   r=   rG   rY   r]   rz   r   classmethodr   __static_attributes__r~   r6   r3   r   r      sv    *0HcSE3O4*.N'.+/O(/IsJ*+"C+&+t+V $L
 '" #     9 9

$ =A66 :6 
	6p . .  6:6::>

  

 3
 4
 8
 
 
$
 
r6   r   N)"r   
__future__r   typingr   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   r~   r6   r3   <module>r      sI    8 " / / ? < K E 5 - 0 " ' U+- z
 z
r6   