
    h                         d Z ddlmZ ddl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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                P    | j                   r| j                  rd}t        |      | S )Nz;Cannot specify both 'include_indices' and 'ignore_indices'.)r   r   
ValueError)selfmsgs     j/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/langchain/chains/elasticsearch_database/base.pyvalidate_indicesz+ElasticsearchDatabaseChain.validate_indices<   s'    D$7$7OCS/!    c                    | j                   gS )z?Return the singular input key.

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

        :meta private:
        )r(   r$   INTERMEDIATE_STEPS_KEYr6   s    r2   output_keysz&ElasticsearchDatabaseChain.output_keysK   s*     --OO$$!788r4   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   )r0   r>   all_indicesis       r2   _list_indicesz(ElasticsearchDatabaseChain._list_indicesU   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   r@   get_mappingjoinr&   itemssearchr!   r=   )r0   r@   rL   kvrI   hitr>   s           r2   _get_indices_infosz-ElasticsearchDatabaseChain._get_indices_infosa   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 )NrE   )r>   body)r   rP   rN   r!   )r0   r@   rG   r#   s       r2   _searchz"ElasticsearchDatabaseChain._searchs   s.    %%CHHW,=E%J6{r4   c                x   |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)colorrY   es_cmd)r@   rG   z
ESResult: yellowz
Answer:)datarZ   )r   get_noop_managerr"   on_textrY   rC   rT   r!   r   appendr   invoke	get_childrW   r   r$   r(   r9   	Exceptionr   )r0   inputsrun_manager_run_manager
input_textr@   r[   query_inputsr   ra   r#   answer_inputsfinal_resultchain_resultexcs                  r2   _callz ElasticsearchDatabaseChain._callw   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"		s   FH# #	H9,H44H9c                     y)Nelasticsearch_database_chain r6   s    r2   _chain_typez&ElasticsearchDatabaseChain._chain_type   s    -r4   )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   rv   )r   r   r   r
   )	clsllmr   rx   ry   rz   kwargsr   r   s	            r2   from_llmz#ElasticsearchDatabaseChain.from_llm   sn    , $1z1M5K5M"S(+>>%6$s*_->> 
#%
 	
 	
r4   )returnr   )r   	list[str])r@   r   r   r!   )r@   r   rG   r!   r   r!   )N)rj   dict[str, Any]rk   z$Optional[CallbackManagerForChainRun]r   r   )r   r!   )r}   r   r   r   rx   Optional[BasePromptTemplate]ry   r   rz   zOptional[BaseOutputParser]r~   r   r   r   )__name__
__module____qualname____doc____annotations__r   r   r   r   r"   r$   r&   r(   r   model_configr   r3   propertyr7   r:   rC   rT   rW   rs   rw   classmethodr   rv   r4   r2   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
 
 
$
 
r4   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   r9   r   rv   r4   r2   <module>r      sI    8 " / / ? < K E 5 - 0 " ' U+- z
 z
r4   