
    h`                        d dl Z d dlZd dlZd dlmZmZmZmZmZm	Z	m
Z
mZ d dlZd dlZd dlmZmZmZmZmZ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!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) d dl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 d d	l6m7Z7 d d
l6m8Z9 d dl6m:Z:m;Z; d dl<m=Z=m>Z>m?Z?m@Z@mAZAmBZB ddlCmDZDmEZEmFZF er	d dlGmHZI eIZJneZJg dZK G d deEe      ZLdeMdeNfdZOy)    N)TYPE_CHECKINGAnyDictListOptionalTupleUnioncast)"ANTHROPIC_WEB_SEARCH_TOOL_MAX_USES!DEFAULT_ANTHROPIC_CHAT_MAX_TOKENS-DEFAULT_REASONING_EFFORT_HIGH_THINKING_BUDGET,DEFAULT_REASONING_EFFORT_LOW_THINKING_BUDGET/DEFAULT_REASONING_EFFORT_MEDIUM_THINKING_BUDGETRESPONSE_FORMAT_TOOL_NAME)map_finish_reasontype_to_response_format_param)
BaseConfigBaseLLMException)AllAnthropicMessageValuesAllAnthropicToolsValuesAnthropicCodeExecutionToolAnthropicComputerToolAnthropicHostedToolsAnthropicInputSchemaAnthropicMcpServerToolAnthropicMessagesToolAnthropicMessagesToolChoiceAnthropicSystemMessageContentAnthropicThinkingParamAnthropicWebSearchToolAnthropicWebSearchUserLocation)REASONING_EFFORTAllMessageValuesChatCompletionCachedContent#ChatCompletionRedactedThinkingBlockChatCompletionSystemMessageChatCompletionThinkingBlockChatCompletionToolCallChunk#ChatCompletionToolCallFunctionChunkChatCompletionToolParamOpenAIMcpServerToolOpenAIWebSearchOptions)CompletionTokensDetailsWrapper)Message)PromptTokensDetailsWrapperServerToolUse)ModelResponseUsageadd_dummy_toolhas_tool_call_blockssupports_reasoningtoken_counter   )AnthropicErrorAnthropicModelInfoprocess_anthropic_headers)Logging)
web_searchbashtext_editorcode_executionc                       e Zd ZU dZeZee   ed<   dZ	ee
   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed	<   eddddddfdee   dee
   dee   dee   dee   dee   d	ee   d
dfdZed
ee   fd       Ze fd       ZdefdZdeeedf   d
ee   fdZd
efdZdee   dee   d
ee   fdZde d
e!ee"   ee#   f   fdZ$de%d
e#fdZ&de'd
e!e'e"   e'e#   f   fdZ(deeee'e   f      d
ee'e      fdZ)e*deee+ef      d
ee,   fd       Z-dee   d ed!ed
ee.   fd"Z/de0d
e1fd#Z2d$ed eded%ed
ef
d&Z3	 dEd'ee   d
e.fd(Z4d)e'e5   d
e'e6   fd*Z7d)e'e8   de'ee"ef      d
e'ee"ef      fd+Z9ded)e'e5   d ed,ed-ed
efd.Z:d/ee   d0e'e;   d
ee<   fd1Z=d2ed
e!eee'e      ee'ee>e?f         ee   e'e;   f   fd3Z@d4ed5ee   d
eAfd6ZB	 	 dFd2ed7eCj                  d8eEd/ee   d9ee   f
d:ZFd)e'e5   d
ee   fd;ZG	 	 dFded7eCj                  d8eEd<eHd=ed)e'e5   d ed,ed>ed?ee   d/ee   d
eEfd@ZIe*d0e'e;   d
ee<   fdA       ZJdBedCed-eeeCj                  f   d
eLfdDZM xZNS )GAnthropicConfigz
    Reference: https://docs.anthropic.com/claude/reference/messages_post

    to pass metadata to anthropic, it's {"user_id": "any-relevant-information"}
    
max_tokensNstop_sequencestemperaturetop_ptop_kmetadatasystemreturnc                     t               j                         }|j                         D ]%  \  }	}
|	dk7  s|
t        | j                  |	|
       ' y )Nself)localscopyitemssetattr	__class__)rL   rC   rD   rE   rF   rG   rH   rI   locals_keyvalues              f/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/llms/anthropic/chat/transformation.py__init__zAnthropicConfig.__init__Z   sA     (--/!--/JCf}!2U3 *    c                      y)N	anthropic rL   s    rU   custom_llm_providerz#AnthropicConfig.custom_llm_providerk   s    rW   c                      t         |          S N)super
get_config)clsrQ   s    rU   r`   zAnthropicConfig.get_configo   s    w!##rW   modelc                     g d}d|v st        || j                        r"|j                  d       |j                  d       |S )N)streamstoprE   rF   rC   max_completion_tokenstoolstool_choiceextra_headersparallel_tool_callsresponse_formatuserweb_search_optionszclaude-3-7-sonnet)rb   r\   thinkingreasoning_effort)r6   r\   append)rL   rb   paramss      rU   get_supported_openai_paramsz+AnthropicConfig.get_supported_openai_paramss   sG    
  %'+= $ 8 8,
 MM*%MM,-rW   rk   c                     t        |d      S )Nz/$defs/{model})ref_templater   )rL   rk   s     rU   $get_json_schema_from_pydantic_objectz4AnthropicConfig.get_json_schema_from_pydantic_object   s     -*:
 	
