
    yjx3                        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e          Zej                            d          ZdZd Zd Zd Zd*dZd Z dZ!d Z"d Z#d Z$d+dZ%d+dZ&d Z'	 d+de(fdZ)d,de(de(de(fd Z*d,de(de(de(fd!Z+	 d-de(d#e(d$e,fd%Z-d-de(d#e(d$e,fd&Z.de(d'e/d$e,fd(Z0de(d'e/d$e,fd)Z1dS ).uS   
本文件实现了请求产线任务

Authors: suoyi@baidu.com
Date:    2024/7/20
    N)configlog)BceClientConfiguration)BceCredentials)	BosClient)ThreadPoolExecutor)tqdm)urljoin)Pathc                       e Zd ZdZdS )RequestDatasetExceptionz1
    exception for requesting dataset server
    N)__name__
__module____qualname____doc__     m/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/aistudio_sdk/requests/dataset.pyr   r      s          	Dr   r   z~/.download_max_workers   c                     	 t          t          d          5 } t          |                                                                           cddd           S # 1 swxY w Y   dS # t
          $ r}t          cY d}~S d}~ww xY w)zmax download workerrN)openMAX_WORKERS_FILEintreadstrip	ExceptionDEFAULT_MAX_WORKERS)fes     r   get_max_workersr!   (   s    #"C(( 	)Aqvvxx~~''((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) # # #"""""""#s@   A$ 3A
A$ AA$ AA$ $
A?.A:4A?:A?c                     d|i}t          j        | |          }|                                 |                                                    di           }|                    dg           }|S )z	file info	datasetId)dataresultfileIds)requestspostraise_for_statusjsonget)urlr#   r$   responser%   file_idss         r   post_request_get_file_idsr/   1   sg    #D}St,,,H]]__  2..Fzz)R((HOr   c                     t           j                            t          j                  sdS t          t          j        d          5 } |                                                                 cddd           S # 1 swxY w Y   dS )z
    load
    Nr   )ospathexistsr   
TOKEN_FILEr   r   r   )r   s    r   
load_tokenr5   ;   s     7>>&+,, t	f	%	%  vvxx~~                                   s   &A99A= A= c                 x    |r| }nt          j        dd           }d|d}| r|                    |            |S )u   
    填充header
    AISTUDIO_ACCESS_TOKENr6   defaultapplication/json)Content-TypeAuthorization)r1   getenvupdate)paramstokenauthheaderss       r   _header_fillrD   E   sa      Cz)3R@@@B* G  vNr   c                    d| d| d}t          | |          }t                      }t          |           |t          |          }nt                      }t	          j        ||          }|                                 t          |                                           |                                d         d         S )	zget url/llm/files/datasets/z/file/z	/downloadN)rA   )rC   r%   fileUrl)r
   r5   printrD   r'   r+   r)   r*   )hostr#   fileIdr2   r,   rA   rC   r-   s           r   get_file_urlrK   V   s    D)DD6DDDD
$

CLLE	%LLLU+++..|C111H	(--//==??8$Y//r   i   
c                 L    | sdS t          j        d|           }|r|d         ndS )filenameNzfilename="?([^";]+)"?r   )refindall)	cd_headerfnames     r   parse_filename_from_cdrR   h   s4     tJ.	::E&588$&r   c                 v   t          j        | d          }|                                 t          |j                            dd                    }|j                            dd          }t          |          }|s8t          j        	                    | 
                    d          d                   }||fS )u   获取文件大小和文件名T)allow_redirectszContent-Lengthr   zContent-Dispositionr6   ?)r'   headr)   r   rC   r+   rR   r1   r2   basenamesplit)file_urlr   	file_sizecdrM   s        r   get_file_infor\   p   s    h555AAIMM"2A6677I	
,b	1	1B%b))H <7##HNN3$7$7$:;;hr   c                    dd| d| i}t          j        | |d          }|                                 t          |d          5 }|                    |           |                    d          D ]U}	|	rQ|                    |	           |5  |                    t          |	                     d	d	d	           n# 1 swxY w Y   V	 d	d	d	           d	S # 1 swxY w Y   d	S )
downloadRangezbytes=-T)rC   streamzrb+i    )
chunk_sizeN)	r'   r+   r)   r   seekiter_contentwriter?   len)
rY   startend
local_pathpbarlockrC   r-   r   chunks
             r   download_chunkrm   |   su   ...../G|HgdCCCH	j%	 	  ,A	u**d*;; 	, 	,E , , ,KKE

