o
    pkj7g                     @   s^  d 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Zddl	Z	ddl
mZmZmZmZmZmZmZmZ ddlZddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZ de de fddZ!dedefddZ"dedede#fddZ$de de fddZ%de de fddZ&de'e e f de'e e f fddZ(de de fd d!Z)d"e de fd#d$Z*d%eddfd&d'Z+d(eddfd)d*Z,de fd+d,Z-d-e ddfd.d/Z.de'e e f ddfd0d1Z/ej0d2d3d(eded fd4d5Z1ej2d2d3d(eded fd6d7Z3G d8d9 d9eZ4G d:d; d;eZ5G d<d= d=eZ6G d>d? d?eZ7G d@d3 d3eZ8dS )AzReplay API client.    N)AnyAsyncIteratorIteratorLiteralOptionalUnioncastoverload   )errors)BaseApiClient)HttpRequest)HttpResponse)	BaseModel)HttpOptionsHttpOptionsOrDictnamereturnc                 C   s2   t | ts	t| } tdd| }tdd| S )z=Converts a string from camelCase or PascalCase to snake_case.z(.)([A-Z][a-z]+)z\1_\2z([a-z0-9])([A-Z]))
isinstancestrresublower)r   s1 r   ]/home/djax/ivt_ai_plugin/venv/lib/python3.10/site-packages/google/genai/_replay_api_client.pyto_snake_case'   s   
r   objc                 C   s   t | tr+i }|  D ]\}}t|}t|}|dkr$|i ks#|d u r$q|||< q|S t | tr7dd | D S t | tjr@| jS t | t	rOd| v rO| 
ddS | S )Ngeneration_configc                 S   s   g | ]}t |qS r   _normalize_json_case).0itemr   r   r   
<listcomp>;   s    z(_normalize_json_case.<locals>.<listcomp>zdivision by zeroz"integer division or modulo by zero)r   dictitemsr   r    listenumEnumvaluer   replace)r   reskvnorm_knorm_vr   r   r   r    0   s&   



r    obj1obj2c                 C   s    t | }t |}||krdS dS )a  Compares two Python objects for equality ignoring key casing.

  Returns:
      bool: True if the two objects are equal regardless of key casing
  (camelCase vs. snake_case). For example, the following are considered equal:

  {'my_key': 'my_value'}
  {'myKey': 'my_value'}

  This also considers enums and strings with the same value as equal.
  For example, the following are considered equal:

  {'type': <Type.STRING: 'STRING'>}}
  {'type': 'STRING'}
  TFr   )r0   r1   normalized_obj_1normalized_obj_2r   r   r   _equals_ignore_key_caseG   s
   r4   version_stringc                 C      t dd| S )z8Redacts version numbers in the form x.y.z from a string.z\d+\.\d+\.\d+[a-zA-Z0-9]*z{VERSION_NUMBER}r   r   )r5   r   r   r   _redact_version_numbersa      r8   language_labelc                 C   r6   )z;Removed because replay requests are used for all languages.z
gl-python/z{LANGUAGE_LABEL}/r7   )r:   r   r   r   _redact_language_labelf   r9   r;   headersc                 C   s   i }|   D ]O\}}| dkrd||< q| dkr,tt|dddd||< q| dkrCtt|dddd||< q| d	krJq| d
krQq|||< q|S )z,Redacts headers that should not be recorded.zx-goog-api-keyz
{REDACTED}z
user-agentzagentplatform-genai-moduleszvertex-genai-modulesz
+nonsource zx-goog-api-clientzx-goog-user-projectauthorization)r%   r   r;   r8   r*   )r<   redacted_headersheader_nameheader_valuer   r   r   _redact_request_headersk   s(   



rB   urlc                 C   s<   t dd| }t dd|}t dd|}t dd|}|S )Nz".*/projects/[^/]+/locations/[^/]+/z{VERTEX_URL_PREFIX}/z#.*-aiplatform.googleapis.com/[^/]+/z".*aiplatform.googleapis.com/[^/]+/z+.*generativelanguage.*.googleapis.com/[^/]+z{MLDEV_URL_PREFIX}r7   )rC   resultr   r   r   _redact_request_url   s*   rE   pathc                 C   s&   d| v rd| v rt dd| }|S | S )Nz	projects/z
locations/zprojects/[^/]+/locations/[^/]+/z{PROJECT_AND_LOCATION_PATH}/r7   )rF   rD   r   r   r   _redact_project_location_path   s   rG   bodyc                 C   s   t | tr0|  D ]$\}}t |tr"t|}tdd|}|| |< q	t |ttfr-t| q	dS t | tr^t	| D ]&\}}t |trRt|}tdd|}|| |< q9t |ttfr]t| q9dS dS )z,Redacts fields in the request body in place.z<[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}z{UUID}N)
r   r$   r%   r   rG   r   r   r&   _redact_request_body	enumerate)rH   keyr)   ir   r   r   rI      s:   