rW   c                     dddS )Nz
2023-06-01zprompt-caching-2024-07-31)zanthropic-versionzanthropic-betarZ   r[   s    rU   get_cache_control_headersz)AnthropicConfig.get_cache_control_headers   s    !-9
 	
rW   rh   parallel_tool_usec                 B   d }|dk(  rt        d      }nh|dk(  rt        d      }nV|dk(  rt        d      }nDt        |t              r4|j                  di       j                  d      }t        d      }|||d<   | |dk(  r	 |S || |d	<   |S t        d| 
      }|S )Nautotyperequiredanynonefunctionnametooldisable_parallel_tool_use)r|   r   )r   
isinstancedictget)rL   rh   rx   _tool_choice
_tool_names        rU   _map_tool_choicez AnthropicConfig._map_tool_choice   s     ?C& 6L J&6EBLF"6FCLT*$R8<<VDJ6FCL%'1V$( f$  )@Q<Q89 	  ;2C.C  rW   r   c                    d }d }d   dk(  sd   dk(  rd   j                  ddi d      }t        t        j                  j	                               }|j                         D ci c]  \  }}||v s|| }}}t        di |}	t        d   d   |	      }
d   j                  d	      }|||
d	<   |
}nd   j                  d
      rdd   vrt        d      d   d   j                  d      }d   d   j                  d      }||t        d      t        d   d   j                  dd      ||      }d   d   j                  d      }|||d<   |}nt        fdt        D              rj                  dj                  di       j                  d            }|t        |t              st        d      i }j                         D ]  \  }}|dk7  s|dk7  s|||<    t        dd   |d|}n;d   dk(  rt        di }n'd   dk(  r| j!                  t#        t$                    }||t        dd          j                  dd       }j                  di       j                  dd       }|+|	||d<   ||fS |t        |t&              rt)        di ||d<   ||fS c c}}w )Nr|   r   custom
parametersobject)r|   
propertiesr   r   input_schemadescription	computer_z&Missing required parameter: parametersdisplay_width_pxdisplay_height_pxzAMissing required parameter: display_width_px or display_height_pxcomputer)r|   r   r   r   display_numberc              3   F   K   | ]  }d    j                  |        yw)r|   N)
startswith).0tr   s     rU   	<genexpr>z3AnthropicConfig._map_tool_helper.<locals>.<genexpr>   s      Lf((+Ls   !z Missing required parameter: namer|   r   urlmcpzUnsupported tool type: cache_controlrZ   )r   setr   __annotations__keysrO   r   r   
ValueErrorr   r~   ANTHROPIC_HOSTED_TOOLSr   strr   r   _map_openai_mcp_server_toolr
   r,   r   r%   )rL   r   returned_tool
