aboutsummaryrefslogtreecommitdiff
o

�|f$ �@s�ddlZddlZddlZddlZddlZddlZddlmZddlm	Z	ddlm
Z
mZddlm
Z
mZddlmZddlmZmZej�ej�e��ZGdd	�d	e�ZGd
d�de�ZdS)�N)�HTTPAdapter)�Retry)�	HTTPError�Session)�urljoin�quote)�urlretrieve)�UnprocessableEntity�LLMErrorcs(eZdZ�fdd�Z�fdd�Z�ZS)�TimeoutHTTPAdaptercs||_t�j|i|��dS)z�TimeoutHTTPAdapter constructor.
        Args:
            timeout (int): How many seconds to wait for the server to send data before
                giving up.
        N)�timeout�super�__init__)�selfr�args�kwargs��	__class__��A/home/shebes/code/GN-LLM-Hacking/gnqa_eval/src/apis/gnqaclient.pyrszTimeoutHTTPAdapter.__init__cs0|�d�}|dur|j|d<t�j|fi|��S)zAOverride :obj:`HTTPAdapter` send method to add a default timeout.rN)�getrr
�send)r�requestrrrrrrs

zTimeoutHTTPAdapter.send)�__name__�
__module__�__qualname__rr�
__classcell__rrrrrs	rcs�eZdZdZdZd$�fdd�	Zedd	��Zed
d��Zedd
��Z	dd�Z
dd�Zdd�Z�fdd�Z
edd��Zedd��Zedd��Zdd�Zdd�Zd d!�Zd"d#�Z�ZS)%�GeneNetworkQAClienta�GeneNetworkQA Client

    This class provides a client object interface to the GeneNetworkQA API.
    It extends the `requests.Session` class and includes authorization, base URL,
    request timeouts, and request retries.

    Args:
        account (str): Base address subdomain.
        api_key (str): API key.
        version (str, optional): API version, defaults to "v3".
        timeout (int, optional): Timeout value, defaults to 5.
        total_retries (int, optional): Total retries value, defaults to 5.
        backoff_factor (int, optional): Retry backoff factor value, defaults to 30.

    Usage:
        from genenetworkqa import GeneNetworkQAClient
        gnqa = GeneNetworkQAClient(account="account-name", api_key="XXXXXXXXXXXXXXXXXXX...")
    z*https://genenetwork.fahamuai.com/api/tasks�v3��cspt���|j�dd|i�|j�d�|_|j�d�|_t|t|gd�|d�d�}|�	d|�|�	d	|�dS)
N�
AuthorizationzBearer z/answersz	/feedback)i���i�i�i�)�total�status_forcelist�backoff_factor)r�max_retrieszhttps://zhttp://)
r
r�headers�update�BASE_URL�
answer_url�feedback_urlrr�mount)r�account�api_key�versionr�
total_retriesr%�adapterrrrr<s 

���	zGeneNetworkQAClient.__init__c	CsVt|t�r|�d�}|St|t�r)d�|�dd�|�dd�|�dd�|�dd��}|S)Nz.txtz{0}.{1}.{2}.{3} �author��title�year�doi)�
isinstance�str�removesuffix�dict�formatr)�bib_inforrr�format_bibliography_infoOs


�


�z,GeneNetworkQAClient.format_bibliography_infoc
Cs�ztjt|i|d�}|��Wntjjy%}ztd|����d}~ww|jdkr1t|�dfSt	|�}t
||�}|jdkrEt|�dfS|dfS)N��datar'zError making the request: ��r�)�requests�post�base_url�raise_for_status�
exceptions�RequestException�RuntimeError�status_code�negative_status_msg�get_task_id_from_result�get_answer_using_task_id)�
extend_url�my_auth�response�e�task_idrrr�ask_the_documents]s 
���


z%GeneNetworkQAClient.ask_the_documentscCsd|j�d|j��S)NzError: Status code -z
- Reason::)rI�reason)rOrrrrJssz'GeneNetworkQAClient.negative_status_msgcOsN|j|}|jd|g|�Ri|��}|jdkr|�|�dfS|�|�}||fS)N�POSTr@r)r)�custom_requestrIrJ�getTaskIDFromResult)r�exUrlrr�askUrl�resrQrrr�askxs


zGeneNetworkQAClient.askcO�X|j|�|�}|jd|g|�Ri|��}|jdkr(tdt|��|�|�dfS|dfS�N�GETr@zThe result is {0}rrA)r*�extendForTaskIDrUrI�printr;rJ�r�taskidrr�queryrYrrr�answer��
zGeneNetworkQAClient.answercOr[r\)r*�extendTaskIDrUrIr_r;rJr`rrr�
get_answer�rdzGeneNetworkQAClient.get_answerc
sd}d}t|�D]}}zt�j||g|�Ri|��}|��WnEtjjyT}	z(|	jjdkr<t	|	j|	jd|	jj�d���|	jjdkrNt	|	j|	jd|j
����|	�d}	~	wtjjyc}	z|	�d}	~	ww|jr�|�
�dkr||���d	�dur|t�|�q|St�|�q|S)
N�2�r"zResponse Error,status_code:z,Reason: Use of Invalid Tokeni�z%404 Client Error: Not Found for url: rr?)�ranger
rrErBrFrrOrIr
r)rG�ok�lower�jsonr�time�sleep)
r�method�urlrrr&�retry_delay�irO�errorrrrrU�s0���
z"GeneNetworkQAClient.custom_requestcCs"t�|j�}d|�dd���}|S)N�	?task_id=rQr3)rl�loads�textr)rOrQ�resultrrrrK�sz+GeneNetworkQAClient.get_task_id_from_resultc
CsDztjt|i|d�}|��|WStjjy!}z|�d}~ww)Nr>)rBrr*rErFrG)rMrNrOrsrrrrL�s
���z,GeneNetworkQAClient.get_answer_using_task_idcCst�d�dd�|D���S)a
        Filters out non-printable characters from the input string and parses it as JSON.

        Args:
            val (str): Input string to be filtered and parsed.

        Returns:
            dict: Parsed JSON object.
        # remove  this
        r3cSsg|]}|tjvrt|��qSr)�string�	printabler8)�.0�charrrr�
<listcomp>�sz<GeneNetworkQAClient.filter_response_text.<locals>.<listcomp>)rlru�join)�valrrr�filter_response_text�sz(GeneNetworkQAClient.filter_response_textcCst�|j�S)N)rlrurv)rrYrrrrV��z'GeneNetworkQAClient.getTaskIDFromResultcCsdt|d�S)NrtrQ�r8�rrQrrrre�sz GeneNetworkQAClient.extendTaskIDcCsdt|�S)Nrtr�r�rrrr^�r�z#GeneNetworkQAClient.extendForTaskIDc	Csrt|�}t�d|�\}}t�|�\}}|dkr5t|j�}|�di��dd�}|�di��dd�}||fS|dfS)Nz?ask=rAr?rcr3�contextzUnfortunately, I have nothing.)r�
api_clientrZrfrrvr)	rrb�qstrrYrQ�success�	resp_textrcr�rrr�get_gnqa�s
zGeneNetworkQAClient.get_gnqa)rrr r)rrr�__doc__r)r�staticmethodr=rRrJrZrcrfrUrKrLrrVrer^r�rrrrrr&s0







r)rlrx�os�datetimermrB�requests.adaptersr�$requests.packages.urllib3.util.retryrrr�urllib.parserr�urllib.requestr�errors.rag_errr	r
�pathr}�dirname�__file__�basedirrrrrrr�<module>s