o
    i                     @   s   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
 d
eZG dd dee ZdS )zOpenAI LLM adapter for Pipecat.    N)AnyDictList	TypedDict)NotGiven)ChatCompletionMessageParam#ChatCompletionToolChoiceOptionParamChatCompletionToolParam)BaseLLMAdapter)ToolsSchema)
LLMContextLLMContextMessageLLMContextToolChoiceLLMSpecificMessager   c                   @   s:   e Zd ZU dZee ed< ee eB ed< e	eB ed< dS )OpenAILLMInvocationParamsz@Context-based parameters for invoking OpenAI ChatCompletion API.messagestoolstool_choiceN)
__name__
__module____qualname____doc__r   r   __annotations__r	   OpenAINotGivenr    r   r   ]/home/ubuntu/.local/lib/python3.10/site-packages/pipecat/adapters/services/open_ai_adapter.pyr      s
   
 r   c                   @   s   e Zd ZdZedefddZdedefddZ	de
dee fd	d
Zdedeeeef  fddZdee dee fddZdeeB deeB fddZdS )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                 C   s   dS )zCGet the identifier used in LLMSpecificMessage instances for OpenAI.openair   )selfr   r   r   id_for_llm_specific_messages1   s   z-OpenAILLMAdapter.id_for_llm_specific_messagescontextc                 C   s"   |  | || |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!   r   r   r   get_llm_invocation_params6   s   

z*OpenAILLMAdapter.get_llm_invocation_paramstools_schemac                 C   s   |j }dd |D S )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.
        c                 S   s   g | ]
}t d | dqS )function)typer'   )r	   to_default_dict).0funcr   r   r   
<listcomp>Q   s    z=OpenAILLMAdapter.to_provider_tools_format.<locals>.<listcomp>)standard_tools)r   r&   functions_schemar   r   r   to_provider_tools_formatF   s   
z)OpenAILLMAdapter.to_provider_tools_formatc                 C   s   g }|  |D ]N}t|}d|v rAt|d trA|d D ]#}|d dkr4|d d dr4d|d d< |d dkr@d|d d	< qd
|v rP|d
 drPd|d	< || q|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itemr   r   r   get_messages_for_loggingV   s    
z)OpenAILLMAdapter.get_messages_for_loggingr   c                 C   s4   g }|D ]}t |tr||j q|| q|S N)r8   r   r;   r=   )r   r   resultr=   r   r   r   r"   q   s   
z1OpenAILLMAdapter._from_universal_context_messagesr   c                 C   s   |S rA   r   )r   r   r   r   r   _from_standard_tool_choice~   s   z+OpenAILLMAdapter._from_standard_tool_choiceN)r   r   r   r   propertystrr    r   r   r%   r   r   r	   r/   r   r   r@   r   r   r"   r   r   r   r   rC   r   r   r   r   r   &   s"    

r   )r   r6   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   r   <module>   s   	