
    j<                        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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*m+Z+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 d d	l9m:Z:m;Z; d d
l9m<Z= d dl9m>Z>m?Z? d dl@mAZAmBZBmCZCmDZDmEZEmFZF ddlGmHZHmIZImJZJ er	d dlKmLZM eMZNneZN G d deIe      ZOdePdeQfdZRy)    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_BUDGET0DEFAULT_REASONING_EFFORT_MINIMAL_THINKING_BUDGETRESPONSE_FORMAT_TOOL_NAME)map_finish_reasontype_to_response_format_param)
BaseConfigBaseLLMException)ANTHROPIC_BETA_HEADER_VALUESANTHROPIC_HOSTED_TOOLS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)CacheCreationTokenDetailsCompletionTokensDetailsWrapper)Message)PromptTokensDetailsWrapperServerToolUse)ModelResponseUsageadd_dummy_toolhas_tool_call_blockssupports_reasoningtoken_counter   )AnthropicErrorAnthropicModelInfoprocess_anthropic_headers)Loggingc                       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	 dGd'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
dfd-Z:d,ed ed
efd.Z;ded)e'e5   d ed/ed,ed
efd0Z<d1ee   d2e'e=   d
ee>   fd3Z?d4ed
e!eee'e      ee'ee@eAf         ee   e'e=   f   fd5ZBd6ed7ee   d
eCfd8ZD	 	 dHd4ed9eEj                  d:eGd1ee   d;ee   f
d<ZHd)e'e5   d
ee   fd=ZI	 	 dHded9eEj                  d:eGd>eJd?ed)e'e5   d ed/ed@edAee   d1ee   d
eGfdBZKe*d2e'e=   d
ee>   fdC       ZLdDedEed,eeeEj                  f   d
eNfdFZO xZPS )I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              /Users/manta/Documents/Projects/TheRoad-I1/backend/.venv/lib/python3.12/site-packages/litellm/llms/anthropic/chat/transformation.py__init__zAnthropicConfig.__init__]   sA     (--/!--/JCf}!2U3 *    c                      y)N	anthropic rL   s    rU   custom_llm_providerz#AnthropicConfig.custom_llm_providern   s    rW   c                      t         |          S N)super
get_config)clsrQ   s    rU   r`   zAnthropicConfig.get_configr   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)r:   r\   append)rL   rb   paramss      rU   get_supported_openai_paramsz+AnthropicConfig.get_supported_openai_paramsv   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-version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   ry   _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#     L5Kf((+5Ks   !z Missing required parameter: namer}   r   urlmcpzUnsupported tool type: cache_controlrZ   )r   setr   __annotations__keysrO   r    r   
ValueErrorr   r   r   r   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   s    <@7;
<:%f)A"&z"2"6"6$"$#M #&&:&J&J&O&O&Q"R!.!4!4!6%!6A!?R:R1!6 " % <P <'<" **%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((c%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_tools?  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_sequencesP  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 | dk(  rt        dt              S t        d|        )Nlowenabled)r}   budget_tokensmediumhighminimalzUnmapped reasoning effort: )r#   r   r   r   r   r   )ro   s    rU   _map_reasoning_effortz%AnthropicConfig._map_reasoning_effortf  s     #&)J  ))M  ')K  *)N 
 :;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_tool  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_20250305
web_searchr   user_locationapproximater|   r}   search_context_sizemax_uses)	r
   r0   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                 r   | 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(  rEt        |t              r5| j!                  t#        t$        |            }| j                  ||g       |dk(  s||d<     | j'                  ||       |S )N)r   rC   rf   rg   )r   rg   r   rh   rj   )rh   ry   rd   Tre   rD   rE   rF   rk   r   r   r}   	json_moderl   user_idrH   rn   ro   rm   ri   )r   r   )r   rO   r   _add_tools_to_optional_paramsr   r   r   r   r   r   r   r   r   _valid_user_idrB   r   r   r
   r0   +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  /)380G 7L 	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_message2  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_uploadTcode_execution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_toolg  s     #(G%kk)T:O:ot#D.G#*;;vt#<L#'9926/	  /   # HHVT2	"9c2!,,-=> L  LL*)2 rW   r   c                     t         j                  j                  }|j                  d      }|||d<   y |j	                  d      D cg c]  }|j                          }}||vr| d| |d<   y y c c}w )Nrw   ,z, )r   CONTEXT_MANAGEMENT_2025_06_27rT   r   splitstrip)rL   r   
beta_valueexisting_betabetaexisting_valuess         rU   &_ensure_context_management_beta_headerz6AnthropicConfig._ensure_context_management_beta_header  s    1OOUU
$45 (2G$%4A4G4G4LM4LD4::<4LM_,+8/J<(HG$% - Ns   A0c                    |j                  dg       }|D ]  }|j                  dd      rV|j                  d      j                  t        j                  j                        rt
        j                  j                  |d<   k|j                  dd      s~|j                  d      j                  t        j                  j                        st
        j                  j                  |d<    |j                  d      | j                  |       |S )z,Update headers with optional anthropic beta.rg   r}   Nrw   context_management)
r   r   r   	WEB_FETCHrT   r   WEB_FETCH_2025_09_10MEMORYr  r&  )rL   r   r   _toolsr   s        rU   +update_headers_with_optional_anthropic_betaz;AnthropicConfig.update_headers_with_optional_anthropic_beta  s     !$$Wb1Dxx%$((6*:*E*E&0066+ 1EEKK () &$'DHHV,<,G,G&--33-
 1NNTT $  34@77@rW   litellm_paramsc           	         	 ddl m} d|vrW|Ut        |      rJt        j                  r"| j                  t        d            \  |d<   }nt        j                  ddd	      | j                  ||
      }| 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.                  j1                         }|j3                         D ]  \  }}||vs|||<    |j+                  dd      }|r1t5        |t6              r!d|v r|d   t9        |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   r   r  rI   )rb   r  r1  i  z{}
Received Messages={})status_coder  )r  rg      rH   r   )rb   r  )3litellm.litellm_core_utils.prompt_templates.factoryr0  r9   r   modify_paramsr   r8   UnsupportedParamsErrorr-  r  r   	Exceptionr=   formatr   r
   r   r   r	   r   r   r   r  rB   r`   rO   r   r   r   )rL   rb   r  r   r.  r   r0  _r  anthropic_messageser,  rg   configr   r   _litellm_metadatadatas                     rU   transform_requestz!AnthropicConfig.transform_request  s,   		

 ?*$$X.$$.2oo"{C/+(! 44 n!,  BB_ C 

 )-(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 	G"&GG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 )NTr4  r   r   r   	arguments)rA  )r   r   r   rB   !_convert_tool_response_to_message)rL   r   rA  _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   D 	cg c]  }	i |	d|j                  dd      i c}	        |7d}|D ]0  }
t        t        t           |
j                  d            }|,||z  }2 |||||fS c c}	w )Nr   r  r}   r   tool_useidr   r   input)r   rC  )rK  r}   r   indexrn   redacted_thinking	citationssupported_text)r	  rp   r,   r-   jsondumpsr   r
   r+   r)   r   r   )rL   rH  text_contentrO  thinking_blocksreasoning_contentrA  r  r  citation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   )0(<
 )=H	&,gkk&".E )=A FR & "(#'uyy7L#M #/%)99% )
 Y9JJVVs   E1
usage_objectrU  c                 ,   |j                  dd      xs d}|j                  dd      xs d}|}d}d}d }d }	d|v r|d   
|d   }||z  }d|v r|d   
|d   }||z  }d|v r*|d   %d|d   v r|d   d   t        t        |d   d         }	d|v r6|d   1t        |d   j                  d	      |d   j                  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cache_creationephemeral_5m_input_tokensephemeral_1h_input_tokens)rc  rd  )cached_tokenscache_creation_tokenscache_creation_token_detailsT)r   count_response_tokens)reasoning_tokens)ra  )prompt_tokenscompletion_tokenstotal_tokensprompt_tokens_detailsr^  r_  completion_tokens_detailsr`  )	r   r
   intr1   r4   r2   r;   r7   r5   )rL   rZ  rU  rj  rk  _usager^  r_  rg  ra  rm  completion_token_detailsrl  usages                 rU   calculate_usagezAnthropicConfig.calculate_usagec  s    %((;@q(,,_a@EA+,#'(LP$-1)V345A*01N*O'88M%/01=&,-F&G#44M&62C+D+P%0A)BB,-.CDP&* 123HI'# v%&1A*B*N+D*01A*B*F*F/+ +11A*B*F*F/+	,( !;1"=)E!
 ! +!.*$"  	! %'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   }|j                  d      }|	|
d}|||d<   t        j                  ||xs d ||
|	      }| j                  ||
      }|d|d<   |}||j                  d   _        |d   |j                   d<   t#        |d         |j                  d   _        | j'                  |d   |      }t)        |d|       t+        t-        j,                               |_        |d   |_        |j                  d      }|||d<   	 ||j2                  d<   ||_        |S # t4        $ r Y w xY w)Nadditional_headerserrorr   r  r3  r   r   )rH  r(  )rO  rT  )rA  r  provider_specific_fieldsrT  rU  )r   rA  re   stop_reasonr   r  original_responserr  )rZ  rU  rb   )r?   r   r   getattrr=   r   r3  rY  r   r   disable_add_prefix_to_promptr   r3   rG  choicesr  _hidden_paramsr   finish_reasonrs  rP   ro  timecreatedrb   __dict__r8  )rL   rH  rt  ru  r   rv  r  response_headersrS  rO  rT  rU  rA  r(  r{  rE  json_mode_messagerr  context_management_responses                      rU   transform_parsed_responsez)AnthropicConfig.transform_parsed_response  sm     "/H%%&0
+, ))&|YE /89(44(  L-1I   04<>J --BU-V! )$//><<,|;1D1H1H$2
 '#28$ "-AS()=>%$,)A /"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;&9&=&=>R&S#&23NN/0/ ''(<= )7%  s   (G   	GG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)rL  r  r}  additional_argsr   z7Unable to get json response - {}, Original Response: {}rz  r2  )rH  rt  ru  r   rv  )	post_callr   rQ  r8  r~  r=   r9  r   r3  r  r  )rL   rb   rt  ru  r  r  r  r   r.  r  r  r   rH  r<  r  rv  s                   rU   transform_responsez"AnthropicConfig.transform_response0  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   rC  Nvalues)r  )	r   rQ  loadsr   r   r   r3   rR  JSONDecodeError)rA  rF  argsr  rE  s        rU   rD  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_messager3  c                 N    t        ||t        t        j                  |            S )N)r3  r  r   )r=   r
   httpxHeaders)rL   r  r3  r   s       rU   get_error_classzAnthropicConfig.get_error_class}  s%     #!0
 	
rW   r^   )NN)Q__name__
__module____qualname____doc__r   rC   r   ro  r   rD   r   rE   rF   rG   rH   r   rI   r   rV   propertyr\   classmethodr`   rr   r	   r   r   ru   rx   boolr!   r   r.   r   r   r   r   r/   r   r   r   r   staticmethodr&   r#   r   r    r   r0   r$   r   r  r   r'   r"   r  r   r  r&  r-  r@  r,   LitellmMessagerG  r+   r)   rY  r7   rs  r  Responser6   r  r  LoggingClassr  rD  r  r   r  __classcell__)rQ   s   @rU   rB   rB   L   s"    	*   &*NHTN)!%K#%E8C=E8C=#Hhtn# FHSM  .)-%)###' $4
4
 !4 c]4 }4 }4 4.4 4 
