
    +j\                        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 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ZdedefdZ dedede!fdZ"dedefdZ#dedefdZ$de%eef         de%eef         fdZ&dedefdZ'dedefdZ(deddfdZ)deddfd Z*defd!Z+d"eddfd#Z,de%eef         ddfd$Z-ej.        d%d&deded         fd'            Z/ej0        d%d&deded         fd(            Z1 G d) d*e          Z2 G d+ d,e          Z3 G d- d.e          Z4 G d/ d0e          Z5 G d1 d&e          Z6dS )2zReplay API client.    N)AnyLiteralOptionalUnionIteratorAsyncIterator   )errors)BaseApiClient)HttpRequest)HttpResponse)	BaseModel)HttpOptionsHttpOptionsOrDictnamereturnc                     t          | t                    st          |           } t          j        dd|           }t          j        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   s1s     c/home/wildlama/visual-decline/.venv/lib/python3.11/site-packages/google/genai/_replay_api_client.pyto_snake_caser   '   sV     
D#		 t99D	v (D11"	#Xr	2	2	8	8	:	::    objc                 N   t          | t                    rd |                                 D             S t          | t                    rd | D             S t          | t          j                  r| j        S t          | t                    rd| v r|                     dd          S | S )Nc                 N    i | ]"\  }}t          |          t          |          #S  )r   _normalize_json_case).0kvs      r   
<dictcomp>z(_normalize_json_case.<locals>.<dictcomp>2   s?       Aq 	a.q11  r   c                 ,    g | ]}t          |          S r    r!   )r"   items     r   
<listcomp>z(_normalize_json_case.<locals>.<listcomp>7   s!    7774 &&777r   zdivision by zeroz"integer division or modulo by zero)	r   dictitemslistenumEnumvaluer   replace)r   s    r   r!   r!   0   s    T  IIKK    #t 	7737777#ty!! 9#s S  [[
B   
*r   obj1obj2c                 R    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'   )r1   r2   normalized_obj_1normalized_obj_2s       r   _equals_ignore_key_caser6   C   s6    " *$//)$//)))45r   version_stringc                 .    t          j        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   )r7   s    r   _redact_version_numbersr:   ]   s    	,.@.	Q	QQr   language_labelc                 .    t          j        dd|           S )z;Removed because replay requests are used for all languages.z
gl-python/z{LANGUAGE_LABEL}/r9   )r;   s    r   _redact_language_labelr=   b   s    	2N	C	CCr   headersc                    i }|                                  D ]\  }}|                                dk    rd||<   #|                                dk    r4t          t          |                                        dd          ||<   o|                                dk    r4t          t          |                                        dd          ||<   |                                dk    r|                                dk    r|||<   |S )	z,Redacts headers that should not be recorded.zx-goog-api-keyz
{REDACTED}z
user-agentzagentplatform-genai-moduleszvertex-genai-moduleszx-goog-api-clientzx-goog-user-projectauthorization)r+   r   r=   r:   r0   )r>   redacted_headersheader_nameheader_values       r   _redact_request_headersrD   g   s2   #*==?? 3 3k<...&2{##						,	,&<
!,
/
/' '-/EFF {## 
				 3	3	3&<
!,
/
/' '-/EFF {## 
				 5	5	5						/	/&2{##	r   urlc                     t          j        dd|           }t          j        dd|          }t          j        dd|          }t          j        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}r9   )rE   results     r   _redact_request_urlrH   ~   sy     6+	 &
 6, &
 6+ &
 64 &
 
-r   pathc                 F    d| v rd| v rt          j        dd|           }|S | S )Nz	projects/z
locations/zprojects/[^/]+/locations/[^/]+/z{PROJECT_AND_LOCATION_PATH}/r9   )rI   rG   s     r   _redact_project_location_pathrK      s?     D\T11V*& F
 MKr   bodyc                 l   t          | t                    r|                                 D ]p\  }}t          |t                    r+t	          |          }t          j        dd|          }|| |<   Et          |t          t          f          rt          |           qdS t          | t                    rt          |           D ]r\  }}t          |t                    r+t	          |          }t          j        dd|          }|| |<   Et          |t          t          f          rt          |           qd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   rK   r   r   r,   _redact_request_body	enumerate)rL   keyr/   is       r   rN   rN      sP   d $jjll 
$ 
$
U	E3		 	$-e44K
 

 S		edD\** $U###
$ 
$ $ $dOO 
$ 
$5	E3		 	$-e44K
 

 QedD\** $U###$ $
