
    7|h[z                         d dl Z d dlmZmZmZmZmZmZm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mZ d dlmZmZ d dl	mZ  G d	 d
e      Z G d de      Zy)    N)AnyDictIteratorListOptionalTupleUnion)CallbackManagerForLLMRun)LLM)GenerationChunk)convert_to_secret_strget_from_dict_or_env)Field	SecretStr)Responsec                       e Zd ZU dZ ed      Zeed<   	  e ed            Z	eed<   	  edd      Z
eed<   	  edd      Zeed	<   	  ed
      Zeed<   	 dZeeeef      ed<   	  G d d      Zedefd       Zedeeef   fd       Zedeeef   fd       Zedefd       Zdeddf fdZdedeeef   fdZd#deee      deeef   fdZ	 	 d$deee   ef   deee      dee   defdZ dedefdZ!dede"e#   fdZ$	 	 d%deee   ef   deee      d ee%   dede"e#   f
d!Z&	 	 d%deee   ef   deee      d ee%   dedef
d"Z' xZ(S )&SambaStudiou  
    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                       e Zd ZdZy)SambaStudio.ConfigTN__name__
__module____qualname__populate_by_name     a/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/llms/sambanova.pyConfigr   |       r&   r(   returnc                      y)9Return whether this model can be serialized by Langchain.Tr%   clss    r'   is_lc_serializablezSambaStudio.is_lc_serializable   s     r&   c                     dddS )Nr   r   )r   r   r%   selfs    r'   
lc_secretszSambaStudio.lc_secrets   s      1#8
 	
r&   c                 :    d| j                   id| j                  iS )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   r1   s    r'   _identifying_paramszSambaStudio._identifying_params   s#     T^^S@Q@Q/RSSr&   c                      y)zReturn type of llm.zsambastudio-llmr%   r1   s    r'   	_llm_typezSambaStudio._llm_type   s     !r&   kwargsc                     t        |dd      |d<   t        t        |dd            |d<   | j                  |d         \  |d<   |d<   t        |   di | y)	'init and validate environment variablesr   SAMBASTUDIO_URLr   SAMBASTUDIO_API_KEYr   r   Nr%   )r   r   _get_sambastudio_urlssuper__init__r2   r9   	__class__s     r'   r@   zSambaStudio.__init__   sx    $8%'8%
 ! )> )>@UV)
$% 7;6P6P$%7
3zF?3 	"6"r&   urlc                     d|v r|}|}||fS d|v r|j                  dd      }|}||fS |}d|v r$dj                  |j                  d            }||fS t        d      )a3  
        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)r2   rC   r   
stream_urls       r'   r>   z!SambaStudio._get_sambastudio_urls   s     $HJ ## 3;;y"5 
 ## #!1!6!6syy7K!LJ ## %%677r&   stopc           	         |g }| j                   xs i }|j                  dg       |z   }t        |      dkD  r||d<   d| j                  v rsd|j	                         v r|j                  d      |d<   d|j	                         v r|j                  d      |d<   d|j	                         v r|j                  d       |}|S d	| j                  v rPd|j	                         v r|j                  d      |d<   d|j	                         v r|j                  d      |d<   |}|S d
| j                  v rd|j	                         v r|j                  d      |d<   d|j	                         v r|j                  d      |d<   |j                         D ci c]'  \  }}|t        |      j                  t        |      d) }}}|S t        d| j                   d      c c}}w )aD  
        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   rE   select_expertmodelmax_tokens_to_generate
max_tokensprocess_promptapi/v2/predict/genericapi/predict/generic)typevaluerH   9only openai, generic v1 and generic v2 APIs are supported)r   getlenr   keyspopitemsrX   r!   strrL   )r2   rN   _model_kwargs_stop_sequencestuning_paramskvs          r'   _get_tuning_paramszSambaStudio._get_tuning_params   s&    <D ))/R (++,<bADH!#.=M*+ !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Aq DG,,s1v>>M   !$"6"6!7KL s   	,Gpromptc                    t        |t              r|g}| j                  |      }d| j                  v rXd|d   dg}||d|}|j	                         D ci c]  \  }}|	|| }}}d| j
                  j                          dd	}	n;d
| j                  v r|j                  dd      r!t        j                  ddd|d   dgd      }n|d   }d|dg}
|j	                         D ci c]  \  }}|	|| }}}|
|d}d| j
                  j                         i}	nd| j                  v r|j                  dd      r>|d   j                  d      dk(  r!t        j                  ddd|d   dgd      }n|d   }n|d   }|r||d}n|g|d}d| j
                  j                         i}	nt        d| j                   d      t        j                         }|r |j                  | j                  |	|d      }n|j                  | j                  |	|d      }|j                   dk7  r&t#        d|j                    d|j$                   d      |S c c}}w c c}}w ) a  
        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
        rE   userr   rolecontent)messagesrF   NBearer application/jsonAuthorizationzContent-TyperV   rU   Fzsambaverse-conversation-id)
