Ë
    uPêjÆ)  ã                   óú   — d Z ddlZddlZddlmZ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mZ ddlmZ ddlmZmZmZ dd	lmZ dd
lmZmZmZmZmZ erddlZ G d„ de«      Z G d„ de«      Z  G d„ de«      Z!y)zq
Translation logic for anthropic's `/v1/complete` endpoint

Litellm provider slug: `anthropic_text/<model_name>`
é    N)ÚAsyncIteratorÚIterator)ÚTYPE_CHECKINGÚFinal)ÚDEFAULT_MAX_TOKENS)Úcustom_promptÚprompt_factory)ÚBaseModelResponseIterator)Ú
BaseConfigÚBaseLLMExceptionÚLiteLLMLoggingObj)ÚAllMessageValues)ÚChatCompletionToolCallChunkÚChatCompletionUsageBlockÚGenericStreamingChunkÚModelResponseÚUsagec                   ó   ‡ — e Zd Zˆ fd„Zˆ xZS )ÚAnthropicTextErrorc                 ó  •— || _         || _        t        j                  dd¬«      | _        t        j
                  || j                  ¬«      | _        t        ‰| �!  | j                  | j                   | j                  | j                  ¬«       y )NÚPOSTz%https://api.anthropic.com/v1/complete)ÚmethodÚurl)Ústatus_codeÚrequest)Úmessager   r   Úresponse)	r   r   ÚhttpxÚRequestr   ÚResponser   ÚsuperÚ__init__)Úselfr   r   Ú	__class__s      €úu/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/anthropic/completion/transformation.pyr"   zAnthropicTextError.__init__(   sk   ø€ Ø&ˆÔØˆŒÜ—}‘}¨FÐ8_Ô`ˆŒÜŸ™°;ÈÏÉÔUˆŒÜ‰ÑØ—L‘LØ×(Ñ(Ø—L‘LØ—]‘]ð	 	õ 	
ó    )Ú__name__Ú
__module__Ú__qualname__r"   Ú__classcell__)r$   s   @r%   r   r   '   s   ø„ ÷

ð 

r&   r   c                   ó‚  — e Zd ZU dZej
                  Zedz  ed<   dZ	e
dz  ed<   dZedz  ed<   dZedz  ed<   dZedz  ed<   dZedz  ed<   edddddfdedz  de
dz  dedz  dedz  dedz  dedz  d	dfd
„Z	 	 d(dedede
e   dedededz  dedz  d	efd„Zdede
e   dededed	efd„Zdefd„Zdedededed	ef
d„Z	 	 d(dedej4                  dededede
e   dededddedz  dedz  d	efd„Zd ed!edeej<                  z  d	efd"„Z e!ded	efd#„«       Z"de
e   ded	efd$„Z#	 d)d%e$e   e%e   z  ez  d&ededz  fd'„Z&y)*ÚAnthropicTextConfigzŸ
    Reference: https://docs.anthropic.com/claude/reference/complete_post

    to pass metadata to anthropic, it's {"user_id": "any-relevant-information"}
    NÚmax_tokens_to_sampleÚstop_sequencesÚtemperatureÚtop_pÚtop_kÚmetadataÚreturnc                 ó¤   — t        «       j                  «       }|j                  «       D ]%  \  }}	|dk7  sŒ|	€Œt        | j                  ||	«       Œ' y )Nr#   )ÚlocalsÚcopyÚitemsÚsetattrr$   )
r#   r-   r.   r/   r0   r1   r2   Úlocals_ÚkeyÚvalues
             r%   r"   zAnthropicTextConfig.__init__C   sF   € ô  ›Ÿ™›ˆØ!Ÿ-™-›/ò 	4‰JˆC�Ø�f‹} Ñ!2Ü˜Ÿ™¨¨UÕ3ñ	4r&   ÚheadersÚmodelÚmessagesÚoptional_paramsÚlitellm_paramsÚapi_keyÚapi_basec                 óP   — |€t        d«      ‚ddd|dœ}|j                  |«       |S )Nz�Missing Anthropic API Key - A call is being made to anthropic but no key is set either in the environment variables or via paramszapplication/jsonz
