ó
    |¤jœ'  ã            	       óD  • S SK r S SK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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\5      rS\4S jr SS\S\S\S\4S jjr SS\S\S\S\4S jjr SS\S\4S jjr  SS\S\S\S\4S jjr!g)é    N)Údatetime)Ú
HTTPStatus)Úmktime)Úunquote_plusÚurlparse)Úformat_date_time)ÚDashScopeAPIResponse)ÚGetMixin)ÚFILE_PATH_SCHEMA)ÚInvalidInputÚUploadFileException)Úlogger)Úget_user_agentc            
       ó¤   ^ • \ rS rSrSr\S\R                  4S j5       r\  SS\	S\	S\	S\
4S	 jj5       r\ SS\	S\	S
\4U 4S jjj5       rSrU =r$ )ÚOssUtilsé   ÚuploadsÚresponsec                 ó    • SUR                   R                  SS5      ;   a  UR                  5       nU$ UR                  R	                  S5      nU$ )Núapplication/jsonzcontent-typeÚ zutf-8)ÚheadersÚgetÚjsonÚcontentÚdecode)Úclsr   Úmessages      Ú§C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\dashscope/utils/oss_utils.pyÚ_decode_response_errorÚOssUtils._decode_response_error   sL   € à ×!1Ñ!1×!5Ñ!5°nÀbÓ!IÓIØ—m‘m“oˆGð ˆð ×&Ñ&×-Ñ-¨gÓ6ˆGØˆó    ÚmodelÚ	file_pathÚapi_keyÚupload_certificatec           
      ó   • Uce  U R                   " S#UUS.UD6nUR                  [        R                  :w  a%  [	        SUR
                   SUR                   35      eUR                  nOUn0 nS[        5       0nSUS'   [        [        [        R                  " 5       R                  5       5      5      US'   0 nUS	   US
'   US   US'   US   US'   US   S-   [        R                  R!                  U5      -   US'   US   US'   US   US'   SUS'   ["        R$                  " U5      S   =(       d    SUS'   US   n	['        US5       n
SU
0n[(        R*                  " 5        nUR-                  U	UUUSS9nUR                  [        R                  :X  a  SUS   -   U4sSSS5        sSSS5        $ S U S!U R/                  US"9 3n[0        R2                  " U5        [	        U5      e! , (       d  f       O= f SSS5        g! , (       d  f       g= f)$a  Upload file for model fine-tune or other tasks.

Args:
    file_path (str): The local file name to upload.
    purpose (str): The purpose of the file[fine-tune|inference]
    description (str, optional): The file description message.
    api_key (str, optional): The api key. Defaults to None.
    upload_certificate (dict, optional): Reusable upload
        certificate. Defaults to None.

Returns:
    tuple: (file_url, upload_certificate) where file_url is the
        OSS URL and upload_certificate is the certificate used
N)r#   r%   z%Get upload certificate failed, code: z, message: z
user-agentr   ÚAcceptÚDateÚoss_access_key_idÚOSSAccessKeyIdÚ	signatureÚ	SignatureÚpolicyÚ
upload_dirÚ/ÚkeyÚx_oss_object_aclzx-oss-object-aclÚx_oss_forbid_overwritezx-oss-forbid-overwriteÚ200Úsuccess_action_statusr   zapplication/octet-streamzx-oss-content-typeÚupload_hostÚrbÚfilei  )ÚfilesÚdatar   Útimeoutúoss://úUploading file: z to oss failed, error: )r   © )Úget_upload_certificateÚstatus_coder   ÚOKr   Úcoder   Úoutputr   r   r   r   ÚnowÚ	timetupleÚosÚpathÚbasenameÚ	mimetypesÚ
guess_typeÚopenÚrequestsÚSessionÚpostr    r   Úerror)r   r#   r$   r%   r&   ÚkwargsÚupload_infor   Ú	form_dataÚurlÚfr9   Úsessionr   Úmsgs                  r   ÚuploadÚOssUtils.upload!   s]  € ð. Ñ%Ø×4Ò4ð ØØñð ñˆKð
 ×&Ñ&¬*¯-©-Ó7Ü)Ø;Ø"×'Ñ'Ð(¨°K×4GÑ4GÐ3HðJóð ð &×,Ñ,‰Kà,ˆKØˆØ¤Ó!1Ð2ˆØ.ˆ�ÑÜ*¬6´(·,²,³.×2JÑ2JÓ2LÓ+MÓNˆ�‰Øˆ	Ø&1Ð2EÑ&Fˆ	Ð"Ñ#Ø!,¨[Ñ!9ˆ	�+ÑØ)¨(Ñ3ˆ	�(Ñà˜Ñ%¨Ñ+¬b¯g©g×.>Ñ.>¸yÓ.IÑIð 	�%Ñð )4Ð4FÑ(Gˆ	Ð$Ñ%Ø.9Ø$ñ/
ˆ	Ð*Ñ+ð .3ˆ	Ð)Ñ*ä× Ò  Ó+¨AÑ.×LÐ2Lð 	Ð&Ñ'ð ˜-Ñ(ˆÜ�)˜TÔ" aØ˜Q�KˆEÜ×!Ò!Ô# wØ"Ÿ<™<ØØØ"Ø#Ø ð (ð �ð ×'Ñ'¬:¯=©=Ó8Ø# i°Ñ&6Ñ6¸ÐC÷ $Ð#÷ #Ñ"ð +¨9¨+ð 6"à×5Ñ5¸xÐ5ÐHÐIðKð ô
 —L’L Ô%Ü-¨cÓ2Ð2÷# $Õ#úÐ#÷ #×"Ö"ús*   ÅG?Å ;G$Æ	G?Æ.6G$Ç$
