o
    Thߚ                  	   @   s  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 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 ddlmZmZ edZ	d,deeeef ef deeeef  deeef fddZ	d,deeeef ef deeeef  deeef fddZ	d,deeeef ef deeeef  deeef fddZ	d,deeeef ef deeeef  deeef fddZ 	d,deeeef ef deeeef  deeef fddZ!	d,deeeef ef deeeef  deeef fddZ"	d,deeeef ef deeeef  deeef fddZ#	d,deeeef ef deeeef  deeef fddZ$	d,deeeef ef deeeef  deeef fd d!Z%	d,deeeef ef deeeef  deeef fd"d#Z&	d,deeeef ef deeeef  deeef fd$d%Z'	d,deeeef ef deeeef  deeef fd&d'Z(G d(d) d)ej)Z*G d*d+ d+ej)Z+dS )-    N)AnyOptionalUnion)	urlencode   )_api_module)_common)_transformers)types)get_value_by_path)set_value_by_path)
AsyncPagerPagerzgoogle_genai.filesfrom_objectparent_objectreturnc                 C   sX   i }t | dgd urt|ddgt | dg t | dgd ur*t|ddgt | dg |S )N	page_size_querypageSize
page_token	pageTokengetvsetvr   r   	to_object r   U/home/air/segue/gemini/backup/venv/lib/python3.10/site-packages/google/genai/files.py_ListFilesConfig_to_mldev%   s   
r   c                 C   s4   i }t | dgd urt|dgtt | dg| |S )Nconfig)r   r   r   r   r   r   r   _ListFilesParameters_to_mldev:   s   r    c                 C   z   i }t | dgd urt|dgt | dg t | dgd ur(t|dgt | dg t | dgd ur;t|dgt | dg |S Ndetailsmessagecoder   r   r   r   r   _FileStatus_to_mldevI      r&   c                 C   $  i }t | dgd urt|dgt | dg t | dgd ur(t|dgt | dg t | dgd ur;t|dgt | dg t | dgd urNt|dgt | dg t | dgd urat|d	gt | dg t | d
gd urtt|dgt | d
g t | dgd urt|dgt | dg t | dgd urt|dgt | dg t | dgd urt|dgt | dg t | dgd urt|dgt | dg t | dgd urt|dgt | dg t | dgd urt|dgt | dg t | dgd urt|dgt | dg t | dgd urt|dgtt | dg| |S )Nnamedisplay_namedisplayName	mime_typemimeType
size_bytes	sizeBytescreate_time
createTimeexpiration_timeexpirationTimeupdate_time
updateTimesha256_hash
sha256Hashuridownload_uridownloadUristatesourcevideo_metadatavideoMetadataerror)r   r   r&   r   r   r   r   _File_to_mldevZ   D   r@   c                 C   sZ   i }t | dgd urt|dgtt | dg| t | dgd ur+t|dgt | dg |S )Nfiler   )r   r   r@   r   r   r   r   _CreateFileParameters_to_mldev   s   rC   c                 C   \   i }t | dgd urt|ddgtt | dg t | dgd ur,t|dgt | dg |S Nr)   _urlrB   r   r   r   tt_file_namer   r   r   r   _GetFileParameters_to_mldev      rJ   c                 C   rD   rE   rG   r   r   r   r   _DeleteFileParameters_to_mldev   rK   rL   c                 C   r!   r"   r   r   r   r   r   _FileStatus_from_mldev   r'   rM   c                 C   r(   )Nr)   r+   r*   r-   r,   r/   r.   r1   r0   r3   r2   r5   r4   r7   r6   r8   r:   r9   r;   r<   r>   r=   r?   )r   r   rM   r   r   r   r   _File_from_mldev   rA   rN   c                    sb   i  t | dgd urt dgt | dg t | dgd ur/t dg fddt | dgD   S )NnextPageTokennext_page_tokenfilesc                    s   g | ]}t | qS r   )rN   ).0itemr   r   r   
<listcomp>  s    z1_ListFilesResponse_from_mldev.<locals>.<listcomp>r   )r   r   r   rT   r   _ListFilesResponse_from_mldev	  s   

	rV   c                 C      i }|S Nr   r   r   r   r   _CreateFileResponse_from_mldev     rY   c                 C   rW   rX   r   r   r   r   r   _DeleteFileResponse_from_mldev'  rZ   r[   c                   @   s(  e Zd Zdddeej dejfddZdddejdeej	 dej
