
    qi?                         d Z ddlZddlZddlmZ ddlmZmZmZm	Z	 ddl
mZ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 ddlmZ ddlmZmZmZmZ  G d de	      Z G d dee         Zy)z"Anthropic LLM adapter for Pipecat.    N)	dataclass)AnyDictList	TypedDict)	NOT_GIVENNotGiven)MessageParam)ToolUnionParam)logger)BaseLLMAdapter)FunctionSchema)ToolsSchema)
LLMContextLLMContextMessageLLMSpecificMessageLLMStandardMessagec                   B    e Zd ZU dZeez  ed<   ee   ed<   ee	   ed<   y)AnthropicLLMInvocationParamsz:Context-based parameters for invoking Anthropic's LLM API.systemmessagestoolsN)
__name__
__module____qualname____doc__strr	   __annotations__r   r
   r        ]/opt/pipecat/venv/lib/python3.12/site-packages/pipecat/adapters/services/anthropic_adapter.pyr   r      s%    D(N<  r    r   c                      e Zd ZdZedefd       Zdedede	fdZ
dedeeeef      fdZe G d d	             Zd
ee   defdZdedefdZdedefdZdedefdZdee   dee   fdZededeeef   fd       Zdedeeeef      fdZy)AnthropicLLMAdapterzAdapter for converting tool schemas to Anthropic's function-calling format.

    This adapter handles the conversion of Pipecat's standard function schemas
    to the specific format required by Anthropic's Claude models for function calling.
    returnc                      y)zFGet the identifier used in LLMSpecificMessage instances for Anthropic.	anthropicr   )selfs    r!   id_for_llm_specific_messagesz0AnthropicLLMAdapter.id_for_llm_specific_messages-   s     r    contextenable_prompt_cachingc                     | j                  | j                  |            }|j                  |r| j                  |j                        n|j                  | j                  |j                        xs g dS )aR  Get Anthropic-specific LLM invocation parameters from a universal LLM context.

        Args:
            context: The LLM context containing messages, tools, etc.
            enable_prompt_caching: Whether prompt caching should be enabled.

        Returns:
            Dictionary of parameters for invoking Anthropic's LLM API.
        )r   r   r   ) _from_universal_context_messagesget_messagesr   _with_cache_control_markersr   from_standard_toolsr   )r'   r)   r*   r   s       r!   get_llm_invocation_paramsz-AnthropicLLMAdapter.get_llm_invocation_params2   sm     889J9J79SToo ) 001B1BC&& --gmm<B	
 		
r    c                 Z   | j                  | j                  |            j                  }g }|D ]y  }t        j                  |      }d|v rMt        |d   t              r:|d   D ]2  }|d   dk(  rd|d   d<   |d   dk(  s|j                  d      s.d|d<   4 |j                  |       { |S )	aZ  Get messages from a universal LLM context in a format ready for logging about Anthropic.

        Removes or truncates sensitive data like image content for safe logging.

        Args:
            context: The LLM context containing messages.

        Returns:
            List of messages in a format ready for logging about Anthropic.
        contenttypeimagez...sourcedatathinking	signature)	r,   r-   r   copydeepcopy
isinstancelistgetappend)r'   r)   r   messages_for_loggingmessagemsgitems          r!   get_messages_for_loggingz,AnthropicLLMAdapter.get_messages_for_loggingJ   s     889J9J79ST]]  " 		-G--(CCc)nd3 #I 6<725:DN62<:5$((;:O05D-	6
 !'',		- $#r    c                   2    e Zd ZU dZee   ed<   eez  ed<   y)%AnthropicLLMAdapter.ConvertedMessageszLContainer for Anthropic-formatted messages converted from universal context.r   r   N)	r   r   r   r   r   r
   r   r   r	   r   r    r!   ConvertedMessagesrE   f   s    Z|$$hr    rF   universal_context_messagesc                    t         }g }	 |D cg c]  }| j                  |       }}|r;|d   d   dk(  r0t        |      dk(  r	d|d   d<   n|d   d   }|j                  d       |D ]  }|d   dk(  sd|d<    d}|t        |      dz
  k  r||   }||dz      }	|d   |	d   k(  rjt        |d   t              rd|d   d	g|d<   t        |	d   t              rd|	d   d	g|	d<   |d   j                  |	d          |j                  |dz          n|dz  }|t        |      dz
  k  r|D ]R  }t        |d   t              r|d   d
