
    Ng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dS )    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 CoE 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 CoE 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 CoE 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 CoE 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 CoE 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 CoE 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dS )SambaStudio.ConfigTN__name__
__module____qualname__populate_by_name     ^/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/llms/sambanova.pyConfigr   {           r&   r(   returnc                     dS )9Return whether this model can be serialized by Langchain.Tr%   clss    r'   is_lc_serializablezSambaStudio.is_lc_serializable~   s	     tr&   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/RSSr&   c                     dS )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<   |                     |d                   \  |d<   |d<    t                      j        di | dS )	'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__   s    $8%'8%
 %
 ! )> )>@UVV)
 )
$% 7;6P6P$%7
 7
3zF?3 	""6"""""r&   urlc                     d|v r|}|}n[d|v r|                     dd          }|}n>|}d|v r)d                    |                    d                    }nt          d          ||fS )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
        openai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     s??HJJ3;;y"55 

##!1!6!6syy7K7K!L!LJJ$%6777##r&   stopc                    |g }| j         pi }|                    dg           |z   }t          |          dk    r||d<   d| j        v rd|                                v r|                    d          |d<   d|                                v r|                    d          |d<   d	|                                v r|                    d	           |}nd
| j        v r_d|                                v r|                    d          |d<   d|                                v r|                    d          |d<   |}nd| j        v r{d|                                v r|                    d          |d<   d|                                v r|                    d          |d<   d |                                D             }nt          d| j         d          |S )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
        Nstop_sequencesr   rE   select_expertmodelmax_tokens_to_generate
max_tokensprocess_promptapi/v2/predict/genericapi/predict/genericc                 ^    i | ]*\  }}|t          |          j        t          |          d +S ))typevalue)rY   r!   str).0kvs      r'   
<dictcomp>z2SambaStudio._get_tuning_params.<locals>.<dictcomp>   sE       Aq DGG,s1vv>>  r&   rH   9only openai, generic v1 and generic v2 APIs are supported)r   getlenr   keyspopitemsrL   )r2   rN   _model_kwargs_stop_sequencestuning_paramss        r'   _get_tuning_paramszSambaStudio._get_tuning_params   sR    <D )/R (++,<bAADH!##.=M*+ t+++-"4"4"6"666)6):):?)K)Kg&'=+=+=+?+???.;.?.?,/ /l+  =#5#5#7#777!!"2333)MM%)===-,,....1>1B1B71K1Ko.}113333:G:K:K ; ;67 *MM"d&:::-,,....1>1B1B71K1Ko.}113333:G:K:K ; ;67 *0022  MM L$"6 L L L  
 r&   promptc                    t          |t                    r|g}|                     |          }d| j        v rRd|d         dg}||d|}d |                                D             }d| j                                         dd	}nCd
| j        v r|                    dd          r#t          j	        ddd|d         dgd          }n|d         }d|dg}d |                                D             }||d}d| j                                        i}nd| j        v r|                    dd          rK|d                             d          dk    r#t          j	        ddd|d         dgd          }n|d         }n|d         }|r||d}n|g|d}d| j                                        i}nt          d| j         d          t          j                    }	|r|	                    | j        ||d          }
n|	                    | j        ||d          }
|
j        dk    r t#          d |
j         d!|
j         d!          |
S )"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   c                     i | ]
\  }}|||S Nr%   r\   keyrZ   s      r'   r_   z/SambaStudio._handle_request.<locals>.<dictcomp>  s#    SSS:3ARCARARARr&   Bearer application/jsonAuthorizationzContent-TyperV   rU   Fzsambaverse-conversation-idN)
message_idrn   ro   )conversation_idrp   item0)idrZ   c                     i | ]
\  }}|||S rr   r%   rs   s      r'   r_   z/SambaStudio._handle_request.<locals>.<dictcomp>1  s#    WWWZS%UEVc5EVEVEVr&   )re   paramsrt   rW   rZ   True)instancer~   )	instancesr~   rH   r`   TheadersjsonrF      2Sambanova / complete call failed with status code .)
isinstancer[   ri   r   re   r   get_secret_valuera   r   dumpsrL   requestsSessionpostr   r   status_codeRuntimeErrortext)r2   rj   rN   r   r~   messages_dictdatar   re   http_sessionresponses              r'   _handle_requestzSambaStudio._handle_request  s8   $ fc"" 	XF((.. t+++&,CCDM -MMfMDSSSSSD"A+<<>>"A "A 2 GG &)===zz*E22 
#+G+/FSTIVV%    #f556EWW6<<>>WWWF"f55Dd6GGIIJGG #d&:::zz*E22 #*+//88FBB!Z/K 37,2/5ay!" !")	 	 FF $AYFF A$*f==&,X@@d6GGIIJGG L$"6 L L L    ')) 	#(("G$t )  HH $((wT% )  H 3&&$'$ $=$ $ $  
 r&   r   c                    	 |                                 }n,# t          $ r}t          d| d|j                   d}~ww xY wd| j        v r|d         d         d         d         }nZd	| j        v r|d
         d         d         d         }n6d| j        v r|d         d         d         }nt          d| j         d          |S )
        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   messagero   rV   re   rZ   
completionrW   predictionsrH   r`   )r   	Exceptionr   r   r   rL   r2   r   response_dicter   s        r'   _process_responsezSambaStudio._process_responseg  s   	$MMOOMM 	 	 	-a - -%]- -  	 t+++&y1!4Y?	JJJ%)===&w/27;LIJJ"d&:::&}5a8FJJL$"6 L L L       
A ;A c              #     K   	 ddl }n# t          $ r t          d          w xY wd| j        v rf|                    |          }|                                D ]9}|j        dk    r t          d|j         d|j         d          	 |j        dk    rt          |j        t                    rt          j        |j                  }n t          d|j         d|j         d          |                    d	          r t          d|j         d|j         d          t          |d
                   dk    r|d
         d         d         d         }nd}t          |          }|V  # t           $ r}t          d| d|j                   d}~ww xY wdS d| j        v r|                                D ]r}		 t          j        |	          }|d         d         d         d         d         }t          |          }|V  L# t           $ r}t          d| d|	           d}~ww xY wdS d| j        v r|                                D ]l}		 t          j        |	          }|d         d         d         d         }t          |          }|V  F# t           $ r}t          d| d|	           d}~ww xY wdS t%          d| j         d          )
        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   deltaro   r   r   3Error getting content chunk raw streamed response: data: rV   resultre   rZ   stream_tokenzline: rW   	responsesrH   r`   )	sseclientImportErrorr   	SSEClienteventseventr   r   r   r   r[   r   loadsra   rb   r   r   
iter_linesrL   )
r2   r   r   clientr   r   ro   generated_chunkr   lines
             r'   _process_stream_responsez$SambaStudio._process_stream_response  s     	 	 	 	E  	 t+++((22F # #;-//&)#/) ) :) ) )  
zX--%ej#66 #':ej#9#9DD".!1#+#7!1 !1#(:!1 !1 !1# # 
  88G,, ".!1#+#7!1 !1#(:!1 !1 !1# # 
 tI//!33&*9oa&8&A)&LGG&(G*9w*G*G*G----    &.a . .!&. .  ?# #L &)=== ++--  
:d++D"8nW5a8A.QG&57&C&C&CO)))))    &(a ( (!%( (    #d&::: ++--  
:d++D"8n[9!<^LG&57&C&C&CO)))))    &(a ( (!%( (    L$"6 L L L  sS   	 #CE((
F2FF6AG??
H#	HH#AJ
J/J**J/run_managerc              +      K   |                      ||d          }|                     |          D ]"}|r|                    |j                   |V  #d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.
            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   rj   rN   r   r9   r   chunks          r'   _streamzSambaStudio._stream  r        '''EE228<< 	 	E 9,,UZ888KKKK	 	r&   c                     | j         r"d} | j        d|||d|D ]}||j        z  }|S |                     ||d          }|                     |          }|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   rj   rN   r   Fr   r%   r   r   r   r   r   r2   rj   rN   r   r9   r   r   r   s           r'   _callzSambaStudio._call         > 	J% Dk EK  ) ) ej(

'''FF++H55
r&   rr   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   ri   r	   r   r   r   r   r   r   r
   r   r   __classcell__rB   s   @r'   r   r      s        Y Yv !5,,,OS,,,%*U99R==%A%A%AAAAE"d333Hc333'r4888M3888#eE***It***K-1L(4S>*1112                4    [ 
DcN 
 
 
 X
 TT#s(^ T T T XT !3 ! ! ! X!# # # # # # # #$ $sCx $ $ $ $4? ?xS	': ?d3PS8n ? ? ? ?H %)$)	d dd3in%d tCy!d D>	d
 
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dS )SambaNovaCloud.ConfigTNr    r%   r&   r'   r(   r   z  r)   r&   r(   r*   c                     dS )r,   Fr%   r-   s    r'   r/   z!SambaNovaCloud.is_lc_serializable}  s	     ur&   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  s8     Z/+ZZ"1
 
 	
r&   c                     dS )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                     t          |ddd          |d<   t          t          |dd                    |d<    t                      j        di | dS )	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__  su    "6B	#
 #
 #
 '< )<>QRR'
 '
"# 	""6"""""r&   rj   rN   c           	      
   t          |t                    r|g}d|d         dg}||| j        || j        | j        | j        | j        d}d |                                D             }d| j        	                                 dd}t          j                    }|r|                    | j        ||d	
          }n|                    | j        ||d
          }|j        dk    r t          d|j         d|j         d          |S )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
        rl   r   rm   )rp   rF   rT   rN   rR   r   r   r   c                     i | ]
