o
    [+ ix3                     @   s  d Z ddlZddlZddlmZmZ ddlmZ ddlm	Z	 ddl
mZ ddl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ZG dd deZejdZdZdd Zdd Zdd Zd<ddZdd Z dZ!dd Z"dd Z#dd  Z$d=d!d"Z%d=d#d$Z&d%d& Z'	d=d'e(fd(d)Z)d>d'e(d*e(d+e(fd,d-Z*d>d'e(d*e(d+e(fd.d/Z+	0d?d'e(d1e(d2e,fd3d4Z-d?d'e(d1e(d2e,fd5d6Z.d'e(d7e/d2e,fd8d9Z0d'e(d7e/d2e,fd:d;Z1dS )@uS   
本文件实现了请求产线任务

Authors: suoyi@baidu.com
Date:    2024/7/20
    N)configlog)BceClientConfiguration)BceCredentials)	BosClient)ThreadPoolExecutor)tqdm)urljoin)Pathc                   @   s   e Zd ZdZdS )RequestDatasetExceptionz1
    exception for requesting dataset server
    N)__name__
__module____qualname____doc__ r   r   i/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/aistudio_sdk/requests/dataset.pyr      s    r   z~/.download_max_workers   c               
   C   sl   z!t td} t|   W  d   W S 1 sw   Y  W dS  ty5 } ztW  Y d}~S d}~ww )zmax download workerrN)openMAX_WORKERS_FILEintreadstrip	ExceptionDEFAULT_MAX_WORKERS)fer   r   r   get_max_workers(   s   (r   c                 C   s>   d|i}t j| |d}|  | di }|dg }|S )z	file info	datasetId)dataresultfileIds)requestspostraise_for_statusjsonget)urlr   r   responser    file_idsr   r   r   post_request_get_file_ids1   s   r*   c                  C   sN   t jtjs	dS ttjd} |   W  d   S 1 s w   Y  dS )z
    load
    Nr   )ospathexistsr   Z
TOKEN_FILEr   r   r   )r   r   r   r   
load_token;   s
   
$r.    c                 C   s8   |r| }nt jddd }d|d}| r||  |S )u   
    填充header
    ZAISTUDIO_ACCESS_TOKENr/   defaultapplication/json)Content-TypeAuthorization)r+   getenvupdate)paramstokenauthheadersr   r   r   _header_fillE   s   
r;   c                 C   sv   d| d| d}t | |}t }t| |durt|d}nt }tj||d}|  t|  | d d S )	zget url/llm/files/datasets/z/file/z	/downloadN)r8   )r:   r    ZfileUrl)r	   r.   printr;   r"   r&   r$   r%   )hostr   fileIdr,   r'   r8   r:   r(   r   r   r   get_file_urlV   s   
r@   i   
c                 C   s$   | sdS t d| }|r|d S dS )filenameNzfilename="?([^";]+)"?r   )refindall)Z	cd_headerfnamer   r   r   parse_filename_from_cdh   s   rE   c                 C   s`   t j| dd}|  t|jdd}|jdd}t|}|s,tj	| 
dd }||fS )u   获取文件大小和文件名T)allow_redirectszContent-Lengthr   zContent-Dispositionr/   ?)r"   headr$   r   r:   r&   rE   r+   r,   basenamesplit)file_urlr   	file_sizecdrA   r   r   r   get_file_infop   s   rN   c           
   
   C   s   dd| d| i}t j| |dd}|  t|d7}|| |jddD ]"}	|	rI||	 | |t|	 W d	   n1 sDw   Y  q'W d	   d	S 1 sUw   Y  d	S )
downloadRangezbytes=-T)r:   streamzrb+i    )
chunk_sizeN)	r"   r&   r$   r   seekiter_contentwriter6   len)
rK   startend
local_pathpbarlockr:   r(   r   chunkr   r   r   download_chunk|   s   

"r^   c                 C   s  |du rt  }t| \}}tj||}tj|dd tj|s;t|d}|| W d   n1 s6w   Y  g }t	d|t
D ]}|}	t|t
 d |d }
||	|
f qCddlm} t|dd|d	}| }t|d
D}g }|D ].\}	}
tj|rtj|}||
d kr||
|	 d  qu||t| |	|
||| qu|D ]}|  qW d   n1 sw   Y  |  dS )zmulti threadNTexist_okwbr      )LockB)totalunitZ
unit_scaleZdescmax_workers)r   rN   r+   r,   joinmakedirsr-   r   truncaterange
CHUNK_SIZEminappend	threadingrc   r   r   getsizer6   submitr^   r    close)rK   	local_dirrh   rL   rA   rZ   r   chunksirX   rY   rc   r[   r\   executorfuturesZcurrent_sizer   r   r   download_file_multithreaded   sB   
ry   c                 C   s>   |du r	t d}t jdtjd}| d}t||| | dS )zold datasetNHOMEZSTUDIO_GIT_HOSTr0   z/studio/dataset/detail)r+   r5   r   #STUDIO_MODEL_API_URL_PREFIX_DEFAULTdownload_all_files)r   rt   r>   r'   r   r   r   download_datasets   s
   

r}   c              
   C   s   t | |}tj|dd g }t }tdd}|D ]}t|||}	||t	|	|| qW d   n1 s8w   Y  |D ]}
|

  q?dS )z
    all
    Tr_      rg   N)r*   r+   rj   rp   rc   r   r@   ro   rr   ry   r    )r'   r>   r   ZlocalDirr)   tasksZ	pbar_lockrw   r?   rK   taskr   r   r   r|      s   

