
    LiYX                        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%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.ej^                  d%d&deded   fd'       Z0ejb                  d%d&deded   fd(       Z2 G d) d*e      Z3 G d+ d,e      Z4 G d- d.e      Z5 G d/ d0e      Z6 G d1 d&e      Z7y)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|      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     ]/var/www/html/eduruby.in/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                    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 t        | t              rd| v r| j                  dd      S | S c c}}w c c}w )Nzdivision by zeroz"integer division or modulo by zero)r   dictitemsr   _normalize_json_caselistenumEnumvaluer   replace)r   kvitems       r   r!   r!   0   s    T IIKAq 	a.q11  #t3674 &77#tyy!99#sS [[
B  
*
 8s   B>C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/   C   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+[a-zA-Z0-9]*z{VERSION_NUMBER}r   r   )r0   s    r   _redact_version_numbersr3   ]   s    	,.@.	QQr   language_labelc                 0    t        j                  dd|       S )z;Removed because replay requests are used for all languages.z
gl-python/z{LANGUAGE_LABEL}/r2   )r4   s    r   _redact_language_labelr6   b   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   r6   r3   )r7   redacted_headersheader_nameheader_values       r   _redact_request_headersr=   g   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+.*generativelanguage.*.googleapis.com/[^/]+z{MLDEV_URL_PREFIX}r2   )r>   results     r   _redact_request_urlrA   ~   sm     66+	&
 66,&
 66+&
 664&
 
-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}/r2   )rB   r@   s     r   _redact_project_location_pathrD      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   rD   )rE   keyr%   s      r   _redact_request_bodyrH      s3    JJL 7jc5%/6d3i7r   http_requestc                     t        | j                        | _        t        | j                        | _        t	        | j
                  t              st        | j
                         y y N)r=   r7   rA   r>   r   databytesrH   )rI   s    r   redact_http_requestrN      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_linerZ      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getrZ   )r[   s    r   _debug_printrc      s-    jjnn*+	!#r   c                 L    | j                  dd       | j                  dd       y)z*Remove headers that are not deterministic.DateNzServer-Timing)pop)r7   s    r   pop_undeterministic_headersrg      s    	++fd	++ot$r   clientReplayApiClientc              #   t   K   	 d  y # t         j                  $ r}| j                  ||       |d }~ww xY wwrK   r
   APIError_record_interactionrh   rI   es      r   _record_on_api_errorrp      s6     		 
|Q/
Gs   8	 85058c                v   K   	 d  y # t         j                  $ r}| j                  ||       |d }~ww xY wwrK   rk   rn   s      r   _async_record_on_api_errorrr      s6     		 
|Q/
Gs   9
 96169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>   r7   body_segmentsN)	__name__
__module____qualname____doc__r   __annotations__r   r"   object r   r   rt   rt      s1    0
+
(S>d3;'((r   rt   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_coder7   rv   Nbyte_segmentssdk_response_segments_ReplayResponse__contextr   c                 .    t        | j                         y rK   )rg   r7   )selfr   s     r   model_post_initzReplayResponse.model_post_init   s    -r   )rw   rx   ry   rz   r   intr{   r   r   r"   r|   r   r   rM   r   r   r}   r   r   r   r      sk    1+sS>d3;'(()--$u+&-d3;/00.s .t .r   r   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)rw   rx   ry   rz   rt   r{   r   r}   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)rw   rx   ry   rz   r   r{   r"   r   r}   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   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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 )0ri   zFFor integration testing, send recorded response or records a response.Nmode)recordreplayautoapir   replays_directoryvertexaiapi_keycredentialsprojectlocationhttp_optionsprivatec                     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`   ra   rb   replay_session_mode
_replay_id_private)r   r   r   r   r   r   r   r   r   r   r   	__class__s              r   r   zReplayApiClient.__init__  su     
G!   /D!!!zz~~
*D d 48DDJDODMr   r   c                 2    || _         | j                          y rK   )r   _initialize_replay_session)r   r   s     r   initialize_replay_sessionz)ReplayApiClient.initialize_replay_session+  s    DO##%r   c                 N    | j                  | j                  | j                        S rK   )"_generate_file_path_from_replay_idr   r   r   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`   rB   isfiler   r   s    r   _should_call_apiz ReplayApiClient._should_call_api4  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 rK   )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   )rc   r   _replay_index_sdk_response_indexr   r`   rB   r   r   
ValueErroropenr   model_validatejsonloadsreadr   r   )r   replay_file_pathreplay_file_existsfs       r   r   z*ReplayApiClient._initialize_replay_sessionA  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`   rB   join)r   r   r   session_parts
path_partss        r   r   z2ReplayApiClient._generate_file_path_from_replay_idV  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`   makedirsrB   dirnamer   writemodel_dump_json)r   r   r   s      r   closezReplayApiClient.closed  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;rI   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)ru   r>   r7   rv   d   s   ...)r7   rv   r   r   r   )r7   rv   r   r   )r7   rv   r   r   z Unsupported http_response type: No replay session found.)r   r   )r   rN   rt   ru   r>   r7   rL   r   r   r   r   r"   segmentsr   r   r
   rl   r   _to_replay_recordcoderM   r   r   typer   r   appendr   )r   rI   r   r   segr   s         r   rm   z#ReplayApiClient._record_interactionm  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                    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}|j                  j                  }t        ||      sJ d| d|        y )Nzhttp_request.url: zinteraction.request.url: z"Request headers mismatch:
