o
    RTh	e                     @   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	 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r`d 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*deee+e+f  fddZ,dee+ fddZ-dej.fddZ/de0dee+ fddZ1dee0 dee+ fddZ2dej3fddZ4G dd  d Z5edeej6 fd!d"Z7dS )#    N)asynccontextmanager)JSONDecodeError)	AsyncGeneratorAsyncIterator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path
base_queryfragment r!   W/home/air/segue/gemini/backup/venv/lib/python3.10/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r|  S td)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_arg6   s   


r/   c                 C   sD   | du rdS t | tr| S t | trd| v r| d S | d S td)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_argD   s   

r0   c                  C   sh   t jrtt jtjrt jS t  S t jstd t } tt j	}|r'|| _
| dtjjtd | S )Nz4verify_ssl_certs is ignored; openai always verifies.zhttps://)max_retries)openairequestssessionr(   requestsSessionverify_ssl_certswarningswarnr/   r.   proxiesmountadaptersHTTPAdapterMAX_CONNECTION_RETRIES)sr9   r!   r!   r"   _make_sessionR   s   

r?   linec                 C   s@   | r|   dkr
d S | dr| tdd  } | dS d S d S )Ns   data: [DONE]s   data: utf-8)strip
startswithlendecode)r@   r!   r!   r"   parse_stream_helperd   s   

rF   rbodyc                 c   s&    | D ]}t |}|d ur|V  qd S NrF   rG   r@   _liner!   r!   r"   parse_streamr   s   rL   c                 C  s0   | 2 z3 d H W }t |}|d ur|V  q6 d S rH   rI   rJ   r!   r!   r"   parse_stream_asyncy   s   rM   c                   @   s  e Zd Z					d;ddZedd Zdedeegef fdd	Z					d<d
e
ee eef fddZ				d<d
e
ee eef fddZe		d=ded dee deeee
eef f  d
e
ee eef fddZe			d>dddded dee deeee
eef f  d
e
ee eef fddZe						d?ded dee deeee
eef f  d
e
eeef fddZe						d?dedee deeee
eef f  d
e
eeee f eef fddZ						d@dedee deeee
eef f  d
e
eeee f eef fddZe		d=ded dee deeee
eef f  d
e
eedf eef fddZe			d>dddded dee deeee
eef f  d
e
eedf eef fddZe						d?ded dee deeee
eef f  d
e
eeef fddZe						d?dedee deeee
eef f  d
e
eeeedf f eef fd dZ						d@dedee deeee
eef f  d
e
eeeedf f eef fd!dZdAd"d#Zd$edee d
eeef fd%d&Zd'eeeef  d
eeef fd(d)Zdee d
e
eeeef ee f fd*d+Zddddddd,d'eeeef  dedee deeee
eef f  d
ejf
d-d.Zdddddd/d'eeeef  dee deeee
eef f  d
e j!fd0d1Z"d2ejded
e
eeee f ef fd3d4Z#d2e j!ded
e
eeeedf f ef fd5d6Z$d7ed8e%ded
efd9d:Z&dS )BAPIRequestorNc                 C   sR   |pt j| _|pt | _|rt|ntt j| _|pt j| _|p%t j	| _	d S rH   )
r2   api_baser   default_api_keyapi_keyr   from_strapi_typeapi_versionorganization)selfkeyrO   rS   rT   rU   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)Nr   messagezOperation failedcode)r_   r`   )datagetr   OpenAIError)rV   r]   r^   
error_datar_   r`   r!   r!   r"   _check_polling_response   s   

z$APIRequestor._check_polling_responser$   c	                 C   s   |rt | | ||||\}	}
}| |	| t   }||	sLt   | tkr-tdt |p5|	jp5d | ||||\}	}
}| |	| ||	r |	jd |	_|	|
|fS NzOperation polling timed out.
   result)	timesleeprequestre   TIMEOUT_SECSr   Timeoutretry_afterra   rV   methodr   untilfailedparamsheadersintervaldelayr]   brQ   
start_timer!   r!   r"   _poll   s   


zAPIRequestor._pollc	                    s   |rt |I d H  | ||||I d H \}	}
}| |	| t }||	sYt | tkr4tdt |p<|	jp<dI d H  | ||||I d H \}	}
}| |	| ||	r'|	j	d |	_	|	|
|fS rf   )
asynciorj   arequestre   ri   rl   r   rm   rn   ra   ro   r!   r!   r"   _apoll   s   

zAPIRequestor._apoll.streamT
request_idrequest_timeoutc	           	      C      d S rH   r!   	rV   rp   r   rs   rt   filesr}   r~   r   r!   r!   r"   rk         zAPIRequestor.request)r~   r   c          	      C   r   rH   r!   r   r!   r!   r"   rk      s   Fc	           	      C   r   rH   r!   r   r!   r!   r"   rk      r   c	           	      C   r   rH   r!   r   r!   r!   r"   rk     r   c	              
   C   s:   | j | |||||||d}	| |	|\}
}|
|| jfS )Nrs   supplied_headersr   r}   r~   r   )request_rawlower_interpret_responserQ   )rV   rp   r   rs   rt   r   r}   r~   r   rh   resp
got_streamr!   r!   r"   rk     s   
c	           	            d S rH   r!   r   r!   r!   r"   r{   -     zAPIRequestor.arequestc          	         r   rH   r!   r   r!   r!   r"   r{   ;  s   c	           	         r   rH   r!   r   r!   r!   r"   r{   J  r   c	           	         r   rH   r!   r   r!   r!   r"   r{   X  r   c	              
      s   t     I d H }	z| j| ||	|||||dI d H }
| |
|I d H \}W n ty<    d d d I d H   w |rM fdd}| || jfS  d d d I d H  || jfS )Nrs   r   r   r~   r   c                    s\   t tsJ z2 z	3 d H W } | V  q6 W  d d d I d H  d S  d d d I d H  w rH   )r(   r   	__aexit__)rctxr   r!   r"   	wrap_resp  s   .z(APIRequestor.arequest.<locals>.wrap_resp)aiohttp_session
__aenter__arequest_rawr   _interpret_async_response	Exceptionr   rQ   )rV   rp   r   rs   rt   r   r}   r~   r   sessionrh   r   r   r!   r   r"   r{   f  s0   
c           	      C   s  z|d }W n t tfy   td||f |||w d|v r,|d  d|d  7  < tjd|d|d|d|d	|d
 |dkrSt|d||||S |dv rkt|d|d	|d||||S |dkr{t	|d||||S |dkrt
|d||||S |dkrt|d||||S |r|ddg}ddd |D }t|||||S t|d d| d| d| d| 	||||S )Nr   z@Invalid response object from API: %r (HTTP response code was %d)internal_messager_   z

zOpenAI API error receivedr`   typeparam)
error_code
error_typeerror_messageerror_paramstream_errori  )i  i  i  i  i  i  z!(Error occurred while streaming.) c                 S   s   g | ]}|d ur|qS rH   r!   ).0pr!   r!   r"   
<listcomp>  s    z6APIRequestor.handle_error_response.<locals>.<listcomp>)KeyError	TypeErrorr   APIErrorr   log_inforb   RateLimitErrorInvalidRequestErrorAuthenticationErrorPermissionErrorTryAgainjoin)	rV   rG   rcoder   rheadersr   rd   partsr_   r!   r!   r"   handle_error_response  sv   	
	$z"APIRequestor.handle_error_responserp   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r:tj|d	< t||d
}|t| j| j | jrU| j|d< | jd ure| jtjkre| j|d< |d urm||d< tjrtd|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>r4   pythonr2   )bindings_versionhttpliblanglang_versionplatform	publisherunameapplication)zX-OpenAI-Client-User-Agentz
User-AgentzOpenAI-OrganizationzOpenAI-VersionX-Request-IdtruezOpenAI-Debug)r   VERSIONr2   app_infor\   r   r   r   _asdictitemspython_versionjsondumpsupdater   api_key_to_headerrS   rQ   rU   rT   r   OPEN_AIdebug)rV   rp   extrar~   
user_agentuname_without_nodeuart   r!   r!   r"   request_headers  s<   
	



