Ë
    uPêjG(  ã                   óî   — U d Z ddlZddlZddlmZmZm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mZmZ dd	lmZmZmZmZmZ dd
lmZ ddlmZmZ dZeed<   dZ eed<   dZ!eed<    G d„ de«      Z"y)aÓ  
Anthropic Files API transformation config.

Implements BaseFilesConfig for Anthropic's Files API (beta).
Reference: https://docs.anthropic.com/en/docs/build-with-claude/files

Anthropic Files API endpoints:
- POST   /v1/files              - Upload a file
- GET    /v1/files              - List files
- GET    /v1/files/{file_id}    - Retrieve file metadata
- DELETE /v1/files/{file_id}    - Delete a file
- GET    /v1/files/{file_id}/content - Download file content
é    N)ÚAnyÚFinalÚcast)ÚFileDeleted)Úextract_file_data)Úencode_url_path_segment)ÚBaseLLMException)ÚBaseFilesConfigÚLiteLLMLoggingObj)ÚCreateFileRequestÚFileContentRequestÚHttpxBinaryResponseContentÚ%OpenAICreateFileRequestOptionalParamsÚOpenAIFileObject)ÚLlmProvidersé   )ÚAnthropicErrorÚAnthropicModelInfozhttps://api.anthropic.comÚANTHROPIC_FILES_API_BASEzfiles-api-2025-04-14ÚANTHROPIC_FILES_BETA_HEADERÚ	msgbatch_Ú!ANTHROPIC_MESSAGE_BATCH_ID_PREFIXc                   ó´  — e Zd ZdZd„ Zedefd„«       Z	 d)dedz  dedz  ded	e	d
e	de
dz  defd„Zdedede	ej                  z  defd„Z	 	 d*de	deded	e	d
e	dedz  dedz  de	fd„Zdedee   fd„Zde	d	e	dede
de	f
d„Zdeded	e	d
e	de	f
d„Zdedz  dej0                  ded
e	def
d„Zded	e	d
e	deee	f   fd„Zdej0                  ded
e	defd„Zded	e	d
e	deee	f   fd„Zdej0                  ded
e	de fd „Z!d!edz  d	e	d
e	deee	f   fd"„Z"dej0                  ded
e	dee   fd#„Z#d$e$d	e	d
e	deee	f   fd%„Z%dej0                  ded
e	de&fd&„Z'e(d'e	defd(„«       Z)y)+ÚAnthropicFilesConfiga  
    Transformation config for Anthropic Files API.

    Anthropic uses:
    - x-api-key header for authentication
    - anthropic-beta: files-api-2025-04-14 header
    - multipart/form-data for file uploads
    - purpose="messages" (Anthropic-specific, not for batches/fine-tuning)
    c                  ó   — y ©N© ©Úselfs    úp/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/anthropic/files/transformation.pyÚ__init__zAnthropicFilesConfig.__init__8   s   € Øó    Úreturnc                 ó"   — t         j                  S r   )r   Ú	ANTHROPICr   s    r    Úcustom_llm_providerz(AnthropicFilesConfig.custom_llm_provider;   s   € ä×%Ñ%Ð%r"   NÚapi_baseÚapi_keyÚmodelÚoptional_paramsÚlitellm_paramsÚstreamc                 ód   — t        j                  |«      xs t        }|j                  d«      › d�S )Nú/ú	/v1/files)r   Úget_api_baser   Úrstrip)r   r'   r(   r)   r*   r+   r,   s          r    Úget_complete_urlz%AnthropicFilesConfig.get_complete_url?   s1   € ô &×2Ñ2°8Ó<ÒXÔ@XˆØ—/‘/ #Ó&Ð' yÐ1Ð1r"   Úerror_messageÚstatus_codeÚheadersc                 ó|   — t        ||t        |t        «      rt        t        j
                  |«      ¬«      S |¬«      S )N)r4   Úmessager5   )r   Ú
