
    qi*                        d Z ddl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 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 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)zGSambaNova LLM service implementation using OpenAI-compatible interface.    N)	dataclass)AnyDictOptional)logger)AsyncStream)ChatCompletionChunk)OpenAILLMInvocationParams)LLMTextFrame)LLMTokenUsage)
LLMContext)OpenAILLMContext)FunctionCallFromLLM)OpenAILLMSettings)OpenAILLMService)_warn_deprecated_param)
traced_llmc                       e Zd ZdZy)SambaNovaLLMSettingsz!Settings for SambaNovaLLMService.N)__name__
__module____qualname____doc__     P/opt/pipecat/venv/lib/python3.12/site-packages/pipecat/services/sambanova/llm.pyr   r      s    +r   r   c                        e Zd ZU dZeZeed<   dddddedee   ded	ee   d
e	e
e
f   ddf fdZ	 	 ddee   dee   d
e	e
e
f   de
f fdZdedefdZedeez  dee   fd       Z xZS )SambaNovaLLMServicezA service for interacting with SambaNova using the OpenAI-compatible interface.

    This service extends OpenAILLMService to connect to SambaNova's API endpoint while
    maintaining full compatibility with OpenAI's interface and functionality.
    	_settingsNzhttps://api.sambanova.ai/v1)modelbase_urlsettingsapi_keyr    r!   r"   kwargsreturnc                    t        d      }|t        dt         d       ||_        ||j                  |       t	        |   d|||d| y)a  Initialize SambaNova LLM service.

        Args:
            api_key: The API key for accessing SambaNova API.
            model: The model identifier to use. Defaults to "Llama-4-Maverick-17B-128E-Instruct".

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

            base_url: The base URL for SambaNova API. Defaults to "https://api.sambanova.ai/v1".
            settings: Runtime-updatable settings. When provided alongside deprecated
                parameters, ``settings`` values take precedence.
            **kwargs: Additional keyword arguments passed to OpenAILLMService.
        z"Llama-4-Maverick-17B-128E-Instruct)r    Nr    )r#   r!   r"   r   )r   r   r    apply_updatesuper__init__)selfr#   r    r!   r"   r$   default_settings	__class__s          r   r)   zSambaNovaLLMService.__init__0   s`    0 06Z[ "7,@'J%*"
 ))(3a8FVaZ`ar   c                 V    t        j                  d|        t        |   ||fi |S )a  Create OpenAI-compatible client for SambaNova API endpoint.

        Args:
            api_key: API key for authentication. If None, uses instance default.
            base_url: Base URL for the API endpoint. If None, uses instance default.
            **kwargs: Additional keyword arguments for client configuration.

        Returns:
            Configured OpenAI-compatible client instance.
        z#Creating SambaNova client with API )r   debugr(   create_client)r*   r#   r!   r$   r,   s       r   r/   z!SambaNovaLLMService.create_clientW   s0      	:8*EFw$WhA&AAr   params_from_contextc                    | j                   j                  dddi| j                   j                  | j                   j                  | j                   j                  | j                   j
                  d}|j                  |       |j                  | j                   j                         | j                   j                  r2|j                  dg       }d| j                   j                  dg|z   |d<   |S )a  Build parameters for SambaNova chat completion request.

        SambaNova doesn't support some OpenAI parameters like frequency_penalty,
        presence_penalty, and seed.

        Args:
            params_from_context: Parameters, derived from the LLM context, to
                use for the chat completion. Contains messages, tools, and tool
                choice.

        Returns:
            Dictionary of parameters for the chat completion request.
        Tinclude_usage)r    streamstream_optionstemperaturetop_p
max_tokensmax_completion_tokensmessagessystem)rolecontent)
r   r    r5   r6   r7   r8   updateextrasystem_instructionget)r*   r0   paramsr9   s       r   build_chat_completion_paramsz0SambaNovaLLMService.build_chat_completion_paramsj   s     ^^)).5>>55^^))..33%)^^%I%I
 	)*dnn**+ >>,,zz*b1H!dnn.O.OP""F: r   contextc           	        K   g }g }g }d}d}d}d}| j                          d{    t        |t              r| j                  |      n| j	                  |       d{   }	|	4 d{    |	2 3 d{   }
|
j
                  rct        |
j
                  j                  |
j
                  j                  |
j
                  j                        }| j                  |       d{    |
j                  t        |
j                        dk(  r| j                          d{    |
j                  d   j                  s|
j                  d   j                  j                  r|
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  }|
j                  d   j                  j,                  rE| j/                  t1        |
j                  d   j                  j,                               d{    Ut3        |
j                  d   j                  d      sz|
j                  d   j                  j4                  j7                  d      s| j/                  t1        |
j                  d   j                  j4                  d                d{    7 B7 7 7 7 7 U7 7 6 ddd      d{  7   n# 1 d{  7  sw Y   nxY w|r|r|j#                  |       |j#                  |       |j#                  |       g }t9        |||      D ]H  \  }}}t        |      dk  rt;        j<                  |      }|j#                  t?        ||||             J | jA                  |       d{  7   yyyw)	a  Process OpenAI LLM context and stream chat completion chunks.

        This method handles the streaming response from SambaNova API, including
        function call processing and text frame generation. It includes special
        handling for SambaNova's API limitations with tool call indexing.

        Args:
            context: OpenAI LLM context containing conversation state and tools.

        Returns:
            Async stream of chat completion chunks.
        r    N)prompt_tokenscompletion_tokenstotal_tokens   audio
transcript)rC   tool_call_idfunction_name	arguments)!start_ttfb_metrics
isinstancer   )_stream_chat_completions_specific_context*_stream_chat_completions_universal_contextusager   rF   rG   rH   start_llm_usage_metricschoiceslenstop_ttfb_metricsdelta
tool_callsindexappendfunctionnameidrN   r<   
push_framer   hasattrrJ   r@   zipjsonloadsr   run_function_calls)r*   rC   functions_listarguments_listtool_id_listfunc_idxrM   rN   rL   chunk_streamchunktokens	tool_callfunction_callstool_ids                  r   _process_contextz$SambaNovaLLMService._process_context   s      	%%''' '#34 ::7C@@I
   5	d 5	d+ 4d 4de;;*&+kk&?&?*/++*G*G%*[[%=%=F
 66v>>>==(C,>!,C,,...}}Q'--==#))44 !&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W U]]1-33W=%--PQBRBXBXB^B^BbBb C //,u}}Q7G7M7M7S7ST`7a*bccc 	(
5	d4d ?
 /B X di  ,5	d 5	d 5	d 5	d 5	dv Y!!-0!!),-N586 1y' y>A% JJy1	%%' '%,&3"+	" )).9993 '=s   "QM&9QM)
Q)M,*Q-N0M<4M/5M<8A+N#M2$<N M5!DN*NA<N>M8?)N*2NANM: N&Q)Q,Q/M<2N5N8N:N<N=QN	QN!NN!B,Q	Q
Q)NN)r   r   r   r   r   Settings__annotations__strr   r   r   r)   r/   r
   dictrB   r   r   r   r   r	   ro   __classcell__)r,   s   @r   r   r   &   s    $H##  $537%b %b }	%b
 %b /0%b sCx.%b 
%bR "&"&B#B 3-B sCx.	B
 
B&$@Y $^b $L u:'*4u:	(	)u: u:r   r   )$r   rb   dataclassesr   typingr   r   r   logurur   openair   openai.types.chatr	   )pipecat.adapters.services.open_ai_adapterr
   pipecat.frames.framesr   pipecat.metrics.metricsr   *pipecat.processors.aggregators.llm_contextr   1pipecat.processors.aggregators.openai_llm_contextr   pipecat.services.llm_servicer    pipecat.services.openai.base_llmr   pipecat.services.openai.llmr   pipecat.services.settingsr   (pipecat.utils.tracing.service_decoratorsr   r   r   r   r   r   <module>r      sm    N  ! & &   1 O 2 A N < > 8 < ? 	, 	 	`:* `:r   