a
    f	gh                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
mZmZmZmZmZmZmZ d dlmZmZmZ d dlZd dlZejdkrd dlmZ nd dlmZ d dlZd dlmZmZmZ d dlm Z  d d	l!m"Z" d
Z#dZ$dZ%e& Z'dd Z(eee)e)f  dddZ*ee) dddZ+ej,dddZ-e.ee) dddZ/ee. ee) dddZ0ej1dddZ2G dd  d Z3G d!d" d"e	Z4dS )#    N)JSONDecodeError)	AsyncContextManagerAsyncGeneratorCallableDictIteratorOptionalTupleUnionoverload)	urlencodeurlsplit
urlunsplit)      )Literal)errorutilversion)OpenAIResponse)ApiTypeiX        c                 C   s4   t | \}}}}}|r"d||f }t|||||fS )Nz%s&%s)r   r   )urlqueryschemenetlocpathZ
base_queryfragment r   W/var/www/html/llm_bihealth/app/venv/lib/python3.9/site-packages/openai/api_requestor.py_build_api_url,   s    r!   returnc                 C   s>   | du rdS t | tr | | dS t | tr2|  S tddS )zIReturns a value suitable for the 'proxies' argument to 'requests.request.N)httphttpss'openai.proxy' must be specified as either a string URL or a dict with string URL under the https and/or http keys.)
isinstancestrdictcopy
ValueErrorproxyr   r   r    _requests_proxies_arg5   s    


r.   c                 C   sH   | du rdS t | tr| S t | tr<d| v r4| d S | d S tddS )zVReturns a value suitable for the 'proxies' argument to 'aiohttp.ClientSession.request.Nr%   r$   r&   )r'   r(   r)   r+   r,   r   r   r    _aiohttp_proxies_argC   s    

r/   c                  C   sh   t jr"tt jtjrt jS t  S t js2td t } tt j	}|rN|| _
| dtjjtd | S )Nz4verify_ssl_certs is ignored; openai always verifies.zhttps://)max_retries)openaiZrequestssessionr'   requestsSessionZverify_ssl_certswarningswarnr.   r-   proxiesmountadaptersHTTPAdapterMAX_CONNECTION_RETRIES)sr6   r   r   r    _make_sessionQ   s    

r<   )liner#   c                 C   sX   | rT|  drT|  dr*| tdd  } n| tdd  } |  dkrJd S | dS d S )Ns   data:s   data: s   [DONE]utf-8)
startswithlenstripdecode)r=   r   r   r    parse_stream_helperc   s    

rC   )rbodyr#   c                 c   s$   | D ]}t |}|d ur|V  qd S NrC   rD   r=   _liner   r   r    parse_streams   s    rI   )rD   c                 C  s.   | 2 z"3 d H W }t |}|d ur|V  q6 d S rE   rF   rG   r   r   r    parse_stream_asyncz   s    rJ   c                   @   s  e Zd Zd:ddZedd Zeeegef dddZ	d;e
ee eef d	d
dZd<e
ee eef d	ddZed=ed ee eeee
eef f  e
ee eef dddZed>ddded ee eeee
eef f  e
ee eef dddZed?ed ee eeee
eef f  e
eeef dddZed@eee eeee
eef f  e
eeee f eef dddZdAeee eeee
eef f  e
eeee f eef dddZedBed ee eeee
eef f  e
eedf eef dddZedCddded ee eeee
eef f  e
eedf eef dddZedDed ee eeee
eef f  e
eeef dddZedEeee eeee
eef f  e
eeeedf f eef dddZdFeee eeee
eef f  e
eeeedf f eef dddZdGdd Zeee eeef d!d"d#Zeeeef  eeef d$d%d&Zee e
eeeef ee f d'd(d)Zddddddd*eeeef  eee eeee
eef f  ejd+d,d-Zdddddd.eeeef  ee eeee
eef f  e j!d/d0d1Z"ejee
eeee f ef d2d3d4Z#e j!ee
eeeedf f ef d2d5d6Z$ee%eed7d8d9Z&dS )HAPIRequestorNc                 C   sR   |pt j| _|pt | _|r(t|n
tt j| _|p>t j| _|pJt j	| _	d S rE   )
r1   api_baser   Zdefault_api_keyapi_keyr   Zfrom_strapi_typeapi_versionorganization)selfkeyrL   rN   rO   rP   r   r   r    __init__   s    
zAPIRequestor.__init__c                 C   s@   |d }|d r"|d|d f 7 }|d r<|d|d f 7 }|S )Nnamer   z/%sr   z (%s)r   )clsinfor(   r   r   r    format_app_info   s    zAPIRequestor.format_app_info)response	predicatec                 C   s>   ||sd S |j d }|dd}|d}tj||dd S )Nr   messagezOperation failedcode)rZ   r[   )datagetr   ZOpenAIError)rQ   rX   rY   
error_datarZ   r[   r   r   r    _check_polling_response   s    

z$APIRequestor._check_polling_responser"   c	                 C   s   |rt | | ||||\}	}
}| |	| t   }||	st   | tkrZtdt |pj|	jpjd | ||||\}	}
}| |	| q8|	jd |	_|	|
|fS NzOperation polling timed out.
   result)	timesleeprequestr_   TIMEOUT_SECSr   Timeoutretry_afterr\   rQ   methodr   ZuntilfailedparamsheadersintervaldelayrX   brM   