isinstanceÚdictr   ÚhttpxÚHeaders)r   r3   r4   r5   s       r    Úget_error_classz$AnthropicFilesConfig.get_error_classK   s?   € ô Ø#Ø!Ü5?ÀÌÔ5N”Tœ%Ÿ-™-¨Ó1ô
ð 	
ð U\ô
ð 	
r"   Úmessagesc                 óÊ   — |€!t        |t        «      r|j                  d«      }t        j                  ||«      }|€t        d«      ‚|j                  i |¥dt        dœ¥«       |S )Nr'   z|Anthropic API key is required. Set ANTHROPIC_API_KEY or ANTHROPIC_AUTH_TOKEN environment variable or pass api_key parameter.z
2023-06-01)zanthropic-versionzanthropic-beta)r8   r9   Úgetr   Úget_auth_headerÚ
ValueErrorÚupdater   )	r   r5   r)   r=   r*   r+   r(   r'   Úauth_headers	            r    Úvalidate_environmentz)AnthropicFilesConfig.validate_environmentW   s{   € ð Ð¤
¨>¼4Ô @Ø%×)Ñ)¨*Ó5ˆHÜ/×?Ñ?ÀÈÓRˆØÐÜð Oóð ð 	�‰ðØðà%1Ü"=òô	
ð ˆr"   c                 ó   — dgS )NÚpurposer   )r   r)   s     r    Úget_supported_openai_paramsz0AnthropicFilesConfig.get_supported_openai_paramsq   s
   € Øˆ{Ðr"   Únon_default_paramsÚdrop_paramsc                 ó   — |S r   r   )r   rH   r*   r)   rI   s        r    Úmap_openai_paramsz&AnthropicFilesConfig.map_openai_paramst   s
   € ð Ðr"   Úcreate_file_datac                 ó  — |j                  d«      }|€t        d«      ‚t        |«      }|d   xs  dt        t	        j                  «       «      › �}|d   }|j                  dd«      }	|j                  d	d
«      }
|||	fd|
fdœS )zù
        Transform to multipart form data for Anthropic file upload.

        Anthropic expects: POST /v1/files with multipart form-data
        - file: the file content
        - purpose: "messages" (defaults to "messages" if not provided)
        ÚfileNzFile data is requiredÚfilenameÚfile_ÚcontentÚcontent_typezapplication/octet-streamrF   r=   )rN   rF   )r?   rA   r   ÚintÚtime)r   r)   rL   r*   r+   Ú	file_dataÚ	extractedrO   rQ   rR   rF   s              r    Útransform_create_file_requestz2AnthropicFilesConfig.transform_create_file_request}   sœ   € ð ,×/Ñ/°Ó7ˆ	ØÐÜÐ4Ó5Ð5ä,¨YÓ7ˆ	Ø# JÑ/ÒM°U¼3¼t¿y¹y»{Ó;KÐ:LÐ3MˆØ" 9Ñ-ˆØ'Ÿm™m¨NÐ<VÓWˆà)×-Ñ-¨i¸ÓDˆð ˜w¨Ð5Ø˜g�ñ
ð 	
r"   Úraw_responseÚlogging_objc                 óD   — |j                  «       }| j                  |«      S )aV  
        Transform Anthropic file response to OpenAI format.

        Anthropic response:
        {
            "id": "file-xxx",
            "type": "file",
            "filename": "document.pdf",
            "mime_type": "application/pdf",
            "size_bytes": 12345,
            "created_at": "2025-01-01T00:00:00Z"
        }
        ©ÚjsonÚ_parse_anthropic_file)r   r)   rX   rY   r+   Úresponse_jsons         r    Útransform_create_file_responsez3AnthropicFilesConfig.transform_create_file_response›   s#   € ð(  ,×0Ñ0Ó2ˆØ×)Ñ)¨-Ó8Ð8r"   Úfile_idc                 ó¤   — t        j                  |j                  d«      «      xs t        }t	        |d¬«      }|j                  d«      › d|› �i fS ©Nr'   r`   ©Ú