k(  rd|d<   $t        |d   t              s8t        |d         dk(  sJddd	g|d<   T | j                  ||      S c c}w # t        $ r#}t        j                  d|        Y d }~d }~ww xY w)NzError mapping messages: r   roler      userr2   textr3   rL    (empty))r   r   )r   _from_universal_context_message	Exceptionr   errorlenpopr;   r   extendr<   rF   )
r'   rG   r   r   mer@   icurrent_messagenext_messages
             r!   r,   z4AnthropicLLMAdapter._from_universal_context_messagesm   s)    	9IcdA<<Q?dHd
 F+x78}! '-F# "!Y/Q   	)Gv(*"(	)
 #h-!##&qkO#AE?Lv&,v*>>oi8#>!'1KL2OI. l95s;8>U^H_/`.aL+	*11,y2IJQU#Q! #h-!##&   	KG'),c2wy7IR7O%.	"GI.5#gi>P:QUV:V/5y&I%J	"		K %%x%GGc e 	9LL3A3788	9s'   F FF F 	GF<<Gr@   c                 f    t        |t              r| j                  |      S | j                  |      S )N)r;   r    _from_anthropic_specific_message_from_standard_message)r'   r@   s     r!   rP   z3AnthropicLLMAdapter._from_universal_context_message   s/    g1288AA**733r    c                 8   t        |j                  t              rb|j                  j                  d      dk(  rD|j                  j                  d      x}r'|j                  j                  d      x}r
dd||dgdS t	        j
                  |j                        S )	a'  Convert LLMSpecificMessage to Anthropic format.

        Anthropic-specific messages may either be special thought messages that
        need to be handled in a special way, or messages already in Anthropic
        format.

        Args:
            message: Anthropic-specific message.
        r3   thoughtrL   r8   	assistantr7   )r3   r7   r8   rI   r2   )r;   r@   dictr=   r9   r:   )r'   r@   rL   r8   s       r!   r\   z4AnthropicLLMAdapter._from_anthropic_specific_message   s      w-##F+y8 ,,V444%oo11+>>> $ !+$(%.	 	 }}W__--r    c                    t        j                  |      }|d   dk(  rdd|d   |d   dgdS |j                  d	      rQ|d	   }d
g d}|D ]@  }|d   }t        j                  |d         }d|d   |d   |d}|d   j                  |       B |S |j                  d      }t        |t              r	|dk(  rd}|S t        |t              rj|D ]  }	|	d   dk(  r|	d   dk(  rd|	d<   |	d   dk(  s!|	d   d   j                  d      rR|	d   d   }
|
j                  d      d   j                  d      d   }d|	d<   d||
j                  d      d   d|	d <   |	d= |	d   d   j                  d!      rd|	d<   d|	d   d   d"|	d <   |	d= |	d   d   }
t        j                  d#|
         t        |      D 	cg c]  \  }}	|	d   dk(  s| }}}	t        |      D 	cg c]  \  }}	|	d   dk(  s| }}}	t        |      dk(  r4|r2|d   }|d   }||kD  r#|j                  |      }|j!                  ||       |S c c}	}w c c}	}w )$ae  Convert standard universal context message to Anthropic format.

        Handles conversion of text content, tool calls, and tool results.
        Empty text content is converted to "(empty)".

        Args:
            message: Message in standard universal context format.

        Returns:
            Message in Anthropic format.

        Examples:
            Input standard format::

                {
                    "role": "assistant",
                    "tool_calls": [
                        {
                            "id": "123",
                            "function": {"name": "search", "arguments": '{"q": "test"}'}
                        }
                    ]
                }

            Output Anthropic format::

                {
                    "role": "assistant",
                    "content": [
                        {
                            "type": "tool_use",
                            "id": "123",
                            "name": "search",
                            "input": {"q": "test"}
                        }
                    ]
                }
        rI   toolrK   tool_resulttool_call_idr2   )r3   tool_use_idr2   ra   