r|   r8   c                 C   sZ   t j d}|  dd}i }|r||d< tj|||d}|jdkr%| S td|j )u  
    申请ak/sk
    response:
    {
        "logId": "",
        "errorCode": 0,
        "errorMsg": "",
        "timestamp": 0,
        "result": {
            "accessKeyId": "",
            "secretAccessKey": "",
            "sessionToken": "",
            "fileKey": "",
            "serverTime": 0,
            "expiresIn": 0,
            "endpoint": "",
            "bucketName": ""
        }
    }
    z/llm/files/aclr2   r4   r3   
bucketName)r:   r7      zFailed to get bos acl: )r   r{   r"   r&   status_coder%   r   text)r8   bucket_namer'   r:   r7   r(   r   r   r   bos_acl_dataset_file   s   
r   file_origin_namefile_keyc                 C   sp   t dD ]1}zt| ||||}|W   S  ty5 } ztd|d  d t| W Y d}~qd}~ww dS )u?   
    上传文件到指定的bucket，并返回文件ID。
       u   add file 失败，重试第rb      次N)rl   add_filer   r   error)r8   r   r   r   file_absrv   file_idr   r   r   r   add_file_with_retry   s   
r   c                 C   s   t d tj d}|  dd}||||d}tj|||d}|jdkrU| dd	krBt d
 | }	|	di d}
|
S t 	d t 	d| d|j
  dS td|j
 )uY  
    上传文件到指定的bucket，并返回文件ID。

    Args:
        token (str): 认证token。
        file_origin_name (str): 文件的原始名称。
        file_key (str): 文件在存储中的键值。
        bucket_name (str, optional): 如果提供，则上传到此bucket，否则使用默认bucket。
        file_abs (str, optional): 文件的绝对路径，可选。

    Returns:
        dict: 包含操作结果的字典，其中包括logId, errorCode, errorMsg, timestamp和result（包含fileId）。

    Raises:
        HTTPError: 如果请求失败，抛出异常。
    z
add file..z/llm/files/addfiler2   r   )ZfileOriginNameZfileKeyr   ZfileAbsr:   r%   r   	errorCoder   add file successr    r?   u   落库失败add file failed, response:  NzFailed to add file: )r   debugr   r{   r"   r#   r   r%   r&   r   r   r   )r8   r   r   r   r   r'   r:   r   r(   r    r   r   r   r   r     s*   



r   rb   dataset_namer)   c           	      C   sr   t dD ]2}zt| |||||}|W   S  ty6 } ztd|d  d t| W Y d}~qd}~ww dS )u?   
    创建一个新的数据集，并返回数据集ID。
    r   u!   create dataset 失败，重试第rb   r   N)rl   create_datasetr   r   r   )	r8   r   r)   dataset_typedataset_absdataset_licenserv   
dataset_idr   r   r   r   create_dataset_with_retry1  s   
r   c                 C   s   t j d}|  dd}|||||d}tj|||d}	|	jdkrYtd |	 dd	kr>|	 }
|
d
i d}|S t	d|	 d  td| d|	j
  dS td|	j
 )ud  
    创建一个新的数据集，并返回数据集ID。

    Args:
        token (str): 认证token。
        dataset_name (str): 数据集的名称。
        file_ids (list of int): 包含在数据集中的文件ID列表。
        dataset_type (int, optional): 数据集的类型，1 表示私有，2 表示公开。默认为0（私有）。
        dataset_abs (str, optional): 数据集的简介，可选。

    Returns:
        dict: 包含操作结果的字典，其中包括logId, errorCode, errorMsg, timestamp和result（包含datasetId）。
        None: 如果请求失败，返回None。

    z/llm/files/datasetsr2   r   )ZdatasetNameZ
datasetAbsr!   ZdatasetTypeZ
protocolIdr   r   r   r   r   r    r   u   数据集创建失败:errorMsgr   r   NzFailed to create dataset: )r   r{   r"   r#   r   r   r   r%   r&   r   r   r   )r8   r   r)   r   r   r   r'   r:   r   r(   r    r   r   r   r   r   ?  s*   

r   r   c                 C   sl   t dD ]/}zt| ||}|W   S  ty3 } ztd|d  d t| W Y d}~qd}~ww dS )u1   
    向指定的数据集中添加文件。
    r   u&   add file to dataset 失败，重试第rb   r   N)rl   add_files_to_datasetr   r   r   )r8   r   r)   rv   r    r   r   r   r   add_files_to_dataset_with_retryn  s   
r   c                 C   s   t j d| d}|  dd}d|i}tj|||d}|jdkr]| dd	krBtd
| d t	d
| d| d | S t
d| d  t	d| d|j  dS td|j )u  
    向指定的数据集中添加文件。

    Args:
        token (str): 认证token。
        dataset_id (int): 数据集的ID。
        file_ids (list of int): 需要添加到数据集的文件ID列表。

    Returns:
        dict: 包含操作结果的字典，其中包括logId, errorCode, errorMsg, timestamp和result。
        None: 如果请求失败，返回None。

    r<   z/addfiler2   r   r!   r   r   r   r   u   向数据集[u   ]中添加文件成功!u   ]中添加文件成功[]u   添加文件失败: r   r   r   Nz Failed to add files to dataset: )r   r{   r"   r#   r   r%   r&   r   infor   r   r   r   )r8   r   r)   r'   r:   r   r(   r   r   r   r   z  s    
r   )Nr/   )N)NN)rb   r/   rb   )2r   r%   r"   Zaistudio_sdkr   r   Z!baidubce.bce_client_configurationr   Zbaidubce.auth.bce_credentialsr   Z baidubce.services.bos.bos_clientr   r+   rp   concurrent.futuresr   r   urllib.parser	   pathlibr
   rB   r   r   r,   
expanduserr   r   r   r*   r.   r;   r@   rm   rE   rN   r^   ry   r}   r|   strr   r   r   listr   r   r   r   r   r   r   r   r   <module>   sP   	




,	
'-/