rI   http_requestc                 C   s6   t | j| _t| j| _t| jtst| j d S d S N)rB   r<   rE   rC   r   databytesrI   )rM   r   r   r   redact_http_request   s
   rQ   c                  C   sR   t  } | dur'| jdur'| jjdur'| jj}t |}|j}d| d| S dS )z-Prints the current file path and line number.NzFile: z, Line: r=   )inspectcurrentframef_backgetfilef_lineno)current_frameframefilepathlinenor   r   r   _current_file_path_and_line   s   

r[   messagec                 C   s    t dtjddt d|  d S )NzDEBUG (testPYTEST_CURRENT_TEST)z:
    )printosenvirongetr[   )r\   r   r   r   _debug_print   s   
rc   c                 C   s   |  dd |  dd dS )z*Remove headers that are not deterministic.DateNzServer-Timing)pop)r<   r   r   r   pop_undeterministic_headers   s   rf   clientReplayApiClientc              
   c   s:    zd V  W d S  t jy } z| || |d }~ww rN   r   APIError_record_interactionrg   rM   er   r   r   _record_on_api_error      rn   c              
   C  s:   zd V  W d S  t jy } z| || |d }~ww rN   ri   rl   r   r   r   _async_record_on_api_error   ro   rp   c                   @   sF   e Zd ZU dZeed< eed< eeef ed< eeeef  ed< dS )ReplayRequestz(Represents a single request in a replay.methodrC   r<   body_segmentsN)	__name__
__module____qualname____doc__r   __annotations__r$   r&   objectr   r   r   r   rq     s   
 rq   c                   @   s|   e Zd ZU dZdZeed< eeef ed< e	eee
f  ed< dZee	e  ed< e	eee
f  ed< d	ed
dfddZdS )ReplayResponsez)Represents a single response in a replay.   status_coder<   rs   Nbyte_segmentssdk_response_segments_ReplayResponse__contextr   c                 C   s   t | j d S rN   )rf   r<   )selfr   r   r   r   model_post_init  s   zReplayResponse.model_post_init)rt   ru   rv   rw   r|   intrx   r$   r   r&   ry   r}   r   rP   r   r   r   r   r   r   rz   
  s   
 rz   c                   @   s"   e Zd ZU dZeed< eed< dS )ReplayInteractionzBRepresents a single interaction, request and response in a replay.requestresponseN)rt   ru   rv   rw   rq   rx   rz   r   r   r   r   r     s   
 r   c                   @   s&   e Zd ZU dZeed< ee ed< dS )
ReplayFilezRepresents a recorded session.	replay_idinteractionsN)rt   ru   rv   rw   r   rx   r&   r   r   r   r   r   r     s   
 r   c                       s~  e Zd ZdZ								dJded dedee ded	ee d
eej	j
j dee dee dee def fddZdeddfddZdefddZdefddZdefddZdKddZdKddZdee dedefdd ZdKd!d"Zd#ed$eeejef ddfd%d&Zd#ed'eddfd(d)Zd#edefd*d+Zd,e ddfd-d.Z!		dLd#edee" d/edef fd0d1Z#		dLd#edee" d/edef fd2d3Z$dd4d5eee%j&f d6ed7e'dee" def
 fd8d9Z(dd4d5eee%j&f d6ed7e'dee" def
 fd:d;Z)e*ddd<d=d>edee" d?dd@e'def
dAdBZ+e*dd<dCd>edee" d?eee,j-e e%j&f d@e'ddf
dDdBZ+ddd<d=d>edee" d?eeee,j-e e%j&f  d@e'dee f
 fdEdBZ+e*ddd<d=d>edee" d?dd@e'def
dFdGZ.e*dd<dCd>edee" d?eee,j-e e%j&f d@e'ddf
dHdGZ.ddd<d=d>edee" d?eeee,j-e e%j&f  d@e'dee f
 fdIdGZ.  Z/S )Mrh   zFFor integration testing, send recorded response or records a response.NFmode)recordreplayautoapir   replays_directoryvertexaiapi_keycredentialsprojectlocationhttp_optionsprivatec                    sP   t  j||||||	d || _| jstjdd | _d | _|| _|| _|
| _	d S )N)r   r   r   r   r   r   GOOGLE_GENAI_REPLAYS_DIRECTORY)
super__init__r   r`   ra   rb   replay_session_mode
_replay_id_private)r   r   r   r   r   r   r   r   r   r   r   	__class__r   r   r   (  s"   
zReplayApiClient.__init__r   c                 C   s   || _ |   d S rN   )r   _initialize_replay_session)r   r   r   r   r   initialize_replay_sessionH  s   z)ReplayApiClient.initialize_replay_sessionc                 C   s   |  | j| jS rN   )"_generate_file_path_from_replay_idr   r   r   r   r   r   _get_replay_file_pathL  s   z%ReplayApiClient._get_replay_file_pathc                 C   s&   | j dv p| j dkotj|   S )N)r   r   r   )r   r`   rF   isfiler   r   r   r   r   _should_call_apiQ  s   