$ 
$r   http_requestc                     t          | j                  | _        t          | j                  | _        t	          | j        t                    st          | j                   d S d S N)rD   r>   rH   rE   r   databytesrN   )rR   s    r   redact_http_requestrW      s^    01EFF,()9::,	L%u	-	- ,*+++++, ,r   c                      t          j                    } | B| j        ;| j        j        /| j        j        }t          j        |          }|j        }d| d| S dS )z-Prints the current file path and line number.NzFile: z, Line:  )inspectcurrentframef_backgetfilef_lineno)current_frameframefilepathlinenos       r   _current_file_path_and_linerc      sg    &((-


*


%
1 'Eu%%H^F.H..f...	r   messagec                     t          dt          j                            d          dt	                      d|            d S )NzDEBUG (testPYTEST_CURRENT_TEST)z:
    )printosenvirongetrc   )rd   s    r   _debug_printrl      sE    jnn*++	!##    r   c                 ^    |                      dd           |                      dd           dS )z*Remove headers that are not deterministic.DateNzServer-Timing)pop)r>   s    r   pop_undeterministic_headersrp      s0    	++fd	++ot$$$$$r   clientReplayApiClientc              #   r   K   	 d V  d S # t           j        $ r}|                     ||           |d }~ww xY wrT   r
   APIError_record_interactionrq   rR   es      r   _record_on_api_errorry      sT      	EEEEE	   
|Q///
Gs   
 616c                t   K   	 d W V  d S # t           j        $ r}|                     ||           |d }~ww xY wrT   rt   rw   s      r   _async_record_on_api_errorr{      sV      	EEEEEE	   