+++, , , , , , , , , , , , , , ,	,, , , , , , , , , , , , , , , , , ,s7   AC#B<0C<C  CC CCCc                 D   |t                      }t          |           \  }}t          j                            ||          }t          j        |d           t          j                            |          s=t          |d          5 }|                    |           ddd           n# 1 swxY w Y   g }t          d|t                    D ]9}|}	t          |t          z   dz
  |dz
            }
|                    |	|
f           :ddlm} t          |dd|	          } |            }t!          |
          5 }g }|D ]\  }	}
t          j                            |          rDt          j                            |          }||
dz   k    r|                    |
|	z
  dz              h|                    |                    t(          | |	|
|||                     |D ]}|                                 	 ddd           n# 1 swxY w Y   |                                 dS )zmulti threadNTexist_okwbr      )LockB)totalunit
unit_scaledescmax_workers)r!   r\   r1   r2   joinmakedirsr3   r   truncaterange
CHUNK_SIZEminappend	threadingrs   r	   r   getsizer?   submitrm   r%   close)rY   	local_dirrz   rZ   rM   ri   r   chunksirg   rh   rs   rj   rk   executorfuturescurrent_sizes                    r   download_file_multithreadedr      s   %'' (11Ixi22JK	D)))) 7>>*%% "*d## 	"qJJy!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" F1i,, $ $!j.1$i!m44ucl#### icdJJJD466D		4	4	4   		 		JE3w~~j)) !wz::37**KKea000NN%jRVX\]]     	 	AHHJJJJ	               	JJLLLLLs%   B**B.1B.:B:HHHc                     |t          j        d          }t          j        dt          j                  }| d}t	          ||| |           dS )zold datasetNHOMESTUDIO_GIT_HOSTr9   z/studio/dataset/detail)r1   r>   r   #STUDIO_MODEL_API_URL_PREFIX_DEFAULTdownload_all_files)r#   r   rI   r,   s       r   download_datasetsr      sW    If%%	9&0Z[[[D
)
)
)CsD)Y77777r   c           
         t          | |          }t          j        |d           g }t          j                    }t          d          5 }|D ]C}t          |||          }	|                    |                    t          |	||                     D	 ddd           n# 1 swxY w Y   |D ]}
|

                                 dS )z
    all
    Tro      ry   N)r/   r1   r|   r   rs   r   rK   r   r   r   r%   )r,   rI   r#   localDirr.   tasks	pbar_lockr   rJ   rY   tasks              r   r   r      s)    )i88HK4((((E  I		*	*	* fh 	f 	fF#D)V<<HLL)DhPXZcddeeee	ff f f f f f f f f f f f f f f
    s   AB  B$'B$rA   c                     t           j         d}|  dd}i }|r||d<   t          j        |||          }|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/aclr;   r=   r<   
bucketName)rC   r@      zFailed to get bos acl: )r   r   r'   r+   status_coder*   r   text)rA   bucket_namer,   rC   r@   r-   s         r   bos_acl_dataset_filer      s    0 7
G
G
GC!* G F +*||C@@@Hs""}}%&O&O&OPPPr   file_origin_namefile_keyc                     t          d          D ]_}	 t          | ||||          }|c S # t          $ r9}t          j        d|dz    d           t          j        |           Y d}~Xd}~ww xY wdS )u?   
    上传文件到指定的bucket，并返回文件ID。
       u   add file 失败，重试第rr      次N)r~   add_filer   r   error)rA   r   r   r   file_absr   file_idr    s           r   add_file_with_retryr      s     1XX  	u&6+xXXGNNN& 	 	 	I<AaC<<<===IaLLLLLLLL		 s   *
A-/A((A-c                 :   t          j        d           t          j         d}|  dd}||||d}t	          j        |||          }|j        dk    r|                                                    d          d	k    rSt          j        d
           |                                }	|	                    di                               d          }