z ReplayApiClient._should_call_apic                 C   s   |   o| jdkS )Nr   )r   r   r   r   r   r   _should_update_replayW  s   z%ReplayApiClient._should_update_replayc                 C   s   | j s	|   d S d S rN   )r   r   r   r   r   r   (_initialize_replay_session_if_not_loadedZ  s   z8ReplayApiClient._initialize_replay_session_if_not_loadedc                 C   s   t d| j  d| _d| _|  }tj|}| jdkr%|s%t	d| j | jdv rL|rLt
|d}tt| | _W d    n1 sGw   Y  |  rZt| jg d| _d S d S )NzTest is using replay id: r   r   z)Replay files do not exist for replay id: )r   r   r)r   r   )rc   r   _replay_index_sdk_response_indexr   r`   rF   r   r   
ValueErroropenr   model_validatejsonloadsreadr   r   )r   replay_file_pathreplay_file_existsfr   r   r   r   ^  s$   z*ReplayApiClient._initialize_replay_sessionreplay_directoryc                 C   sR   | d}t|dk rt| d|d u rg }n|g}|| tjj| d S )N/   zD: Session ID must be in the format of module/function/[vertex|mldev]z.json)splitlenr   extendr`   rF   join)r   r   r   session_parts
path_partsr   r   r   r   s  s   