|Q///
Gs    727c                   h    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.methodrE   r>   body_segmentsN)	__name__
__module____qualname____doc__r   __annotations__r*   r,   objectr    r   r   r}   r}      sX         00
+++
(((S>d3;'((((((r   r}   c                       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ZdS )ReplayResponsez)Represents a single response in a replay.   status_coder>   r   Nbyte_segmentssdk_response_segments_ReplayResponse__contextr   c                 .    t          | j                   d S rT   )rp   r>   )selfr   s     r   model_post_initzReplayResponse.model_post_init  s    -----r   )r   r   r   r   r   intr   r*   r   r,   r   r   r   rV   r   r   r    r   r   r   r     s         11+sS>d3;'(((()--$u+&---d3;/0000.s .t . . . . . .r   r   c                   (    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)r   r   r   r   r}   r   r   r    r   r   r   r     s0         JJr   r   c                   4    e Zd ZU dZeed<   ee         ed<   dS )
ReplayFilezRepresents a recorded session.	replay_idinteractionsN)r   r   r   r   r   r   r,   r   r    r   r   r   r     s3         &&...&''''''r   r   c                       e Zd ZdZ	 	 	 	 	 	 	 	 d.d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ZdeddfdZdefdZdefdZdefdZd/dZd/dZdee         dedefdZd/dZdedeeej        ef         ddfdZdededdfdZdedefdZd e ddfd!Z!	 	 d0dedee"         d"edef fd#Z#	 	 d0dedee"         d"edef fd$Z$dd%d&eee%j&        f         d'ed(e'dee"         def
 fd)Z(dd%d&eee%j&        f         d'ed(e'dee"         def
 fd*Z)dd%d+edee"         deeee*f         f fd,Z+dd%d+edee"         de*f fd-Z, xZ-S )1rr   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                     t                                          ||||||	           || _        | j        s%t          j                            dd           | _        d | _        || _        || _        |
| _	        d S )N)r   r   r   r   r   r   GOOGLE_GENAI_REPLAYS_DIRECTORY)
super__init__r   ri   rj   rk   replay_session_mode
_replay_id_private)r   r   r   r   r   r   r   r   r   r   r   	__class__s              r   r   zReplayApiClient.__init__   s     
GG!     /D! !z~~
*D   d 48DDJDODMMMr   r   c                 <    || _         |                                  d S rT   )r   _initialize_replay_session)r   r   s     r   initialize_replay_sessionz)ReplayApiClient.initialize_replay_session@  s!    DO##%%%%%r   c                 B    |                      | j        | j                  S rT   )"_generate_file_path_from_replay_idr   r   r   s    r   _get_replay_file_pathz%ReplayApiClient._get_replay_file_pathD  s$    22  r   c                     | j         dv p<| j         dk    o1t          j                            |                                            S )N)r   r   r   )r   ri   rI   isfiler   r   s    r   _should_call_apiz ReplayApiClient._should_call_apiI  sF    :** 
f 	=t99;;<<<r   c                 @    |                                  o
| j        dk    S )Nr   )r   r   r   s    r   _should_update_replayz%ReplayApiClient._should_update_replayO  s       "":tzU'::r   c                 @    | j         s|                                  d S d S rT   )r   r   r   s    r   (_initialize_replay_session_if_not_loadedz8ReplayApiClient._initialize_replay_session_if_not_loadedR  s/     (
%%'''''( (r   c                 L   t          d| j        z              d| _        d| _        |                                 }t
          j                            |          }| j        dk    r|st          d| j        z             | j        dv rm|rkt          |d          5 }t                              t          j        |                                                    | _        d d d            n# 1 swxY w Y   |                                 rt          | j        g           | _        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   )rl   r   _replay_index_sdk_response_indexr   ri   rI   r   r   
ValueErroropenr   model_validatejsonloadsreadr   r   )r   replay_file_pathreplay_file_existsfs       r   r   z*ReplayApiClient._initialize_replay_sessionV  ss   ,t>???D D1133(899zX&8
5
G   z''',>' #&& N!(77
166888L8LMMN N N N N N N N N N N N N N N !!## &O"  d s   AC((C,/C,replay_directoryc                     |                     d          }t          |          dk     rt          | d          |g }n|g}|                    |           t	          j        j        | dz   S )N/   zD: Session ID must be in the format of module/function/[vertex|mldev]z.json)splitlenr   extendri   rI   join)r   r   r   session_parts
path_partss        r   r   z2ReplayApiClient._generate_file_path_from_replay_idk  s    OOC((M
=A , , ,   jj$%jm$$$7<$w..r   c                    |                                  r| j        sd S |                                 }t          j        t          j                            |          d           t          |d          5 }|                    | j        	                    dd                     d d d            n# 1 swxY w Y   d | _        d S )NT)exist_okw   )exclude_unsetindent)
r   r   r   ri   makedirsrI   dirnamer   writemodel_dump_json)r   r   r   s      r   closezReplayApiClient.closey  s   %%'' t/B f1133K 011DAAAA		$	$ Qggd!11Q1OOPPPQ Q Q Q Q Q Q Q Q Q Q Q Q Q QDs   50B11B58B5rR   http_responsec                    |                                  sd S t          |           t          |j        |j        |j        |j        g          }t          |t                    rgt          t          |j                  t          |                                          d |                                D             |j        g           }nt          |t          j                  rCt          t          |j        j                  |                                g|j        g           }nVt          |t(                    rt          i g |gg           }n,t+          dt-          t/          |                    z             | j        t+          d          | j        j                            t7          ||                     d S )	N)r~   rE   r>   r   c                 (    g | ]}|d d         dz   S )Nd   s   ...r    )r"   segs     r   r)   z7ReplayApiClient._record_interaction.<locals>.<listcomp>  s2       %(c$3$i&   r   )r>   r   r   r   r   )r>   r   r   r   )r>   r   r   r   z Unsupported http_response type: No replay session found.)r   r   )r   rW   r}   r~   rE   r>   rU   r   r   r   r*   r,   segmentsr   r   r
   ru   r   _to_replay_recordcoderV   r   r   typer   r   appendr   )r   rR   r   r   r   s        r   rv   z#ReplayApiClient._record_interaction  s   
 %%'' f%%%"$#()	  G -.. },--]335566 ,9,G,G,I,I   $/ "  hh 
M6?	3	3 }-566&88::;#( "	  hh 
M5	)	) 
& "	  hh 
,s43F3F/G/G
G   "1222$++'H===    r   interactionc                 ~   t          d|j                    t          d|j        j                    |j        |j        j        k    sJ |j        |j        j        k    sJ d|j         d|j        j                     |j        |j        j        k    sJ t          j        |j                  }t          |t                    st          |           |g}t          j        |j        j                  }|D ]&}t          |t                    st          |           't          ||          sJ d| d|             d S )Nzhttp_request.url: zinteraction.request.url: z"Request headers mismatch:
Actual: 
Expected: zRequest body mismatch:
Actual: )rl   rE   r   r>   r~   copydeepcopyrU   r   rV   rN   r   r6   )r   rR   r   request_data_copyactual_request_bodyexpected_request_bodysegments          r   _match_requestzReplayApiClient._match_request  s   
 8l&688999F[-@-DFFGGG{266666;#6#>>>>	3'	3 	3 (0	3 	3 ?>>
 +"5"<<<<< l&788 '// .,---,- M+*=*KLL( & &'' &W%%%"#68MNN  	-&	- 	-*	- 	- N  r   c                    t          |           | j        t          d          | j        j        | j                 }|                     ||           | xj        dz  c_        d| _        t          j        	                    |j
                   t          |j
        j        d |j
        j        D             |j
        j                  }|j        dgk    rdg|_        |S )Nr   r	   r   c                 6    g | ]}t          j        |          S r    )r   dumps)r"   r   s     r   r)   z?ReplayApiClient._build_response_from_replay.<locals>.<listcomp>  s2     
 
 
 Jw
 
 
