U
    h                  7   @   s   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eZdZddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+dd,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<g7Zd=Zd>Zd?Zd@ZG dAdB dBe
ZdS )CzUtil that calls Wikidata.    N)AnyDictListOptional)Document)	BaseModelroot_validatori,  ZP31ZP279ZP27ZP361ZP527ZP495ZP17ZP585ZP131ZP106ZP21ZP569ZP570ZP577ZP50ZP571ZP641ZP625ZP19ZP69ZP108ZP136ZP39ZP161ZP20ZP101ZP179ZP175ZP7937ZP57ZP607ZP509ZP800ZP449ZP580ZP582ZP276ZP112ZP740ZP159ZP452ZP102ZP1142ZP1387ZP1576ZP140ZP178ZP287ZP25ZP22ZP40ZP185ZP802ZP1416enzlangchain-wikidataz"https://www.wikidata.org/w/api.phpz0https://www.wikidata.org/w/rest.php/wikibase/v0/c                   @   s   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deedddZeee dddZeee dddZeedddZdS )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langT)pre)valuesreturnc                 C   s   z0ddl m} ddlm} ||ttd|d< W n tk
rL   tdY nX z,ddlm} |dt	d	tid
d}||d< W n tk
r   tdY nX |S )z7Validate that the python package exists in environment.r   )MediaWikiAPI)Config)
user_agentZmediawiki_urlr   z`Could not import mediawikiapi python package. Please install it with `pip install mediawikiapi`.)Client<   z
User-AgentT)timeoutbase_urlheadersZfollow_redirectsr   zxCould not import wikibase_rest_api_client python package. Please install it with `pip install wikibase-rest-api-client`.)
Zmediawikiapir   Zmediawikiapi.configr   WIKIDATA_USER_AGENTWIKIDATA_API_URLImportErrorZwikibase_rest_api_clientr   WIKIDATA_REST_API_URL)clsr   r   r   r   client r$   J/tmp/pip-unpacked-wheel-9gdii04g/langchain_community/utilities/wikidata.pyvalidate_environment_   s0    


z'WikidataAPIWrapper.validate_environment)qidr   c                 C   s   ddl m} || j| j| jd}||}|sDtd| d d S g }|jr`|	d|j  |j
rx|	d|j
  |jr|	dd	|j  |j D ](\}}|r|	|j d
d	|  qtd|d | j |d| ddS )Nr   )FluentWikibaseClient)Zsupported_propsr   zCould not find item z in WikidatazLabel: zDescription: z	Aliases: z, z: 
zhttps://www.wikidata.org/wiki/)titlesource)page_contentmeta)Z)wikibase_rest_api_client.utilities.fluentr(   r   r   r   Zget_itemloggerwarninglabelappenddescriptionaliasesjoinZ
statementsitemsr   r   )selfr'   r(   Zfluent_clientrespZ	doc_linespropr   r$   r$   r%   _item_to_document   s0      
z$WikidataAPIWrapper._item_to_document)queryr   c                 C   sR   |dt  }| jj|| jd}g }|d| j D ]}| | }r0|| q0|S )z[
        Run Wikidata search and get the item documents plus the meta information.
        Nresults)WIKIDATA_MAX_QUERY_LENGTHr   searchr   r9   r1   r6   r:   Zclipped_queryr5   Zdocsitemdocr$   r$   r%   load   s    zWikidataAPIWrapper.loadc                 C   sx   |dt  }| jj|| jd}g }|d| j D ]*}| | }r0|d| d|j  q0|sddS d|d| j S )z+Run Wikidata search and get item summaries.Nr;   zResult z:
z(No good Wikidata Search Result was foundz

)	r=   r   r>   r   r9   r1   r,   r4   r   r?   r$   r$   r%   run   s    zWikidataAPIWrapper.runN)__name__
__module____qualname____doc__r   __annotations__r   intr   boolr   DEFAULT_PROPERTIESr   r   strDEFAULT_LANG_CODEr   r   r   r&   r   r   r9   rB   rC   r$   r$   r$   r%   r
   L   s   

 r
   )rG   loggingtypingr   r   r   r   Zlangchain_core.documentsr   Zlangchain_core.pydantic_v1r   r   	getLoggerrD   r.   r=   rK   rM   r   r   r!   r
   r$   r$   r$   r%   <module>   s   
9