2023-06-01)Úacceptzanthropic-versionzcontent-typez	x-api-key)Ú
ValueErrorÚupdate)	r#   r<   r=   r>   r?   r@   rA   rB   Ú_headerss	            r%   Úvalidate_environmentz(AnthropicTextConfig.validate_environmentR   sD   € ð ˆ?Üð Tóð ð )Ø!-Ø.Ø ñ	
ˆð 	�‰�xÔ Øˆr&   c                 óº   — | j                  ||¬«      }t        j                  j                  «       }|j	                  «       D ]  \  }}	||vsŒ|	||<   Œ ||dœ|¥}
|
S )N©r>   r=   )r=   Úprompt)Ú(_get_anthropic_text_prompt_from_messagesÚlitellmr,   Ú
get_configr7   )r#   r=   r>   r?   r@   r<   rK   ÚconfigÚkÚvÚdatas              r%   Útransform_requestz%AnthropicTextConfig.transform_requesti   sy   € ð ×EÑEÈxÐ_dÐEÓeˆä×3Ñ3×>Ñ>Ó@ˆØ—L‘L“Nò 	'‰DˆAˆqà˜Ò(à%&� Ò"ð		'ð Øñ
ð ð
ˆð ˆr&   c                 ó
   — g d¢S )zY
        Anthropic /complete API Ref: https://docs.anthropic.com/en/api/complete
        )ÚstreamÚ
max_tokensÚmax_completion_tokensÚstopr/   r0   Úextra_headersÚuser© )r#   r=   s     r%   Úget_supported_openai_paramsz/AnthropicTextConfig.get_supported_openai_params‚   s   € ò	
ð 		
r&   Únon_default_paramsÚdrop_paramsc                 óZ  — |j                  «       D ]—  \  }}|dk(  r||d<   |dk(  r||d<   |dk(  r	|du r||d<   |dk(  rJt        |t        «      st        |t        «      r*t	        j
                  «       j                  |«      }|�||d<   |dk(  r||d<   |d	k(  r||d	<   |d
k(  sŒ‘d|i|d<   Œ™ |S )a?  
        Follows the same logic as the AnthropicConfig.map_openai_params method (which is the Anthropic /messages API)

        Note: the only difference is in the get supported openai params method between the AnthropicConfig and AnthropicTextConfig
        API Ref: https://docs.anthropic.com/en/api/complete
        rV   r-   rW   rU   TrX   r.   r/   r0   rZ   Úuser_idr2   )r7   Ú
isinstanceÚstrÚlistrM   ÚAnthropicConfigÚ_map_stop_sequences)r#   r]   r?   r=   r^   Úparamr;   Ú_values           r%   Úmap_openai_paramsz%AnthropicTextConfig.map_openai_params‘   sç   € ð /×4Ñ4Ó6ò 	A‰LˆE�5Ø˜Ò$Ø:?�Ð 6Ñ7ØÐ/Ò/Ø:?�Ð 6Ñ7Ø˜Ò  U¨d¡]Ø,1� Ñ)Ø˜Š¤J¨u´cÔ$:¼jÈÔPTÔ>UÜ ×0Ñ0Ó2×FÑFÀuÓM�ØÐ%Ø8>�OÐ$4Ñ5Ø˜Ò%Ø16� Ñ.Ø˜ÒØ+0� Ñ(Ø˜‹Ø/8¸%Ð.@� 
Ò+ð!	Að$ Ðr&   Úraw_responseÚmodel_responseÚlogging_objÚrequest_dataÚencodingztiktoken.Encoding | NoneÚ	json_modec                 óÚ  — 	 |j                  «       }| j                  ||¬«      }d|v r#t        t        |d   «      |j                  ¬«      ‚t        |d   «      dkD  r!|d   |j                  d   j                  _
        |d   |j                  d   _        |	�|	nt        j                  }t        |j                  |«      «      }t        |j                  |d   d   d   j                  d	d
