
    9iX                        S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKJ	r	  SSK
Jr  SSKJrJr  SSKJrJr  SSKJrJr  SS	KJr  SS
KJr  SSKJr  SSKJrJr  SSKJr  SSKJr  SSKJrJr  SSKJrJrJr  SSKJ r   SSKJ!r!J"r"J#r#J$r$J%r%  SSK&J'r'  SSK&J(r(  SSK)J*r*  SSKJ+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2J3r3J4r4J5r5  SSK6J7r7  SSK8J8r8  SSK9J:r:  \1" S5      r;/ SQr<\4S   r=SS/r> " S S \?5      r@ " S! S"5      rA " S# S$5      rBS% rCS& rDS\(R                  S\(R                  S'.S(\,\G\	\H\-4   S)\GS*\GS+\,\GS4   S,\\G   S-\\G   S.\\G   4S/ jjrISS0SS\(R                  SS\(R                  \(R                  S1.	S*\GS2\,\G\	\+\G   \+\	   4   S)\\G   S-\\G   S+\,\GS4   S,\\G   S3\\,\+\G   \G4      S4\\,\+\G   \G4      S5\KS.\\G   4S6 jjrLS7 rMg)8uh  
本文件实现了模型库hub接口封装

TODO: 
    当前脚本后续将移动至sdk目录下, 但用法将发生变化, 需和pm确认
    旧：
        from aistudio_sdk.hub import create_repo
        create_repo()
    新：
        from aistudio_sdk import hub
        hub.create_repo()

Authors: linyichong(linyichong@baidu.com)
Date:    2023/08/21
    )OptionalN)Path)	ErrorEnum)request_aistudio_hubrequest_aistudio_app_service)request_aistudio_git_file_infocommit_files)request_aistudio_git_file_typerequest_aistudio_git_files_type)"request_aistudio_git_upload_access)request_bos_upload)#request_aistudio_git_upload_pointer)"request_aistudio_git_upload_common request_single_git_upload_common)get_exist_file_old_sha)request_aistudio_repo_visible) request_aistudio_verify_lfs_file!request_single_git_upload_pointer)convert_to_dict_objectis_valid_hostcalculate_sha256)err_resp)extract_yaml_blockis_readme_mdget_file_sizeget_file_hashthread_executor)log)config)post_upload_statistic_async)ListUnionBinaryIOIterableCallable	GeneratorTypeVarDictAnyLiteralIterator)	dataclassfnmatch)contextmanagerT)create_repouploadfile_existsupload_folderupload_file)lfsnormalz.gitz.cachec                       \ rS rSrSrSrg)UploadFileExceptionE   u   
上传文件异常
 N)__name__