message_idrk   rl   )conversation_idrm   item0)idrY   )r_   paramskeyrW   rY   True)instancerv   )	instancesrv   rH   rZ   TheadersjsonrF      2Sambanova / complete call failed with status code .)
isinstancer`   rf   r   r_   r   get_secret_valuer[   r}   dumpsrL   requestsSessionpostr   r   status_codeRuntimeErrortext)r2   rg   rN   r   rv   messages_dictdatarw   rY   r|   r_   http_sessionresponses                r'   _handle_requestzSambaStudio._handle_request  s   $ fc"XF((. !5!55&,CDM -MfMD15S:3ARCJSDS#*++<<>?"A 2G &)=)==zz*E2+G+/FSTIV%  #f56E39<<>WZS%UEVc5jWFW"f5Dd66GGIJG #d&:&::zz*E2*+//8FB!ZZ/K 37,2/5ay!")	F $AYF$*f=&,X@d66GGIJG !$"6"6!7KL   '')#((""G$t ) H $((wT% ) H 3&D''(==/$ 
 S T* Xs   
I!I*
I5Ir   c                 \   	 |j                         }d| j                  v r|d   d   d   d   }|S d	| j                  v r|d
   d   d   d   }|S d| j                  v r|d   d   d   }|S t        d| j                   d      # t        $ r }t        d| d|j                         d}~ww xY w)
        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: NrE   choicesr   messagerl   rV   r_   rY   
completionrW   predictionsrH   rZ   )r}   	Exceptionr   r   r   rL   r2   r   response_dicter   s        r'   _process_responsez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 	B+B&&B+c              #   H  K   	 ddl }d| j                  v r7|j                  |      }|j	                         D ]  }|j
                  dk(  r&t        d|j                   d|j                   d      	 |j                  dk7  rt        |j                  t              r t        j                  |j                        }n&t        d|j                   d|j                   d      |j                  d	      r&t        d|j                   d|j                   d      t        |d
         dkD  r|d
   d   d   d   }nd}t        |      }|  yd| j                  v rM|j#                         D ]9  }		 t        j                  |	      }|d   d   d   d   d   }t        |      }| ; yd| j                  v rJ|j#                         D ]6  }		 t        j                  |	      }|d   d   d   d   }t        |      }| 8 yt%        d| j                   d      # t        $ r t        d      w xY w# t         $ r }t        d| d|j                         d}~ww xY w# t         $ r}t        d| d|	       d}~ww xY w# t         $ r}t        d| d|	       d}~ww xY ww)
        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`.rE   error_event1Sambanova /complete call failed with status code r   [DONE]errorr   deltarl   r   r   3Error getting content chunk raw streamed response: data: rV   resultr_   rY   stream_tokenzline: rW   	responsesrH   rZ   )	sseclientImportErrorr   	SSEClienteventseventr   r   r   r   r`   r}   loadsr[   r\   r   r   
iter_linesrL   )
r2   r   r   clientr   r   rl   generated_chunkr   lines
             r'   _process_stream_responsez$SambaStudio._process_stream_response  s    	 !5!55((2F #;;-/&K#//0 ::,a) 
zzX-%ejj#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"H A)J"2CH2
%J"06I&$J"3J >J"H//J"2	I;IIJ"	I='I88I==J" 	J	JJJ"run_managerc              +      K   | j                  ||d      }| j                  |      D ]#  }|r|j                  |j                         | % yw)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   r2   rg   rN   r   r9   r   chunks          r'   _streamzSambaStudio._stream  S       '''E228< 	E,,UZZ8K	   AAc                     | j                   r.d} | j                  d|||d|D ]  }||j                  z  } |S | j                  ||d      }| j	                  |      }|S )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.

        Returns:
            result: string with model generation
        r   rg   rN   r   Fr   r%   r   r   r   r   r   r2   rg   rN   r   r9   r   r   r   s           r'   _callzSambaStudio._call        >>J% DkEK ) ejj(
)
 '''F++H5
r&   )NNFNN))r!   r"   r#   __doc__r   r   r`   __annotations__r   r   r   r   r   boolr   r   r   r   r(   classmethodr/   propertyr3   r6   r8   r@   r   r>   r   rf   r	   r   r   r   r   r   r   r
   r   r   __classcell__rB   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                       e Zd ZU dZ ed      Zeed<   	  e ed            Z	eed<   	  ed      Z
eed<   	  ed      Zeed	<   	  ed
      Zeed<   	  ed      Zeed<   	  ed      Zee   ed<   	  ed      Zee   ed<   	  eddi      Zeed<   	  G d d      Zedefd       Zedeeef   fd       Zedeeef   fd       Zedefd       Zdeddf fdZ	 	 d&de e!e   ef   dee!e      d	ee   de"fdZ#d e"defd!Z$d e"de%e&   fd"Z'	 	 d'de e!e   ef   dee!e      d#ee(   dedef
d$Z)	 	 d'de e!e   ef   dee!e      d#ee(   dede%e&   f
d%Z* xZ+S )(SambaNovaCloudu  
    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-InstructrR   Fr   i   rT   gffffff?temperatureNtop_ptop_kinclude_usageTstream_optionsc                       e Zd ZdZy)SambaNovaCloud.ConfigTNr    r%   r&   r'   r(   r   {  r)   r&   r(   r*   c                      y)r,   Fr%   r-   s    r'   r/   z!SambaNovaCloud.is_lc_serializable~  s     r&   c                 
    ddiS )Nr   r%   r1   s    r'   r3   zSambaNovaCloud.lc_secrets  s    #%899r&   c                     | j                   | j                  | j                  | j                  | j                  | j
                  | j                  dS )r5   rR   r   rT   r   r   r   r   r   r1   s    r'   r6   z"SambaNovaCloud._identifying_params  sC     ZZ//++ZZZZ"11
 	
