
    qi                         d Z ddlZddlmZmZ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 ddlmZmZmZmZmZ  G d	 d
e      Z G d dee         Zy)zOpenAI LLM adapter for Pipecat.    N)AnyDictList	TypedDict)NotGiven)ChatCompletionMessageParam#ChatCompletionToolChoiceOptionParamChatCompletionToolParam)BaseLLMAdapter)ToolsSchema)
LLMContextLLMContextMessageLLMContextToolChoiceLLMSpecificMessager   c                   H    e Zd ZU dZee   ed<   ee   ez  ed<   e	ez  ed<   y)OpenAILLMInvocationParamsz@Context-based parameters for invoking OpenAI ChatCompletion API.messagestoolstool_choiceN)
__name__
__module____qualname____doc__r   r   __annotations__r
   OpenAINotGivenr	        [/opt/pipecat/venv/lib/python3.12/site-packages/pipecat/adapters/services/open_ai_adapter.pyr   r      s-    J-..'(>994~EEr   r   c                       e Zd ZdZedefd       ZdedefdZ	de
dee   fdZdedeeeef      fdZd	ee   dee   fd
Zdeez  deez  fdZy)OpenAILLMAdapteraI  OpenAI-specific adapter for Pipecat.

    Handles:

    - Extracting parameters for OpenAI's ChatCompletion API from a universal
      LLM context
    - Converting Pipecat's standardized tools schema to OpenAI's function-calling format.
    - Extracting and sanitizing messages from the LLM context for logging about OpenAI.
    returnc                      y)zCGet the identifier used in LLMSpecificMessage instances for OpenAI.openair   )selfs    r   id_for_llm_specific_messagesz-OpenAILLMAdapter.id_for_llm_specific_messages1   s     r   contextc                     | j                  | j                  |            | j                  |j                        |j                  dS )a  Get OpenAI-specific LLM invocation parameters from a universal LLM context.

        Args:
            context: The LLM context containing messages, tools, etc.

        Returns:
            Dictionary of parameters for OpenAI's ChatCompletion API.
        )r   r   r   ) _from_universal_context_messagesget_messagesfrom_standard_toolsr   r   )r$   r&   s     r   get_llm_invocation_paramsz*OpenAILLMAdapter.get_llm_invocation_params6   sC     ==d>O>OPW>XY--gmm<"..	
 	
r   tools_schemac                 v    |j                   }|D cg c]  }t        d|j                                c}S c c}w )a  Convert function schemas to OpenAI's function-calling format.

        Args:
            tools_schema: The Pipecat tools schema to convert.

        Returns:
            List of OpenAI formatted function call definitions ready for use
            with ChatCompletion API.
        function)typer.   )standard_toolsr
   to_default_dict)r$   r,   functions_schemafuncs       r   to_provider_tools_formatz)OpenAILLMAdapter.to_provider_tools_formatF   sB     (66 )
 $d>R>R>TU
 	
 
s   "6c                 n   g }| j                  |      D ]  }t        j                  |      }d|v rUt        |d   t              rB|d   D ]:  }|d   dk(  r|d   d   j                  d      rd|d   d<   |d   dk(  s3d|d   d	<   < d
|v r|d
   j                  d      rd|d	<   |j                  |        |S )aT  Get messages from a universal LLM context in a format ready for logging about OpenAI.

        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 OpenAI.
        contentr/   	image_urlurlzdata:image/zdata:image/...input_audioz...data	mime_typezimage/)r)   copydeepcopy
isinstancelist
startswithappend)r$   r&   msgsmessagemsgitems         r   get_messages_for_loggingz)OpenAILLMAdapter.get_messages_for_loggingV   s     ((1 	G--(CCc)nd3 #I @<;6#K07BB=Q;K[ 1% 8<=8:?D/7@ c!c+&6&A&A(&K#FKK	 r   r   c                     g }|D ]?  }t        |t              r|j                  |j                         /|j                  |       A |S N)r>   r   rA   rC   )r$   r   resultrC   s       r   r(   z1OpenAILLMAdapter._from_universal_context_messagesq   sH      	'G'#56goo. g&	' r   r   c                     |S rH   r   )r$   r   s     r   _from_standard_tool_choicez+OpenAILLMAdapter._from_standard_tool_choice~   s
     r   N)r   r   r   r   propertystrr%   r   r   r+   r   r   r
   r4   r   r   rF   r   r   r(   r   r   r	   r   rK   r   r   r   r    r    &   s     c  
 
@Y 
 
[ 
TJaEb 
 
 tDcN?S 6./	(	)/(:	,~	=r   r    )r   r<   typingr   r   r   r   openai._typesr   r   openai.types.chatr   r	   r
   !pipecat.adapters.base_llm_adapterr   %pipecat.adapters.schemas.tools_schemar   *pipecat.processors.aggregators.llm_contextr   r   r   r   r   r    r   r   r   <module>rT      sT    &  - - 4  = = F	 F\~&?@ \r   