fdd	Zddd
edeej dejfddZddd
edeej dejfddZdddeeeje ejf deej dejfddZdddeej deej fddZdddeeejejejf deej defddZ dS )FilesNr   r   r   c                C   s   t j|d}| jjrtdt|}|d}|rd|}nd}|d}|r1| dt| }|	dd d}|j
durH|j
jdurH|j
j}t|}t|}| jd	|||}|js`d
nt|j}	| jjsnt|	}	t jj|	| d}
| j|
 |
S )aa  Lists all files from the service.

    Args:
      config (ListFilesConfig): Optional, configuration for the list method.

    Returns:
      ListFilesResponse: The response for the list method.

    Usage:

    .. code-block:: python

      pager = client.files.list(config={'page_size': 10})
      for file in pager.page:
        print(file.name)
    r]   =This method is only supported in the Gemini Developer client.rF   rQ   r   ?r   Nget responsekwargs)r
   _ListFilesParameters_api_clientvertexai
ValueErrorr    r`   
format_mapr   popr   http_optionsr   convert_to_dictencode_unserializable_typesrequestbodyjsonloadsrV   ListFilesResponse_from_response
model_dump_verify_responseselfr   parameter_modelrequest_dictrequest_url_dictpathquery_paramsrk   rc   response_dictreturn_valuer   r   r   _list2  s>   




zFiles._listrB   c                C   s&  t j||d}| jjrtdt|}|d}|r d|}nd}|d}|r2| dt| }|	dd  d }|j
d urI|j
jd urI|j
j}t|}t|}| jd|||}	|d urnt|d	d rnt j|	d
}
|
S |	jssdnt|	j}| jjst|}t jj|| d}
| j|
 |
S NrB   r   r^   rF   zupload/v1beta/filesr   r_   r   postshould_return_http_response)sdk_http_responsera   rb   )r
   _CreateFileParametersrf   rg   rh   rC   r`   ri   r   rj   r   rk   r   rl   rm   rn   getattrCreateFileResponsero   rp   rq   rY   rs   rt   ru   rw   rB   r   rx   ry   rz   r{   r|   rk   rc   r~   r}   r   r   r   _createt  sN   





zFiles._creater)   c                C     t j||d}| jjrtdt|}|d}|r d|}nd}|d}|r2| dt| }|	dd d}|j
durI|j
jdurI|j
j}t|}t|}| jd	|||}	|	jsad
nt|	j}
| jjsot|
}
t jj|
| d}| j| |S )ai  Retrieves the file information from the service.

    Args:
      name (str): The name identifier for the file to retrieve.
      config (GetFileConfig): Optional, configuration for the get method.

    Returns:
      File: The file information.

    Usage:

    .. code-block:: python

      file = client.files.get(name='files/...')
      print(file.uri)
    r)   r   r^   rF   files/{file}r   r_   r   Nr`   ra   rb   )r
   _GetFileParametersrf   rg   rh   rJ   r`   ri   r   rj   r   rk   r   rl   rm   rn   ro   rp   rq   rN   Filers   rt   ru   rw   r)   r   rx   ry   rz   r{   r|   rk   rc   r}   r~   r   r   r   r`     s@   