«      «      «      }t!        t#        j"                  «       «      |_        ||_        t)        ||||z   ¬«      }t+        |d|«       |S # t        $ r" t        |j                  |j                  ¬«      ‚w xY w)N)r   r   rJ   ÚerrorÚ
completionr   Ústop_reasonÚchoicesr   ÚcontentÚ )Úprompt_tokensÚcompletion_tokensÚtotal_tokensÚusage)ÚjsonÚ	Exceptionr   Útextr   rL   rb   Úlenrs   r   rt   Úfinish_reasonrM   rm   ÚencodeÚgetÚintÚtimeÚcreatedr=   r   r8   )r#   r=   ri   rj   rk   rl   r>   r?   r@   rm   rA   rn   Úcompletion_responserK   Ú	tokenizerrv   rw   ry   s                     r%   Útransform_responsez&AnthropicTextConfig.transform_response²   s}  € ð	fØ)5×):Ñ):Ó)<Ðð ×EÑEÈxÐ_dÐEÓeˆØÐ)Ñ)Ü$ÜÐ/°Ñ8Ó9Ø(×4Ñ4ôð ô
 Ð& |Ñ4Ó5¸Ò9Ø<OÐP\Ñ<]�×&Ñ& qÑ)×1Ñ1Ô9Ø6IÈ-Ñ6XˆN×"Ñ" 1Ñ%Ô3ð (0Ð';™8Ä×AQÑAQˆ	Ü" 9×#3Ñ#3°FÓ#;Ó<ˆÜ#&Ø×Ñ˜^¨IÑ6°qÑ9¸)ÑD×HÑHÈÐTVÓWÓXó$
Ðô "%¤T§Y¡Y£[Ó!1ˆÔØ$ˆÔÜØ'Ø/Ø&Ð):Ñ:ô
ˆô 	� ¨Ô/ØÐøô; ò 	fÜ$¨\×->Ñ->ÈL×LdÑLdÔeÐeð	fús   ‚D? Ä?+E*Úerror_messager   c                 ó   — t        ||¬«      S )N)r   r   )r   )r#   r‡   r   r<   s       r%   Úget_error_classz#AnthropicTextConfig.get_error_classá   s   € Ü!Ø#Ø!ô
ð 	
r&   c                 ó   — | dk(  xs | dk(  S )Nzclaude-2zclaude-instant-1r[   )r=   s    r%   Ú_is_anthropic_text_modelz,AnthropicTextConfig._is_anthropic_text_modelç   s   € à˜
Ñ"ÒA eÐ/AÑ&AÐAr&   c                 ó¬   — t         j                  }||v r(||   }t        |d   |d   |d   |¬«      }t	        |«      S t        ||d¬«      }t	        |«      S )NÚrolesÚinitial_prompt_valueÚfinal_prompt_value)Ú	role_dictrŽ   r�   r>   Ú	anthropic)r=   r>   Úcustom_llm_provider)rM   Úcustom_prompt_dictr   r	   rb   )r#   r>   r=   r“   Úmodel_prompt_detailsrK   s         r%   rL   z<AnthropicTextConfig._get_anthropic_text_prompt_from_messagesë   sp   € Ü$+×$>Ñ$>ÐØÐ&Ñ&à*<¸UÑ*CÐ Ü"Ø.¨wÑ7Ø%9Ð:PÑ%QØ#7Ð8LÑ#MØ!ô	ˆFô �6‹{Ðô $¨%¸(ÐXcÔdˆFä�6‹{Ðr&   Ústreaming_responseÚsync_streamc                 ó   — t        |||¬«      S )N)r•   r–   rn   )Ú'AnthropicTextCompletionResponseIterator)r#   r•   r–   rn   s       r%   Úget_model_response_iteratorz/AnthropicTextConfig.get_model_response_iteratorû   s   € ô 7Ø1Ø#Øô
ð 	
r&   )NN)F)'r'   r(   r)   Ú__doc__rM   rV   r-   r�   Ú__annotations__r.   rc   r/   r0   r1   r2   Údictr   r"   rb   r   rH   rS   r\   Úboolrh   r   r    r   r   r†   ÚHeadersr   r‰   Ústaticmethodr‹   rL   r   r   r™   r[   r&   r%   r,   r,   5   s  … ñð (/×'9Ñ'9Ð˜# ™*Ó9Ø"&€N�D˜4‘KÓ&Ø"€K��t‘Ó"Ø€Eˆ3�‰:ÓØ€Eˆ3�‰:ÓØ €Hˆd�T‰kÓ ð ,>Ø&*Ø"&Ø Ø Ø $ñ4à! D™jð4ð ˜t™ð4ð ˜4‘Zð	4ð
 �T‰zð4ð �T‰zð4ð ˜‘+ð4ð 