Actual: 
Expected: zRequest body mismatch:
Actual: )rc   r>   r   r7   ru   copydeepcopyrL   r   rM   rH   rv   r/   )r   rI   r   request_data_copyactual_request_bodyexpected_request_bodys         r   _match_requestzReplayApiClient._match_request  sJ   
 %l&6&6%789,[-@-@-D-D,EFG{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   )r7   response_streambyte_streamz{}rP   )rN   r   r   r   r   r   r   r
   rl   raise_for_responser   r   r7   rv   r   dumpsr   r   )r   rI   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                 H   | 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               r{d|d   v rt|d   d   }t        dt#        |              t        d|        t        |t$              r7|dk7  r2t'        j(                  |      }t'        j*                  |      }||d   d<   | j,                  s||k(  sJ d| d|        t        d| d|        | xj                  dz  c_        y )Nr   r   r	   r   sdk_http_responser7   T)exclude_nonezresponse_model: r   )r   r   rE   zraw_body length: z
raw_body: rP   zSDK response mismatch:
Actual: r   z(Expected SDK response mismatch:
Actual: )r   r   r   r   r   r   r   r"   getattrrg   r   r   r   
model_dumprc   r   r   r   r   r   r   r   r   )r   r   r   sdk_response_responser7   actualexpectedraw_bodys           r   _verify_responsez ReplayApiClient._verify_response  s7   zzU122%%2243E3E3IJK!!#	ND	)'*%n6I4P	

+!9d
 
%g
.0077

#
#
#
6 .$'%a(n
>44$4GHI &&Dv&FF##99  H
 (D!		(Z
&
'. X122126:(
*3x=/:
;
H:.
/#&8r>zz(+Hzz(+H4<H()&1==
H
K+F8<z	JK
 >vhlS[R\]^!r   streamc                 
   | j                          | j                         rt        d|z         t        | |      5  t        |   |||      }d d d        |rdg }j                         D ]&  }|j                  t        j                  |             ( t        |j                  |      }| j                  ||       n| j                  |       t        d|j                  z         |S | j                  |      S # 1 sw Y   xY wNzapi mode request: %szapi mode result: %s)r   r   rc   rp   r   _requestr   r   r   r   r   r7   rm   r   r   rI   r   r   r@   result_segmentsr   r   s          r   r   zReplayApiClient._request	  s     	113)L89l3 F!,fEF	( 	6G

 
 G!4
