
    dh[z                         S SK r S SKJrJrJrJrJrJrJr  S SK	r	S SK
Jr  S SKJr  S SKJr  S SKJrJr  S SKJrJr  S SK	Jr   " S	 S
\5      r " S S\5      rg)    N)AnyDictIteratorListOptionalTupleUnion)CallbackManagerForLLMRun)LLM)GenerationChunk)convert_to_secret_strget_from_dict_or_env)Field	SecretStr)Responsec                     ^  \ rS rSr% Sr\" SS9r\\S'    \" \	" S5      S9r
\	\S'    \" SSS9r\\S	'    \" SSS9r\\S
'    \" SS9r\\S'    Sr\\\\4      \S'     " S S5      r\S\4S j5       r\S\\\4   4S j5       r\S\\\4   4S j5       r\S\4S j5       rS\SS4U 4S jjrS\S\\\4   4S jrS%S\\\      S\\\4   4S jjr  S&S\\\   \4   S\\\      S\\   S\ 4S jjr!S\ S\4S jr"S\ S\#\$   4S  jr%  S'S\\\   \4   S\\\      S!\\&   S\S\#\$   4
S" jjr'  S'S\\\   \4   S\\\      S!\\&   S\S\4
S# jjr(S$r)U =r*$ )(SambaStudio   ua  
SambaStudio large language models.

Setup:
    To use, you should have the environment variables
    ``SAMBASTUDIO_URL`` set with your SambaStudio environment URL.
    ``SAMBASTUDIO_API_KEY``  set with your SambaStudio endpoint API key.
    https://sambanova.ai/products/enterprise-ai-platform-sambanova-suite
    read extra documentation in https://docs.sambanova.ai/sambastudio/latest/index.html
    Example:
    .. code-block:: python
        from langchain_community.llms.sambanova  import SambaStudio
        SambaStudio(
            sambastudio_url="your-SambaStudio-environment-URL",
            sambastudio_api_key="your-SambaStudio-API-key,
            model_kwargs={
                "model" : model or expert name (set for Bundle endpoints),
                "max_tokens" : max number of tokens to generate,
                "temperature" : model temperature,
                "top_p" : model top p,
                "top_k" : model top k,
                "do_sample" : wether to do sample
                "process_prompt": wether to process prompt
                    (set for Bundle generic v1 and v2 endpoints)
            },
        )
Key init args — completion params:
    model: str
        The name of the model to use, e.g., Meta-Llama-3-70B-Instruct-4096
        (set for Bundle endpoints).
    streaming: bool
        Whether to use streaming handler when using non streaming methods
    model_kwargs: dict
        Extra Key word arguments to pass to the model:
            max_tokens: int
                max tokens to generate
            temperature: float
                model temperature
            top_p: float
                model top p
            top_k: int
                model top k
            do_sample: bool
                wether to do sample
            process_prompt:
                wether to process prompt
                (set for Bundle generic v1 and v2 endpoints)
Key init args — client params:
    sambastudio_url: str
        SambaStudio endpoint Url
    sambastudio_api_key: str
        SambaStudio endpoint api key

Instantiate:
    .. code-block:: python

        from langchain_community.llms import SambaStudio

        llm = SambaStudio=(
            sambastudio_url = set with your SambaStudio deployed endpoint URL,
            sambastudio_api_key = set with your SambaStudio deployed endpoint Key,
            model_kwargs = {
                "model" : model or expert name (set for Bundle endpoints),
                "max_tokens" : max number of tokens to generate,
                "temperature" : model temperature,
                "top_p" : model top p,
                "top_k" : model top k,
                "do_sample" : wether to do sample
                "process_prompt" : wether to process prompt
                    (set for Bundle generic v1 and v2 endpoints)
            }
        )

Invoke:
    .. code-block:: python
        prompt = "tell me a joke"
        response = llm.invoke(prompt)

Stream:
    .. code-block:: python

    for chunk in llm.stream(prompt):
        print(chunk, end="", flush=True)

Async:
    .. code-block:: python

    response = llm.ainvoke(prompt)
    await response

 defaultsambastudio_urlsambastudio_api_keyT)r   excludebase_urlstreaming_urlF	streamingNmodel_kwargsc                       \ rS rSrSrSrg)SambaStudio.Config|   T N__name__