r   )r>   response_streambyte_streamz{}rY   )rW   r   r   r   r   r   r   r
   ru   raise_for_responser   r   r>   r   r   r   )r   rR   r   r   s       r   _build_response_from_replayz+ReplayApiClient._build_response_from_replay  s    %%%"1222%243EFKk222! D
O&&{';<<< $,
 
&/=
 
 
  (6  M $..')dm#r   response_modelc                    | j         dk    rd S | j        st          d          | j        j        | j        dz
           }|                                 rt          |t                    r|d         }t          |dd           }|r$|"t          |dd           }|rt          |           |j
        j                            |                    d                     d S t          |t                    r|d         }t          d	|                    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$                    r9|dk    r3t'          j        |          }t'          j        |          }||d         d<   | j        s||k    sJ d| d|             nt          d| d|            | xj        dz  c_        d S )Nr   r   r	   r   sdk_http_responser>   T)exclude_nonezresponse_model: r   )r   r   rL   zraw_body length: z
raw_body: rY   zSDK response mismatch:
Actual: r   z(Expected SDK response mismatch:
Actual: )r   r   r   r   r   r   r   r,   getattrrp   r   r   r   
model_dumprl   r   r*   r   r   r   r   r   r   )r   r   r   sdk_response_responser>   actualexpectedraw_bodys           r   _verify_responsez ReplayApiClient._verify_response  s   zUf 31222%243E3IJK!!## 	ND	)	) +'*%n6I4PP	 /

+!9d
 
  	/
%g
.
.
.077

#
#
#
6
6   f.$'' )%a(nI>44$4GGII   &&Dv&FFF#9 H
 (D!! =		(	(Z
&
'. .	( X1222126:(
:3x==::
;
;
;
.H..
/
/
/#&& =8r>>z(++Hz(++H4<H()&1= _
H


	JF	J	J	J	J 


 ]v]]S[]]^^^!r   streamc                 r   |                                   |                                 rt          d|z             t          | |          5  t	                                          |||          }d d d            n# 1 swxY w Y   |rlg }|                                D ])}|                    t          j	        |                     *t          |j        |          }|                     ||           n|                     ||           t          d|j        z             |S |                     |          S Nzapi mode request: %szapi mode result: %s)r   r   rl   ry   r   _requestr   r   r   r   r   r>   rv   r   r   rR   r   r  rG   result_segmentsr   r   s          r   r
  zReplayApiClient._request!  s    	11333 <)L8999l33 F F!!,fEEF F F F F F F F F F F F F F F	 	7(( 	6 	6G

 
 G!4!4
5
5
5
5fno>>  v6666 	  v666(6;6777m--l;;;s   $A<<B B c                   K   |                                   |                                 rt          d|z             t          | |          4 d {V  t	                                          |||           d {V }d d d           d {V  n# 1 d {V swxY w Y   |rrg }|                                2 3 d {V }|                    t          j	        |                     /6 t          |j        |          }|                     ||           n|                     ||           t          d|j        z             |S |                     |          S r	  )r   r   rl   r{   r   _async_requestasync_segmentsr   r   r   r   r>   rv   r   r  s          r   r  zReplayApiClient._async_request;  s      	11333 <)L8999+D,?? 
 
 
 
 
 
 
 
ww--,
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 	7#2244 	6 	6 	6 	6 	6 	6 	6'

 
 G!4!4
5
5
5
5 5fno>>  v6666 	  v666(6;6777m--l;;;s   *B
BB:C)r   	file_path
upload_urlupload_sizec                   t          |t          j                  r|                                }|                                }|                    |t          j                   t          dddt          j
        |                              d          ii           }nt          ddd|ii           }|                                 ret          | |          5  t                                          ||||          }d d d            n# 1 swxY w Y   |                     ||           |S |                     |          S NPOSTrY   rV   zutf-8)r~   rE   rU   r>   r  r  )r   ioIOBasetellr   seekri   SEEK_SETr   base64	b64encodedecoder   ry   r   upload_filerv   r   
