
    [ThbW                     .   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 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 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%ee)f   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. G d& d'e      Z/ G d( d)e      Z0 G d* d+e      Z1 G d, d-e      Z2 G d. d/e      Z3y)0zReplay API client.    N)AnyLiteralOptionalUnion)	HTTPError   )errors)BaseApiClient)HttpRequest)HttpResponse)	BaseModel)HttpOptionsHttpOptionsOrDictnamereturnc                     t        | t              st        |       } t        j                  dd|       }t        j                  dd|      j	                         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     d/home/www/backend.miabetepe.com/venv/lib/python3.12/site-packages/google/genai/_replay_api_client.pyto_snake_caser   (   sG     
D#	t9D	vv (D1"	#Xr	2	8	8	::    objc                 F   t        | t              r6| j                         D ci c]  \  }}t        |      t	        |       c}}S t        | t
              r| D cg c]  }t	        |       c}S t        | t        j                        r| j                  S | S c c}}w c c}w N)	r   dictitemsr   _normalize_json_caselistenumEnumvalue)r   kvitems       r   r!   r!   1   s    T IIKAq 	a.q11  #t3674 &77#tyy!99J
 8s   BBobj1obj2c                 <    t        |       }t        |      }||k(  ryy)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'}
  TF)r!   )r)   r*   normalized_obj_1normalized_obj_2s       r   _equals_ignore_key_caser.   ?   s)    " *$/)$/))r   version_stringc                 0    t        j                  dd|       S )z8Redacts version numbers in the form x.y.z from a string.z\d+\.\d+\.\d+z{VERSION_NUMBER}r   r   )r/   s    r   _redact_version_numbersr2   Y   s    	 "4n	EEr   language_labelc                 0    t        j                  dd|       S )z;Removed because replay requests are used for all languages.z
gl-python/z{LANGUAGE_LABEL}/r1   )r3   s    r   _redact_language_labelr5   ^   s    	2N	CCr   headersc                 r   i }| j                         D ]  \  }}|j                         dk(  rd||<   |j                         dk(  rt        t        |            ||<   J|j                         dk(  rt        t        |            ||<   u|j                         dk(  r|j                         dk(  r|||<    |S )z,Redacts headers that should not be recorded.zx-goog-api-keyz
{REDACTED}z
user-agentzx-goog-api-clientzx-goog-user-projectauthorization)r    r   r5   r2   )r6   redacted_headersheader_nameheader_values       r   _redact_request_headersr<   c   s    #*==? 3k<..&2{#					,&<
!,
/'{# 
			 3	3&<
!,
/'{# 
			 5	5					/&2{#!3" 
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/https://generativelanguage.googleapis.com/[^/]+z{MLDEV_URL_PREFIX}r1   )r=   results     r   _redact_request_urlr@   z   sm     66+	&
 66,&
 66+&
 668&
 
-r   pathc                 H    d| v rd| v rt        j                  dd|       }|S | S )Nz	projects/z
locations/zprojects/[^/]+/locations/[^/]+/z{PROJECT_AND_LOCATION_PATH}/r1   )rA   r?   s     r   _redact_project_location_pathrC      s6     D\T1VV*&F
 MKr   bodyc                 r    | j                         D ]$  \  }}t        |t              st        |      | |<   & y)z,Redacts fields in the request body in place.N)r    r   r   rC   )rD   keyr%   s      r   _redact_request_bodyrG      s3    JJL 7jc5%/6d3i7r   http_requestc                     t        | j                        | _        t        | j                        | _        t	        | j
                  t              st        | j
                         y y r   )r<   r6   r@   r=   r   databytesrG   )rH   s    r   redact_http_requestrL      sK    01E1EF,()9)9:,	L%%u	-**+ 