ó4ð, #Ø#ñàðð ðð Ð'Ñ(ð	ð
 ðð ðð �t‘ðð ˜‘*ðð 
óð.àðð Ð'Ñ(ðð ð	ð
 ðð ðð 
óð2
°ó 
ðà ðð ðð ð	ð
 ðð 
óðX #Ø!%ñ-àð-ð —n‘nð-ð &ð	-ð
 'ð-ð ð-ð Ð'Ñ(ð-ð ð-ð ð-ð -ð-ð �t‘ð-ð ˜$‘;ð-ð 
ó-ð^
¨Sð 
¸sð 
ÈTÐTY×TaÑTaÑMað 
Ðfvó 
ð ðB¨ð B°ò Bó ðBðÀÐFVÑAWð Ð`cð Ðhkó ð( "'ñ	

à$ S™M¨M¸#Ñ,>Ñ>ÀÑNð

ð ð

ð ˜$‘;ô	

r&   r,   c                   ó   — e Zd Zdedefd„Zy)r˜   Úchunkr3   c           	      óB  — 	 d}d }d}d}d }d }t        |j                  dd«      «      }|j                  dd «      }	|	�t        |	t        «      r|	}|j                  d«      xs d}|�d}t	        |||||||¬«      }
|
S # t
        j                  $ r t        d	|› �«      ‚w xY w)
Nru   FÚindexr   rq   rr   T)r|   Útool_useÚis_finishedr~   ry   r£   Úprovider_specific_fieldsz"Failed to decode JSON from chunk: )r�   r€   ra   rb   r   rz   ÚJSONDecodeErrorrE   )r#   r¡   r|   r¤   r¥   r~   ry   r¦   r£   Ú_chunk_textÚreturned_chunks              r%   Úchunk_parserz4AnthropicTextCompletionResponseIterator.chunk_parser	  sÏ   € ð	KØˆDØBFˆHØˆKØˆMØ<@ˆEØ.2Ð$Ü˜uŸy™y¨°!Ó4Ó5ˆEØ!&§¡¨<¸Ó!>ˆKØÐ&¬:°kÄ3Ô+GØ"�Ø!ŸI™I mÓ4Ò:¸ˆMØÐ(Ø"�Ü$9ØØ!Ø'Ø+ØØØ)Aô%ˆNð "Ð!øä×#Ñ#ò 	KÜÐAÀ%ÀÐIÓJÐJð	Kús   ‚A9A< Á<"BN)r'   r(   r)   rœ   r   rª   r[   r&   r%   r˜   r˜     s   „ ðK $ð KÐ+@ô Kr&   r˜   )"rš   rz   r‚   Úcollections.abcr   r   Útypingr   r   r   rM   Úlitellm.constantsr   Ú3litellm.litellm_core_utils.prompt_templates.factoryr   r	   Ú)litellm.llms.base_llm.base_model_iteratorr
   Ú)litellm.llms.base_llm.chat.transformationr   r   r   Úlitellm.types.llms.openair   Úlitellm.types.utilsr   r   r   r   r   Útiktokenr   r,   r˜   r[   r&   r%   ú<module>r´      sx   ðñó Û ß 3ß 'ã ã Ý 0÷õ P÷ñ õ
 7÷õ ñ Ûô
Ð)ô 
ôP
˜*ô P
ôfKÐ.Gõ Kr&   