5	6fnno>  v6 	  v6(6;;67m--l;;F Fs   C99Dc                 p  K   | j                          | j                         rt        d|z         t        | |      4 d {    t        |   |||       d {   }d d d       d {    |r@g }j                         2 3 d {   }|j                  t        j                  |             .| j                  |       t        d|j                  z         |S | j                  |      S 7 7 7 # 1 d {  7  sw Y   xY w7 6 t        |j                  |      }| j                  ||       rwr   )r   r   rc   rr   r   _async_requestasync_segmentsr   r   r   r   r7   rm   r   r  s          r   r  zReplayApiClient._async_request#  s&     	113)L89+D,? 
 
w-,
 

 
 
#224 	6 	6'

 
 G!4
5 	  v6(6;;67m--l;;#


 
 
 
	64fnno>  v6s~   ?D6C/D6C5C1C5 D6+C3,D6DD
	DA$D61C53D65D;C><DD6
D*D6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        | |      5  t        	| =  ||||      }d d d        | j!                  |       |S | j#                  |      S # 1 sw Y   .xY wNPOSTrP   rM   zutf-8)ru   r>   rL   r7   r  r  )r   ioIOBasetellr   seekr`   SEEK_SETr   base64	b64encodedecoder   rp   r   upload_filerm   r   
r   r  r  r	  r   offsetcontentr   r@   r   s
            r   r  zReplayApiClient.upload_file?  s     )RYY'~~f gnnVR[[)))'299'BC	g R{I&>g g. 
$z;\ % 

 w/m--g66
 
s   =C>>Dc                j  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                         rTt        | |      4 d {    t        	| =  ||||       d {   }d d d       d {    | j!                  |       |S | j#                  |      S 7 T7 ;7 -# 1 d {  7  sw Y   =xY wwr  )r   r  r  r  r   r  r`   r  r   r  r  r  r   rr   r   async_upload_filerm   r   r  s
            r   r  z!ReplayApiClient.async_upload_file`  s#     )RYY'~~f gnnVR[[)))'299'BC	g R{I&>g +D': 
 
w0z;\ 1 
 

 
 w/m--g66


 
 
 
sZ   C D3DD3DDD#D3.D/*D3DD3D0$D'%D0,D3rB   c                6   | j                          | j                  d|i |      }| j                         r:t        | |      5  t        |   ||      }d d d        | j                  |       |S | j                  |      j                  d   S # 1 sw Y   ;xY wNrb   )rB   request_dictr   r  r   )	r   _build_requestr   rp   r   download_filerm   r   r   r   rB   r   r   r@   r   s        r   r  zReplayApiClient.download_file  s     	113!!Dr " G g. H&t,&GH
w/m--g6BB1EEH Hs   BBc                  K   | j                          | j                  d|i |      }| j                         rRt        | |      4 d {    t        |   ||       d {   }d d d       d {    | j                  |       |S | j                  |      j                  d   S 7 _7 H7 :# 1 d {  7  sw Y   JxY wwr  )	r   r  r   rr   r   async_download_filerm   r   r   r   s        r   r"  z#ReplayApiClient.async_download_file  s      	113!!Dr " G +D': 
 
w2| 3 
 

 
 w/m--g6BB1EE


 
 
 
sZ   AC	B)
CB/"B+#B/'C2B-37C+B/-C/C5B86C=C)NFNNNNNF)r   N)NF).rw   rx   ry   rz   r   r   r   boolgoogleauthr   Credentialsr   r   r   r   r   r   r   r   r   r   r   r   r   r
   rl   rM   rm   r   r   r   r   r   r   r   r  r  r  r   r  r  r   r  r"  __classcell__)r   s   @r   ri   ri     s   N *.#CG# $,056  "#	
  } FKK33??@ }  [) @& & &S 
 ;T ;(*/# /[^ /cf /.. <%?@. 	.` % 	<k l .5"Y 5"4 5"t 37	<< ./< 	<
 <: 37	<< ./< 	<
 <D 377sBII~&7 7 	7 ./7 7N 377sBII~&7 7 	7 ./7 7D GKFF(01B(CF\5#%&F  GKFF(01B(CF
F Fr   )8rz   r  r   
contextlibr#   rQ   r  r   r`   r   typingr   r   r   r   r   r   google.authr$  rP   r
   _api_clientr   r   r   _commonr   typesr   r   r   r   r!   r#  r/   r3   r6   r   r=   rA   rD   r|   rH   rN   rZ   rc   rg   contextmanagerrp   asynccontextmanagerrr   rt   r   r   r   ri   r}   r   r   <module>r0     s          	  	 	 I I   & $ %  1; ; ;c c &# S T 4RC RC R
D3 D3 D
T#s(^ S#X .S S 4  7tCK0 7T 7,k ,d ,S # $ %c3h %D % !2 + RZ[_R`   -> k ^klp^q   )I )
.Y 
.	 ( (WFm WFr   