tool_callsr`   function	argumentstool_useidname)r3   rl   rm   inputrN   rO   r3   rL   	image_urlurlzdata::rJ   ;r   r4   base64,)r3   
media_typer6   r5   http)r3   rp   zUnsupported 'image_url': )r9   r:   r=   jsonloadsr>   r;   r   r<   
startswithsplitr   warning	enumeraterS   rT   insert)r'   r@   tcret	tool_callri   rj   new_tool_user2   rB   rp   	mime_typerX   image_indicestext_indicesimg_idxfirst_txt_idx
image_items                     r!   r]   z*AnthropicLLMAdapter._from_standard_message   s   N --(6?f$ !.'.~'>#*9#5	 	 ;;|$&B&26C 	4	$Z0 JJx'<=	&#D/$V,&	  I%%l3	4 J++i(gs#"}#X W & J<6)d6lb.@#,DL<;.K(/::7C";/6$'IIcN1$5$;$;C$@$C	'.V$,*3$'IIcN1$5*X
 !-k*51<<VD'.V$)#'#4U#;*X !-";/6)B3%'HI5J@ /8.@\71dDLT[D[Q\M\-6w-?Z'!T4<SYCYAZLZ=!Q&<'* ,Q]*!(W!5JNN=*= ]Zs   5H7H7H=,H=r   c                 d   dt         fd}	 t        j                  |      }g }t        t	        |      dz
  dd      D ]/  }||   d   dk(  s|j                  |       t	        |      dk(  s/ n |D ]  } |||           |S # t        $ r$}t        j                  d|        cY d	}~S d	}~ww xY w)
zAdd cache control markers to messages for prompt caching.

        Args:
            messages: List of messages in Anthropic format.

        Returns:
            List of messages with cache control markers added.
        r@   c                 \    t        | d   t              rd| d   dg| d<   ddi| d   d   d<   y )Nr2   rL   rM   r3   	ephemeralcache_control)r;   r   )r@   s    r!   add_cache_control_markerzQAnthropicLLMAdapter._with_cache_control_markers.<locals>.add_cache_control_markerM  sA    '),c2/5wy?Q&R%S	"7={6KGIr"?3r    rJ   r   rI   rK      z#Error adding cache control marker: N)	r
   r9   r:   rangerS   r>   rQ   r   rR   )r'   r   r   messages_with_markersuser_message_indicesrX   indexrW   s           r!   r.   z/AnthropicLLMAdapter._with_cache_control_markersC  s    	Ll 	L
	) %)MM($;! $& 34592rB (+F3v=(//2/0A5	 . G()>u)EFG )( 	)LL>qcBC((	)s)   >B B +B 	B/B*$B/*B/ri   c                 f    | j                   | j                  d| j                  | j                  ddS )zConvert a single function schema to Anthropic's format.

        Args:
            function: The function schema to convert.

        Returns:
            Dictionary containing the function definition in Anthropic's format.
        object)r3   
propertiesrequired)rm   descriptioninput_schema)rm   r   r   r   )ri   s    r!   _to_anthropic_function_formatz1AnthropicLLMAdapter._to_anthropic_function_formatr  s8     MM#// &11$--
 	
r    tools_schemac                 b    |j                   }|D cg c]  }| j                  |       c}S c c}w )zConvert function schemas to Anthropic's function-calling format.

        Args:
            tools_schema: The tools schema containing functions to convert.

        Returns:
            List of function definitions formatted for Anthropic's API.
        )standard_toolsr   )r'   r   functions_schemafuncs       r!   to_provider_tools_formatz,AnthropicLLMAdapter.to_provider_tools_format  s/     (66EUVT2248VVVs   ,N)r   r   r   r   propertyr   r(   r   boolr   r0   r   r   r   rC   r   rF   r   r,   r
   rP   r   r\   r   r]   r.   staticmethodr   r   r   r   r   r    r!   r#   r#   &   sE    c  
!
:>
	%
0$
 $tDcN?S $8   9H*./@*A9H	9Hv47H 4\ 4
!.8J !.| !.Fq.@ q\ qf-)D4F -)4P\K] -)^ 
 
4S> 
 
&
W[ 
WT$sTWx.EY 
Wr    r#   ) r   r9   rw   dataclassesr   typingr   r   r   r   r&   r   r	   anthropic.types.message_paramr
    anthropic.types.tool_union_paramr   logurur   !pipecat.adapters.base_llm_adapterr   (pipecat.adapters.schemas.function_schemar   %pipecat.adapters.schemas.tools_schemar   *pipecat.processors.aggregators.llm_contextr   r   r   r   r   r#   r   r    r!   <module>r      sZ    )   ! - - ) 6 ;  < C =  9  jW.)EF jWr    