mcp_server_input_schema_allowed_propertieskvinput_schema_filteredinput_anthropic_schema_tool_description_display_width_px_display_height_px_computer_tool_display_numberfunction_nameadditional_tool_params_cache_control_cache_control_functions    `                  rU   _map_tool_helperz AnthropicConfig._map_tool_helper   sq    <@7;
<:%f)A"&z"2"6"6$"$#M #&&:&J&J&O&O&Q"R6C6I6I6K$hdaqTgOgQT$h!$h;O;hRg;h")*%f-3E
  
+//>L''3m$!M&\$$[14
#33 !IJJ/3J/?/M/Q/Q"0 15Z0@0N0R0R#1 !(,>,F W  3&\*%))&*=!2"4	N #:.|<@@AQRO*3B/0*ML5KLL HHVTXXj"-E-I-I&-QRM$J}c,J !CDD%'"

1;1;01*1- % 1 &\9OM &\U"/7$7J&\U"99($/J  Z%76tF|nEFF /48"&((:r":">">PT"U$)1?o. j(( )4': 2M 2-2o. j(([ %is   (J;5J;c                 ,   ddl m} |j                  dd       }d }| ||j                  dd             }|j                  di       }d }|&|j                  dd       }||j                  dd      }t	        d	|d
   |d         }|||d<   |||d<   |S )Nr   )#AnthropicMcpServerToolConfigurationallowed_tools)r   headersAuthorizationzBearer  r   
server_urlserver_label)r|   r   r   tool_configurationauthorization_token)litellm.types.llms.anthropicr   r   replacer   )	rL   r   r   r   r   r   r   bearer_tokeninitial_tools	            rU   r   z+AnthropicConfig._map_openai_mcp_server_tool  s     	U$7LP$!D"hh=" ((9b)-1";;=L'&2&:&:9b&I#-\"n%
 )1CL-.*2EL./rW   rg   c                     g }g }|D ]S  }d|v r|j                  |       | j                  |      \  }}||j                  |       |C|j                  |       U ||fS )Nr   )rp   r   )rL   rg   anthropic_toolsmcp_serversr   new_toolmcp_server_tools          rU   
_map_toolszAnthropicConfig._map_tools9  sx     D%&&t,,0,A,A$,G)/'#**84".&&7  ++rW   re   c                 6   d }t        |t              r)|j                         rt        j                  du r|S |g}|S t        |t
              rMg }|D ]6  }|j                         rt        j                  du r&|j                  |       8 t        |      dkD  r|}|S )NTr   )r   r   isspacelitellmdrop_paramslistrp   len)rL   re   new_stopnew_vr   s        rU   _map_stop_sequencesz#AnthropicConfig._map_stop_sequencesJ  s     )-dC 7#6#6$#>vH  d#EIIKG$7$74$?Q  5zA~ rW   ro   c                     | y | dk(  rt        dt              S | dk(  rt        dt              S | dk(  rt        dt              S t	        d|        )Nlowenabled)r|   budget_tokensmediumhighzUnmapped reasoning effort: )r    r   r   r   r   )ro   s    rU   _map_reasoning_effortz%AnthropicConfig._map_reasoning_effort`  sy     #&)J  ))M  ')K 
 :;K:LMNNrW   rT   optional_paramsis_thinking_enabledc                 v    dg}||d   |v ry d }d|v r|d   }nd|v r|d   d   }	 | j                  |      }|S )Ntextr|   response_schemajson_schemaschema)r   )*_create_json_tool_call_for_response_format)rL   rT   r   r   ignore_response_format_typesr   r   s          rU   %map_response_format_to_anthropic_toolz5AnthropicConfig.map_response_format_to_anthropic_toolx  sv     )/x$MU6].JJ&*% 12Ke#.x8K	 ??# @ 
 rW   c                 x   t        t        |      }t        dd      }|j                  d      }|jt	        d      }t        j
                  j                         }|j                  d      }|-|j                         D ]  \  }}	||v s|dk7  s|	||<    ||d<   |j                  d      }
|
t        |
   |d	<   |S )