__module____qualname____firstlineno__populate_by_name__static_attributes__r"       Z/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/llms/sambanova.pyConfigr    |       r*   r,   returnc                     g)9Return whether this model can be serialized by Langchain.Tr"   clss    r+   is_lc_serializableSambaStudio.is_lc_serializable   s     r*   c                     SSS.$ )Nr   r   )r   r   r"   selfs    r+   
lc_secretsSambaStudio.lc_secrets   s      1#8
 	
r*   c                 :    SU R                   0SU R                  0E$ )Return a dictionary of identifying parameters.

This information is used by the LangChain callback system, which
is used for tracing purposes make it possible to monitor LLMs.
r   r   )r   r   r6   s    r+   _identifying_paramsSambaStudio._identifying_params   s#     T^^S@Q@Q/RSSr*   c                     g)zReturn type of llm.zsambastudio-llmr"   r6   s    r+   	_llm_typeSambaStudio._llm_type   s     !r*   kwargsc                    > [        USS5      US'   [        [        USS5      5      US'   U R                  US   5      u  US'   US'   [        TU ]  " S0 UD6  g)	'init and validate environment variablesr   SAMBASTUDIO_URLr   SAMBASTUDIO_API_KEYr   r   Nr"   )r   r   _get_sambastudio_urlssuper__init__r7   rA   	__class__s     r+   rH   SambaStudio.__init__   sx    $8%'8%
 ! )> )>@UV)
$% 7;6P6P$%7
3zF?3 	"6"r*   urlc                     SU;   a  UnUnX#4$ SU;   a  UR                  SS5      nUnX#4$ UnSU;   a#  SR                  UR                  S5      5      nX#4$ [        S5      e)z
Get streaming and non streaming URLs from the given URL

Args:
    url: string with sambastudio base or streaming endpoint url

Returns:
    base_url: string with url to do non streaming calls
    streaming_url: string with url to do streaming calls
chat/completionsstreamzstream/r   genericzgeneric/streamUnsupported URL)replacejoinsplit
ValueError)r7   rL   r   
stream_urls       r+   rF   !SambaStudio._get_sambastudio_urls   s     $HJ ## 3;;y"5 
 ## #!1!6!6syy7K!LJ ## %%677r*   stopc           	         Uc  / nU R                   =(       d    0 nUR                  S/ 5      U-   n[        U5      S:  a  X2S'   SU R                  ;   ay  SUR	                  5       ;   a  UR                  S5      US'   SUR	                  5       ;   a  UR                  S5      US'   SUR	                  5       ;   a  UR                  S5        UnU$ S	U R                  ;   aT  SUR	                  5       ;   a  UR                  S5      US'   SUR	                  5       ;   a  UR                  S5      US'   UnU$ S
U R                  ;   a  SUR	                  5       ;   a  UR                  S5      US'   SUR	                  5       ;   a  UR                  S5      US'   UR                  5        VVs0 sH'  u  pVU[        U5      R                  [        U5      S._M)     nnnU$ [        SU R                   S35      es  snnf )a  
Get the tuning parameters to use when calling the LLM.

Args:
    stop: Stop words to use when generating. Model output is cut off at the
        first occurrence of any of the stop substrings.

Returns:
    The tuning parameters in the format required by api to use
