
    7|h5                         d Z ddlZddlmZmZmZmZ ddlmZ ddl	m
Z
mZ  ej                  e      ZdZg dZdZd	Zd
ZdZ G d de
      Zy)zUtil that calls Wikidata.    N)AnyDictListOptional)Document)	BaseModelmodel_validatori,  )7P31P279P27P361P527P495P17P585P131P106P21P569P570P577P50P571P641P625P19P69P108P136P39P161P20P101P179P175P7937P57P607P509P800P449P580P582P276r   P112P740P159P452P102P1142P1387P1576P140P178P287P25P22P40P185P802P1416enzlangchain-wikidataz"https://www.wikidata.org/w/api.phpz0https://www.wikidata.org/w/rest.php/wikibase/v1/c                       e Zd ZU dZeed<   eed<   dZeed<   dZe	ed<   dZ
eed	<   eZee   ed
<   eZeed<    ed      ededefd              Zdedee   fdZdedee   fdZdedefdZy)WikidataAPIWrapperaw  Wrapper around the Wikidata API.

    To use, you should have the ``wikibase-rest-api-client`` and
    ``mediawikiapi `` python packages installed.
    This wrapper will use the Wikibase APIs to conduct searches and
    fetch item content. By default, it will return the item content
    of the top-k results.
    It limits the Document content by doc_content_chars_max.
    wikidata_mwwikidata_rest   top_k_resultsFload_all_available_metai  doc_content_chars_maxwikidata_propslangbefore)modevaluesreturnc                     	 ddl m} ddlm}  | |t        t
                    |d<   	 ddlm}  |dt        d	t        id
      }||d<   |S # t        $ r t        d      w xY w# t        $ r t        d      w xY w)z7Validate that the python package exists in environment.r   )MediaWikiAPI)Config)
user_agentmediawiki_urlrC   z`Could not import mediawikiapi python package. Please install it with `pip install mediawikiapi`.)Client<   z
User-AgentT)timeoutbase_urlheadersfollow_redirectsrD   zxCould not import wikibase_rest_api_client python package. Please install it with `pip install wikibase-rest-api-client`.)
mediawikiapirP   mediawikiapi.configrQ   WIKIDATA_USER_AGENTWIKIDATA_API_URLImportErrorwikibase_rest_api_clientrT   WIKIDATA_REST_API_URL)clsrM   rP   rQ   rT   clients         e/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/utilities/wikidata.pyvalidate_environmentz'WikidataAPIWrapper.validate_environment_   s    	12$0"5EUV%F=!	7.%':;!%	F '-F?# +  	E 	   	Q 	s   'A !A% A"%A:qidc                     ddl m}  || j                  | j                  | j                        }|j                  |      }|st        j                  d| d       y g }|j                  r|j                  d|j                          |j                  r|j                  d|j                          |j                  r-|j                  dd	j                  |j                                |j                  j                         D ]S  \  }}|s	|j                  |j                   d
d	j                  |D cg c]  }|j                  xs d c}              U t!        dj                  |      d | j"                   |d| d      S c c}w )Nr   )FluentWikibaseClient)supported_propsrJ   zCould not find item z in WikidatazLabel: zDescription: z	Aliases: z, z: unknown
zhttps://www.wikidata.org/wiki/)titlesource)page_contentmeta))wikibase_rest_api_client.utilities.fluentrg   rD   rI   rJ   get_itemloggerwarninglabelappenddescriptionaliasesjoin
statementsitemsvaluer   rH   )	selfre   rg   fluent_clientresp	doc_linesproprM   vs	            rc   _item_to_documentz$WikidataAPIWrapper._item_to_document   sk   R.B0C0C$))/
 %%c*NN1#lCD	::wtzzl34}T-=-=,>?@<<y4<<)@(ABC OO113 	LD&  zzl"TYYf/U0D90D/U%V$WX	 ))I.0L$2L2LM,J3%*PQ
 	
 0Vs   6Fqueryc                     |dt          }| j                  j                  || j                        }g }|d| j                   D ]'  }| j	                  |      x}s|j                  |       ) |S )z[
        Run Wikidata search and get the item documents plus the meta information.
        Nresults)WIKIDATA_MAX_QUERY_LENGTHrC   searchrF   r   rt   r{   r   clipped_queryry   docsitemdocs          rc   loadzWikidataAPIWrapper.load   s~    
 889  ''t?Q?Q'R.D../ 	!D,,T22s2C 	!     c                 :   |dt          }| j                  j                  || j                        }g }|d| j                   D ]7  }| j	                  |      x}s|j                  d| d|j                          9 |sydj                  |      d| j                   S )z+Run Wikidata search and get item summaries.Nr   zResult z:
z(No good Wikidata Search Result was foundz

)	r   rC   r   rF   r   rt   rm   rw   rH   r   s          rc   runzWikidataAPIWrapper.run   s     889  ''t?Q?Q'R.D../ 	CD,,T22s2gdV3s/?/?.@AB	C ={{4 !=4#=#=>>r   N)__name__
__module____qualname____doc__r   __annotations__rF   intrG   boolrH   DEFAULT_PROPERTIESrI   r   strDEFAULT_LANG_CODErJ   r	   classmethodr   rd   r   r   r   r   r    r   rc   rB   rB   L   s     M3$)T)!%3% 2NDI2!D#!(#$ 3   $@
S 
Xh-? 
<# $x. ? ? ?r   rB   )r   loggingtypingr   r   r   r   langchain_core.documentsr   pydanticr   r	   	getLoggerr   rq   r   r   r   r\   r]   r`   rB   r   r   rc   <module>r      s`      , , - /			8	$ 8 r  * 7 J l? l?r   