Nweb_search_20250305r=   r   user_locationapproximater{   r|   search_context_sizemax_uses)	r
   r-   r!   r   r"   r   r   rO   r   )rL   rT   value_typedhosted_web_search_toolr   anthropic_user_locationanthropic_user_location_keysuser_location_approximaterS   user_location_valuer   s              rU   map_web_search_toolz#AnthropicConfig.map_web_search_tool  s     159!7&"
 $8$&D-&X#.>>CCE ) )6(9(9-(H%(40I0O0O0Q,C,::sf}7J/4 1R ;R&7 *oo.CD*1S#2":. &%rW   non_default_paramsr   c                 ^   | j                  |      }|j                         D ]  \  }}|dk(  r||d<   |dk(  r||d<   |dk(  r.| j                  |      \  }}	| j                  ||      }|	r|	|d<   |dk(  s|dk(  r8| j	                  |j                  d      |j                  d      	      }
|
|
|d<   |d
k(  r	|du r||d
<   |dk(  r8t        |t              st        |t              r| j                  |      }|||d<   |dk(  r||d<   |dk(  r||d<   |dk(  rPt        |t              r@| j                  |||      }||st        dd}
|
|d<   d|d<   | j                  ||g      }|dk(  r$|"t        |t              rt        |      rd|i|d<   |dk(  r||d<   y|dk(  r*t        |t              rt        j                  |      |d<   |dk(  st        |t              s| j!                  t#        t$        |            }| j                  ||g        | j'                  ||       |S )N)r   rC   rf   rg   )r   rg   r   rh   rj   )rh   rx   rd   Tre   rD   rE   rF   rk   r   r   r|   	json_moderl   user_idrH   rn   ro   rm   )r   r   )r   rO   r   _add_tools_to_optional_paramsr   r   r   r   r   r   r   r   r   _valid_user_idrB   r   r   r
   r-   +update_optional_params_with_thinking_tokens)rL   r   r   rb   r   r   paramrT   r   r   r   _valuer   r   s                 rU   map_openai_paramsz!AnthropicConfig.map_openai_params  s    #661 7 
 /446LE5$05-//05-/3u/E,"&"D"D$3? #E # 5@OM2%2G)G))$6$:$:=$I*<*@*@AV*W *    +5AOM2 Ud],1)Juc$:jPT>U11%8%8>O$45%16.+0())j.EBB?,? =*,Ev#VL5AOM2/3,"&"D"D$3E7 #E # %uc*"5)/8%.@
+
".3
+,,E31G.=.S.S/
+ ..:eT3J)-)A)A/7*& 22$3<R;S 3  7H 	881? 	9 	
 rW   r   c                     t        d      }|d|d<   i |d<   n|j                  t        t         |             t        t        |      }|S )a3  
        Handles creating a tool call for getting responses in JSON format.

        Args:
            json_schema (Optional[dict]): The JSON schema the response should be in

        Returns:
            AnthropicMessagesTool: The tool call to send to Anthropic API to get responses in JSON format
        r   r{   TadditionalPropertiesr   r   )r   updater
   r   r   )rL   r   r   r   s       rU   r   z:AnthropicConfig._create_json_tool_call_for_response_format  s]     /C/
  59M01*,M,'  &:K!HI%*
 rW   messagesc                 :   g }g }t        |      D ]  \  }}|d   dk(  sd}t        di |}t        |d   t              r0t	        d|d         }d|v r|d   |d<   |j                  |       d}ngt        |d   t              rT|d   D ]J  }	t	        |	j                  d	      |	j                  d            }d|	v r|	d   |d<   |j                  |       L d}|s|j                  |        t        |      d
kD  r!t        |      D ]  }|j                  |        |S )z
        Translate system message to anthropic format.

        Removes system message from the original list and returns a new list of anthropic system message content.
        rolerI   Fcontentr   )r|   r   r   Tr|   r   rZ   )	enumerater'   r   r   r   rp   r   r   r   reversedpop)