|
S t          j	        d           t          j	        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/addfiler;   r   )fileOriginNamefileKeyr   fileAbsrC   r*   r   	errorCoder   add file successr%   rJ   u   落库失败add file failed, response:  NzFailed to add file: )r   debugr   r   r'   r(   r   r*   r+   r   r   r   )rA   r   r   r   r   r,   rC   r$   r-   r%   r   s              r   r   r     s/   " Il7
K
K
KC!* G
 +!	 D }S'===Hs""==??{++q00I)***]]__Fjj2..228<<GNIn%%%IJDJJ8=JJKKK4%&LX]&L&LMMMr   rr   dataset_namer.   c           	          t          d          D ]`}	 t          | |||||          }|c S # t          $ r9}t          j        d|dz    d           t          j        |           Y d}~Yd}~ww xY wdS )u?   
    创建一个新的数据集，并返回数据集ID。
    r   u!   create dataset 失败，重试第rr   r   N)r~   create_datasetr   r   r   )	rA   r   r.   dataset_typedataset_absdataset_licenser   
dataset_idr    s	            r   create_dataset_with_retryr   1  s    
 1XX  	'|X|U`bqrrJ& 	 	 	IB!A#BBBCCCIaLLLLLLLL		 s   +
A./A))A.c                 d   t           j         d}|  dd}|||||d}t          j        |||          }	|	j        dk    rt          j        d           |	                                                    d          d	k    r?|	                                }
|
                    d
i                               d          }|S t          j	        d|	                                                    d                      t          j        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/datasetsr;   r   )datasetName
datasetAbsr&   datasetType
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   )rA   r   r.   r   r   r   r,   rC   r$   r-   r%   r   s               r   r   r   ?  sD     7
L
L
LC!* G $!#% D }S'===H s""	%&&&==??{++q00]]__FHb1155kBBJIPx}}/B/B:/N/NPPQQQIJDJJ8=JJKKK4%&R8=&R&RSSSr   r   c                     t          d          D ]]}	 t          | ||          }|c S # t          $ r9}t          j        d|dz    d           t          j        |           Y d}~Vd}~ww xY wdS )u1   
    向指定的数据集中添加文件。
    r   u&   add file to dataset 失败，重试第rr   r   N)r~   add_files_to_datasetr   r   r   )rA   r   r.   r   r%   r    s         r   add_files_to_dataset_with_retryr   n  s     1XX  	)%XFFFMMM& 	 	 	IGqsGGGHHHIaLLLLLLLL		 s   (
A+/A&&A+c                 J   t           j         d| d}|  dd}d|i}t          j        |||          }|j        dk    r|                                                    d          d	k    rGt          j        d
| d           t          j	        d
| d| d           |                                S t          j
        d|                                                    d                      t          j	        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。

    rF   z/addfiler;   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   )rA   r   r.   r,   rC   r$   r-   s          r   r   r   z  sF    7
a
aZ
a
a
aC!* G 	8D }S'===Hs""==??{++q00HHZHHHIIIITjTTTTTUUU==??"INX]]__-@-@-L-LNNOOOIJDJJ8=JJKKK4 &&X&X&XYYYr   )Nr6   )N)NN)rr   r6   rr   )2r   r*   r'   aistudio_sdkr   r   !baidubce.bce_client_configurationr   baidubce.auth.bce_credentialsr    baidubce.services.bos.bos_clientr   r1   r   concurrent.futuresr   r	   urllib.parser
   pathlibr   rN   r   r   r2   
expanduserr   r   r!   r/   r5   rD   rK   r   rR   r\   rm   r   r   r   strr   r   r   listr   r   r   r   r   r   r   r   <module>r      sA      $ $ $ $ $ $ $ $ D D D D D D 8 8 8 8 8 8 6 6 6 6 6 6 				     1 1 1 1 1 1                         					 	 	 	 	i 	 	 	
 7%%&?@@   # # #          "0 0 0 
' ' '	 	 	, , ,) ) ) )X8 8 8 8  & %Q %Q%Q %Q %Q %QN
 
s 
c 
S 
 
 
 
*N *NC *N3 *N# *N *N *N *NZ OP S  t    -T -T# -TS -TD -T -T -T -T^
3 
C 
4 
 
 
 
$Z $Z $Z $Z $Z $Z $Z $Z $Zr   