.r   c                      t        j                         } | a| j                  U| j                  j                  ?| j                  j                  }t        j                  |      }|j                  }d| d| S y)z-Prints the current file path and line number.zFile: z, Line:  )inspectcurrentframef_backgetfilef_lineno)current_frameframefilepathlinenos       r   _current_file_path_and_linerX      sr    &&(-



*



%
%
1  ''Eu%H^^FH:XfX..	r   messagec                 n    t        dt        j                  j                  d      dt	               d|        y )NzDEBUG (testPYTEST_CURRENT_TEST)z:
    )printosenvirongetrX   )rY   s    r   _debug_printra      s-    jjnn*+	!#r   c                 L    | j                  dd       | j                  dd       y)z*Remove headers that are not deterministic.DateNzServer-Timing)pop)r6   s    r   pop_undeterministic_headersre      s    	++fd	++ot$r   c                   T    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<   y)ReplayRequestz(Represents a single request in a replay.methodr=   r6   body_segmentsN)	__name__
__module____qualname____doc__r   __annotations__r   r"   object r   r   rg   rg      s1    0
+
(S>d3;'((r   rg   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y)ReplayResponsez)Represents a single response in a replay.   status_coder6   ri   Nbyte_segmentssdk_response_segments_ReplayResponse__contextr   c                 .    t        | j                         y r   )re   r6   )selfrw   s     r   model_post_initzReplayResponse.model_post_init   s    -r   )rj   rk   rl   rm   rt   intrn   r   r   r"   ro   ru   r   rK   r   rz   rp   r   r   rr   rr      sk    1+sS>d3;'(()--$u+&-d3;/00.s .t .r   rr   c                   &    e Zd ZU dZeed<   eed<   y)ReplayInteractionzBRepresents a single interaction, request and response in a replay.requestresponseN)rj   rk   rl   rm   rg   rn   rr   rp   r   r   r}   r}      s    Jr   r}   c                   ,    e Zd ZU dZeed<   ee   ed<   y)
ReplayFilezRepresents a recorded session.	replay_idinteractionsN)rj   rk   rl   rm   r   rn   r"   r}   rp   r   r   r   r      s    &.&''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   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j4                  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!	 	 d.dedee"   d edef fd!Z#	 	 d.dedee"   d edef fd"Z$dd#d$eee%jL                  f   d%ed&e'dee"   def
 fd'Z(dd#d$eee%jL                  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 )/ReplayApiClientzFFor integration testing, send recorded response or records a response.Nmode)recordreplayautoapir   replays_directoryvertexaiapi_keycredentialsprojectlocationhttp_optionsc
                     t         
