
    gb1                         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	m
Z
 d dlmZ d dlmZmZ d dl d dlmZmZ erd dlmZ neZd	Z G d
 de      Zy)    N)TYPE_CHECKINGAnyDictOptionalTupleUnion)verbose_logger)CustomBatchLogger)get_async_httpx_clienthttpxSpecialProvider)*)StandardCallbackDynamicParamsStandardLoggingPayload
VertexBaseIAM_AUTHc            
       &    e Zd Zddee   ddf fdZ	 ddee   dee   deeef   fdZdeeef   fdZ	ded	ede
eef   fd
Zi fdeeeef      defdZdee   defdZdee   defdZd	efdZd	efdZdeeef   ded	edeeef   fdZ xZS )GCSBucketBaseNbucket_namereturnc                     t        t        j                        | _        t	        j
                  d      }|xs t	        j
                  d      }|| _        || _        i | _        t        | (  di | y )N)llm_providerGCS_PATH_SERVICE_ACCOUNTGCS_BUCKET_NAME )r   r   LoggingCallbackasync_httpx_clientosgetenvpath_service_account_jsonBUCKET_NAMEvertex_instancessuper__init__)selfr   kwargs_path_service_account_bucket_name	__class__s        d/var/www/openai/venv/lib/python3.12/site-packages/litellm/integrations/gcs_bucket/gcs_bucket_base.pyr$   zGCSBucketBase.__init__   sg    "8-==#
 !#		*D E"Bbii0A&B8M&*679"6"    service_account_jsonvertex_instancec                    K   ddl m} ||}|j                  |d d       d {   \  }}|j                  d|||d d d dd 	      \  }}t	        j
                  d|       d| d	d
}|S 7 DwNr   )vertex_chat_completion	vertex_aicredentials
project_idcustom_llm_providerz
gcs-bucket)	modelauth_headervertex_credentialsvertex_projectvertex_locationgemini_api_keystreamr5   api_basezconstructed auth_header %szBearer zapplication/json)AuthorizationzContent-Type)litellmr0   _ensure_access_token_async_get_token_and_urlr	   debug)	r%   r,   r-   r0   _auth_headerr9   r7   _headerss	            r*   construct_request_headersz'GCSBucketBase.construct_request_headers!   s     
 	3"4O-<-W-W, + .X .
 (
$n );;$3)  + < 

Q 	9;G&{m4.

 /(
s   "A+A)AA+c                     ddl m} |j                  | j                  d d      \  }}|j	                  d|| j                  |d d d dd 	      \  }}t        j                  d|       d| d	d
}|S r/   )r?   r0   _ensure_access_tokenr    rA   r	   rB   )r%   r0   rC   r9   r7   rD   rE   s          r*   sync_construct_request_headersz,GCSBucketBase.sync_construct_request_headersD   s    2'='R'R66 + (S (
$n 0BB$#==)  + C 