field_namer.   ú
/v1/files/©r   r0   r?   r   r   r1   ©r   r`   r*   r+   r'   Úencoded_file_ids         r    Útransform_retrieve_file_requestz4AnthropicFilesConfig.transform_retrieve_file_request²   óR   € ô -×9Ñ9¸.×:LÑ:LÈZÓ:XÓYÒuÔ]uˆÜ!8¸ÈYÔ!WˆØ—/‘/ #Ó&Ð' z°/Ð1BÐCÀRÐGÐGr"   c                 óD   — |j                  «       }| j                  |«      S r   r[   )r   rX   rY   r+   r^   s        r    Ú transform_retrieve_file_responsez5AnthropicFilesConfig.transform_retrieve_file_response¼   s#   € ð  ,×0Ñ0Ó2ˆØ×)Ñ)¨-Ó8Ð8r"   c                 ó¤   — t        j                  |j                  d«      «      xs t        }t	        |d¬«      }|j                  d«      › d|› �i fS rb   rf   rg   s         r    Útransform_delete_file_requestz2AnthropicFilesConfig.transform_delete_file_requestÅ   rj   r"   c                 ób   — |j                  «       }|j                  dd«      }t        |dd¬«      S )NÚidÚ TrN   )rp   ÚdeletedÚobject)r\   r?   r   )r   rX   rY   r+   r^   r`   s         r    Útransform_delete_file_responsez3AnthropicFilesConfig.transform_delete_file_responseÏ   s:   € ð  ,×0Ñ0Ó2ˆØ&×*Ñ*¨4°Ó4ˆÜØØØô
ð 	
r"   rF   c                 óœ   — t        j                  |j                  d«      «      xs t        }|j	                  d«      › d�}i }|r||d<   ||fS )Nr'   r.   r/   rF   )r   r0   r?   r   r1   )r   rF   r*   r+   r'   ÚurlÚparamss          r    Útransform_list_files_requestz1AnthropicFilesConfig.transform_list_files_requestÝ   sW   € ô -×9Ñ9¸.×:LÑ:LÈZÓ:XÓYÒuÔ]uˆØ Ÿ™¨Ó,Ð-¨YÐ7ˆØ(*ˆÙØ 'ˆF�9ÑØ�Fˆ{Ðr"   c                 óŽ   — |j                  «       }|j                  dg «      }|D �cg c]  }| j                  |«      ‘Œ c}S c c}w )z´
        Anthropic list response:
        {
            "data": [...],
            "has_more": false,
            "first_id": "...",
            "last_id": "..."
        }
        Údata)r\   r?   r]   )r   rX   rY   r+   r^   Ú
files_dataÚfs          r    Útransform_list_files_responsez2AnthropicFilesConfig.transform_list_files_responseê   sC   € ð  ,×0Ñ0Ó2ˆØ)×-Ñ-¨f°bÓ9ˆ
Ø7AÖB°!�×*Ñ*¨1Õ-ÒBÐBùÒBs   §AÚfile_content_requestc                 ó$  — |j                  d«      }t        j                  |j                  d«      «      xs t        }t	        |d¬«      }|j                  t        «      r|j                  d«      › d|› d�i fS |j                  d«      › d|› d�i fS )	Nr`   r'   rc   r.   z/v1/messages/batches/z/resultsre   z/content)r?   r   r0   r   r   Ú
startswithr   r1   )r   r~   r*   r+   r`   r'   rh   s          r    Útransform_file_content_requestz3AnthropicFilesConfig.transform_file_content_requestý   s™   € ð .×1Ñ1°)Ó<ˆÜ,×9Ñ9¸.×:LÑ:LÈZÓ:XÓYÒuÔ]uˆÜ!8¸ÈYÔ!WˆØ×ÑÔ?Ô@Ø—o‘o cÓ*Ð+Ð+@ÀÐ@QÐQYÐZÐ\^Ð^Ð^Ø—/‘/ #Ó&Ð' z°/Ð1BÀ(ÐKÈRÐOÐOr"   c                 ó   — t        |¬«      S )N)Úresponse)r   )r   rX   rY   r+   s       r    Útransform_file_content_responsez4AnthropicFilesConfig.transform_file_content_response
  s   € ô *°<Ô@Ð@r"   rU   c                 ó  — | j                  dd«      }|rG	 t        t        j                  t	        j
                  |j                  dd«      dd d«      «      «      }nt        t	        j                  «       «      }t        | j                  dd«      | j                  d	| j                  d