z	Files.getc                C   r   )a]  Deletes a remotely stored file.

    Args:
      name (str): The name identifier for the file to delete.
      config (DeleteFileConfig): Optional, configuration for the delete method.

    Returns:
      DeleteFileResponse: The response for the delete method

    Usage:

    .. code-block:: python

      client.files.delete(name='files/...')
    r   r^   rF   r   r   r_   r   Ndeletera   rb   )r
   _DeleteFileParametersrf   rg   rh   rL   r`   ri   r   rj   r   rk   r   rl   rm   rn   ro   rp   rq   r[   DeleteFileResponsers   rt   ru   r   r   r   r   r     sD   




zFiles.deletec                C   sZ  | j jrtdt }|r*t|trtjdi |}n|}tj|j|j	|j
d}nt }|j	dur@|j	ds@d|j	 |_	t|tjrw|jdu rOtdt|dr]d|jvr]td| }|d	tj | | |_||tj n1t|}|rtj|st| d
tj||_|jdu rt|\|_}|jdu rtd|r|jr|j}d|_ddd|j |j d|_ntj dddd|j |j dd}| j!|tj"|ddd}	|	j#du s|	j#jdu sd|	j#jvrt$d|	j#jd }
t|tjr| j j%||
|j|d}n| j j%||
|j|d}tjj&t'|j(d |r)|) dS i dS )a  Calls the API to upload a file using a supported file service.

    Args:
      file: A path to the file or an `IOBase` object to be uploaded. If it's an
        IOBase object, it must be opened in blocking (the default) mode and
        binary mode. In other words, do not use non-blocking mode or text mode.
        The given stream must be seekable, that is, it must be able to call
        `seek()` on 'path'.
      config: Optional parameters to set `diplay_name`, `mime_type`, and `name`.
    r^   r,   r)   r*   Nfiles/zfUnknown mime type: Could not determine the mimetype for your file
 please set the `mime_type` argumentmodeb'The file must be opened in binary mode.r    is not a valid file path.iUnknown mime type: Could not determine the mimetype for your file
    please set the `mime_type` argumentra   application/json	resumablestartzContent-TypezX-Goog-Upload-ProtocolzX-Goog-Upload-Commandz#X-Goog-Upload-Header-Content-Lengthz!X-Goog-Upload-Header-Content-Typeapi_versionheadersTrk   r   r   x-goog-upload-urlPFailed to create file. Upload URL did not returned from the create file request.rk   rB   rb   r   )*rf   rg   rh   r
   UploadFileConfig
isinstancedictr   r,   r)   r*   
startswithioIOBasehasattrr   tellseekosSEEK_ENDr.   SEEK_SETfspathr{   isfileFileNotFoundErrorgetsize	mimetypes
guess_typerk   r   r   HttpOptionsr   CreateFileConfigr   KeyErrorupload_filers   rN   rp   rt   rw   rB   r   config_modelfile_objoffsetfs_path_rk   rc   
upload_urlreturn_filer   r   r   upload8  s   












zFiles.uploadc                C   s   t d| j| j|d|S NrQ   r]   )r   r   rw   r   r   r   r   list  s   
z
Files.listc          	      C   s   | j jrtdd}|rt|trtjdi |}n|}t|tjr+|jdu r+tdt	
|}d| d}ddi}| dt| }d}t|d	gdurSt|d	g}| j j||d
}t|tjrf||_|S t|tjru|jduru||j_|S )ar  Downloads a file's data from storage.

    Files created by `upload` can't be downloaded. You can tell which files are
    downloadable by checking the `source` or `download_uri` property.

    Note: This method returns the data as bytes. For `Video` and
    `GeneratedVideo` objects there is an additional side effect, that it also
    sets the `video_bytes` property on the `Video` object.

    Args:
      file (str): A file name, uri, or file object. Identifying which file to
        download.
      config (DownloadFileConfigOrDict): Optional, configuration for the get
        method.

    Returns:
      File: The file data as bytes.

    Usage:

    .. code-block:: python

      for file client.files.list():
        if file.download_uri is not None:
          break
      else:
        raise ValueError('No files found with a `download_uri`.')
      data = client.files.download(file=file)
      # data = client.files.download(file=file.name)
      # data = client.files.download(file=file.download_uri)

      video = types.Video(uri=file.uri)
      video_bytes = client.files.download(file=video)
      video.video_bytes
    r^   NzOnly generated files can be downloaded, uploaded files can't be downloaded. You can tell which files are downloadable by checking the `source` or `download_uri` property.r   	:downloadaltmediar_   rk   r   r   )rf   rg   rh   r   r   r
   DownloadFileConfigr   r9   rH   rI   r   r   download_fileVideovideo_bytesGeneratedVideovideo)	rw   rB   r   r   r)   r{   r|   rk   datar   r   r   download  s<   )

zFiles.download)!__name__
__module____qualname__r   r
   ListFilesConfigOrDictrr   r   
FileOrDictCreateFileConfigOrDictr   r   strGetFileConfigOrDictr   r`   DeleteFileConfigOrDictr   r   r   r   PathLiker   r   UploadFileConfigOrDictr   r   r   r   r   DownloadFileConfigOrDictbytesr   r   r   r   r   r\   0  sj    
F
>
D
H
u
r\   c                   @   s   e Zd Zdddeej dejfddZdddejdeej	 dej
fdd	Zddd
edeej dejfddZddd
edeej dejfddZdddeeeje ejf deej dejfddZdddeej deej fddZdddeeejf deej defddZdS )
AsyncFilesNr]   r   r   c                   s  t j|d}| jjrtdt|}|d}|r d|}nd}|d}|r2| dt| }|	dd d}|j
durI|j
jdurI|j
j}t|}t|}| jd	|||I dH }|jsdd
nt|j}	| jjsrt|	}	t jj|	| d}
| j|
 |