__module____qualname____firstlineno____doc____static_attributes__r;       P/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/aistudio_sdk/hub.pyr9   r9   E   s     	rB   r9   c                   R   \ rS rSrSrSrS rS rS r\	S 5       r
S r  S%S
\\\\\   \\   4   S\S\\\\   \4      S\\\\   \4      4S jjrS	\R&                  S	\R(                  S.S\\\\\4   S\S\S\\S	4   S\\   S\\   S\\   4S jjrS	SS	S	\R&                  S	S	\R0                  \R(                  S4
S\S\\\\\   \\   4   S\\   S\\   S\\S	4   S\\   S\\\\   \4      S\\\\   \4      S\S\\   S\4S jjrS\S\S\S\S\S\S \S!\S"\4S# jrS$rg	)&HubK   u   Hub类hubc                    [         R                  " SSS9(       d  [         R                  " S[         R                  " S5      S9nU S3n[         R                  R                  U5      (       aD  [	        US5       nUR                  5       R                  5       [         R                  S'   SSS5        [        5       U l	        g! , (       d  f       N= f)	uv   初始化函数，从本地磁盘加载AI Studio认证令牌。

Args:
    无参数。

Returns:
    无返回值。
AISTUDIO_ACCESS_TOKEN defaultAISTUDIO_CACHE_HOMEHOMEz/.cache/aistudio/.auth/tokenrN)
osgetenvpathexistsopenreadstripenvironUploadingCheckupload_checker)self
cache_hometoken_file_pathfiles       rC   __init__Hub.__init__O   s     yy0"=#8"))FBSTJ!+,HIOww~~o../3/4:>))+:K:K:MBJJ67 0 -. 0/s   90C
Cc           
         0 nSU;  a<  [        [        R                  R                  [        R                  R                  5      $ UR                  SS5      nUS:X  Ga  SU;  a?  [        [        R                  R                  [        R                  R                  S-   5      $ UR                  S5      nU(       a  US;  a?  [        [        R                  R                  [        R                  R                  S	-   5      $ US
:X  a2  SU;  a$  [        [        R                  R                  S5      $ US   US'   US:X  a2  SU;  a$  [        [        R                  R                  S5      $ US   US'   O US:X  a  SU;  a  UR                  S5      US'   SU;   a<  [        US   [        5      (       d$  [        [        R                  R                  S5      $ S H  nXQ;   d  M
  [        X   [        5      (       d)  [        [        R                  R                  SU-   5      s  $ X   R                  5       X'   X   (       a  Mi  [        [        R                  R                  SU-   5      s  $    [        R                  " S5      (       dB  SU;  a<  [        [        R                  R                  [        R                  R                  5      $ SU;   aT  [        US   [        5      (       d<  [        [        R                  R                  [        R                  R                  5      $ US   nSU;   aj  UR                  S5      u  pxUR                  5       nUR                  5       nU(       a  U(       d$  [        [        R                  R                  S5      $ XS'   OUR                  5       US'   US:X  a  UR                  S5      (       a  SOSUS   UR                  SS5      UR                  SS5      UR                  SS 5      UR                  SS5      S!.n	UR                  U	5        [        [!        S40 UD65      n
OUR                  S5      (       a  SOSUS   UR                  SS5      UR                  SS5      UR                  SS5      UR                  SS 5      UR                  SS5      S".n	UR                  U	5        [#        S40 UD6n[$        R&                  " S#U 35        [        U5      n
[$        R&                  " S$U
 35        S%U
;   a  U
S%   S:w  a  [$        R(                  " S&U
 35        S'U
S(   ;   a1  [        [        R*                  R                  U
S(   U
S%   U
S)   5      nU$ [        [        R,                  R                  U
S(   U
S%   U
S)   5      nU$ US:X  a0  U
S*   S+   U
S*   S,   U
S*   S-   S:X  a  S.OS/U
S*   S   U
S*   S   S0.nU$ U
S*   S1   U
S*   S2   U
S*   S,   U
S*   S   U
S*   S   S3.nU$ )5u  
创建一个repo仓库并返回创建成功后的信息。
Params:
    repo_id (str): 仓库名称，格式为user_name/repo_name 或者 repo_name，必填。
    repo_type (str): 仓库类型，取值为app/model，分别为应用仓库和模型仓库。如果未指定，默认为model。
    app_name (str): 应用名称，如果repo_type为app，则必填。默认值为repo_id (如果不填，后端自动生成）。

    app_sdk (str): 应用SDK, 如果repo_type为app，则必填，可以填写 streamlit, gradio, static 三种
    version (str): streamlit 或 gradio 版本，必填
        * gradio版本支持"4.26.0", "4.0.0"
        * streamlit版本支持"1.33.0", "1.30.0"
    model_name (str): 模型名称，如果repo_type为model，则必填。默认值为repo_id。
    desc (str): 仓库描述，可选，默认为空。
    license (str): 仓库许可证，可选，默认为"Apache License 2.0"。
    private (bool): 是否私有仓库，可选，默认为False。
    token (str): 认证令牌，可选，默认为环境变量的值。
Demo:
    创建应用仓库：
    create_repo(repo_id='app_repo_0425',
                app_sdk='streamlit',
                version="1.33.0"
                desc='my app demo')
Returns:
    dict: 仓库创建结果。
repo_id	repo_typemodelappapp_namezshould provide param app_nameapp_sdk)	streamlitgradiostaticz.app_sdk should be streamlit, gradio or static.rg   versionzstreamlit version needed.streamlitVersionrh   zgradio version needed.gradioVersion
model_nameprivatezprivate should be bool type.)ra   rm   licensetokenzshould be str type: zshould not be empty: rI   rp   desc/zNuser_name or repo_name is empty. repo_id should be user_name/repo_name format.r      rJ   ro   zApache License 2.0)repoTyperepoName	modelNamerq   ro   rp   )rt   ru   appNameappTyperq   ro   rp   zcreate_repo resp: zcreate_repo resp dict: 	errorCodezcreate_repo failed: zrepo already createderrorMsglogIdresultrv   ru   rt   TF)rm   ra   rn   rq   ro   appIdrw   )app_idre   ra   rq   ro   r;   )r   r   PARAMS_INVALIDcodemessageget
isinstanceboolstrrV   rP   rQ   TOKEN_IS_EMPTYsplitupdater   r   r   r   debugerrorREPO_ALREADY_EXISTAISTUDIO_CREATE_REPO_FAILED)rZ   kwargsparamsrb   rf   keyrepo_name_raw	user_name	repo_namemore_paramsrespresp_rawress                rC   r1   Hub.create_repod   s   4 F"I44999;S;S;[;[\\ JJ{G4	'	 8 8 = = ) 8 8 @ @Cb bd d jj+Gg-NN	 8 8 = = ) 8 8 @ @Cs su u+%F*#I$<$<$A$A$?A A-3I->)*("F*#I$<$<$A$A$<> >*0*;''!l&&@#)::i#8F< z&2CT'J'JI4499;YZZ@C}!&+s33#I$<$<$A$ACY\_C_``$k//1{{#I$<$<$A$ACZ]`C`aa A yy011gV6KI44999;S;S;[;[\\VJvf~s$C$CI44999;S;S;[;[\\y)-#0#6#6s#; I!)I!)II	 8 8 = = pr r )9 - 3 3 5F9  "(I!6!6AA"9-#ZZb9

62.!::i1EFGR0K MM+&)*>*H*HID "(I!6!6AA"9-!::j"5!::i4

62.!::i1EFGR0K MM+&3=f=HII*8*56)(3DII/v67$4#4#9II,TF34%j)99y;;@@#J/#K0#G}. J	 yDDII#J/#K0#G}. J"8n[9>*5#'>*#=#B4Xv.>)4C 
 x.1 N95>*5Xv.>)4C 
rB   c                   ^^^ UR                  S5      (       d  [        R                  " S5        gUS   mUR                  S0 5      mSnT(       a  TR                  S5      (       a  SnT(       a  U[        R                  :  a  SOSnUU4S jnUU4S	 jn/ nU(       a  UR                  U5        U(       a  UR                  U5        [        R                  R                  S
SS9S:X  d  UR                  5         U(       d  [        R                  " S5        gSn	U H  n
 [        R                  " SU
R                   35        U
" 5       nUSL a(  [        R                  " SU
R                   35        Sn	  U	$ [        R                  " SU
R                   SU 35        M     U	$ ! [         aZ  n[        R                  " SU
R                   SU 35        [        R                  " [        R                  " 5       5         SnAM  SnAff = f)u  
上传文件
settings: 上传文件的配置信息
settings = {
    'upload'[bool]: True or False
    'upload_href'[str]:  upload url
    'sts_token'[dict]: sts token
        {
        "bos_host":"",
        "bucket_name": "",
        "key":"",
        "access_key_id": "",
        "secret_access_key": "",
        "session_token": "",
        "expiration": ""
        }
}
file_path: 本地文件路径
r2   z%file already exists, skip the upload.Tupload_href	sts_tokenFbos_hostc                  4  > SSK Jn JnJn   U " TR	                  S5      TR	                  S5      TR	                  S5      TR	                  S5      5      nU" UTR	                  S5      TTR	                  S5      S	9nU$ ! [
         a  n[        U5      eS
nAff = f)u   
使用sts上传文件
r   )
sts_clientr5   upload_super_filer   access_key_idsecret_access_keysession_tokenbucket_namer   )bucketr]   r   N)aistudio_sdk.utils.bos_sdkr   r5   r   r   	Exceptionr9   )r   r5   r   clientr   e	file_pathr   s         rC   _uploading_using_sts2Hub._upload_lfs_file.<locals>._uploading_using_sts  s     ^]-#IMM*$=y}}_?]$==)<=y}}_?]_'/8}}]/KR[ajananotauw
 -)!,,-s   A/A= =
BBBc                     >  [        TT5      n SU ;   a#  U S   [        R                  R                  :w  a  U $ g! [         a  n[        U5      eSnAff = f)u   
使用http上传文件

error_codeTN)r   r   SUCCESSr   r   r9   )r   r   r   r   s     rC   _uploading_using_http3Hub._upload_lfs_file.<locals>._uploading_using_http'  sW    -(i@3&3|+<	@Q@Q@V@V+VJ -)!,,-s   49 
AAAPERFER_STS_UPLOADtruerK   zno upload method available.zuploading file using zupload lfs file success. zupload lfs file failed. : N)r   logginginfor   LFS_FILE_SIZE_LIMIT_PUTappendrP   rW   reverser   r<   r9   r   	traceback
format_exc)rZ   settingsr   	file_sizeis_sts_validis_http_validr   r   	functionsupload_successfuncr   r   r   r   s     `          @@rC   _upload_lfs_fileHub._upload_lfs_file   s   ( ||H%%LL@A}-LLb1	z22L +	F<Z<Z0Z`e	-
	- 	1223zz~~16~BfLMM78D64T]]ODEf$;LL#<T]]O!LM%)N  MM$<T]]O2cU"ST  	 ' 6 8r!MNi224556s     AF#7&F##
H-AHHc                     SR                  [        R                  " S[        R                  S9[        R
                  5      nU (       a  U SU  3n[        R                  " U5      nUR                  S:X  a   UR                  5       nUS   S:X  a  US   $ / $  / $ ! [         a$  n[        R                  " S	U 35         S nA/ $ S nAff = f)
N{}{}STUDIO_MODEL_API_URL_PREFIXrK   z?repoId=   ry   r   r|   zget black list fail:)formatrP   rQ   r   #STUDIO_MODEL_API_URL_PREFIX_DEFAULTBLACK_LIST_URLrequestsr   status_codejsonr   r   r   )ra   urlresponserO   r   s        rC   _get_suffix_forbiddenHub._get_suffix_forbiddenP  s    	2--		7AkAkl%%C XgY/||C(H##s*MMO[>Q&X;&I + 	  	2II,QC011		2s   BB B 
C$CCc                 t   SnXS'   X$S'   S H  nXd;   d  M
  [        XF   5      [        :w  a>  [        [        R                  R
                  [        R                  R                  5      s  $ XF   R                  5       XF'   XF   (       a  M|  [        [        R                  R
                  [        R                  R                  5      s  $    UR                  S5      (       a  US   OSnUS   nSU;   a  US   OSn	US   n
S	U
;  a<  [        [        R                  R
                  [        R                  R                  5      $ U
R                  S	5      u  pUR                  5       nU
R                  5       n
U
(       a  U(       d<  [        [        R                  R
                  [        R                  R                  5      $ [        R                  " S
[        R                  S9n[        U5      (       d$  [        [        R                  R
                  S5      $ [        R                  R                  SSS9S:w  ag  US   SU;   a  US   OSS.n[!        [#        S0 UD65      nSU;   a:  US   S:w  a1  [        [        R$                  R
                  US   US   US   5      nU$ ['        XXXy5      n[)        U5      S:X  a  gg)u   
文件是否存在
params:
    repo_id: 仓库id，格式为user_name/repo_name
    filename: 仓库中的文件路径
    revision: 分支名
    token: 认证令牌
zparams not valid.ra   filename)r   ra   revisionrp   r   masterrp   rJ   rr   STUDIO_GIT_HOSTrK   zhost not valid.SKIP_REPO_VISIBLE_CHECKfalser   )repoIdrp   ry   r   rz   r{   FTr;   )typer   r   r   r   r   r   rV   r   r   rP   rQ   r   STUDIO_GIT_HOST_DEFAULTr   rW   r   r   AISTUDIO_NO_REPO_READ_AUTHr   r   )rZ   ra   r   argsr   str_params_not_validr   r   r   rp   r   r   	call_hostr   r   r   info_ress                    rC   r3   Hub.file_existsf  s     3#y%z @C}$+#I$<$<$A$A$-$<$<$D$DF F$k//1{{#I$<$<$A$A$-$<$<$D$DF F @ *0J)?)?6*%X:&	#*f#4w"9%	iI4499%44<<> >  )s3	OO%	OO%		I4499%44<<> > II/9W9WX	Y''I4499-/ / ::>>3W>EO !+,3v,=2F **G*Q&*QRDd"tK'8A'=yCCHH $Z 0 $[ 1 $W/ 
 2)	2:C!(+r1rB   Nfolder_path_or_filespath_in_repoallow_patternsignore_patternsc                 H   S nS n[        U[        5      (       a5  [        R                  R	                  US   5      (       a  UnO5[        S5      e[        R                  R	                  U5      (       a  U/nOUnUc  U R                  R                  U5        [        U5      R                  5       R                  5       nUR                  5       (       d  [        SU S35      e[        UR                  S5      5       Vs0 s H:  nUR                  5       (       d  M  UR                  U5      R!                  5       U_M<     nnOm0 nU He  n[        R                  R	                  U5      (       d  M)  U R                  R#                  U5        Xx[        R                  R%                  U5      '   Mg     [        [&        R)                  UR+                  5       X4S95      n	U(       a  UR-                  S5       S3OSn
U	 Vs/ s H  nX-   [/        X   5      4PM     nnU$ s  snf s  snf )	Nr   z0Uploading multiple folders is not supported now.zProvided path: 'z' is not a directoryz**/*)r   r   rr   rJ   )r   listrP   rR   isfile
ValueErrorrY   check_folderr   
expanduserresolveis_dirsortedglobis_filerelative_toas_posix
check_filebasenamerX   filter_repo_objectskeysrV   r   )rZ   r   r   r   r   folder_path
files_pathrR   relpath_to_abspathfiltered_repo_objectsprefixrelpathprepared_repo_objectss                rC   _prepare_upload_folderHub._prepare_upload_folder  s    
*D11ww~~215661
 !STTww~~23323
2,,[9{+668@@BK%%'' #3K=@T!UVV
 #;#3#3F#;<"<D<<> ?  -668$><  " "$"77>>$''''2248AErww'7'7'=> # !%.."''). / !
 3?L&&s+,A.B 1!
0 s#5#>?@0 	 !

 %$5"*!
s   >H$H;Hrp   rb   commit_messager   path_or_fileobjra   rp   rb   r   r   c                J   U[         R                  ;  a  [        SU S[         R                   35      eU(       d  [        S5      e[        U[        [
        45      (       ae  [        R                  R                  [        R                  R                  U5      5      nU=(       d    [        R                  R                  U5      nOU(       d  [        S5      eUb  UOSU 3n[        U[        R                  5      (       a  UR                  5       nU R                  X1X$XVUSS9  g)	z
upload single file
Invalid repo type: , supported repos: z$Path or file object cannot be empty!z#Arg `path_in_repo` cannot be empty!NzAdd T)ra   r   r   rp   rb   r   r   single)r   REPO_TYPE_SUPPORTr   r   r   r   rP   rR   abspathr   r   ioBufferedIOBaserU   r4   )rZ   r  r   ra   rp   rb   r   r   s           rC   r5   Hub.upload_file  s     F44429+=PQWQiQiPjkllCDDoT{33 ggoobgg.@.@.QRO'L277+;+;O+LL   !FGG -8N\N>S 	 or'8'899-224O7#/	' 	 	6rB   rJ   Fr   max_workersr  c           	        ^ ^^^
^^^ U[         R                  ;  a  [        SU S[         R                   35      eTc  [        R                  " S5      mU(       a  UOSnU(       a  UOSnUc  / nO[        U[        5      (       a  U/nUb  UOSnU(       a  X24/nOT R                  UUUUS9n[        R                  " S[         R                  S9mTR                  S	5      u  pUR                  5       nUR                  5       nU(       a  U(       d  [        S
5      e/ nU H  u  nnUR                  U5        M     [        U5      S:X  a  g[        TXT
UT5      m0 nU H  u  nnTU   UU'   M     T R                  R                  U VVs/ s H  u  nnUPM
     snnUS9  T R!                  T5      m[#        U	SS9UUUUU
U U4S j5       n/ nU" UUS9nU Vs/ s H
  nUc  M  UPM     nn[        U5      S:X  d  Uc  [$        R&                  " S5        g[)        UTT
UUTS9  [        U5      S:  a(  [+        S5        U H  u  nn[+        U SU 35        M     ggs  snnf s  snf )r2   r  r  NrI   zUpload folder to repo)r   r   r   r   r   rK   rr   -repo_name or user_name is empty,abort upload.r   )file_path_listlfs_mapF)r  disable_tqdmc                    > U u  p#[        US9(       Ga  US:X  Ga  TS:X  Ga   SR                  [        R                  " S[        R
                  S9[        R                  5      n[        U5      nUTS.nSS	0n[        R                  " XFUS
S9nUR                  S:X  a  UR                  5       n	U	R                  S5      S:X  a)  [        R                  " SU	R                  S5       35        OEU	R                  S5      n
[        R                  " SU
 SU 35        UR!                  USU
 345        g  ['        U5      R(                  R+                  5       nT(       a4  UT;   a.  [        R$                  " SU S35        UR!                  US45        g [-        US9nUS   nUS   nTR/                  TUUUTTUTTR                  U5      US9
$ ! ["         a9  n[        R$                  " SU 35        UR!                  USU 345         S nAg S nAff = f)N)r   z	README.mdr   r   r   rK   )yamlr   zContent-Typezapplication/json)
   r  )r   headerstimeoutr   ry   r   u   调用成功，logId:r{   rz   zcheck readme fail:z,skipzcheck readme failFile:z  forbidden! Skip.zfile type forbidden)file_path_or_objr   	file_hash)
ra   sha256sizedatarp   r   file_path_in_repogit_hostis_lfslog_list)r   r   rP   rQ   r   r   README_CHECK_URLr   r   postr   r   r   r   r   r   r   r   r   r   suffixlowerr   _upload_and_gather_commit_info)	item_pairr  r  r   r   yaml_contentpayloadr  r   r  	error_msgr   r"  hash_info_dr   r  black_extensionsr  r  ra   r   rZ   rp   s                   rC   _upload_items(Hub.upload_folder.<locals>._upload_itemsS  s   +4(i005F+5UZbfnZn  --		"?IsIst//1C $6i#@L ,")G
 '(:G  (}}SYabH++s2'}}88K0A5II(=dhhw>O=P&QR(,(<III(:9+U9+&VW$OOY:KI;8W,XY#' 3 )_++113FF.>$>5+=>?,A BC -!*!K )5I(5I 66 !"3!{{#45! 7  # !  HH1!56OOY2DQC0H$IJ s   CG
 -AG
 

H/HH)r  znothing to commit)r  ra   r   r   
file_quadsrp   z&these files were skipped with reasons:r   )r   r  r   rP   rQ   r   r   r   r   r   rV   r   lenr   rY   check_normal_filesr   r   r   r   r	   print)rZ   ra   r   r   r   rp   rb   r   r   r  r   r  r   r   r   repo_path_listname_lfs_local_path_mapremote_path
local_pathitemr+  	skip_listuploaded_item_rawuploaded_item_listreasonr*  r  r  s   ``   `    `                @@@rC   r4   Hub.upload_folder
  s    F44429+=PQWQiQiPjkll=II56E+9t-</$ " O--./O -8N@U 	 &2%@$A! %)$?$?%0)- /	 %@ %! 99.8V8VW&}}S1	OO%	OO%		LMM,GD!!!$' - ~!#1(I-5~uN  '<#K-4[-Az* (= 	..0EF0EWQD0EF& 	/ 	
  55g> 
[u	E5	 5	 
F5	n 	)!
 0AU/@tDd/@U!"a'+=+EII)*))	
 y>A:;&/"
FBvh/0 '0 a GF Vs   
I
I"Ir  r  r  r  r  r  c       
   	      T   SU;  a  [        S5      eUR                  S5      u  pUR                  5       nUR                  5       nU(       a  U(       d  [        S5      eU	(       Ga   [        XXX2U5      n[        R                  " SU 35        SU;   aP  US   [        R                  R                  :w  a/  [
        R                  " U SU 35        U
R                  US	45        g UR                  S
5      (       d$  [
        R                  " SU SUS S  S35        XtX4$ U R                  XU5      nU(       d.  [
        R                  " SU S35        U
R                  US45        g UR                  S5      (       a  [!        UR                  S5      X#U5      n[        R                  " SU 35        SU;   aO  US   [        R                  R                  :w  a.  [        R                  " SU S35        U
R                  US45        g XtX4$ [
        R                  " S5        U["        R$                  :  a.  [
        R                  " SU S35        U
R                  US45        g XtX4$ ! [         a8  n[
        R                  " U SU 35        U
R                  US45         S nAg S nAff = f)Nrr   z-repo_id should be user_name/repo_name format.r  u#    request upload_access fail,skip，zrequest upload_access failz,the request_aistudio_git_upload_access res: r   z- upload fail due to request git upload error:z+upload fail due to request git upload errorr2   zfile z
 with sha    z has already uploaded.zupload this lfs file u    failed. 文件上传终止z$upload lfs file failed,server error verify_hrefzverify lfs file res: zverify lfs file failed:.zverify lfs file failedz!Start uploading this common file.r  z+ is larger than 5MB for a common file. Failz!larger than 5MB for a common file)r   r   rV   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   COMMON_FILE_SIZE_LIMIT)rZ   ra   r  r  r  rp   r   r  r  r  r  r   r   pre_resr   
upload_res
verify_ress                    rC   r$  "Hub._upload_and_gather_commit_info  sw     gLMM&}}S1	OO%	OO%		LMM <XR[=A5R MMH	RSw&7<+@IDUDUDZDZ+Z		TF"OPWyYZ'T UV;;x((5j<RST(>>..wdCJ		1$7RST'M NO{{=))=gkk->XZ`hmn
4ZLAB:-*\2JiN_N_NdNd2dMM$;D6"CDOOT+C$DE
 %F::II9:f333		E$'RST'J KL 66I  		TF"EaSIJ'C DEs   'I% %
J'/.J""J')rY   )NN)r<   r=   r>   r?   r@   OBJECT_NAMEr^   r1   r   staticmethodr   r3   r"   r   r   r!   r   r   r   REPO_TYPE_MODELDEFAULT_REPOSITORY_REVISIONbytesr#   r5   DEFAULT_MAX_WORKERSintr   r4   r$  rA   r;   rB   rC   rE   rE   K   s   K/*RhUp  *AN ?C?C5%"'T49d4j(H"I5% 5% %U49c>%:;	5%
 &eDIsN&;<5%z '+'-'='=,0&,&H&H'6 #3eX#=>'6 	'6
 '6 d#'6  }'6 %SM'6 sm'6Z DH*,,0&*'-'='=>B?C%99&,&H&H V1V1 sD$s)T$Z?@V1 #3-	V1
 %SMV1 d#V1  }V1 %U49c>%:;V1 &eDIsN&;<V1 V1 smV1 V1rB7 B7 	B7
 B7 B7 B7 B7  #B7 B7 B7rB   rE   c                   t   \ rS rSrSr\R                  \R                  \R                  \R                  \R                  4S\S\S\S\S\4
S jjrS	 rS
\\\4   4S jrS\\\\4      S\4S jr\SSSS.S\\   S\\\\   \4      S\\\\   \4      S\\\/\4      4S jj5       r\S\4S j5       rSrg)rX   i  z
check class
max_file_countmax_file_count_in_dirmax_file_sizesize_threshold_to_enforce_lfsnormal_file_size_total_limitc                 @    Xl         X l        X0l        X@l        XPl        g N)rN  rO  rP  rQ  rR  )rZ   rN  rO  rP  rQ  rR  s         rC   r^   UploadingCheck.__init__  s"     -%:"*-J*,H)rB   c           	      D   [        U[        [        45      (       a3  [        R                  R                  U5      (       d  [        SU S35      e[        U5      nX R                  :  a8  [        R                  " SU R                  S-   S[        US-  S5       S35        gg)	z
check size
File z does not existzFile exceeds size limit:    @	 GB, got     GBN)r   r   r   rP   rR   rS   r   r   rP  r   warnround)rZ   r  r   s      rC   r   UploadingCheck.check_file  s    
 &d4477>>"233 5)9(:/!JKK&'78	)))HH01C1Cy1Q0R S""'	Y(?"C!DCI J *rB   r   c                    SnSn[        U[        5      (       a  [        U5      nUR                  5        H  nUR	                  5       (       a]  US-  n[        U5      nXPR                  :  a<  [        R                  " SU SU R                  S-   S[        US-  S5       S35        Ms  Mu  UR                  5       (       d  M  US-  nU R                  U5      u  pgXg-   U R                  :  a   [        S	U S
Xg-    SU R                   35      eX&-  nX7-  nM     X R                  :  a  [        SU SU R                   35      eX#4$ )
check
r   rs   rW  z exceeds size limit: rX  rY  rZ  r[  z
Directory z
 contains z items and exceeds limit: zTotal file count z and exceeds limit: )r   r   r   iterdirr   r   rP  r   r\  r]  r   r   rO  r   rN  )rZ   r   
file_count	dir_countr7  	item_sizesub_file_countsub_dir_counts           rC   r   UploadingCheck.check_folder  sh    
	k3''{+K'')D||~~a
!.t!4	111HHuTF*?@R@RV_@`?a b$$))y*A1$E#FcK L 2 Q	040A0A$0G-"2d6P6PP$z$z.B`Aa b;;?;U;U:V&X Y Y,
*	 *  +++0<PQUQdQdPefgg$$rB   r  r  c                     U Vs/ s H  o2U   (       a  M  UPM     nn[        U Vs/ s H  n[        U5      PM     sn5      nXPR                  :  a"  [        SUS-   SU R                  S-   S35      egs  snf s  snf )r`  zTotal size of non-lfs files i   zMB and exceeds limit: MBN)sumr   rR  r   )rZ   r  r  r7  normal_file_list
total_sizes         rC   r/  !UploadingCheck.check_normal_files)  s    
 .<Q^T4=D^Q:JK:J$--:JKL
999;J+<V;W X3373T3TXc3d2eegi j j : RKs   A5A5A:N)r   r   r   itemsr   r   r   c             #     ^#    U(       a  UOSnU(       a  UOSn[        U[        5      (       a  U/n[        U[        5      (       a  U/nUb%  U Vs/ s H  n[        R                  U5      PM     nnUb%  U Vs/ s H  n[        R                  U5      PM     nnUc  S[        4S jnUnU  HM  nU" U5      mUb  [        U4S jU 5       5      (       d  M*  Ub  [        U4S jU 5       5      (       a  MI  Uv   MO     gs  snf s  snf 7f)a  Filter repo objects based on an allowlist and a denylist.

Input must be a list of paths (`str` or `Path`) or a list of arbitrary objects.
In the later case, `key` must be provided and specifies a function of one argument
that is used to extract a path from each element in iterable.

Patterns are Unix shell-style wildcards which are NOT regular expressions. See
https://docs.python.org/3/library/fnmatch.html for more details.

Args:
    items (`Iterable`):
        List of items to filter.
    allow_patterns (`str` or `List[str]`, *optional*):
        Patterns constituting the allowlist. If provided, item paths must match at
        least one pattern from the allowlist.
    ignore_patterns (`str` or `List[str]`, *optional*):
        Patterns constituting the denylist. If provided, item paths must not match
        any patterns from the denylist.
    key (`Callable[[T], str]`, *optional*):
        Single-argument function to extract a path from each item. If not provided,
        the `items` must already be `str` or `Path`.

Returns:
    Filtered list of objects, as a generator.

Raises:
    :class:`ValueError`:
        If `key` is not provided and items are not `str` or `Path`.

Example usage with paths:
```python
>>> # Filter only PDFs that are not hidden.
>>> list(UploadingCheck.filter_repo_objects(
...     ["aaa.PDF", "bbb.jpg", ".ccc.pdf", ".ddd.png"],
...     allow_patterns=["*.pdf"],
...     ignore_patterns=[".*"],
... ))
["aaa.pdf"]
```
Nr7  c                     [        U [        5      (       a  U $ [        U [        5      (       a  [        U 5      $ [        SU  S35      e)Nz9Please provide `key` argument in `filter_repo_objects`: `z` is not a string.)r   r   r   r   )r7  s    rC   	_identity5UploadingCheck.filter_repo_objects.<locals>._identity|  sF    dC((KdD))t9$ OPTvUgh rB   c              3   <   >#    U  H  n[        TU5      v   M     g 7frT  r-   .0rO   rR   s     rC   	<genexpr>5UploadingCheck.filter_repo_objects.<locals>.<genexpr>  s      6>.<GD!$$n   c              3   <   >#    U  H  n[        TU5      v   M     g 7frT  r-   rt  s     rC   rv  rw    s      3?.=GD!$$orx  )r   r   rX   _add_wildcard_to_directoriesr0   any)rn  r   r   r   prq  r7  rR   s          @rC   r   "UploadingCheck.filter_repo_objects5  s1    b ,:t-</$nc**,-Nos++./O% ('A ;;A>'   & )(A ;;A>(  
 ;  CDt9D )# 6>.<6> 3> 3> *s 3?.=3? 0? 0?J /
s   ADC>0	D9DA0Dpatternc                 "    U S   S:X  a  U S-   $ U $ )Nrr   *r;   )r~  s    rC   rz  +UploadingCheck._add_wildcard_to_directories  s    2;#S= rB   )rN  rO  rP  rR  rQ  )r<   r=   r>   r?   r@   r   UPLOAD_MAX_FILE_COUNTUPLOAD_MAX_FILE_COUNT_IN_DIRUPLOAD_MAX_FILE_SIZE$UPLOAD_SIZE_THRESHOLD_TO_ENFORCE_LFS#UPLOAD_NORMAL_FILE_SIZE_TOTAL_LIMITrL  r^   r   r"   r   r   r   r!   dictr/  rG  r$   r0   r   r%   r   rz  rA   r;   rB   rC   rX   rX     sR   
 #)">">)/)L)L!'!<!<171\1\060Z0ZII $'I 	I
 ,/I +.IJ%c4i(8 %B
jeCI6F1G 
jRV 
j  ?C?C04^A;^ %U49c>%:;^ &eDIsN&;<	^
 (A38,-^ ^@ c  rB   rX   c                  6    [        5       R                  " S0 U D6$ )u   
创建
r;   )rE   r1   r   s    rC   r1   r1     s     5&v&&rB   c                  0    [         R                  " S5        g)   
上传
z>This function is not supported.Please use upload_file instead.N)r   r   r  s    rC   r2   r2     s     IINOrB   r   r  r   ra   rp   rb   r   r   c           
      <    [        5       R                  U UUUUUUS9$ )z
single file
r  r   ra   rp   rb   r   r   )rE   r5   r  s          rC   r5   r5     s2     5_*6%,#('0,:&.  0 0rB   rJ   )	r   r   r   rp   rb   r   r   r  r   r   r   r   r  c        
         F    [        5       R                  U UUUUUUUUU	5
      $ )r  )rE   r4   )
ra   r   r   r   rp   rb   r   r   r  r   s
             rC   r4   r4     s7     5
 
rB   c                 >    [        5       R                  " X/UQ70 UD6$ )u    
检查云端文件存在与否
)rE   r3   )ra   r   r   r   s       rC   r3   r3     s!     5W@@@@rB   )Nr@   typingr   r   rP   r  r   r   pathlibr   aistudio_sdk.constant.err_coder   aistudio_sdk.requests.hubr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   aistudio_sdk.utils.utilr   r   r   r   r   r   r   r   r   aistudio_sdkr   r   aistudio_sdk.dotr    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   dataclassesr,   r.   
contextlibr/   r0   __all__
UploadModeFORBIDDEN_FOLDERSr   r9   rE   rX   r1   r2   rH  rI  r   rJ  r5   rK  rL  r4   r3   r;   rB   rC   <module>r     sG     	 	    4 X R e H 8 I j < C i [ [ ,E E   82 2 2 2 !  %CL _%
X& 	) 	Z
7 Z
7zr rh' '+'-'='=,0&,&H&H0"3eX#=>00 0 d#	0
  }0 %SM0 sm0, DH*,,0&*'-'='=>B?C%99&,&H&HsD$s)T$Z?@ #3- %SM	
 d#  } %U49c>%:; &eDIsN&;<  sm6ArB   