start_timer   r   r    _poll   s    

zAPIRequestor._pollc	                    s   |rt |I d H  | ||||I d H \}	}
}| |	| t }||	st | tkrftdt |pv|	jpvdI d H  | ||||I d H \}	}
}| |	| qD|	j	d |	_	|	|
|fS r`   )
asynciord   arequestr_   rc   rf   r   rg   rh   r\   ri   r   r   r    _apoll   s    
zAPIRequestor._apoll.T)stream
request_idrequest_timeoutr#   c	           	      C   s   d S rE   r   	rQ   rj   r   rl   rm   filesrv   rw   rx   r   r   r    re      s    zAPIRequestor.request)rw   rx   c          	      C   s   d S rE   r   ry   r   r   r    re      s    Fc	           	      C   s   d S rE   r   ry   r   r   r    re      s    c	           	      C   s   d S rE   r   ry   r   r   r    re     s    c	              
   C   s:   | j | |||||||d}	| |	|\}
}|
|| jfS )Nrl   supplied_headersrz   rv   rw   rx   )request_rawlower_interpret_responserM   )rQ   rj   r   rl   rm   rz   rv   rw   rx   rb   resp
got_streamr   r   r    re     s    
c	           	         s   d S rE   r   ry   r   r   r    rt   .  s    zAPIRequestor.arequestc          	         s   d S rE   r   ry   r   r   r    rt   <  s    c	           	         s   d S rE   r   ry   r   r   r    rt   K  s    c	           	         s   d S rE   r   ry   r   r   r    rt   Y  s    c	              
      s   t     I d H }	d z>| j| ||	|||||dI d H | |I d H \}
W n8 ty   d urt   d d d I d H   Y n0 |
r fdd}| |
| jfS    d d d I d H  |
| jfS d S )Nrl   r|   rz   rw   rx   c                    sl   t tsJ z:2 z3 d H W } | V  q6 W    d d d I d H  n   d d d I d H  0 d S rE   )r'   r   release	__aexit__)rctxr   rb   r   r    	wrap_resp  s    z(APIRequestor.arequest.<locals>.wrap_resp)	AioHTTPSession
__aenter__arequest_rawr~   _interpret_async_response	Exceptionr   r   rM   )rQ   rj   r   rl   rm   rz   rv   rw   rx   sessionr   r   r   r   r    rt   g  s4    
c           	      C   s  z|d }W n. t tfy:   td||f |||Y n0 d|v r\|d  d|d  7  < tjd|d|d|d|d	|d
 |dkrt|d||||S |dv rt|d|d	|d||||S |dk rt	|d||||S |dkrt
|d||||S |dkr@t|d||||S |rz|ddg}ddd |D }t|||||S t|d d| d| d| d| 	||||S d S )Nr   z@Invalid response object from API: %r (HTTP response code was %d)Zinternal_messagerZ   z

zOpenAI API error receivedr[   typeparam)Z
error_codeZ
error_typeerror_messageZerror_paramstream_errori  )i  i  i  i  i  i  z!(Error occurred while streaming.) c                 S   s   g | ]}|d ur|qS rE   r   ).0pr   r   r    
<listcomp>      z6APIRequestor.handle_error_response.<locals>.<listcomp>)KeyError	TypeErrorr   APIErrorr   log_infor]   ZRateLimitErrorZInvalidRequestErrorAuthenticationErrorPermissionErrorZTryAgainjoin)	rQ   rD   rcoder   rheadersr   r^   partsrZ   r   r   r    handle_error_response  st    

	


$z"APIRequestor.handle_error_response)rj   rw   r#   c                 C   s   dt jf }tjr&|d| tj 7 }ddd t  	 D }t jddt
 t d|d}tjrttj|d	< t||d
}|t| j| j | jr| j|d< | jd ur| jtjkr| j|d< |d ur||d< tjrd|d< || |S )NzOpenAI/v1 PythonBindings/%sr   c                 s   s   | ]\}}|d kr|V  qdS )nodeNr   r   kvr   r   r    	<genexpr>  s   z/APIRequestor.request_headers.<locals>.<genexpr>r2   pythonr1   )Zbindings_versionhttpliblangZlang_versionplatformZ	publisherunameZapplication)zX-OpenAI-Client-User-Agentz
User-AgentzOpenAI-OrganizationzOpenAI-VersionX-Request-IdtruezOpenAI-Debug)r   VERSIONr1   Zapp_inforW   r   r   r   _asdictitemspython_versionjsondumpsupdater   Zapi_key_to_headerrN   rM   rP   rO   r   ZOPEN_AIdebug)rQ   rj   extrarw   
user_agentZuname_without_nodeZuarm   r   r   r    request_headers  s<    
	



zAPIRequestor.request_headers)r|   r#   c                 C   sd   i }|d u r|S t |ts"td| D ]4\}}t |tsDtdt |tsVtd|||< q*|S )NzHeaders must be a dictionaryzHeader keys must be stringszHeader values must be strings)r'   r)   r   r   r(   )rQ   r|   rm   r   r   r   r   r    _validate_headers  s    



zAPIRequestor._validate_headers)rw   r#   c                 C   s   d| j |f }| |}d }	|dks,|dkrR|rtdd | D }
t||
}nD|dv r|rf|rf|}	|r|st| }	d|d< nt	d	|f | 
|||}tjd
||d tjd|	| jd |||	fS )Nz%s%sr]   deletec                 S   s    g | ]\}}|d ur||fqS rE   r   r   r   r   r    r   ,  r   z5APIRequestor._prepare_request_raw.<locals>.<listcomp>>   putpostzapplication/jsonContent-TypezUnrecognized HTTP method %r. This may indicate a bug in the OpenAI bindings. Please contact us through our help center at help.openai.com for assistance.zRequest to OpenAI API)rj   r   zPost details)r\   rO   )rL   r   r   r   r!   r   r   encoder   APIConnectionErrorr   r   	log_debugrO   )rQ   r   r|   rj   rl   rz   rw   abs_urlrm   r\   Zencoded_paramsr   r   r    _prepare_request_raw  s0    	

z!APIRequestor._prepare_request_rawr{   )r|   rv   rw   rx   r#   c             
   C   sX  |  ||||||\}	}
}ttds8t t_t t_n4t ttdd tkrltj	  t t_t t_z,tjj
||	|
||||r|nttjjd}W nt tjjy } ztd||W Y d }~nDd }~0  tjjy } ztd||W Y d }~n
d }~0 0 tjd|	|j|jd|jd	d
 tjdkrTtjd|j|jd |S )Nr   session_create_timer   )rm   r\   rz   rv   timeoutr6   zRequest timed out: {}z#Error communicating with OpenAI: {}OpenAI API responseOpenAI-Processing-Msr   r   Zresponse_codeZprocessing_msrw   r   API response bodybodyrm   )r   hasattr_thread_contextr<   r   rc   r   getattrMAX_SESSION_LIFETIME_SECSclosere   rf   r6   r2   
exceptionsrg   r   formatRequestExceptionr   r   r   status_coderm   r]   r1   logcontent)rQ   rj   r   rl   r|   rz   rv   rw   rx   r   rm   r\   rb   er   r   r    r}   C  sX    






&


zAPIRequestor.request_rawr   )r|   rw   rx   r#   c             
      sZ  |  ||||||\}	}
}t|tr<tj|d |d d}ntj|rH|ntd}|rptjj	||\}}||
d< ||	|
|t
tj|d}z`|jf i |I d H }tjd|	|j|jd|jd	d
 tjdkrtjd|j|jd |W S  tjtjfy" } ztd|W Y d }~n<d }~0  tjyT } ztd|W Y d }~n