S )ak  Lists all files from the service.

    Args:
      config (ListFilesConfig): Optional, configuration for the list method.

    Returns:
      ListFilesResponse: The response for the list method.

    Usage:

    .. code-block:: python

      pager = await client.aio.files.list(config={'page_size': 10})
      for file in pager.page:
        print(file.name)
    r]   r^   rF   rQ   r   r_   r   Nr`   ra   rb   )r
   re   rf   rg   rh   r    r`   ri   r   rj   r   rk   r   rl   rm   async_requestro   rp   rq   rV   rr   rs   rt   ru   rv   r   r   r   r   
  sD   





zAsyncFiles._listrB   c                   s.  t j||d}| jjrtdt|}|d}|r!d|}nd}|d}|r3| dt| }|	dd  d }|j
d urJ|j
jd urJ|j
j}t|}t|}| jd|||I d H }	|d urrt|d	d rrt j|	d
}
|
S |	jswdnt|	j}| jjst|}t jj|| d}
| j|
 |
S r   )r
   r   rf   rg   rh   rC   r`   ri   r   rj   r   rk   r   rl   rm   r   r   r   ro   rp   rq   rY   rs   rt   ru   r   r   r   r   r   N  sP   






zAsyncFiles._creater)   c                   
  t j||d}| jjrtdt|}|d}|r!d|}nd}|d}|r3| dt| }|	dd d}|j
durJ|j
jdurJ|j
j}t|}t|}| jd	|||I dH }	|	jsed
nt|	j}
| jjsst|
}
t jj|
| d}| j| |S )as  Retrieves the file information from the service.

    Args:
      name (str): The name identifier for the file to retrieve.
      config (GetFileConfig): Optional, configuration for the get method.

    Returns:
      File: The file information.

    Usage:

    .. code-block:: python

      file = await client.aio.files.get(name='files/...')
      print(file.uri)
    r   r^   rF   r   r   r_   r   Nr`   ra   rb   )r
   r   rf   rg   rh   rJ   r`   ri   r   rj   r   rk   r   rl   rm   r   ro   rp   rq   rN   r   rs   rt   ru   r   r   r   r   r`     sF   





