
    hjU]                        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/var/www/app.qaans.com/backend/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                    t          | t                    rPi }|                                 D ]7\  }}t          |          }t	          |          }|dk    r	|i k    s|2|||<   8|S t          | t
                    rd | D             S t          | t          j                  r| j        S t          | t                    rd| v r| 
                    dd          S | S )Ngeneration_configc                 ,    g | ]}t          |          S  _normalize_json_case).0items     r   
<listcomp>z(_normalize_json_case.<locals>.<listcomp>;   s!    7774 &&777r   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_vs         r   r#   r#   0   s    T 
C		  1Qf#A&&f	&	&	&FbLLFNc&kkJ#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"   )r3   r4   normalized_obj_1normalized_obj_2s       r   _equals_ignore_key_caser8   G   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   )r9   s    r   _redact_version_numbersr<   a   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}/r;   )r=   s    r   _redact_language_labelr?   f   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<   r-   )r@   redacted_headersheader_nameheader_values       r   _redact_request_headersrF   k   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}r;   )rG   results     r   _redact_request_urlrJ      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}/r;   )rK   rI   s     r   _redact_project_location_pathrM      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   rM   r   r   r)   _redact_request_body	enumerate)rN   keyr,   is       r   rP   rP      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)rF   r@   rJ   rG   r   databytesrP   )rT   s    r   redact_http_requestrY      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_linere      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getre   )rf   s    r   _debug_printrn      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_headersrr      s0    	++fd	++ot$$$$$r   clientReplayApiClientc              #   r   K   	 d V  d S # t           j        $ r}|                     ||           |d }~ww xY wrV   r
   APIError_record_interactionrs   rT   es      r   _record_on_api_errorr{      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rV   rv   ry   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.methodrG   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 rV   )rr   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   rX   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 )1rt   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   rk   rl   rm   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 rV   )r   _initialize_replay_session)r   r   s     r   initialize_replay_sessionz)ReplayApiClient.initialize_replay_sessionD  s!    DO##%%%%%r   c                 B    |                      | j        | j                  S rV   )"_generate_file_path_from_replay_idr   r   r   s    r   _get_replay_file_pathz%ReplayApiClient._get_replay_file_pathH  s$    22  r   c                     | j         dv p<| j         dk    o1t          j                            |                                            S )N)r   r   r   )r   rk   rK   isfiler   r   s    r   _should_call_apiz ReplayApiClient._should_call_apiM  sF    :** 
f 	=t99;;<<<r   c                 @    |                                  o
| j        dk    S )Nr   )r   r   r   s    r   _should_update_replayz%ReplayApiClient._should_update_replayS  s       "":tzU'::r   c                 @    | j         s|                                  d S d S rV   )r   r   r   s    r   (_initialize_replay_session_if_not_loadedz8ReplayApiClient._initialize_replay_session_if_not_loadedV  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   )rn   r   _replay_index_sdk_response_indexr   rk   rK   r   r   
ValueErroropenr   model_validatejsonloadsreadr   r   )r   replay_file_pathreplay_file_existsfs       r   r   z*ReplayApiClient._initialize_replay_sessionZ  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   extendrk   rK   join)r   r   r   session_parts
path_partss        r   r   z2ReplayApiClient._generate_file_path_from_replay_ido  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   rk   makedirsrK   dirnamer   writemodel_dump_json)r   r   r   s      r   closezReplayApiClient.close}  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rT   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   rG   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   rY   r   r   rG   r@   rW   r   r   r   r'   r)   segmentsr   r   r
   rw   r   _to_replay_recordcoderX   r   r   typer   r   appendr   )r   rT   r   r   r   s        r   rx   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 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 body mismatch:
Actual: 
Expected: )rn   rG   r   r   copydeepcopyrW   r   rX   rP   r   r8   )r   rT   r   request_data_copyactual_request_bodyexpected_request_bodysegments          r   _match_requestzReplayApiClient._match_request  sJ   
 8l&688999F[-@-DFFGGG{266666 +"5"<<<<< l&788 '// .,---,- M+*=*KLL( & &'' &W%%%"#68M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{}r[   )rY   r   r   r   r   r   r   r
   rw   raise_for_responser   r   r@   r   r   r   )r   rT   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   rN   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)   getattrrr   r   r   r   
model_dumprn   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   rn   r{   r   _requestr   r   r   r   r   r@   rx   r   r   rT   r   r	  rI   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   rn   r}   r   _async_requestasync_segmentsr   r   r   r   r@   rx   r   r  s          r   r  zReplayApiClient._async_requestA  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POSTr[   rX   zutf-8)r   rG   rW   r@   r  r  )r   ioIOBasetellr   seekrk   SEEK_SETr   base64	b64encodedecoder   r{   r   upload_filerx   r   
r   r  r  r  r   offsetcontentr   rI   r   s
            r   r!  zReplayApiClient.upload_file]  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  rk   r  r   r  r  r   r   r}   r   async_upload_filerx   r   r"  s
            r   r&  z!ReplayApiClient.async_upload_file~  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(rK   c                   |                                   |                     d|i |          }|                                 rct          | |          5  t	                                          ||          }d d d            n# 1 swxY w Y   |                     ||           |S |                     |          j        d         S Nrm   )rK   request_dictr   r  r   )	r   _build_requestr   r{   r   download_filerx   r   r   r   rK   r   r   rI   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_filerx   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
   rw   rX   rx   r   r   r   r   r  r   r  r  r  r  r   r!  r&  r   r+  r.  __classcell__)r   s   @r   rt   rt   !  s       NN *.#CG# $,0 56  "#	
  } FK3?@ }  [)      @& & & & & &S    
    ;T ; ; ; ;( ( ( (   */# /[^ /cf / / / /   .. <%?@. 	. . . .`!! %! 	! ! ! !F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*   r\   r  r   rk   r   typingr   r   r   r   r   r   google.authr0  r[   r
   _api_clientr   r   r   _commonr   typesr   r   r   r   r#   r/  r8   r<   r?   r'   rF   rJ   rM   rP   rY   re   rn   rr   contextmanagerr{   asynccontextmanagerr}   r   r   r   r   rt   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 
. 
. 
.    	   ( ( ( ( ( ( ( (\F \F \F \F \Fm \F \F \F \F \Fr   