d }~0 0 d S )Nr      )connecttotal)r   r   )rj   r   rm   r\   r-   r   r   r   r   r   r   r   r   Request timed outzError communicating with OpenAI)r   r'   tupleaiohttpZClientTimeoutrf   r2   modelsRequestEncodingMixin_encode_filesr/   r1   r-   re   r   r   statusrm   r]   r   r   r   ServerTimeoutErrorrs   TimeoutErrorr   rg   ClientErrorr   )rQ   rj   r   r   rl   r|   rz   rw   rx   r   rm   r\   r   content_typeZrequest_kwargsrb   r   r   r   r    r   |  sR    






 zAPIRequestor.arequest_raw)rb   rv   r#   c                    s\   |r6d j ddv r6 fddt  D dfS j jd j j dd	dfS d
S )EReturns the response(s) and a bool indicating whether it is a stream.text/event-streamr    c                 3   s$   | ]}j | j jd dV  qdS )Trv   N)_interpret_response_liner   rm   r   r=   rb   rQ   r   r    r     s   z3APIRequestor._interpret_response.<locals>.<genexpr>Tr>   Fr   N)rm   r]   rI   
iter_linesr   r   rB   r   )rQ   rb   rv   r   r   r    r     s    

z APIRequestor._interpret_responsec              
      s   |r4d j ddv r4 fddt j2 dfS z  I dH  W nl tjtjfy~ } zt	