G2	Ç.G?Ç?
HÚreturnc                 ó<   >• SS0nXS'   [         TU ]  " SU4SU0UD6$ )z’Get a oss upload certificate.

Args:
    api_key (str, optional): The api key. Defaults to None.

Returns:
    DashScopeAPIResponse: The job info
ÚactionÚ	getPolicyr#   NÚparams)Úsuperr   )r   r#   r%   rP   r]   Ú	__class__s        €r   r?   ÚOssUtils.get_upload_certificateo   s1   ø€ ð ˜KÐ(ˆØˆw‰ä‰wŠ{˜4 ÑB°ÐB¸6ÑBÐBr"   r>   )NN©N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__ÚSUB_PATHÚclassmethodrL   ÚResponser    ÚstrÚdictrW   r	   r?   Ú__static_attributes__Ú__classcell__)r_   s   @r   r   r      sª   ø† Ø€Hàð¨h×.?Ñ.?ó ó ðð ð
 Ø#'ñK3àðK3ð ðK3ð ð	K3ð
 !ôK3ó ðK3ðZ ð ñCàðCð ðCð
 
÷Có öCr"   r   Úfile_uric                 óN  • [        U 5      nUR                  (       a#  UR                  [        UR                  5      -   nO[        UR                  5      nUR	                  S5      (       a  [        U5      S:”  a  US   S:X  a  USS  n[        R                  R                  U5      $ )Nr0   é   Ú:é   )r   Únetlocr   rG   Ú
startswithÚlenrF   Ú
expanduser)rm   Úparse_resultr$   s      r   Ú_resolve_file_uri_pathrw   „   s‹   € Ü˜HÓ%€LØ××Ø ×'Ñ'¬,°|×7HÑ7HÓ*IÑI‰	ä  ×!2Ñ!2Ó3ˆ	ð 	×Ñ˜S×!Ñ!Ü�	‹N˜QÓØ�a‰L˜CÓà˜a˜b�Mˆ	ä�7‰7×Ñ˜iÓ(Ð(r"   r#   Úupload_pathr%   r&   c                 ó  • UR                  [        5      (       aj  [        U5      n[        R                  R                  U5      (       a,  [        R                  U UUUS9u  pVUc  [        SU S35      eU$ [        SU S35      eg )N©r#   r$   r%   r&   r=   ú failedú
The file: ú is not exists!)
rs   r   rw   rF   rG   Úexistsr   rW   r   r   )r#   rx   r%   r&   r$   Úfile_urlÚ_s          r   Úupload_filer�   •   s“   € ð ×ÑÔ.×/Ñ/Ü*¨;Ó7ˆ	Ü�7‰7�>‰>˜)×$Ñ$Ü"Ÿ/™/ØØ#ØØ#5ð	 *ð ‰KˆHð ÑÜ)Ø& { m°7Ð;óð ð ˆOä ¨I¨;°oÐFÓGÐGØr"   r   c                 óX  • UR                  [        5      (       al  [        U5      n[        R                  R                  U5      (       a.  [        R                  U UUUS9u  pVUc  [        SU S35      eSXV4$ [        SU S35      eUR                  S5      (       a  SX4$ UR                  S5      (       dq  [        R                  R                  U5      n[        R                  R                  U5      (       a.  [        R                  U UUUS9u  pVUc  [        SU S35      eSXV4$ S	X4$ )
a  Check the content is local file path, upload and return the url

