Ë
    uPêj¹5  ã                   óä   — d dl Z d dlZd dlZd dlmZ d dlmZ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mZ d d	lmZmZmZmZmZ d d
lmZmZmZ ddlmZ ddl m!Z!m"Z"  G d„ d«      Z#y)é    N)Ú	Coroutine)ÚAnyÚFinal)Úverbose_logger)Úuuid)ÚLogging)Úencode_url_path_segment)Úget_async_httpx_client)ÚFileContentRequestÚHttpxBinaryResponseContentÚOpenAIBatchResultÚOpenAIChatCompletionResponseÚOpenAIErrorBody)Ú	CallTypesÚLlmProvidersÚModelResponseé   )ÚAnthropicConfig)ÚANTHROPIC_ERROR_STATUS_CODE_MAPÚAnthropicModelInfoc                   óü   — e Zd ZdZd„ Z	 	 	 	 ddededz  dedz  deej                  z  de
dz  d	efd
„Z	 	 	 	 ddedededz  dedz  deej                  z  de
dz  d	eeeeef   z  fd„Zded	efd„Zdeded	efd„Zy)ÚAnthropicFilesHandlerzŽ
    Handles Anthropic Files API operations.

    Currently supports:
    - file_content() for retrieving Anthropic Message Batch results
    c                 ó"   — t        «       | _        y )N)r   Úanthropic_model_info)Úselfs    úi/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/anthropic/files/handler.pyÚ__init__zAnthropicFilesHandler.__init__$   s   € Ü$6Ó$8ˆÕ!ó    NÚfile_content_requestÚapi_baseÚapi_keyÚtimeoutÚmax_retriesÚreturnc              ƒ   óÚ  K  — |j                  d«      }|st        d«      ‚|j                  d«      r|j                  ddd«      }n|}| j                  j                  |«      }| j                  j                  ||«      }|€t        d«      ‚t        |d¬	«      }	|j                  d
«      › d|	› d�}
dddœ}|j                  |«       t        t        j                  ¬«      }|j                  |
|¬«      ƒ d{  –—† }|j                  «        | j                  |j                  «      }t!        j"                  |j$                  |j&                  ||j(                  ¬«      }t+        |¬«      S 7 Œr­w)aW  
        Async: Retrieve file content from Anthropic.

        For batch results, the file_id should be the batch_id.
        This will call Anthropic's /v1/messages/batches/{batch_id}/results endpoint.

        Args:
            file_content_request: Contains file_id (batch_id for batch results)
            api_base: Anthropic API base URL
            api_key: Anthropic API key
            timeout: Request timeout
            max_retries: Max retry attempts (unused for now)

        Returns:
            HttpxBinaryResponseContent: Binary content wrapped in compatible response format
        Úfile_idz+file_id is required in file_content_requestzanthropic_batch_results:Ú é   NzMissing Anthropic API KeyÚbatch_id)Ú