rL   r  system_prompt_indicesanthropic_system_message_listidxmessagevalid_contentsystem_message_block anthropic_system_message_content_contents
             rU   translate_system_messagez(AnthropicConfig.translate_system_message%  s_    !#MO%%h/LCv(*&+'B'MW'M$29=sC7T#1)<84 '*>>0A 9I 2888 %)M	 2D9$+I$69%-\\&%9%-\\&%9 9 +h6 ( 9 =_M 6<<< %7 %)M )005I 0J $%) 56S! 7 -,rW   c                 h   d}|D ]J  }|j                  dd      }|st        |t              s)|D ]  }|j                  dd      }|dk(  sd} J L |r^|D ]=  }|j                  dd      }	|	st        |	t              s)|	j	                  d      s;|c S  |j                  t        dd	             |S )
z:if 'container_upload' in messages, add code_execution toolFr  Nr|   container_uploadTr@   code_execution_20250522r   )r   r   r   r   r   rp   r   )
rL   r  rg   add_code_execution_toolr  message_contentr  content_typer   	tool_types
             rU   r  z'AnthropicConfig.add_code_execution_toolZ  s     #(G%kk)T:O:ot#D.G#*;;vt#<L#'9926/	  /   # HHVT2	"9c2!,,-=> L  LL*)2 rW   litellm_paramsr   c           	      z   	 ddl m} d|vrW|Ut        |      rJt        j                  r"| j                  t        d            \  |d<   }nt        j                  ddd	      | j                  |
      }t        |      dkD  r||d<   	  |||d      }	t        t        t         t"        t$        t&        f         |j)                  d            xs g }| j+                  |	|      }t        |      dkD  r||d<   t        j,                  j/                         }|j1                         D ]  \  }}||vs|||<    |j)                  dd      }|r1t3        |t4              r!d|v r|d   t7        |d         r
d|d   i|d<   ||	d|}|S # t        $ r+}
t        ddj                  t        |
      |            d}
~
ww xY w)z9
        Translate messages to anthropic format.
        r   )anthropic_messages_ptrg   NrY   )r\   zAnthropic doesn't support tool calling without `tools=` param specified. Pass `tools=` param OR set `litellm.modify_params = True` // `litellm_settings::modify_params: True` to add dummy tool to the request.r   )r  rb   llm_providerr  rI   )rb   r  r  i  z{}