z2ReplayApiClient._generate_file_path_from_replay_idc                 C   sz   |   r| js	d S |  }tjtj|dd t|d}|| jj	ddd W d    n1 s3w   Y  d | _d S )NT)exist_okw   )exclude_unsetindent)
r   r   r   r`   makedirsrF   dirnamer   writemodel_dump_json)r   r   r   r   r   r   close  s   
zReplayApiClient.closerM   http_responsec                 C   s   |   sd S t| t|j|j|j|jgd}t|tr5t	t
|jt| dd | D |jg d}n4t|tjrLt	t
|jj| g|jg d}nt|tr_t	i g |d d gg d}n
tdtt| | jd u rrtd	| jjt||d
 d S )N)rr   rC   r<   rs   c                 S   s   g | ]}|d d qS )Nd   r   )r!   segr   r   r   r#     s    z7ReplayApiClient._record_interaction.<locals>.<listcomp>)r<   rs   r}   r|   r~   )r<   rs   r|   r~   i   )r<   rs   r}   r~   z Unsupported http_response type: No replay session found.)r   r   )r   rQ   rq   rr   rC   r<   rO   r   r   rz   r$   r&   segmentsr}   r|   r   rj   r   _to_replay_recordcoderP   r   r   typer   r   appendr   )r   rM   r   r   r   r   r   r   rk     sR   

	



z#ReplayApiClient._record_interactioninteractionc                 C   s   t d|j  t d|jj  |j|jjksJ |j|jjks#J t|j}t|ts2t	| |g}t|jj
}|D ]}t|tsIt	| q>t||sYJ d| d| d S )Nzhttp_request.url: zinteraction.request.url: zRequest body mismatch:
Actual: 
Expected: )rc   rC   r   rr   copydeepcopyrO   r   rP   rI   rs   r4   )r   rM   r   request_data_copyactual_request_bodyexpected_request_bodysegmentr   r   r   _match_request  s(   

zReplayApiClient._match_requestc                 C   s   t | | jd u rtd| jj| j }| || |  jd7  _d| _tj	|j
 t|j
jdd |j
jD |j
jd}|jdgkrGdg|_|S )	Nr   r
   r   c                 S   s   g | ]}t |qS r   )r   dumps)r!   r   r   r   r   r#     s    z?ReplayApiClient._build_response_from_replay.<locals>.<listcomp>)r<   response_streambyte_streamz{}r=   )rQ   r   r   r   r   r   r   r   rj   raise_for_responser   r   r<   rs   r}   r   )r   rM   r   r   r   r   r   _build_response_from_replay  s$   
z+ReplayApiClient._build_response_from_replayresponse_modelc                 C   s  | j dkrd S | jstd| jj| jd  }|  rIt|tr$|d }t|dd }|r<|d ur<t|dd }|r<t	| |j
j|jdd d S t|trR|d }td	|jdd  |jdd
d}|j
j| j }t|trd|v rt|d trd|d v r|d d }tdt|  td|  t|tr|dkrt|}t|}||d d< | js||ksJ d| d| n
td| d|  |  jd7  _d S )Nr   r   r
   r   sdk_http_responser<   T)exclude_nonezresponse_model: r   )r   r   rH   zraw_body length: z
raw_body: r=   zSDK response mismatch:
Actual: r   z(Expected SDK response mismatch:
Actual: )r   r   r   r   r   r   r   r&   getattrrf   r   r~   r   
model_dumprc   r   r$   r   r   r   r   r   r   )r   r   r   sdk_response_responser<   actualexpectedraw_bodyr   r   r   _verify_response  s^   








z ReplayApiClient._verify_responsestreamc                    s   |    |  rZtd|  t| | t |||}W d    n1 s&w   Y  |rKg }| D ]
}|t	| q3t
|j|}| || n| || td|j  |S | |S Nzapi mode request: %szapi mode result: %s)r   r   rc   rn   r   _requestr   r   r   r   r   r<   rk   r   r   rM   r   r   rD   result_segmentsr   r   r   r   r   +  s    
zReplayApiClient._requestc              	      s   |    |  rmtd|  t| |4 I d H  t |||I d H }W d   I d H  n1 I d H s4w   Y  |r^g }| 2 z3 d H W }|t	| qA6 t
|j|}| || n| || td|j  |S | |S r   )r   r   rc   rp   r   _async_requestasync_segmentsr   r   r   r   r<   rk   r   r   r   r   r   r   E  s(   (
zReplayApiClient._async_requestr   	file_path
upload_urlupload_sizec          	         s   t |tjr&| }| }||tj tdddt	
|dii d}n
tddd|ii d}|  r[t| | t j||||d}W d    n1 sNw   Y  | || |S | |S NPOSTr=   rP   zutf-8)rr   rC   rO   r<   r   r   )r   ioIOBasetellr   seekr`   SEEK_SETr   base64	b64encodedecoder   rn   r   upload_filerk   r   	r   r   r   r   r   offsetcontentr   rD   r   r   r   r   a  s,   
zReplayApiClient.upload_filec          	   	      s   t |tjr'| }| }||tj tdddt	
|dii d}n
tddd|ii d}|  rit| |4 I d H  t j||||dI d H }W d   I d H  n1 I d H s\w   Y  | || |S | |S r   )r   r   r   r   r   r   r`   r   r   r   r   r   r   rp   r   async_upload_filerk   r   r   r   r   r   r    s.   (
z!ReplayApiClient.async_upload_filei   r   destination
chunk_sizerF   r  r  c                C      d S rN   r   r   rF   r   r  r  r   r   r   download_file     	zReplayApiClient.download_file)r   r  c                C   r  rN   r   r  r   r   r   r    r  c                   s  |    | jd|i |d}|  r7t| | t j||d |d}| || W d    n1 s1w   Y  ntt| 	|j
d }|d urt|ttjfrkt|d}|| W d    d S 1 sdw   Y  d S t|drw|| d S tdt| d|S 	Nrb   )rF   request_dictr   r  r   wbr   zUnsupported destination type: z<. Expected str, os.PathLike, or a writable file-like object.)r   _build_requestr   rn   r   r  rk   r   rP   r   r   r   r   r`   PathLiker   r   hasattrr   r   )r   rF   r   r  r  r   r   r   r   r   r   r    sB   	
		

c                      d S rN   r   r  r   r   r   async_download_file     	z#ReplayApiClient.async_download_filec                   r  rN   r   r  r   r   r   r    r  c          	   	      s6  |    | jd|i |d}|  rEt| |4 I d H  t j||d |dI d H }| || W d   I d H  n1 I d H s?w   Y  ntt| 	|j
d }|d urt|ttjfryt|d}|| W d    d S 1 srw   Y  d S t|dr||}t|r|I d H  d S tdt| d|S r	  )r   r  r   rp   r   r  rk   r   rP   r   r   r   r   r`   r  r   r   r  rR   isawaitabler   r   )	r   rF   r   r  r  r   r   r   r+   r   r   r   r    sH   (	




)NFNNNNNF)r   N)NF)0rt   ru   rv   rw   r   r   r   boolgoogleauthr   Credentialsr   r   r   r   r   r   r   r   r   r   r   r   r   r   rj   rP   rk   r   r   r   r   r   r   r   r   r   r   r   r   r  r	   r  r`   r  r  __classcell__r   r   r   r   rh   %  sv   	
 


	
0
#:"'!
(
)9rw   r   r   
contextlibr'   rR   r   r   r`   r   typingr   r   r   r   r   r   r   r	   google.authr  r=   r   _api_clientr   r   r   _commonr   typesr   r   r   r   r    r  r4   r8   r;   r$   rB   rE   rG   rI   rQ   r[   rc   rf   contextmanagerrn   asynccontextmanagerrp   rq   rz   r   r   rh   r   r   r   r   <module>   sP   (	"	