zAsyncFiles.getc                   r   )ag  Deletes a remotely stored file.

    Args:
      name (str): The name identifier for the file to delete.
      config (DeleteFileConfig): Optional, configuration for the delete method.

    Returns:
      DeleteFileResponse: The response for the delete method

    Usage:

    .. code-block:: python

      await client.aio.files.delete(name='files/...')
    r   r^   rF   r   r   r_   r   Nr   ra   rb   )r
   r   rf   rg   rh   rL   r`   ri   r   rj   r   rk   r   rl   rm   r   ro   rp   rq   r[   r   rs   rt   ru   r   r   r   r   r     sF   





zAsyncFiles.deletec                   s  | j jr	tdt }|r+t|trtjdi |}n|}tj|j|j	|j
d}nt }|j	durA|j	dsAd|j	 |_	t|tjrx|jdu rPtdt|dr^d|jvr^td| }|d	tj | | |_||tj n1t|}|rtj|st| d
tj||_|jdu rt|\|_}|jdu rtd|r|jr|j}d|_ddd|j |j d|_ntj dddd|j |j dd}| j!|tj"|dddI dH }	|	j#du s|	j#jdu sd|	j#jvrd|	j#jvrt$dd|	j#jv r|	j#jd }
n|	j#jd }
t|tjr'| j j%||
|j|dI dH }n| j j%||
|j|dI dH }tjj&t'|j(d |rG|) dS i dS )a  Calls the API to upload a file asynchronously using a supported file service.

    Args:
      file: A path to the file or an `IOBase` object to be uploaded. If it's an
        IOBase object, it must be opened in blocking (the default) mode and
        binary mode. In other words, do not use non-blocking mode or text mode.
        The given stream must be seekable, that is, it must be able to call
        `seek()` on 'path'.
      config: Optional parameters to set `diplay_name`, `mime_type`, and `name`.
    r^   r   Nr   r   r   r   r   r   r   ra   r   r   r   r   r   Tr   r   r   zX-Goog-Upload-URLr   r   rB   rb   r   )*rf   rg   rh   r
   r   r   r   r   r,   r)   r*   r   r   r   r   r   r   r   r   r   r.   r   r   r{   r   r   r   r   r   rk   r   r   r   r   r   r   r   async_upload_filers   rN   rp   rt   r   r   r   r   r     s   












zAsyncFiles.uploadc                   s    t d| j| j|dI d H |S r   )r   r   r   r   r   r   r     s   zAsyncFiles.listc          	         s   | j jr	tdd}|rt|trtjd
i |}n|}t|}d| d}d}t	|dgdur8t	|dg}ddi}|rG| dt
| }| j j||d	I dH }|S )at  Downloads a file's data from the file service.

    The Vertex-AI implementation of the API foes not include the file service.

    Files created by `upload` can't be downloaded. You can tell which files are
    downloadable by checking the `download_uri` property.

    Args:
      File (str): A file name, uri, or file object. Identifying which file to
        download.
      config (DownloadFileConfigOrDict): Optional, configuration for the get
        method.

    Returns:
      File: The file data as bytes.

    Usage:

    .. code-block:: python

      for file client.files.list():
        if file.download_uri is not None:
          break
      else:
        raise ValueError('No files found with a `download_uri`.')
      data = client.files.download(file=file)
      # data = client.files.download(file=file.name)
      # data = client.files.download(file=file.uri)
    r^   Nr   r   rk   r   r   r_   r   r   )rf   rg   rh   r   r   r
   r   rH   rI   r   r   async_download_file)	rw   rB   r   r   r)   r{   rk   r|   r   r   r   r   r     s.   #

zAsyncFiles.download)r   r   r   r   r
   r   rr   r   r   r   r   r   r   r   r   r`   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     sj    
H
>
F
H
z
r   rX   ),r   rp   loggingr   r   typingr   r   r   urllib.parser   ra   r   r   r	   rH   r
   r   r   r   r   pagersr   r   	getLoggerloggerr   r   objectr   r    r&   r@   rC   rJ   rL   rM   rN   rV   rY   r[   
BaseModuler\   r   r   r   r   r   <module>   s   








8









8





	   [