zAPIRequestor.request_headersr   c                 C   sd   i }|d u r|S t |tstd| D ]\}}t |ts"tdt |ts+td|||< q|S )NzHeaders must be a dictionaryzHeader keys must be stringszHeader values must be strings)r(   r*   r   r   r)   )rV   r   rt   r   r   r!   r!   r"   _validate_headers  s   



zAPIRequestor._validate_headersc                 C   s   d| j |f }| |}d }	|dks|dkr)|r(tdd | D }
t||
}n"|dv rC|r3|r3|}	|rB|sBt| }	d|d< nt	d	|f | 
|||}tjd
||d tjd|	| jd |||	fS )Nz%s%srb   deletec                 S   s    g | ]\}}|d ur||fqS rH   r!   r   r!   r!   r"   r   "  s     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)rp   r   zPost details)ra   rT   )rO   r   r   r   r#   r   r   encoder   APIConnectionErrorr   r   	log_debugrT   )rV   r   r   rp   rs   r   r~   abs_urlrt   ra   encoded_paramsr!   r!   r"   _prepare_request_raw  s4   	


z!APIRequestor._prepare_request_rawr   c             
   C   s<  |  ||||||\}	}
}ttdst t_t t_nt ttdd tkr6tj	  t t_t t_ztjj
||	|
||||rD|nttjjd}W n- tjjyc } z	td||d }~w tjjyy } z	td||d }~ww tjd|	|j|jd|jd	d
 tjdkrtjd|j|jd |S )Nr   session_create_timer   )rt   ra   r   r}   timeoutr9   zRequest timed out: {}z#Error communicating with OpenAI: {}OpenAI API responseOpenAI-Processing-Msr   r   response_codeprocessing_msr~   r   API response bodybodyrt   )r   hasattr_thread_contextr?   r   ri   r   getattrMAX_SESSION_LIFETIME_SECScloserk   rl   r9   r4   