Args:
    model (str): Which model to upload.
    content (str): The content.
    api_key (_type_): The api key.
    upload_certificate (dict, optional): Reusable upload certificate.
        Defaults to None.

Raises:
    UploadFileException: Upload failed.
    InvalidInput: The input is invalid

Returns:
    tuple: (is_upload, file_url_or_content, upload_certificate)
        where is_upload indicates if file was uploaded, file_url_or_content
        is the result URL or original content, and upload_certificate
        is the certificate (newly obtained or passed in)
rz   r=   r{   Tr|   r}   r<   ÚhttpF)rs   r   rw   rF   rG   Úisfiler   rW   r   r   ru   )r#   r   r%   r&   r$   r   Úcerts          r   Úcheck_and_upload_localr†   ®   sD  € ð2 ×ÑÔ*×+Ñ+Ü*¨7Ó3ˆ	Ü�7‰7�>‰>˜)×$Ñ$Ü%Ÿ_™_ØØ#ØØ#5ð	 -ð ‰NˆHð ÑÜ)Ø& w i¨wÐ7óð ð ˜Ð'Ð'Ü˜Z¨	 {°/ÐBÓCÐCØ×Ñ˜(×#Ñ#Ø�WÐ0Ð0Ø×Ñ˜f×%Ñ%Ü—'‘'×$Ñ$ WÓ-ˆÜ�7‰7�>‰>˜'×"Ñ"Ü%Ÿ_™_ØØ!ØØ#5ð	 -ð ‰NˆHð ÑÜ)Ø& w i¨wÐ7óð ð ˜Ð'Ð'Ø�'Ð-Ð-r"   Úelemc                 ó  • SnUnUR                  5        Hl  u  pg[        U[        5      nU(       a  UOU/n	US;   a5  [        U	5       H&  u  p§[	        U UUU5      u  nnnU(       d  M   XÉU
'   SnM(     U(       a  U	OU	S   X'   Mn     XE4$ )a�  Check and upload files in element.

Args:
    model: Model name
    elem: Element dict containing file references
    api_key: API key
    upload_certificate: Optional upload certificate to reuse

Returns:
    tuple: (has_upload, upload_certificate) where has_upload is bool
        indicating if any file was uploaded, and upload_certificate
        is the certificate (newly obtained or passed in)
F)ÚimageÚvideoÚaudioÚtextTr   )ÚitemsÚ
isinstanceÚlistÚ	enumerater†   )r#   r‡   r%   r&   Ú
has_uploadÚobtained_certificater1   r   Úis_listÚcontentsÚiÚ	is_uploadr   s                r   Úcheck_and_uploadr—   é   s¥   € ð& €JØ-ÐàŸ
™
ž‰ˆä˜W¤dÓ+ˆÞ%‘7¨G¨9ˆàÐ5Ó5Ü'¨Ö1‘
�ô
 +ØØØØ(ó	ñ	ØØØ(÷ �9Ø"*˜Q‘KØ!%’Jñ 2ö !(‘H¨X°a©[ˆ‹	ñ) %ð, Ð+Ð+r"   c                 ó(   • [        U UUU5      u  pEXE4$ )a¢  Preprocess message element and upload files if needed.

Args:
    model: Model name
    elem: Element dict containing file references
    api_key: API key
    upload_certificate: Optional upload certificate to reuse

Returns:
    tuple: (is_upload, upload_certificate) where is_upload is bool
        indicating if any file was uploaded, and upload_certificate
        is the certificate (newly obtained or passed in)
)r—   )r#   r‡   r%   r&   r–   r…   s         r   Úpreprocess_message_elementr™     s&   € ô& 'ØØØØó	�O€Ið ˆ?Ðr"   ra   )"rI   rF   r   rƒ   r   Útimer   Úurllib.parser   r   Úwsgiref.handlersr   rL   Ú)dashscope.api_entities.dashscope_responser	   Údashscope.client.base_apir
   Údashscope.common.constantsr   Údashscope.common.errorr   r   Údashscope.common.loggingr   Údashscope.common.utilsr   r   ri   rw   rj   r�   r†   r—   r™   r>   r"   r   Ú<module>r£      sö   ðó Û 	Ý Ý Ý ß /Ý -ã å JÝ .Ý 7ß DÝ +Ý 1ôkCˆxô kCð\) Sô )ð*  $ñ	Øðàðð ðð õ	ð:  $ñ	8.Øð8.àð8.ð ð8.ð õ	8.ð~  $ñ	,,à
ð,,ð õ	,,ðf  $ñ	Øðà
ðð ðð ö	r"   