stop_sequencesr   rN   select_expertmodelmax_tokens_to_generate
max_tokensprocess_promptapi/v2/predict/genericapi/predict/generic)typevaluerQ   9only openai, generic v1 and generic v2 APIs are supported)r   getlenr   keyspopitemsrb   r$   strrU   )r7   rX   _model_kwargs_stop_sequencestuning_paramskvs          r+   _get_tuning_paramsSambaStudio._get_tuning_params   s%    <D ))/R (++,<bADH!#.=*+ !5!55-"4"4"66)6):):?)Kg&'=+=+=+??.;.?.?,/l+  =#5#5#77!!"23)M< 9 &)=)==-,,..1>1B1B71Ko.}1133:G:K:K ;67 *M* ' #d&:&::-,,..1>1B1B71Ko.}1133:G:K:K ;67 +0022DA DG,,s1v>>2    !$"6"6!7KL s   #-G.promptc                    [        U[        5      (       a  U/nU R                  U5      nSU R                  ;   aY  SUS   S./nXSS.UEnUR	                  5        VVs0 sH  u  pxUc  M
  Xx_M     nnnSU R
                  R                  5        3SS	.n	GOQS
U R                  ;   a  UR                  SS5      (       a"  [        R                  " SSSUS   S./S.5      nOUS   nSUS./n
UR	                  5        VVs0 sH  u  pxUc  M
  Xx_M     nnnXS.nSU R
                  R                  5       0n	OSU R                  ;   a  UR                  SS5      (       a@  US   R                  S5      S:X  a"  [        R                  " SSSUS   S./S.5      nOUS   nOUS   nU(       a  XS.nOU/US.nSU R
                  R                  5       0n	O[        SU R                   S35      e[        R                  " 5       nU(       a  UR                  U R                  XSS9nOUR                  U R                  XSS9nUR                   S:w  a&  [#        SUR                    SUR$                   S35      eU$ s  snnf s  snnf ) z
Performs a post request to the LLM API.

Args:
prompt: The prompt to pass into the model
stop: list of stop tokens
streaming: wether to do a streaming call

Returns:
    A request Response object
rN   userr   rolecontent)messagesrO   NBearer application/jsonAuthorizationzContent-Typer`   r_   Fzsambaverse-conversation-id)
message_idrv   rw   )conversation_idrx   item0)idrc   )ri   paramskeyra   rc   True)instancer   )	instancesr   rQ   rd   TheadersjsonrO      2Sambanova / complete call failed with status code .)
isinstancerj   rp   r   ri   r   get_secret_valuere   r   dumpsrU   requestsSessionpostr   r   status_codeRuntimeErrortext)r7   rr   rX   r   r   messages_dictdatar   rc   r   ri   http_sessionresponses                r+   _handle_requestSambaStudio._handle_request  s   $ fc""XF((. !5!55&,CDM -MfMD15S:3JCJDS#*++<<>?"A 2G &)=)==zz*E22+G+/FSTIV%  #f56E39<<>W>ZSUjcj>FW"5Dd66GGIJG #d&:&::zz*E22*+//8FB!ZZ/K 37,2/5ay!")	F $AYF$*=&,X@d66GGIJG !$"6"6!7KL   '')#((""Gt ) H $((w% ) H 3&D''(==/$ 
 S T* Xs   I/(I/:I5I5r   c                 j    UR                  5       nSU R                  ;   a  US   S   S   S   nU$ S	U R                  ;   a  US
   S   S   S   nU$ SU R                  ;   a  US   S   S   nU$ [        SU R                   S35      e! [         a   n[        SU SUR                   35      eSnAff = f)
Process a non streaming response from the api

Args:
    response: A request Response object

Returns
    completion: a string with model generation
;Sambanova /complete call failed couldn't get JSON response 
response: NrN   choicesr   messagerw   r`   ri   rc   
completionra   predictionsrQ   rd   )r   	Exceptionr   r   r   rU   r7   r   response_dicter   s        r+   _process_responseSambaStudio._process_responseh  s    	$MMOM !5!55&y1!4Y?	JJ  &)=)==&w/27;LIJ  #d&:&::&}5a8FJ 	 !$"6"6!7KL !  	MaSX]]O- 	s   B 
B2B--B2c              #   |  #     SSK nSU R                  ;   GaG  UR                  U5      nUR	                  5        GH   nUR
                  S:X  a&  [        SUR                   SUR                   S35      e UR                  S:w  a  [        UR                  [        5      (       a!  [        R                  " UR                  5      nO&[        SUR                   SUR                   S35      eUR                  S	5      (       a&  [        SUR                   SUR                   S35      e[        US
   5      S:  a  US
   S   S   S   nOSn[        US9nUv   GM   GM#     gSU R                  ;   aM  UR#                  5        H8  n	 [        R                  " U	5      nUS   S   S   S   S   n[        US9nUv   M:     gSU R                  ;   aJ  UR#                  5        H5  n	 [        R                  " U	5      nUS   S   S   S   n[        US9nUv   M7     g[%        SU R                   S35      e! [         a    [        S5      ef = f! [          a   n[        SU SUR                   35      eSnAff = f! [          a  n[        SU SU	 35      eSnAff = f! [          a  n[        SU SU	 35      eSnAff = f7f)
Process a streaming response from the api

Args:
    response: An iterable request Response object

Yields:
    GenerationChunk: a GenerationChunk with model partial generation
r   NTcould not import sseclient libraryPlease install it with `pip install sseclient-py`.rN   error_event1Sambanova /complete call failed with status code r   [DONE]errorr   deltarw   r   r   3Error getting content chunk raw streamed response: data: r`   resultri   rc   stream_tokenzline: ra   	responsesrQ   rd   )	sseclientImportErrorr   	SSEClienteventseventr   r   r   r   rj   r   loadsre   rf   r   r   
iter_linesrU   )
r7   r   r   clientr   r   rw   generated_chunkr   lines
             r+   _process_stream_response$SambaStudio._process_stream_response  s    	 !5!55((2F;;-/&K#//0 ::,a) 
zzX-%ejj#66#'::ejj#9D"."S#+#7#7"8#(::,a!1# 
  88G,,"."S#+#7#7"8#(::,a!1# 
 tI/!3&*9oa&8&A)&LG&(G*9w*G--) . )L &)=)== ++-
::d+D"8nW5a8A.QG&57&CO)) . #d&:&:: ++-
::d+D"8n[9!<^LG&57&CO)) . !$"6"6!7KL [  	E 	P ! &MaS .  ! &MaS (  ! &MaS ( s   J<H0 A,J<5C"I	,J<4I68(J<!1JJ<0IJ<	
I3I..I33J<6
J JJJ<
J9#J44J99J<run_managerc              +      #    U R                  XSS9nU R                  U5       H)  nU(       a  UR                  UR                  5        Uv   M+     g7f)a$  Call out to Sambanova's complete endpoint.

Args:
    prompt: The prompt to pass into the model.
    stop: a list of strings on which the model should stop generating.
    run_manager: A run manager with callbacks for the LLM.
Yields:
    chunk: GenerationChunk with model partial generation
Tr   Nr   r   on_llm_new_tokenr   r7   rr   rX   r   rA   r   chunks          r+   _streamSambaStudio._stream  K       '''E228<E,,UZZ8K =   AAc                     U R                   (       a.  SnU R                  " SXUS.UD6 H  nXVR                  -  nM     U$ U R                  XSS9nU R	                  U5      nU$ )zCall out to Sambanova's complete endpoint.

Args:
    prompt: The prompt to pass into the model.
    stop: a list of strings on which the model should stop generating.

Returns:
    result: string with model generation
r   rr   rX   r   Fr   r"   r   r   r   r   r   r7   rr   rX   r   rA   r   r   r   s           r+   _callSambaStudio._call  v      >>J kEK jj(

 '''F++H5
r*   r"   )NNFNN)+r$   r%   r&   r'   __doc__r   r   rj   __annotations__r   r   r   r   r   boolr   r   r   r   r,   classmethodr3   propertyr8   r<   r?   rH   r   rF   r   rp   r	   r   r   r   r   r   r   r
   r   r   r)   __classcell__rJ   s   @r+   r   r      s   Zx !,OS,%*9R=%AA"d3Hc3'r48M38#E*It*K-1L(4S>*12    4   
DcN 
 
 TT#s(^ T T !3 ! !# # #$ $sCx $4?xS	': ?d3PS8n ?H %)$)	dd3in%d tCy!d D>	d
 
dL"( "s "H] ]h>W ]D %):>	d3in% tCy! 67	
  
/	"2 %):>	d3in% tCy! 67	
  
 r*   r   c                     ^  \ rS rSr% Sr\" SS9r\\S'    \" \	" S5      S9r
\	\S'    \" SS9r\\S'    \" S	S9r\\S
'    \" SS9r\\S'    \" SS9r\\S'    \" SS9r\\   \S'    \" SS9r\\   \S'    \" SS0S9r\\S'     " S S5      r\S\4S j5       r\S\\\4   4S j5       r\S\\\4   4S j5       r\S\4S j5       rS\SS4U 4S jjr   S(S\!\"\   \4   S\\"\      S
\\   S\#4S  jjr$S!\#S\4S" jr%S!\#S\&\'   4S# jr(  S)S\!\"\   \4   S\\"\      S$\\)   S\S\4
S% jjr*  S)S\!\"\   \4   S\\"\      S$\\)   S\S\&\'   4
S& jjr+S'r,U =r-$ )*SambaNovaCloudi  u  
SambaNova Cloud large language models.

Setup:
    To use, you should have the environment variables:
    ``SAMBANOVA_URL`` set with SambaNova Cloud URL.
    defaults to http://cloud.sambanova.ai/
    ``SAMBANOVA_API_KEY`` set with your SambaNova Cloud API Key.
    Example:
    .. code-block:: python
        from langchain_community.llms.sambanova  import SambaNovaCloud
        SambaNovaCloud(
            sambanova_api_key="your-SambaNovaCloud-API-key,
            model = model name,
            max_tokens = max number of tokens to generate,
            temperature = model temperature,
            top_p = model top p,
            top_k = model top k
        )
Key init args — completion params:
    model: str
        The name of the model to use, e.g., Meta-Llama-3-70B-Instruct-4096
        (set for CoE endpoints).
    streaming: bool
        Whether to use streaming handler when using non streaming methods
    max_tokens: int
        max tokens to generate
    temperature: float
        model temperature
    top_p: float
        model top p
    top_k: int
        model top k

Key init args — client params:
    sambanova_url: str
        SambaNovaCloud Url defaults to http://cloud.sambanova.ai/
    sambanova_api_key: str
        SambaNovaCloud api key
Instantiate:
    .. code-block:: python
        from langchain_community.llms.sambanova  import SambaNovaCloud
        SambaNovaCloud(
            sambanova_api_key="your-SambaNovaCloud-API-key,
            model = model name,
            max_tokens = max number of tokens to generate,
            temperature = model temperature,
            top_p = model top p,
            top_k = model top k
        )
Invoke:
    .. code-block:: python
        prompt = "tell me a joke"
        response = llm.invoke(prompt)
Stream:
    .. code-block:: python
    for chunk in llm.stream(prompt):
        print(chunk, end="", flush=True)
Async:
    .. code-block:: python
    response = llm.ainvoke(prompt)
    await response
r   r   sambanova_urlsambanova_api_keyzMeta-Llama-3.1-8B-Instructr\   Fr   i   r^   gffffff?temperatureNtop_ptop_kinclude_usageTstream_optionsc                       \ rS rSrSrSrg)SambaNovaCloud.Configi{  Tr"   Nr#   r"   r*   r+   r,   r   {  r-   r*   r,   r.   c                     g)r0   Fr"   r1   s    r+   r3   !SambaNovaCloud.is_lc_serializable~  s     r*   c                 
    SS0$ )Nr   r"   r6   s    r+   r8   SambaNovaCloud.lc_secrets  s    #%899r*   c                     U R                   U R                  U R                  U R                  U R                  U R
                  U R                  S.$ )r;   r\   r   r^   r   r   r   r   r   r6   s    r+   r<   "SambaNovaCloud._identifying_params  sC     ZZ//++ZZZZ"11
 	
r*   c                     g)z7Get the type of language model used by this chat model.zsambanovacloud-llmr"   r6   s    r+   r?   SambaNovaCloud._llm_type  s     $r*   rA   c                 v   > [        USSSS9US'   [        [        USS5      5      US'   [        TU ]  " S0 UD6  g)	rC   r   SAMBANOVA_URLz,https://api.sambanova.ai/v1/chat/completionsr   r   SAMBANOVA_API_KEYNr"   )r   r   rG   rH   rI   s     r+   rH   SambaNovaCloud.__init__  sP    "6B	#
 '< )<>QR'
"# 	"6"r*   rr   rX   c           	      p   [        U[        5      (       a  U/nSUS   S./nUUU R                  UU R                  U R                  U R
                  U R                  S.nUR                  5        VVs0 sH  u  pgUc  M
  Xg_M     nnnSU R                  R                  5        3SS.n[        R                  " 5       n	U(       a  U	R                  U R                  XSS	9n
OU	R                  U R                  XS
S	9n
U
R                  S:w  a&  [        SU
R                   SU
R                    S35      eU
$ s  snnf )z
Performs a post request to the LLM API.

Args:
    prompt: The prompt to pass into the model.
    stop: list of stop tokens

Returns:
    A request Response object
rt   r   ru   )rx   rO   r^   rX   r\   r   r   r   ry   rz   r{   Tr   Fr   r   r   )r   rj   r^   r\   r   r   r   ri   r   r   r   r   r   r   r   r   r   )r7   rr   rX   r   r   r   r   rc   r   r   r   s              r+   r   SambaNovaCloud._handle_request  sJ     fc""XF"(VAY?@%//ZZ++ZZZZ	
 .2ZZ\O\zsU

\O&t'='='N'N'P&QR.

  '')#((""Gt ) H $((""Gu ) H 3&D''(==/$ 
 - Ps   2D2>D2r   c                      UR                  5       nUS   S   S   S   nU$ ! [         a   n[        SU SUR                   35      eSnAff = f)r   r   r   Nr   r   r   rw   )r   r   r   r   r   s        r+   r    SambaNovaCloud._process_response  si    	$MMOM #9-a0;IF
  	MaSX]]O- 	s   " 
AAAc              #   .  #     SSK nUR                  U5      nUR                  5        GH   nUR                  S:X  a&  [        SUR                   SUR                   S35      e UR                  S:w  a  [        UR                  [        5      (       a!  [        R                  " UR                  5      nO&[        SUR                   SUR                   S35      eUR                  S5      (       a&  [        SUR                   SUR                   S35      e[        US	   5      S:  a  US	   S   S
   S   nOSn[        US9nUv   GM   GM#     g! [         a    [        S5      ef = f! [         a   n[        SU SUR                   35      eSnAff = f7f)r   r   Nr   r   r   r   r   r   r   r   rw   r   r   r   r   )r   r   r   r   r   r   r   r   r   rj   r   r   re   rf   r   r   )	r7   r   r   r   r   r   rw   r   r   s	            r+   r   'SambaNovaCloud._process_stream_response  s    	 $$X.]]_E{{m+"G++,Azzl!% 
::)!%**c22#zz%**5*O'334A$zzl!- 
 xx((*O'334A$zzl!- 
 4	?+a/"&y/!"4W"=i"H"$&57&CO))) * %  	E 	L  "I!UZZL* sA   FE AF$C"E(	FE%%F(
F2FFFr   c                     U R                   (       a.  SnU R                  " SXUS.UD6 H  nXVR                  -  nM     U$ U R                  XSS9nU R	                  U5      nU$ )Call out to SambaNovaCloud complete endpoint.

Args:
    prompt: The prompt to pass into the model.
    stop: Optional list of stop words to use when generating.

Returns:
    The string generated by the model.
r   r   Fr   r"   r   r   s           r+   r   SambaNovaCloud._call1  r   r*   c              +      #    U R                  XSS9nU R                  U5       H)  nU(       a  UR                  UR                  5        Uv   M+     g7f)r   Tr   Nr   r   s          r+   r   SambaNovaCloud._streamN  r   r   r"   r   r   ).r$   r%   r&   r'   r   r   r   rj   r   r   r   r\   r   r   r^   intr   floatr   r   r   r   dictr,   r   r3   r   r   r8   r   r<   r?   rH   r	   r   r   r   r   r   r   r   r
   r   r   r)   r   r   s   @r+   r   r     s   >@ r*M3*#(2#?y?!;<E3<E*It*KD)J) s+K+"40E8E?0 .E8C=. /4)@ANDAA    4   :DcN : : 
T#s(^ 
 
  $3 $ $# # #  %)$)	4d3in%4 tCy!4 D>	4
 
4l( s 07 7h>W 7x %):>	d3in% tCy! 67	
  
@ %):>	d3in% tCy! 67	
  
/	" r*   r   )r   typingr   r   r   r   r   r   r	   r    langchain_core.callbacks.managerr
   #langchain_core.language_models.llmsr   langchain_core.outputsr   langchain_core.utilsr   r   pydanticr   r   r   r   r   r"   r*   r+   <module>r
     sC     D D D  E 3 2 L % O# OdCS Cr*   