4" Xc]   $ $ 4
$S$_5
	$

4 
#C==Ed^	-	.@a)+a)	x/0(;Q2RR	Sa)F'	>,,	t+,d3I.JJ	K,"U3S	>23	$s)	, O"5)93)>#?@O	(	)O O8d^6:QU	'	(6&%& 
 &>U U U 	U
 U 
Ur '+d^ 
<3--.3-	+	,3-j 01  E14789  
e+T12	3	 DId It I.2	,^^ '(^ 	^
 ^ ^ 
^@D> 45 
.	!	(DWD DWUc13VVW	

 	()	+
F DWLH H5=c]H	H^ %)'+j!j nnj &	j
 D>j  }jX$/?*@ 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   )SrQ  r  r  typingr   r   r   r   r   r   r	   r
   r  r   litellm.constantsr   r   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#   r$   r%   litellm.types.llms.openair&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   litellm.types.utilsr1   r2   r3   r  r4   r5   litellm.utilsr6   r7   r8   r9   r:   r;   common_utilsr=   r>   r?   *litellm.litellm_core_utils.litellm_loggingr@   LiteLLMLoggingObjr  rB   r   r  r   rZ   rW   rU   <module>r     s     	  O O O     F J R    "    : I  Y XW$LLx
(* x
v!C D rW   