field_nameú/z/v1/messages/batches/z/resultszapplication/jsonz
2023-06-01)Úacceptzanthropic-version)Úllm_provider)ÚurlÚheaders)Ústatus_coder/   ÚcontentÚrequest)Úresponse)ÚgetÚ
ValueErrorÚ
startswithÚreplacer   Úget_api_baseÚget_auth_headerr	   ÚrstripÚupdater
   r   Ú	ANTHROPICÚraise_for_statusÚ3_transform_anthropic_batch_results_to_openai_formatr1   ÚhttpxÚResponser0   r/   r2   r   )r   r   r    r!   r"   r#   r&   r)   Úauth_headerÚencoded_batch_idÚresults_urlr/   Úasync_clientÚanthropic_responseÚtransformed_contentÚtransformed_responses                   r   Úafile_contentz#AnthropicFilesHandler.afile_content'   st  è ø€ ð0 .×1Ñ1°)Ó<ˆÙÜÐJÓKÐKð ×ÑÐ8Ô9Ø—‘Ð'AÀ2ÀqÓI‰HàˆHð ×,Ñ,×9Ñ9¸(ÓCˆØ!×6Ñ6×FÑFÀwÐPXÓYˆàÐÜÐ8Ó9Ð9ô #:¸(ÈzÔ"ZÐØ (§¡°Ó 4Ð5Ð5JÐK[ÐJ\Ð\dÐeˆð )Ø!-ñ
ˆð 	�‰�{Ô#ô 5Ä,×BXÑBXÔYˆØ*6×*:Ñ*:¸{ÐT[Ð*:Ó*\×$\ÐØ×+Ñ+Ô-ð #×VÑVÐWi×WqÑWqÓrÐô ',§n¡nØ*×6Ñ6Ø&×.Ñ.Ø'Ø&×.Ñ.ô	'
Ðô *Ð3GÔHÐHð %]ús   ‚C4E+Ã6E)Ã7A3E+Ú	_is_asyncc           	      ó‚   — |r| j                  ||||¬«      S t        j                  | j                  |||||¬«      «      S )a’  
        Retrieve file content from Anthropic.

        For batch results, the file_id should be the batch_id.
        This will call Anthropic's /v1/messages/batches/{batch_id}/results endpoint.

        Args:
            _is_async: Whether to run asynchronously
            file_content_request: Contains file_id (batch_id for batch results)
            api_base: Anthropic API base URL
            api_key: Anthropic API key
            timeout: Request timeout
            max_retries: Max retry attempts (unused for now)

        Returns:
            HttpxBinaryResponseContent or Coroutine: Binary content wrapped in compatible response format
        )r   r    r!   r#   )r   r    r!   r"   r#   )rH   ÚasyncioÚrun)r   rI   r   r    r!   r"   r#   s          r   Úfile_contentz"AnthropicFilesHandler.file_contento   s`   € ñ4 Ø×%Ñ%Ø%9Ø!ØØ'ð	 &ó ð ô —;‘;Ø×"Ñ"Ø)=Ø%Ø#Ø#Ø +ð #ó óð r   Úanthropic_contentc                 ó’  — 	 t        «       }g }|j                  d«      }|j                  «       j                  d«      D �]°  }|j                  «       sŒt	        j
                  |«      }|j                  dd«      }|j                  di «      }|j                  dd«      }	|	dk(  rf|j                  di «      }
|
sŒz| j                  |
|¬	«      }|d
|
j                  dd«      |dœdœ}|j                  t	        j                  |«      «       ŒË|	dk(  r¤|j                  di «      }|j                  di «      }|j                  dd«      }|j                  dd«      }t        j                  |d«      }d||dœi}|||j                  dd«      |dœdœ}|j                  t	        j                  |«      «       �Œt|	dv s�Œzdd|	› �ddœi}|dd|dœdœ}|j                  t	        j                  |«      «       �Œ³ dj                  |«      }|r|dz  }|j                  d«      S # t        $ r"}t        j                  d|«       |cY d}~S d}~ww xY w)a  
        Transform Anthropic batch results JSONL to OpenAI batch results JSONL format.

        Anthropic format:
        {
          "custom_id": "...",
          "result": {
            "type": "succeeded",
            "message": { ... }  // Anthropic message format
          }
        }

        OpenAI format:
        {
          "custom_id": "...",
          "response": {
            "status_code": 200,
            "request_id": "...",
            "body": { ... }  // OpenAI chat completion format
          }
        }
        úutf-8ú