r   r  r  r  r   offsetcontentr   rG   r   s
            r   r  zReplayApiClient.upload_fileW  s    )RY'' ~~f  gnnVR[))))'2299'BBC	  gg R{I&>  g  	7g.. 
 
$$z;\ % 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 w///m--g666s   &D

DDc                  K   t          |t          j                  r|                                }|                                }|                    |t          j                   t          dddt          j
        |                              d          ii           }nt          ddd|ii           }|                                 r}t          | |          4 d {V  t                                          ||||           d {V }d d d           d {V  n# 1 d {V swxY w Y   |                     ||           |S |                     |          S r  )r   r  r  r  r   r  ri   r  r   r  r  r  r   r{   r   async_upload_filerv   r   r   s
            r   r$  z!ReplayApiClient.async_upload_filex  s       )RY'' ~~f  gnnVR[))))'2299'BBC	  gg R{I&>  g  	7+D':: 
 
 
 
 
 
 
 
ww00z;\ 1 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 w///m--g666s    ,D
D(+D(rI   c                   |                                   |                     d|i |          }|                                 rct          | |          5  t	                                          ||          }d d d            n# 1 swxY w Y   |                     ||           |S |                     |          j        d         S Nrk   )rI   request_dictr   r  r   )	r   _build_requestr   ry   r   download_filerv   r   r   r   rI   r   r   rG   r   s        r   r)  zReplayApiClient.download_file  s    	11333!!Dr "  G  Fg.. H H&&t,&GGH H H H H H H H H H H H H H H
w///m--g66B1EEs   $BB
Bc                  K   |                                   |                     d|i |          }|                                 r{t          | |          4 d {V  t	                                          ||           d {V }d d d           d {V  n# 1 d {V swxY w Y   |                     ||           |S |                     |          j        d         S r&  )	r   r(  r   r{   r   async_download_filerv   r   r   r*  s        r   r,  z#ReplayApiClient.async_download_file  s      	11333!!Dr "  G  F+D':: 
 
 
 
 
 
 
 
ww22| 3 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 w///m--g66B1EEs   *B
B!$B!)NFNNNNNF)r   N)NF).r   r   r   r   r   r   r   boolgoogleauthr   Credentialsr   r   r   r   r   r   r   r   r   r   r   r   r   r
   ru   rV   rv   r   r   r   r   r  r   r
  r  r  r  r   r  r$  r   r)  r,  __classcell__)r   s   @r   rr   rr     s       NN *.#CG# $,0 56  "#	
  } FK3?@ }  [)      @& & & & & &S    
    ;T ; ; ; ;( ( ( (   */# /[^ /cf / / / /   .. <%?@. 	. . . .` % 	   Bk l    .5"Y 5"4 5" 5" 5" 5"t 37	< << ./< 	<
 < < < < < <: 37	< << ./< 	<
 < < < < < <D 377 7 7sBI~&7 7 	7 ./7 7 7 7 7 7 7N 377 7 7sBI~&7 7 	7 ./7 7 7 7 7 7 7D GKF F FF(01B(CF\5#%&F F F F F F  GKF F FF(01B(CF
F F F F F F F F F Fr   )7r   r  r   
contextlibr-   rZ   r  r   ri   r   typingr   r   r   r   r   r   google.authr.  rY   r
   _api_clientr   r   r   _commonr   typesr   r   r   r   r!   r-  r6   r:   r=   r*   rD   rH   rK   rN   rW   rc   rl   rp   contextmanagerry   asynccontextmanagerr{   r}   r   r   r   rr   r    r   r   <module>r:     s_              				  				 				 I I I I I I I I I I I I I I I I           & & & & & & $ $ $ $ $ $ % % % % % %       1 1 1 1 1 1 1 1; ; ; ; ; ;c c    &# S T    4RC RC R R R R
D3 D3 D D D D
T#s(^ S#X    .S S    4     $s $t $ $ $ $8,k ,d , , , ,S    # $    %c3h %D % % % % !2 + RZ[_R`     -> k ^klp^q     ) ) ) ) )I ) ) )
. 
. 
. 
. 
.Y 
. 
. 
.    	   ( ( ( ( ( ( ( (ZF ZF ZF ZF ZFm ZF ZF ZF ZF ZFr   