
    qi"                         d Z ddlZddl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ej                  d	<   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 e G d de             Z G d de      Zy)zGoogle LLM service using OpenAI-compatible API format.

This module provides integration with Google's AI LLM models using the OpenAI
API format through Google's Gemini API OpenAI compatibility layer.
    N)	dataclass)Optional)AsyncStream)ChatCompletionChunk)FunctionCallFromLLMfalseGRPC_ENABLE_FORK_SUPPORT)logger)LLMTextFrame)LLMTokenUsage)OpenAILLMContext)OpenAILLMSettings)OpenAILLMService)_warn_deprecated_paramc                       e Zd ZdZy)GoogleOpenAILLMSettingsz(Settings for GoogleLLMOpenAIBetaService.N)__name__
__module____qualname____doc__     T/opt/pipecat/venv/lib/python3.12/site-packages/pipecat/services/google/openai/llm.pyr   r   $   s    2r   r   c            
       f     e Zd ZU dZeZeed<   dddddededee   d	ee   f fd
Z	de
fdZ xZS )GoogleLLMOpenAIBetaServicea  Google LLM service using OpenAI-compatible API format.

    This service provides access to Google's AI LLM models (like Gemini) through
    the OpenAI API format. It handles streaming responses, function calls, and
    tool usage while maintaining compatibility with OpenAI's interface.

    Note: This service includes a workaround for a Google API bug where function
    call indices may be incorrectly set to None, resulting in empty function names.

    .. deprecated:: 0.0.82
        GoogleLLMOpenAIBetaService is deprecated and will be removed in a future version.
        Use GoogleLLMService instead for better integration with Google's native API.

    Reference:
        https://ai.google.dev/gemini-api/docs/openai
    	_settingsz8https://generativelanguage.googleapis.com/v1beta/openai/N)base_urlmodelsettingsapi_keyr   r   r   c                B   ddl }|j                         5  |j                  d       |j                  dt        d       ddd       t        d      }|t        d	t
        d	       ||_        ||j                  |       t        | (  d|||d
| y# 1 sw Y   VxY w)aZ  Initialize the Google LLM service.

        Args:
            api_key: Google API key for authentication.
            base_url: Base URL for Google's OpenAI-compatible API.
            model: Google model name to use (e.g., "gemini-2.0-flash").

                .. deprecated:: 0.0.105
                    Use ``settings=OpenAILLMSettings(model=...)`` instead.

            settings: Runtime-updatable settings. When provided alongside deprecated
                parameters, ``settings`` values take precedence.
            **kwargs: Additional arguments passed to the parent OpenAILLMService.
        r   NalwayszGoogleLLMOpenAIBetaService is deprecated and will be removed in a future version. Use GoogleLLMService instead for better integration with Google's native API.   )
stacklevelzgemini-2.0-flash)r   r   )r    r   r   r   )warningscatch_warningssimplefilterwarnDeprecationWarningr   r   r   apply_updatesuper__init__)	selfr    r   r   r   kwargsr%   default_settings	__class__s	           r   r,   z#GoogleLLMOpenAIBetaService.__init__@   s    . 	$$& 	!!(+MM`"	  	 39KL "7,CWM%*"
 ))(3a8FVaZ`a/	 	s   *BBcontextc           	        K   g }g }g }d}d}d}d}| j                          d {    | j                  |       d {   }	|	4 d {    |	2 3 d {   }
|
j                  rot        |
j                  j                  xs d|
j                  j
                  xs d|
j                  j                  xs d      }| j                  |       d {    |
j                  t        |
j                        dk(  r| j                          d {    |
j                  d   j                  s|
j                  d   j                  j                  r4t        j                  d|
j                  d   j                  j                          |
j                  d   j                  j                  d   }|j                  |k7  r>|j!                  |       |j!                  |       |j!                  |       d}d}d}|dz  }|j"                  r;|j"                  j$                  r%||j"                  j$                  z  }|j&                  }|j"                  s |j"                  j(                  s||j"                  j(                  z  }3|
j                  d   j                  j*                  sX| j-                  t/        |
j                  d   j                  j*                               d {    7 7 7 7 7 *7 7 6 d d d       d {  7   n# 1 d {  7  sw Y   nxY w|r|r|j!                  |       |j!                  |       |j!                  |       t        j                  d| d| d|        g }t1        |||      D ]?  \  }}}|dk(  rt3        j4                  |      }|j!                  t7        ||||	             A | j9                  |       d {  7   y y y w)
Nr    )prompt_tokenscompletion_tokenstotal_tokenszTool call:    zFunction list: z, Arguments list: z, Tool ID list: )r1   tool_call_idfunction_name	arguments)start_ttfb_metrics)_stream_chat_completions_specific_contextusager   r4   r5   r6   start_llm_usage_metricschoiceslenstop_ttfb_metricsdelta
tool_callsr
   debugindexappendfunctionnameidr:   content
push_framer   zipjsonloadsr   run_function_calls)r-   r1   functions_listarguments_listtool_id_listfunc_idxr9   r:   r8   chunk_streamchunktokens	tool_callfunction_callstool_ids                  r   _process_contextz+GoogleLLMOpenAIBetaService._process_contextr   s    	%%''' @@II 	   .	X .	X+ -X -Xe;;*&+kk&?&?&D1*/++*G*G*L1%*[[%=%=%BF
 66v>>>==(C,>!,C,,...}}Q'--==#))44 LL;u}}Q/?/E/E/P/P.Q!RS %a 0 6 6 A A! DI (2&--m<&--i8$++L9(*$&	') A ))i.@.@.E.E%););)@)@@'0|| ))i.@.@.J.J!Y%7%7%A%AA	]]1%++33//,u}}Q7G7M7M7U7U*VWWWm 	( J.	X-X ?
 /B X[  ,.	X .	X .	X .	X .	Xh Y!!-0!!),-LL!.!11CNCSScdpcqr  N586 1y' !B&  JJy1	%%' '%,&3"+	( )).999? '=s   "O+K,O+K/
O+K2	O+LL K5L A7LK8<LK;ELL'>L'>L%K>&L,O+/O+2O+5L 8L;L>L LO+LO+L%LL%!CO+"O%#O+)r   r   r   r   r   Settings__annotations__strr   r,   r   rZ   __classcell__)r0   s   @r   r   r   +   sm    " 'H&& S#6:0b 0b 	0b
 }0b 230bdd:.> d:r   r   )r   rM   osdataclassesr   typingr   openair   openai.types.chatr   pipecat.services.llm_servicer   environlogurur
   pipecat.frames.framesr   pipecat.metrics.metricsr   1pipecat.processors.aggregators.openai_llm_contextr    pipecat.services.openai.base_llmr   pipecat.services.openai.llmr   pipecat.services.settingsr   r   r   r   r   r   <module>rm      sr     	 !   1 < *1

% &  . 1 N > 8 < 	/ 	 	k:!1 k:r   