\  }}|||S rr   r%   rs   s      r'   r_   z2SambaNovaCloud._handle_request.<locals>.<dictcomp>  s#    OOOzsEU=NU=N=N=Nr&   ru   rv   rw   Tr   Fr   r   r   )r   r[   rT   rR   r   r   r   re   r   r   r   r   r   r   r   r   r   )	r2   rj   rN   r   r   r   r   r   r   s	            r'   r   zSambaNovaCloud._handle_request  sa     fc"" 	XF"(VAY??@%/Z+ZZ	
 	
 POTZZ\\OOOV4+A+R+R+T+TVV.
 

  ')) 	#(("G$t )  HH $(("G$u )  H 3&&$'$ $=$ $ $  
 r&   r   c                     	 |                                 }n,# t          $ r}t          d| d|j                   d}~ww xY w|d         d         d         d         }|S )r   r   r   Nr   r   r   ro   )r   r   r   r   r   s        r'   r   z SambaNovaCloud._process_response  s    	$MMOOMM 	 	 	-a - -%]- -  	 #9-a0;IF
r   c              #     K   	 ddl }n# t          $ r t          d          w xY w|                    |          }|                                D ]9}|j        dk    r t          d|j         d|j         d          	 |j        dk    rt          |j        t                    rt          j        |j                  }n t          d|j         d|j         d          |                    d          r t          d|j         d|j         d          t          |d	                   dk    r|d	         d         d
         d         }nd}t          |          }|V  # t          $ r}t          d| d|j                   d}~ww xY wdS )r   r   Nr   r   r   r   r   r   r   r   ro   r   r   r   r   )r   r   r   r   r   r   r   r   r   r[   r   r   ra   rb   r   r   )	r2   r   r   r   r   r   ro   r   r   s	            r'   r   z'SambaNovaCloud._process_stream_response  s6     	 	 	 	E  	 $$X..]]__ #	 #	E{m++"%+% %z% % %  