Received Messages={})status_coder  )r  rg      rH   r   )rb   r  )3litellm.litellm_core_utils.prompt_templates.factoryr  r5   r   modify_paramsr   r4   UnsupportedParamsErrorr  r   	Exceptionr9   formatr   r
   r   r   r	   r   r   r   r  rB   r`   rO   r   r   r   )rL   rb   r  r   r  r   r  _r  anthropic_messagese_toolsrg   configr   r   _litellm_metadatadatas                     rU   transform_requestz!AnthropicConfig.transform_request|  s   		

 ?*$$X.$$.2oo"{C/+(! 44 n!,  )-(E(Ex(E(X%,-1(EOH%
	!6!(" e$;T$ABCD##G,   	 ,,6HPV,Wu:>',OG$ ((335LLNDAq(%&"	 # +..z4@,d3..!),80;<+46G	6R*SOJ' *
 
 W  	 299#a&(K 	s   	F 	F:&F55F:r   
tool_callsc                     d }|du r[t        |      dk(  rMd }d|d   d   v r)|d   d   d   t        k(  r|d   d   j                  d      }|t        j	                  |      }|S )NTr   r   r   r   	arguments)r.  )r   r   r   rB   !_convert_tool_response_to_message)rL   r   r.  _messagejson_mode_content_strs        rU   !_transform_response_for_json_modez1AnthropicConfig._transform_response_for_json_mode  s    
 .2ZA!537!*Q-
33qM*-f59RR(21j(A(E(Ek(R%$0*LL) M  rW   completion_responsec                    d}d }d }d }g }t        |d         D ]  \  }}|d   dk(  r	||d   z  }n|d   dk(  rF|j                  t        |d   dt        |d   t	        j
                  |d	         
      |             na|j                  dd       $|g }|j                  t        t        |             n+|d   dk(  r#|g }|j                  t        t        |             |j                  d      |g }|j                  |d           |7d}|D ]0  }	t        t        t           |	j                  d            }
|
,||
z  }2 |||||fS )Nr   r  r|   r   tool_useidr   r   input)r   r0  )r8  r|   r   indexrn   redacted_thinking	citations)r  rp   r)   r*   jsondumpsr   r
   r(   r&   r   r   )rL   r5  text_contentr<  thinking_blocksreasoning_contentr.  r  r  blockthinking_contents              rU   extract_response_contentz(AnthropicConfig.extract_response_content  s    )-	
 	 	
 ,08:
%&9)&DELCv&(/J.!!/"4='!D!(&*jj1A&B" "
 Z.:"*&(O&&t,G'QR$77"*&(O&&<gF
 {{;'3$ "I  !56A FB & "(#'uyy7L#M #/%)99% )
 Y9JJVVrW   usage_objectrA  c                    |j                  dd      xs d}|j                  dd      xs d}|}d}d}d }d|v r
|d   |d   }d|v r|d   
|d   }||z  }d|v r*|d   %d|d   v r|d   d   t        t        |d   d         }t        |      }	|rt	        t        |d	
            nd }
||z   }t        ||||	|||
|t        |      nd       }|S )Ninput_tokensr   output_tokenscache_creation_input_tokenscache_read_input_tokensserver_tool_useweb_search_requests)cached_tokensT)r   count_response_tokens)reasoning_tokens)rL  )prompt_tokenscompletion_tokenstotal_tokensprompt_tokens_detailsrI  rJ  completion_tokens_detailsrK  )r   r
   intr0   r.   r7   r3   r1   )rL   rE  rA  rP  rQ  _usagerI  rJ  rL  rS  completion_token_detailsrR  usages                rU   calculate_usagezAnthropicConfig.calculate_usage*  sc    %((;@q(,,_a@EA+,#'(-1)V345A*01N*O'%/01=&,-F&G#44M&62C+D+P%0A)BB,-.CDP&* 123HI'# !;1!
 ! +!.*$"  	! %'88'/%"7(C$;&> '2 2EF
 rW   raw_responsemodel_responseprefix_promptc                    i }t        t        |j                              |d<   d|v r1t        |dd       }t	        t        |d         |j                  |      d}d }	d }
d }g }| j                  |      \  }}	}
}}|&|j                  |      st        j                  s||z   }t        j                  ||xs d |	|
d|
|      }| j                  ||	      }|d
|d<   |}||j                  d   _        |d   |j                  d<   t!        |d         |j                  d   _        | j%                  |d   |      }t'        |d|       t)        t+        j*                               |_        |d   |_        ||_        |S )Nadditional_headerserrorr   r  r  r   r   )r5  )r<  r@  )r.  r  provider_specific_fieldsr@  rA  )r   r.  re   stop_reasonr   r  original_responserX  )rE  rA  rb   )r;   r   r   getattrr9   r   r  rD  r   r   disable_add_prefix_to_promptr/   r4  choicesr  _hidden_paramsr   finish_reasonrY  rP   rU  timecreatedrb   )rL   r5  rZ  r[  r   r\  rg  response_headersr?  r<  r@  rA  r.  r2  json_mode_messagerX  s                   rU   transform_parsed_responsez)AnthropicConfig.transform_parsed_responsef  s     "/H%%&0
+, ))&|YE /89(44(  L-1I   04<>J --BU-V! )$//><<,|;%$,!*'6* !0"3	H !% F F#% !G ! !,5;#M2,08N""1%-ATBN))*=> 7H#M27N""1%3
 $$,W5/ % 
 	/!$TYY[!127;(6%rW   c                     t        |      dk(  ry|d   }|j                  d      }|d   dk(  r$|j                  dd      rt        |t              r|S y)	z
        Get the prefix prompt from the messages.

        Check last message
        - if it's assistant message, with 'prefix': true, return the content

        E.g. :    {"role": "assistant", "content": "Argentina", "prefix": True}
        r   Nr  r  	assistantprefixF)r   r   r   r   )rL   r  r  r  s       rU   get_prefix_promptz!AnthropicConfig.get_prefix_prompt  sW     x=A2,!++i0FO{*He,?C0""rW   logging_objrequest_dataencodingapi_keyc                 l   |j                  ||
|j                  d|i       	 |j                         }| j                  |      }| j                  |||||      }|S # t        $ rM}t	        |dd       }t        dj                  t        |      |j                        |j                  |      d }~ww xY w)Ncomplete_input_dict)r9  rv  rc  additional_argsr   z7Unable to get json response - {}, Original Response: {}r`  r  )r5  rZ  r[  r   r\  )	post_callr   r=  r$  rd  r9   r%  r   r  rr  rm  )rL   rb   rZ  r[  rs  rt  r  r   r  ru  rv  r   r5  r(  rk  r\  s                   rU   transform_responsez"AnthropicConfig.transform_response  s     	*//2LA	 	 	

	"."3"3"5 ...A77 3%)' 8 
 '  	&|YE QXXFL-- )44( 	s   A 	B3&AB..B3c                    | d   d   j                  d      }	 |t        j                  |      }t        |t              r>|j                  d      x}+t        j                  t        j                  |            }|S t        j                  t        j                  |            }|S 	 y# t        j                  $ r t        j                  |      cY S w xY w)z
        In JSON mode, Anthropic API returns JSON schema as a tool call, we need to convert it to a message to follow the OpenAI format

        r   r   r0  Nvalues)r  )	r   r=  loadsr   r   r   r/   r>  JSONDecodeError)r.  r3  argsr}  r2  s        rU   r1  z1AnthropicConfig._convert_tool_response_to_message  s     0:!}Z/H/L/L0
	B$0zz"78tT*#'88H#55B&tzz&7IJH#O  'tzz$7GHH#O 1   ## 	B??+@AA	Bs   A$B+ >*B+ +)CCerror_messager  c                 N    t        ||t        t        j                  |            S )N)r  r  r   )r9   r
   httpxHeaders)rL   r  r  r   s       rU   get_error_classzAnthropicConfig.get_error_class$  s%     #!0
 	