r&   c                      y)z7Get the type of language model used by this chat model.zsambanovacloud-llmr%   r1   s    r'   r8   zSambaNovaCloud._llm_type  s     $r&   r9   c                 z    t        |ddd      |d<   t        t        |dd            |d<   t        |   di | y)	r;   r   SAMBANOVA_URLz,https://api.sambanova.ai/v1/chat/completionsr   r   SAMBANOVA_API_KEYNr%   )r   r   r?   r@   rA   s     r'   r@   zSambaNovaCloud.__init__  sP    "6B	#
 '< )<>QR'
"# 	"6"r&   rg   rN   c           	      d   t        |t              r|g}d|d   dg}||| j                  || j                  | j                  | j
                  | j                  d}|j                         D ci c]  \  }}|	|| }}}d| j                  j                          dd}t        j                         }	|r |	j                  | j                  ||d	      }
n|	j                  | j                  ||d
	      }
|
j                  dk7  r&t        d|
j                   d|
j                    d      |
S c c}}w )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
        ri   r   rj   )rm   rF   rT   rN   rR   r   r   r   rn   ro   rp   Tr{   Fr~   r   r   )r   r`   rT   rR   r   r   r   r_   r   r   r   r   r   r   r   r   r   )r2   rg   rN   r   r   r   rw   rY   r|   r   r   s              r'   r   zSambaNovaCloud._handle_request  sO     fc"XF"(VAY?@%//ZZ++ZZZZ	
 .2ZZ\OzsEU=NU
OO&t'='='N'N'P&QR.

  '')#((""G$t ) H $((""G$u ) H 3&D''(==/$ 
 - Ps   -
D,8D,r   c                     	 |j                         }|d   d   d   d   }|S # t        $ r }t        d| d|j                         d}~ww xY w)r   r   r   Nr   r   r   rl   )r}   r   r   r   r   s        r'   r   z SambaNovaCloud._process_response  si    	$MMOM #9-a0;IF
  	MaSX]]O- 	s   " 	AAAc              #   
  K   	 ddl }|j                  |      }|j                         D ]  }|j                  dk(  r&t        d|j                   d|j                   d      	 |j                  dk7  rt        |j                  t              r t        j                  |j                        }n&t        d|j                   d|j                   d      |j                  d      r&t        d|j                   d|j                   d      t        |d	         dkD  r|d	   d   d
   d   }nd}t        |      }|  y# t        $ r t        d      w xY w# t        $ r }t        d| d|j                         d}~ww xY ww)r   r   Nr   r   r   r   r   r   r   r   rl   r   r   r   r   )r   r   r   r   r   r   r   r   r   r`   r}   r   r[   r\   r   r   )	r2   r   r   r   r   r   rl   r   r   s	            r'   r   z'SambaNovaCloud._process_stream_response  s    	 $$X.]]_ #	E{{m+"G++,Azzl!% 
::)!%**c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D? AF#CE;F?EF	F  E;;F  Fr   c                     | j                   r.d} | j                  d|||d|D ]  }||j                  z  } |S | j                  ||d      }| j	                  |      }|S )  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   zSambaNovaCloud._call1  r   r&   c              +      K   | j                  ||d      }| j                  |      D ]#  }|r|j                  |j                         | % yw)r   Tr   Nr   r   s          r'   r   zSambaNovaCloud._streamN  r   r   r   r   ),r!   r"   r#   r   r   r   r`   r   r   r   rR   r   r   rT   intr   floatr   r   r   r   dictr(   r   r/   r   r   r3   r   r6   r8   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&   