d|W Y d}~n>d}~0  tjy } ztj| jd	 W Y d}~n
d}~0 0 j  I dH d
 j j dddfS dS )r   r   r   r   c                   s.   | z$3 d H W }j | j jddV  q6 d S )NTr   )r   r   rm   r   r   r   r    r     s   z9APIRequestor._interpret_async_response.<locals>.<genexpr>TNr   )r   r>   Fr   )rm   r]   rJ   r   readr   r   rs   r   r   rg   r   r   Zlog_warnr   rB   r   )rQ   rb   rv   r   r   r   r    r     s(     &z&APIRequestor._interpret_async_response)rD   r   rv   r#   c           	   
   C   s   |dkrt d |S |dkr,tjd|||dz$d|ddv rD|}n
t|}W nJ ttfy } z.tjd| d	| d
|||d|W Y d }~n
d }~0 0 t ||}|od|j	v }|sd|  krdk sn | j
|||j	||d|S )N   i  z*The server is overloaded or not ready yet.)rm   z
text/plainr   r   z
HTTP code z from API ()r      i,  )r   )r   r   ZServiceUnavailableErrorr]   r   loadsr   UnicodeDecodeErrorr   r\   r   )	rQ   rD   r   r   rv   r\   r   r   r   r   r   r    r     s4    

z%APIRequestor._interpret_response_line)NNNNN)NNNN)NNNN)..)...)......)......)NNNFNN)..)...)......)......)NNNFNN)F)'__name__
__module____qualname__rS   classmethodrW   r   r   boolr_   r	   r   r(   rr   ru   r   r   r   r
   floatre   r   rt   r   r   r   r   bytesr   r2   Responser}   r   ZClientResponser   r   r   intr   r   r   r   r    rK      st       

    
"    
	     	                  	     	                  4
B
+
,?>rK   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )r   c                 C   s   d | _ d| _d S )NF)_session_should_close_sessionrQ   r   r   r    rS     s    zAioHTTPSession.__init__c                    s6   t j | _| jd u r0t  I d H | _d| _| jS )NT)r1   Z
aiosessionr]   r   r   ZClientSessionr   r   r   r   r   r    r     s
    
zAioHTTPSession.__aenter__c                    s2   | j d u rtd| jr.| j |||I d H  d S )NzSession is not initialized)r   RuntimeErrorr   r   )rQ   exc_type	exc_value	tracebackr   r   r    r     s    
zAioHTTPSession.__aexit__N)r   r   r   rS   r   r   r   r   r   r    r     s   r   )5rs   r   rc   r   sys	threadingr4   r   typingr   r   r   r   r   r   r	   r
   r   urllib.parser   r   r   r   r2   version_infor   Ztyping_extensionsr1   r   r   r   Zopenai.openai_responser   Zopenai.utilr   rf   r   r:   localr   r!   r(   r.   r/   r3   r<   r   rC   rI   StreamReaderrJ   rK   r   r   r   r   r    <module>   sJ   ,
	     