exceptionsrm   r   formatRequestExceptionr   r   r   status_codert   rb   r2   logcontent)rV   rp   r   rs   r   r   r}   r~   r   r   rt   ra   rh   er!   r!   r"   r   9  s\   










zAPIRequestor.request_rawr   c             
      s<  |  ||||||\}	}
}t|trtj|d |d d}n
tj|r%|ntd}|r9tjj	||\}}||
d< ||	|
|t
tj|d}z0|jdi |I d H }tjd|	|j|jd|jd	d
 tjdkrstjd|j|jd |W S  tjtjfy } ztd|d }~w tjy } ztd|d }~ww )Nr      )connecttotal)r   r   )rp   r   rt   ra   r.   r   r   r   r   r   r   r   r   Request timed outzError communicating with OpenAIr!   )r   r(   tupleaiohttpClientTimeoutrl   r4   modelsRequestEncodingMixin_encode_filesr0   r2   r.   rk   r   r   statusrt   rb   r   r   r   ServerTimeoutErrorrz   TimeoutErrorr   rm   ClientErrorr   )rV   rp   r   r   rs   r   r   r~   r   r   rt   ra   r   content_typerequest_kwargsrh   r   r!   r!   r"   r   r  sZ   






zAPIRequestor.arequest_rawrh   c                    sX   |rd j ddv r fddt  D dfS j jd j j dd	df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r}   N)_interpret_response_liner   rt   r   r@   rh   rV   r!   r"   r     s    
z3APIRequestor._interpret_response.<locals>.<genexpr>TrA   Fr  )rt   rb   rL   
iter_linesr  r   rE   r   )rV   rh   r}   r!   r
  r"   r     s   

z APIRequestor._interpret_responsec              
      s   |rd j ddv r fddt j2 dfS z	  I dH  W n0 tjtjfy: } zt	
d|d}~w tjyT } ztj| jd	 W Y d}~nd}~ww j  I dH d
 j j dddfS )r  r  r   r  c                   s0   | z3 d H W }j | j jddV  q6 d S )NTr  )r  r   rt   r	  r
  r!   r"   r     s    z9APIRequestor._interpret_async_response.<locals>.<genexpr>TNr   )r   rA   Fr  )rt   rb   rM   r   readr   r   rz   r   r   rm   r  r   log_warnr  rE   r   )rV   rh   r}   r   r!   r
  r"   r     s0   z&APIRequestor._interpret_async_responserG   r   c           	   
   C   s   |dkr	t d |S |dkrtjd|||dzd|ddv r"|}nt|}W n ttfyG } ztjd| d	| d
|||d|d }~ww t ||}|oSd|j	v }|sad|  kr`dk sln | j
|||j	||d|S )N   i  z*The server is overloaded or not ready yet.)rt   z
text/plainr   r  z
HTTP code z from API ()r      i,  )r   )r   r   ServiceUnavailableErrorrb   r   loadsr   UnicodeDecodeErrorr   ra   r   )	rV   rG   r   r   r}   ra   r   r   r   r!   r!   r"   r    s:   


z%APIRequestor._interpret_response_line)NNNNN)NNNN)..)...)......)NNNFNN)F)'__name__
__module____qualname__rX   classmethodr\   r   r   boolre   r
   r   r)   ry   r|   r   r   r	   r   floatrk   r   r{   r   r   r   r   bytesr   r4   Responser   r   ClientResponser   r   r   intr  r!   r!   r!   r"   rN      s   



"

		
		
	
	
	

		
		
	
	
	


+A

*


,	

?	

=

rN   c               	   C  sb   t j } | r| V  d S t 4 I d H }|V  W d   I d H  d S 1 I d H s*w   Y  d S rH   )r2   
aiosessionrb   r   ClientSession)user_set_sessionr   r!   r!   r"   r     s   

.r   )8rz   r   ri   r   sys	threadingr7   
contextlibr   r   typingr   r   r   r   r   r	   r
   r   r   urllib.parser   r   r   r   r4   version_infor   typing_extensionsr2   r   r   r   openai.openai_responser   openai.utilr   rl   r   r=   localr   r#   r)   r/   r0   r5   r?   r  rF   rL   StreamReaderrM   rN   r  r   r!   r!   r!   r"   <module>   sP    ,
	     