Q 	9;G&{m4.

 r+   object_namec                 R    d|v r |j                  dd      \  }}| d| }||fS ||fS )a  
        Handles when the user passes a bucket name with a folder postfix


        Example:
            - Bucket name: "my-bucket/my-folder/dev"
            - Object name: "my-object"
            - Returns: bucket_name="my-bucket", object_name="my-folder/dev/my-object"

        /   )split)r%   r   rJ   prefixs       r*   _handle_folders_in_bucket_namez,GCSBucketBase._handle_folders_in_bucket_name`   sI     +"-"3"3C";K#HAk]3K++K''r+   r&   c                   K   |i }|j                  dd      }|t        j                  d       t        j                  d|       |j                  dd      xs | j                  }|j                  dd      xs | j                  }|t        d      |}|}| j                  |       d{   }nI| j                  t        d      | j                  }| j                  }| j                  |       d{   }t        |||	      S 7 \7 w)
a  
        This function is used to get the GCS logging config for the GCS Bucket Logger.
        It checks if the dynamic parameters are provided in the kwargs and uses them to get the GCS logging config.
        If no dynamic parameters are provided, it uses the default values.
        N standard_callback_dynamic_paramszUsing dynamic GCS loggingz$standard_callback_dynamic_params: %sgcs_bucket_namegcs_path_service_accountzGCS_BUCKET_NAME is not set in the environment, but GCS Bucket is being used as a logging callback. Please set 'GCS_BUCKET_NAME' in the environment.)r3   )r   r-   path_service_account)getr	   rB   r!   r    
ValueErrorget_or_create_vertex_instanceGCSLoggingConfig)r%   r&   rR   r(   r'   r   rU   r-   s           r*   get_gcs_logging_configz$GCSBucketBase.get_gcs_logging_configu   sa     >F JJ94@ 	) ,7  !<=  68X
 1445FM $## 
 1445OQUV 211 "
 #  j  'K#8 $($F$F0 %G % O
 '  j  **K#'#A#A $($F$F0 %G % O  #+!5
 	
s%   B*D,D	-A	D6D7DDr3   c                    K   ddl m} | j                  |      }|| j                  vr2 |       }|j	                  |dd       d{    || j                  |<   | j                  |   S 7 "w)z
        This function is used to get the Vertex instance for the GCS Bucket Logger.
        It checks if the Vertex instance is already created and cached, if not it creates a new instance and caches it.
        r   r   Nr1   r2   )&litellm.llms.vertex_ai.vertex_llm_baser   &_get_in_memory_key_for_vertex_instancer"   r@   )r%   r3   r   _in_memory_keyr-   s        r*   rX   z+GCSBucketBase.get_or_create_vertex_instance   s      	FDD[Q!6!66(lO!<<'$/ =   
 5DD!!.1$$^44s   AA+A)#A+c                     |xs t         S )aH  
        Returns key to use for caching the Vertex instance in-memory.

        When using Vertex with Key based logging, we need to cache the Vertex instance in-memory.

        - If a credentials string is provided, it is used as the key.
        - If no credentials string is provided, "IAM_AUTH" is used as the key.
        )IAM_AUTH_KEY)r%   r3   s     r*   r]   z4GCSBucketBase._get_in_memory_key_for_vertex_instance   s     *l*r+   c                 T  K   	 | j                  |       d{   }| j                  |d   |d          d{   }|d   }| j                  ||      \  }}d| d	| d
}| j                  j	                  ||       d{   }|j
                  dk7  r*t        j                  dt        |j                               yt        j                  d|j
                         |j                  S 7 7 7 m# t        $ r)}t        j                  dt        |             Y d}~yd}~ww xY ww)z
        Download an object from GCS.

        https://cloud.google.com/storage/docs/downloading-objects#download-object-json
        r&   Nr-   rU   r-   r,   r   r   rJ   ,https://storage.googleapis.com/storage/v1/b//o/z
?alt=mediaurlrE      GCS object download error: %sz,GCS object download response status code: %s)rZ   rF   rP   r   rV   status_coder	   errorstrtextrB   content	Exception	r%   rJ   r&   gcs_logging_configrE   r   rh   responsees	            r*   download_gcs_objectz!GCSBucketBase.download_gcs_object   sP    "	9=9T9T :U : 4 !:: 23D E%78N%O ;  G -];K'+'J'J'' (K ($K
 ASQ\P]]ghC "4488S'8RRH##s*$$3S5G   >@T@T
 ###;4 S  	  !@#a&I	sm   D(C3 C- C3 C/AC3 C1<C3  D(+C3 ,D(-C3 /C3 1C3 3	D%<D D( D%%D(c                   K   	 | j                  |       d{   }| j                  |d   |d          d{   }|d   }| j                  ||      \  }}d| d	| }| j                  j	                  ||
       d{   }|j
                  dk7  s|j
                  dk7  r5t        j                  dt        |j                        |j
                         yt        j                  d|j
                  |j                         |j                  S 7 7 7 # t        $ r)}t        j                  dt        |             Y d}~yd}~ww xY ww)z,
        Delete an object from GCS.
        rb   Nr-   rU   rc   r   rd   re   rf   rg   ri      z,GCS object delete error: %s, status code: %sz8GCS object delete response status code: %s, response: %srj   )rZ   rF   rP   r   deleterk   r	   rl   rm   rn   rB   rp   rq   s	            r*   delete_gcs_objectzGCSBucketBase.delete_gcs_object   sk    &	9=9T9T :U : 4 !:: 23D E%78N%O ;  G -];K'+'J'J'' (K ($K
 ASQ\P]^C "44;;W;UUH$$+1E1E1L$$B&((
   J$$ == C4 V&  	  !@#a&I	sn   ED D D DAD DAD E6D ED D D 	E	 E?EE		ErE   logging_payloadc                 *  K   t        |t              r|}nt        j                  |t              }| j	                  ||      \  }}| j
                  j                  |d| d| |       d{   }|j                  dk7  r)t        j                  dt        |j                               t        j                  d	|       t        j                  d
|j                         t        j                  d|j                         |j                         S 7 w)z]
        Helper function to make POST request to GCS Bucket in the specified bucket.
        )defaultrd   z3https://storage.googleapis.com/upload/storage/v1/b/z/o?uploadType=media&name=)rE   rh   dataNri   zGCS Bucket logging error: %szGCS Bucket response %szGCS Bucket status code %szGCS Bucket response.text %s)
isinstancerm   jsondumpsrP   r   postrk   r	   rl   rn   rB   )r%   rE   r   rJ   rz   json_logged_payloadrs   s          r*   _log_json_data_on_gcsz#GCSBucketBase._log_json_data_on_gcs%  s      os+"1"&**_c"J#'#F#F## $G $
 [
 0055Ek]Rklwkxy$ 6 
 
 3&  !?X]]AST5x@8(:N:NO:HMMJ}}
s   A,D.D/B#D)N)__name__
__module____qualname__r   rm   r$   r   r   rF   rI   r   rP   r   rY   rZ   rX   r]   ru   ry   r   r   r   __classcell__)r)   s   @r*   r   r      s@   	#HSM 	#t 	# 15!&sm! "*-! 
c3h	!FS#X 8(( ( 
sCx	(, 249
tCH~.9
	9
v5#C=5	5(	+(3- 	+TW 	+(S (T*3 *X!c3h! ! 	!
 5s:;!r+   r   )r   r   typingr   r   r   r   r   r   litellm._loggingr	   (litellm.integrations.custom_batch_loggerr
   &litellm.llms.custom_httpx.http_handlerr   r   %litellm.types.integrations.gcs_bucketlitellm.types.utilsr   r   r\   r   r`   r   r   r+   r*   <module>r      sC     	 C C + F 4 UAJq% qr+   