Ú	custom_idr'   ÚresultÚtypeÚ	succeededÚmessage)Úanthropic_messageÚanthropic_configéÈ   Úid)r0   Ú
request_idÚbody)rR   r3   ÚerroredÚerrorzUnknown errorÚ	api_erroriô  )rV   rT   r[   )ÚcanceledÚexpiredzBatch request was Úinvalid_request_errori�  z?Error transforming Anthropic batch results to OpenAI format: %sN)r   ÚdecodeÚstripÚsplitÚjsonÚloadsr4   Ú-_transform_anthropic_message_to_openai_formatÚappendÚdumpsr   ÚjoinÚencodeÚ	Exceptionr   r^   )r   rN   rX   Útransformed_linesÚcontent_strÚlineÚanthropic_resultrR   rS   Úresult_typerW   Úopenai_response_bodyÚopenai_resultr^   Ú	error_objÚerror_messageÚ
error_typer0   Úerror_body_erroredÚopenai_result_erroredÚerror_body_canceledÚopenai_result_canceledrF   Úes                           r   r>   zIAnthropicFilesHandler._transform_anthropic_batch_results_to_openai_format›   s‡  € ð.U	%Ü&5Ó&7ÐØ')Ðð "3×!9Ñ!9¸'Ó!BˆKØ#×)Ñ)Ó+×1Ñ1°$Ó7ó EQ�Ø—z‘z”|Øä#'§:¡:¨dÓ#3Ð Ø,×0Ñ0°¸bÓA�	Ø)×-Ñ-¨h¸Ó;�Ø$Ÿj™j¨°Ó4�ð  +Ò-à(.¯
©
°9¸bÓ(AÐ%Ú(Ø/3×/aÑ/aØ.?Ø-=ð 0bó 0Ð,ð *3à/2Ø.?×.CÑ.CÀDÈ"Ó.MØ(<ñ)ñ<˜ð *×0Ñ0´·±¸MÓ1JÕKØ  IÒ-à"ŸJ™J w°Ó3�EØ %§	¡	¨'°2Ó 6�IØ$-§M¡M°)¸_Ó$M�MØ!*§¡¨v°{Ó!C�Jä"A×"EÑ"EÀjÐRUÓ"V�Kð  Ø'4Ø$.ñ"ð;Ð&ð &/à+6Ø*/¯)©)°LÀ"Ó*EØ$6ñ%ñ@Ð)ð &×,Ñ,¬T¯Z©ZÐ8MÓ-NÖOØ Ð$;Ó;ð  Ø);¸K¸=Ð'IØ$;ñ"ð<Ð'ð &/à+.Ø*,Ø$7ñ%ñAÐ*ð &×,Ñ,¬T¯Z©ZÐ8NÓ-OÖPðKEQðP #'§)¡)Ð,=Ó">ÐÙ Ø# tÑ+Ð#Ø&×-Ñ-¨gÓ6Ð6øÜò 	%Ü× Ñ Ð!bÐdeÔfà$Õ$ûð	%ús,   ‚B5H Â8C>H Æ8A"H È	IÈ$IÈ;IÉIrW   rX   c                 ó   — 	 t        j                  dt        j                  |«      j	                  d«      ¬«      }t        «       }t        j                  ddt        j                  dd¬«      ¬	«      g|_	        t        |j                  d
d«      dddœgdt        j                  t        j                  «       dt        t!        j"                  «       «      z   dt        t!        j"                  «       «      di i¬«	      }i |_        |j'                  |||dd¬«      }|j)                  d¬«      }|j                  d«      s|j                  dd«      |d<   |S # t*        $ rr}t-        j.                  d|«       |j                  dd«      dt1        t        j                  «       «      |j                  d
d«      ddddœddœgddddœdœ}	|	cY d}~S d}~ww xY w)zX
        Transform a single Anthropic message to OpenAI chat completion format.
        rY   rP   )r0   r1   Ústopr   r'   Ú	assistant)r1   Úrole)Úfinish_reasonÚindexrV   Úmodelzclaude-3-5-sonnet-20241022ÚuserÚbatch_request)r€   r1   FÚbatch_Úbatch_processingÚoptional_params)	rƒ   ÚmessagesÚstreamÚ	call_typeÚ