rW   r^   )NN)O__name__
__module____qualname____doc__r   rC   r   rU  r   rD   r   rE   rF   rG   rH   r   rI   r   rV   propertyr\   classmethodr`   rr   r	   r   r   ru   rw   boolr   r   r+   r   r   r   r   r,   r   r   r   r   staticmethodr#   r    r   r   r   r-   r!   r   r   r   r$   r   r  r   r  r-  r)   LitellmMessager4  r(   r&   rD  r3   rY  r  Responser2   rm  rr  LoggingClassr{  r1  r  r   r  __classcell__)rQ   s   @rU   rB   rB   I   s    	*   &*NHTN)!%K#%E8C=E8C=#Hhtn# FHSM  .)-%)###' $4
4
 !4 c]4 }4 }4 4.4 4 
4" Xc]   $ $ 6
$S$_5
	$

4 
#C==Ed^	-	.@])+])	x/0(;Q2RR	S])~'	>,,	t+,d3I.JJ	K,"U3S	>23	$s)	, O"5)93)>#?@O	(	)O O.d^6:QU	'	(6&%& 
 &>S S S 	S
 S 
Sn '+d^ 
<3--.3-	+	,3-j 01  E14789  
e+T12	3	 DZZ '(Z 	Z
 Z Z 
ZxD> 45 
.	!	(<WD <WUc13VVW	

 	()	+
F <W|: :5=c]:	:B %)'+X!X nnX &	X
 D>X  }Xt$/?*@ Xc] D "&$(,, nn, &	,
 ", , '(, , , , #, D>, 
,\ 45	.	! <
 
/2
=B4CV=W
	
rW   rB   r   rJ   c                 h    d}d}t        j                  ||       ryt        j                  ||       ryy)z
    Validate that user_id is not an email or phone number.
    Returns: bool: True if valid (not email or phone), False otherwise
    z0^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$z^\+?[\d\s\(\)-]{7,}$FT)rematch)r   email_patternphone_patterns      rU   r   r   .  s4    
 HM+M	xxw'	xxw'rW   )Pr=  r  ri  typingr   r   r   r   r   r   r	   r
   r  r   litellm.constantsr   r   r   r   r   r   'litellm.litellm_core_utils.core_helpersr    litellm.llms.base_llm.base_utilsr   )litellm.llms.base_llm.chat.transformationr   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   litellm.types.llms.openair#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   litellm.types.utilsr.   r/   r  r0   r1   litellm.utilsr2   r3   r4   r5   r6   r7   common_utilsr9   r:   r;   *litellm.litellm_core_utils.litellm_loggingr<   LiteLLMLoggingObjr  r   rB   r   r  r   rZ   rW   rU   <module>r     s     	  O O O    F J R       ? 9 I  Y XW$LL Q b
(* b
JC D rW   