:))!%*c22 #z%*55*-'3- -$z- - -  
 xx(( *-'3- -$z- - -  
 4	?++a//"&y/!"4W"=i"H"$&57&C&C&CO))))   "*! * *"Z* *  ?#	 #	s!   	 #>CE
F(FFr   c                     | j         r"d} | j        d|||d|D ]}||j        z  }|S |                     ||d          }|                     |          }|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._call0  r   r&   c              +      K   |                      ||d          }|                     |          D ]"}|r|                    |j                   |V  #dS )r   Tr   Nr   r   s          r'   r   zSambaNovaCloud._streamM  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***#(52#?#?#?y???!;<<<E3<<<eE***It***KeD)))J))) s+++K+++"U4000E8E?000 5...E8C=... 5/4)@AAANDAAAA                4    [ :DcN : : : X: 
T#s(^ 
 
 
 X
  $3 $ $ $ X$# # # # # # # #  %)$)	4 4d3in%4 tCy!4 D>	4
 
4 4 4 4l( s    07 7h>W 7 7 7 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      s6    D D D D D D D D D D D D D D D D D D  E E E E E E 3 3 3 3 3 3 2 2 2 2 2 2 L L L L L L L L % % % % % % % %      N N N N N# N N NbC C C C CS C C C C Cr&   