start_timeÚlitellm_call_idÚfunction_idÚlitellm_trace_idÚkwargsN)Úcompletion_responseÚraw_responseÚmodel_responseÚ	json_modeÚprefix_promptT)Úexclude_nonerZ   z9Error transforming Anthropic message to OpenAI format: %szchat.completionr^   )r‚   rV   r�   )Úprompt_tokensÚcompletion_tokensÚtotal_tokens)rZ   ÚobjectÚcreatedrƒ   ÚchoicesÚusage)r?   r@   rf   rj   rl   r   ÚlitellmÚChoicesÚMessagerœ   r   r4   r   Úaretrieve_batchÚtimeÚstrr   Úuuid4rˆ   Útransform_parsed_responseÚ
model_dumprm   r   r^   Úint)
r   rW   rX   Úmock_responser“   Úlogging_objrG   Úopenai_bodyr|   Úerror_responses
             r   rh   zCAnthropicFilesHandler._transform_anthropic_message_to_openai_format	  sÓ  € ðF	"ä#(§>¡>ØÜŸ
™
Ð#4Ó5×<Ñ<¸WÓEô$ˆMô %2£OˆNô —‘Ø"(ØÜ#ŸO™O°B¸[ÔIôð&ˆNÔ"ô ")Ø'×+Ñ+¨GÐ5QÓRØ#)°oÑFÐGØÜ#×3Ñ3ÜŸ9™9›;Ø (¬3¬t¯z©z«|Ó+<Ñ <Ø.Ü!$¤T§Z¡Z£\Ó!2Ø)¨2Ð.ô
"ˆKð +-ˆKÔ'ð +;×*TÑ*TØ$5Ø*Ø-ØØ"ð +Uó +Ð ð @T×?^Ñ?^ÐlpÐ?^Ó?qˆKð —?‘? 4Ô(Ø$5×$9Ñ$9¸$ÀÓ$C�˜DÑ!àÐøÜò 	"Ü× Ñ Ð!\Ð^_Ô`ð (×+Ñ+¨D°"Ó5Ø+ÜœtŸy™y›{Ó+Ø*×.Ñ.¨w¸Ó;ð "#Ø,7ÀBÑ#GØ)0ñðð &'Ø)*Ø$%ññCˆNð$ "Õ!ûð+	"ús   ‚EE Å	GÅA'GÇGÇG)NNg     À‚@N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r£   Úfloatr?   ÚTimeoutr§   r   rH   Úboolr   r   rM   Úbytesr>   Údictr   r   rh   © r   r   r   r      s6  „ ñò9ð  $Ø"Ø).Ø"&ñFIà0ðFIð ˜‘*ðFIð �t‘ð	FIð
 ˜Ÿ™Ñ&ðFIð ˜4‘ZðFIð 
$óFIðX  $Ø"Ø).Ø"&ñ*àð*ð 1ð*ð ˜‘*ð	*ð
 �t‘ð*ð ˜Ÿ™Ñ&ð*ð ˜4‘Zð*ð 
$ i°°SÐ:TÐ0TÑ&UÑ	Uó*ðXl%ÐUZð l%Ð_dó l%ð\L"Ø!%ðL"Ø9HðL"à	%ôL"r   r   )$rK   rf   r¢   Úcollections.abcr   Útypingr   r   r?   rž   Úlitellm._loggingr   Úlitellm._uuidr   Ú*litellm.litellm_core_utils.litellm_loggingr   Ú$litellm.litellm_core_utils.url_utilsr	   Ú&litellm.llms.custom_httpx.http_handlerr
   Úlitellm.types.llms.openair   r   r   r   r   Úlitellm.types.utilsr   r   r   Úchat.transformationr   Úcommon_utilsr   r   r   rµ   r   r   ú<module>rÁ      sN   ðÛ Û Û Ý %ß ã ã Ý +Ý Ý >Ý HÝ I÷õ ÷ GÑ Få 1ß N÷y"ò y"r   