|   ||||||	       || _        | j                  s%t        j                  j                  dd       | _        d | _        || _        || _        y )N)r   r   r   r   r   r   GOOGLE_GENAI_REPLAYS_DIRECTORY)	super__init__r   r^   r_   r`   replay_session_mode
_replay_id)ry   r   r   r   r   r   r   r   r   r   	__class__s             r   r   zReplayApiClient.__init__   sn     
G!   /D!!!zz~~
*D d 48DDJDOr   r   c                 2    || _         | j                          y r   )r   _initialize_replay_session)ry   r   s     r   initialize_replay_sessionz)ReplayApiClient.initialize_replay_session  s    DO##%r   c                 N    | j                  | j                  | j                        S r   )"_generate_file_path_from_replay_idr   r   ry   s    r   _get_replay_file_pathz%ReplayApiClient._get_replay_file_path  s$    22 r   c                     | j                   dv xs? | j                   dk(  xr. t        j                  j                  | j	                                S )N)r   r   r   )r   r^   rA   isfiler   r   s    r   _should_call_apiz ReplayApiClient._should_call_api  sF    ::** 

f 	=t99;<<r   c                 D    | j                         xr | j                  dk7  S )Nr   )r   r   r   s    r   _should_update_replayz%ReplayApiClient._should_update_replay$  s      ":tzzU'::r   c                 >    | j                   s| j                          y y r   )r   r   r   s    r   (_initialize_replay_session_if_not_loadedz8ReplayApiClient._initialize_replay_session_if_not_loaded'  s    
%%' r   c                 2   t        d| j                  z          d| _        d| _        | j	                         }t
        j                  j                  |      }| j                  dk(  r|st        d| j                  z         | j                  dv rR|rPt        |d      5 }t        j                  t        j                  |j                                     | _        d d d        | j#                         rt        | j                  g       | _        y y # 1 sw Y   7xY w)NzTest is using replay id: r   r   z)Replay files do not exist for replay id: )r   r   r)r   r   )ra   r   _replay_index_sdk_response_indexr   r^   rA   r   r   
ValueErroropenr   model_validatejsonloadsreadr   r   )ry   replay_file_pathreplay_file_existsfs       r   r   z*ReplayApiClient._initialize_replay_session+  s    ,t>?D D113(89zzX&8
5
G  zz'',> #& N!(77

16688LMN !!#&OO"d $N Ns   <DDreplay_directoryc                     |j                  d      }t        |      dk  rt        | d      |g }n|g}|j                  |       t	        j
                  j                  | dz   S )N/   zD: Session ID must be in the format of module/function/[vertex|mldev]z.json)splitlenr   extendr^   rA   join)ry   r   r   session_parts
path_partss        r   r   z2ReplayApiClient._generate_file_path_from_replay_id@  st    OOC(M
=AK , ,  j$%jm$77<<$w..r   c                 |   | j                         r| j                  sy | j                         }t        j                  t        j
                  j                  |      d       t        |d      5 }|j                  | j                  j                  dd             d d d        d | _        y # 1 sw Y   d | _        y xY w)NT)exist_okw   )exclude_unsetindent)
r   r   r   r^   makedirsrA   dirnamer   writemodel_dump_json)ry   r   r   s      r   closezReplayApiClient.closeN  s    %%'t/B/B113KK 01DA		$ Qggd!!11Q1OPQDQDs   .-B++B;rH   http_responsec           
      t   | j                         sy t        |       t        |j                  |j                  |j
                  |j                  g      }t        |t              rgt        t        |j
                        t        |j                               |j                         D cg c]
  }|d d dz    c}|j                  g       }nt        |t        j                         rFt        t        |j"                  j
                        |j%                         g|j&                  g       }nAt        |t(              rt        i g |gg       }n t+        dt-        t/        |            z         | j0                  t+        d      | j0                  j2                  j5                  t7        ||	             y c c}w )
N)rh   r=   r6   ri   d   s   ...)r6   ri   ru   rt   rv   )r6   ri   rt   rv   )r6   ri   ru   rv   z Unsupported http_response type: No replay session found.)r~   r   )r   rL   rg   rh   r=   r6   rJ   r   r   rr   r   r"   segmentsru   rt   r	   APIErrorr   _to_replay_recordcoderK   r   r   typer   r   appendr}   )ry   rH   r   r~   segr   s         r   _record_interactionz#ReplayApiClient._record_interactionW  s   
 %%'%""$$#(()	G -.},,-]3356,9,G,G,I%(c$3i&  $// "h 
M6??	3}--556&88:;#(( "	h 
M5	)& "	h 
,s43F/G
G  "122$$++'H=5s   (F5interactionc                    |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}|j                  j                  }t        ||      sJ d| d|        y )Nz"Request headers mismatch:
Actual: 
Expected: zRequest body mismatch:
Actual: )r=   r~   r6   rh   copydeepcopyrJ   r   rK   rG   ri   r.   )ry   rH   r   request_data_copyactual_request_bodyexpected_request_bodys         r   _match_requestzReplayApiClient._match_request  s   
 {2266666;#6#6#>#>> 	''( ) ((001	3>
 +"5"5"<"<<<< l&7&78 '/,-,-'//=="#68MN 	&' (*+	-Nr   c           	      N   t        |       | j                  t        d      | j                  j                  | j                     }| j                  ||       | xj                  dz  c_        d| _        t        j                  j                  |j                         t        |j                  j                  |j                  j                  D cg c]  }t        j                  |       c}|j                  j                         }|j"                  dgk(  rdg|_        |S c c}w )Nr   r   r   )r6   response_streambyte_streamz{}rN   )rL   r   r   r   r   r   r   r	   r   raise_for_responser   r   r6   ri   r   dumpsru   r   )ry   rH   r   segmentr   s        r   _build_response_from_replayz+ReplayApiClient._build_response_from_replay  s    %"122%%2243E3EFKk2! D
OO&&{';';< $$,, '//==
 JJw
  ((66M $$.')dm#
s   D"
response_modelc                    | j                   dk(  ry | j                  st        d      | j                  j                  | j                  dz
     }| j                         rvt        |t              r|d   }t        |dd       }|r|t        |dd       }|rt        |       |j                  j                  j                  |j                  d             y t        |t              r|d   }t        d	|j                  d             |j                  dd
      }|j                  j                  | j                     }t        |t               rd|v rt        |d   t               rwd|d   v rp|d   d   }t        dt#        |             t        d|       t        |t$              r7|dk7  r2t'        j(                  |      }t'        j*                  |      }||d   d<   ||k(  sJ d| d|        | xj                  dz  c_        y )Nr   r   r   r   sdk_http_responser6   T)exclude_nonezresponse_model: r   )r   r   rD   zraw_body length: z
raw_body: rN   zSDK response mismatch:
Actual: r   )r   r   r   r   r   r   r   r"   getattrre   r   rv   r   
model_dumpr]   r   r   r   r   r   r   r   )ry   r   r   sdk_response_responser6   actualexpectedraw_bodys           r   _verify_responsez ReplayApiClient._verify_response  s   zzU122%%2243E3E3IJK!!#	ND	)'*%n6I4P	

+!9d
 
%g
.0077

#
#
#
6 .$'%a(n	
n77T7JK&&Dv&FF##99  H
 (D!		(Z
&
'. X122126:(
#S]
3
h
'#&8r>zz(+Hzz(+H4<H()&1 	(I	)&hZHI!r   streamc                 (   | j                          | j                         rt        d|z         	 t        |   |||      }|rdg }|j                         D ]&  }|j                  t        j                  |             ( t        |j                  |      }| j                  ||       n| j                  ||       t        d|j                  z         |S | j                  |      S # t
        j                  $ r}| j                  ||       |d }~ww xY wNzapi mode request: %szapi mode result: %s)r   r   ra   r   _requestr	   r   r   r   r   r   r   r   r6   r   	ry   rH   r   r   r?   eresult_segmentsr   r   s	           r   r   zReplayApiClient._request  s     	113)L89!,fE 
( 	6G

 
 G!4
5	6fnno>  v6 	  v6(6;;67m--l;;! __   q1s   C% %D8DDc                 T  K   | j                          | j                         rt        d|z         	 t        |   |||       d {   }|r@g }|j                         2 3 d {   }|j                  t        j                  |             .| j                  ||       t        d|j                  z         |S | j                  |      S 7 # t
        j                  $ r}| j                  ||       |d }~ww xY w7 6 t        |j                  |      }| j                  ||       wr   )r   r   ra   r   _async_requestr	   r   r   async_segmentsr   r   r   r   r6   r   r   s	           r   r   zReplayApiClient._async_request
  s     	113)L89w-,
 
 
#224 	6 	6'

 
 G!4
5 	  v6(6;;67m--l;;'
 __   q1
	64fnno>  v6s_   /D(C CC D( C>$C<%C>(A#D(C C9 C44C99D(<C>>*D(r   	file_path
upload_urlupload_sizec                   t        |t        j                        rt|j                         }|j	                         }|j                  |t        j                         t        dddt        j                  |      j                  d      ii       }nt        ddd|ii       }| j                         r(	 t        
| 9  ||||      }| j1                  ||       |S | j3                  |      S # t        $ ru}	t!        t#        |	j$                  j&                        t)        j*                  d|	j$                  j,                  i      g      }|	j$                  j.                  |_        |	d }	~	ww xY w	NPOSTrN   rK   zutf-8)rh   r=   rJ   r6   r   r   reason)r   ioIOBasetellr   seekr^   SEEK_SETr   base64	b64encodedecoder   r   upload_filer   r   r   r   r6   r   r   r  rt   r   r   ry   r   r   r   r   offsetcontentr~   r?   r   r   s             r   r  zReplayApiClient.upload_file)  sD    )RYY'~~f gnnVR[[)))'299'BC	g R{I&>g 	$z;\ % 
 w/m--g66  ##$tzz8QZZ=N=N2O'P&Q
 ZZ33s   2C* *	E(3A0E##E(c                  K   t        |t        j                        rt|j                         }|j	                         }|j                  |t        j                         t        dddt        j                  |      j                  d      ii       }nt        ddd|ii       }| j                         r0	 t        
| 9  ||||       d {   }| j1                  ||       |S | j3                  |      S 7 )# t        $ ru}	t!        t#        |	j$                  j&                        t)        j*                  d|	j$                  j,                  i      g      }|	j$                  j.                  |_        |	d }	~	ww xY wwr   )r   r  r  r  r   r  r^   r  r   r  r	  r
  r   r   async_upload_filer   r   r   r   r6   r   r   r  rt   r   r   r  s             r   r  z!ReplayApiClient.async_upload_fileP  sQ     )RYY'~~f gnnVR[[)))'299'BC	g R{I&>g 	w0z;\ 1 
 
 w/m--g66
  ##$tzz8QZZ=N=N2O'P&Q
 ZZ33s=   B0E74C6 
C4C6 %E74C6 6	E4?A0E//E44E7rA   c                   | j                          | j                  d|i |      }| j                         r&	 t        |   ||      }| j                  ||       |S | j                  |      j                   d   S # t
        $ ru}t        t        |j                  j                        t        j                  d|j                  j                  i      g      }|j                  j                  |_        |d }~ww xY wNr`   )rA   request_dictr   r   r  r   )r   _build_requestr   r   download_filer   r   r   r   r6   r   r   r  rt   r   r   r   ry   rA   r   r~   r?   r   r   s         r   r  zReplayApiClient.download_filew  s     	113!!Dr " G &t,&G w/m--g6BB1EE  ##$tzz8QZZ=N=N2O'P&Q
 ZZ33s   A; ;	C9A0C44C9c                  K   | j                          | j                  d|i |      }| j                         r.	 t        |   ||       d {   }| j                  ||       |S | j                  |      j                   d   S 7 6# t
        $ ru}t        t        |j                  j                        t        j                  d|j                  j                  i      g      }|j                  j                  |_        |d }~ww xY wwr  )r   r  r   r   async_download_filer   r   r   r   r6   r   r   r  rt   r   r   r   r  s         r   r  z#ReplayApiClient.async_download_file  s      	113!!Dr " G 	w2| 3 
 
 w/m--g6BB1EE
  ##$tzz8QZZ=N=N2O'P&Q
 ZZ33s;   6DB BB 2DB 	DA0D  DD)NFNNNNN)r   N)NF).rj   rk   rl   rm   r   r   r   boolgoogleauthr   Credentialsr   r   r   r   r   r   r   r   r   r   r   r   r   r	   r   rK   r   r}   r   r   r   r   r   r   r   r  r  r{   r  r  r   r  r  __classcell__)r   s   @r   r   r      s   N *.#CG# $,0 56    "#	 
   }  FKK33??@  }    [) <& & &S 
 ;T ;(*/# /[^ /cf /.. <%?@. 	.` % 	8k l .1"Y 1"4 1"l 37	<< ./< 	<
 <@ 37	<< ./< 	<
 <J 37%7sBII~&%7 %7 	%7 ./%7 %7Z 37%7sBII~&%7 %7 	%7 ./%7 %7P GKFF(01B(CF\5#%&F, GKFF(01B(CF
F Fr   r   )4rm   r  r   datetimer#   rO   r  r   r^   r   typingr   r   r   r   google.authr  requests.exceptionsr   rN   r	   _api_clientr
   r   r   _commonr   typesr   r   r   r   r!   r  r.   r2   r5   r   r<   r@   rC   ro   rG   rL   rX   ra   re   rg   rr   r}   r   r   rp   r   r   <module>r%     s          	  	 	 0 0  )  & $ %  1; ; ;c c # S T 4FC FC F
D3 D3 D
T#s(^ S#X .S S 4  7tCK0 7T 7,k ,d ,S # $ %c3h %D %)I )
.Y 
.	 ( (mFm mFr   