d«      «      || j                  dd«      d| j                  dd«      dd¬«      S # t        t        f$ r  t        t	        j                  «       «      }Y Œ‘w xY w)z/Parse Anthropic file object into OpenAI format.Ú
created_atrq   ÚZz+00:00Né   z%Y-%m-%dT%H:%M:%Srp   Ú
size_bytesÚbytesr   rO   rN   rF   r=   Úuploaded)rp   rŠ   r†   rO   rs   rF   ÚstatusÚstatus_details)
r?   rS   ÚcalendarÚtimegmrT   ÚstrptimeÚreplacerA   Ú	TypeErrorr   )rU   Úcreated_at_strr†   s      r    r]   z*AnthropicFilesConfig._parse_anthropic_file  sì   € ð !*§¡¨l¸BÓ ?ˆÙð
.Ü Ü—O‘OÜŸ™Ø*×2Ñ2°3¸ÓAÀ#À2ÐFØ/óóó‘
ô œTŸY™Y›[Ó)ˆJäØ�}‰}˜T 2Ó&Ø—-‘- ¨i¯m©m¸GÀQÓ.GÓHØ!Ø—]‘] :¨rÓ2ØØ—M‘M )¨ZÓ8ØØô	
ð 		
øô ¤	Ð*ò .Ü ¤§¡£Ó-’
ð.ús   –AC Ã,DÄ
Dr   )NN)*Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   Úpropertyr   r&   Ústrr9   Úboolr2   rS   r:   r;   r	   r<   ÚlistrD   r   rG   rK   r   rW   ÚResponser   r   r_   Útupleri   rl   rn   r   rt   rx   r}   r   r�   r   r„   Ústaticmethodr]   r   r"   r    r   r   -   sª  „ ñòð ð& \ò &ó ð&ð #ñ
2à˜‘*ð
2ð �t‘ð
2ð ð	
2ð
 ð
2ð ð
2ð �t‘ð
2ð 
ó
2ð

àð

ð ð

ð ˜Ÿ™Ñ%ð	

ð
 
ó

ð& #Ø#ñàðð ðð ð	ð
 ðð ðð �t‘ðð ˜‘*ðð 
óð4°ð ¸Ð>cÑ9dó ðà ðð ðð ð	ð
 ðð 
óð
àð
ð ,ð
ð ð	
ð
 ð
ð 
ó
ð<9à�T‰zð9ð —n‘nð9ð 'ð	9ð
 ð9ð 
ó9ð.HàðHð ðHð ð	Hð
 
ˆs�DˆyÑ	óHð9à—n‘nð9ð 'ð9ð ð	9ð
 
ó9ðHàðHð ðHð ð	Hð
 
ˆs�DˆyÑ	óHð
à—n‘nð
ð 'ð
ð ð	
ð
 
ó
ðà�t‘ðð ðð ð	ð
 
ˆs�DˆyÑ	óðCà—n‘nðCð 'ðCð ð	Cð
 
ÐÑ	óCð&Pà0ðPð ðPð ð	Pð
 
ˆs�DˆyÑ	óPðAà—n‘nðAð 'ðAð ð	Að
 
$óAð ð
¨ð 
Ð2Bò 
ó ñ
r"   r   )#r—   rŽ   rT   Útypingr   r   r   r:   Úopenai.types.file_deletedr   Ú8litellm.litellm_core_utils.prompt_templates.common_utilsr   Ú$litellm.litellm_core_utils.url_utilsr   Ú)litellm.llms.base_llm.chat.transformationr	   Ú*litellm.llms.base_llm.files.transformationr
   r   Úlitellm.types.llms.openair   r   r   r   r   Úlitellm.types.utilsr   Úcommon_utilsr   r   r   Ú__annotations__r   r   r   r   r"   r    ú<module>r©      sm   ðòó Û ß #Ñ #ã Ý 1å VÝ HÝ F÷÷õ õ -ç =à"=Ð ˜%Ó =Ø%;Ð ˜UÓ ;Ø+6Ð ! 5Ó 6ôA
˜?õ A
r"   