
    7|h'8                         d dl Z d dlZd dlmZmZmZmZmZmZ d dl	Z	d dl
mZmZ d dlmZ d dlmZ d dlmZ  ej&                  e      Z G d de      Zy)	    N)AnyAsyncIteratorDictIteratorListOptional)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)LLM)GenerationChunk)Fieldc                      e Zd ZU dZeed<   	 dZee   ed<   	 dZee	   ed<   	  e
dd	      Zeed<   	 d
Zee   ed<   	 dZee   ed<   	 dZee   ed<   	 dZee   ed<   	 dZee   ed<   	 dZee   ed<   	 dZee   ed<   	 dZee	   ed<   	 dZee	   ed<   	 dZee	   ed<   	 dZee   ed<   	 dZee   ed<   	  e
dd	      Zeed<   	  e
dd	      Ze	ed<   	  e
dd 	      Zeed <   	 d!Zee	   ed"<   	  e
dd#	      Zeed#<   	  e
dd$	      Zeed$<   	 g Z ee!e      ed%<   	 dZ"eed&<   	 e#d'e$ee%f   fd(       Z&e#d'e$ee%f   fd)       Z'e#d'efd*       Z(d4d+ee!e      d'e$ee%f   fd,Z)	 	 d5d-ed+ee!e      d.ee*   d/e%d'ef
d0Z+	 	 d5d-ed+ee!e      d.ee,   d/e%d'ef
d1Z-	 	 d5d-ed+ee!e      d.ee*   d/e%d'e.e/   f
d2Z0	 	 d5d-ed+ee!e      d.ee,   d/e%d'e1e/   f
d3Z2y)6TextGenaz  Text generation models from WebUI.

    To use, you should have the text-generation-webui installed, a model loaded,
    and --api added as a command-line option.

    Suggested installation, use one-click installer for your OS:
    https://github.com/oobabooga/text-generation-webui#one-click-installers

    Parameters below taken from text-generation-webui api example:
    https://github.com/oobabooga/text-generation-webui/blob/main/api-examples/api-example.py

    Example:
        .. code-block:: python

            from langchain_community.llms import TextGen
            llm = TextGen(model_url="http://localhost:8500")
    	model_urlNpreset   max_new_tokensT	do_sample)aliasg?temperatureg?top_p   	typical_pr   epsilon_cutoff
eta_cutoffgzG?repetition_penalty(   top_k
min_lengthno_repeat_ngram_size	num_beamspenalty_alphalength_penaltyFearly_stoppingseedadd_bos_tokeni   truncation_lengthban_eos_tokenskip_special_tokensstopping_strings	streamingreturnc                    i d| j                   d| j                  d| j                  d| j                  d| j                  d| j
                  d| j                  d| j                  d	| j                  d
| j                  d| j                  d| j                  d| j                  d| j                  d| j                  d| j                  d| j                   | j"                  | j$                  | j&                  | j(                  dS )z/Get the default parameters for calling textgen.r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r&   r'   )r(   r)   r*   r+   )r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r&   r'   r(   r)   r*   r+   selfs    _/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/llms/textgen.py_default_paramszTextGen._default_paramsv   sU   
d11

 4++
 TZZ	

 
 d11
 $//
 !$"9"9
 TZZ
 $//
 #D$=$=
 
 T//
 d11
 d11
  DII!
" T//#
$ "&!7!7!//#'#;#; $ 5 5+
 	
    c                 :    i d| j                   i| j                  S )zGet the identifying parameters.r   )r   r2   r/   s    r1   _identifying_paramszTextGen._identifying_params   s$     I;/H43G3GHHr3   c                      y)zReturn type of llm.textgen r/   s    r1   	_llm_typezTextGen._llm_type   s     r3   stopc                     | j                   r|t        d      | j                  | j                  }nd| j                  i}| j                   xs |xs g |d<   |S )a  
        Performs sanity check, preparing parameters in format needed by textgen.

        Args:
            stop (Optional[List[str]]): List of stop sequences for textgen.

        Returns:
            Dictionary containing the combined parameters.
        z2`stop` found in both the input and default params.r   r+   )r+   
ValueErrorr   r2   )r0   r:   paramss      r1   _get_parameterszTextGen._get_parameters   sc       T%5QRR;;))F,F &*%:%:%Hd%Hb!"r3   promptrun_managerkwargsc                    | j                   r0d} | j                  d|||d|D ]  }||j                  z  } |}|S | j                   d}| j	                  |      }	|	j                         }
||
d<   t        j                  ||
      }|j                  dk(  r|j                         d   d   d	   }|S t        d
|        d}|S )  Call the textgen web API and return the output.

        Args:
            prompt: The prompt to use for generation.
            stop: A list of strings to stop generation when encountered.

        Returns:
            The generated text.

        Example:
            .. code-block:: python

                from langchain_community.llms import TextGen
                llm = TextGen(model_url="http://localhost:5000")
                llm.invoke("Write a story about llamas.")
         r?   r:   r@   /api/v1/generater?   json   resultsr   textERROR: response: r8   )r,   _streamrK   r   r>   copyrequestspoststatus_coderH   printr0   r?   r:   r@   rA   combined_text_outputchunkresulturlr=   requestresponses               r1   _callzTextGen._call   s    . >>#% % DkEK 3 %

2$3 *F  ^^$$45C))$/FkkmG &GH}}Sw7H##s*!3A6v>
  )(45r3   c                   K   | j                   r1d} | j                  d|||d|2 3 d{   }||j                  z  }| j                   d}| j	                  |      }	|	j                         }
||
d<   t        j                  ||
      }|j                  dk(  r|j                         d   d	   d
   }|S t        d|        d}|S 7 6 |}|S w)rC   rD   rE   NrF   r?   rG   rI   rJ   r   rK   rL   r8   )r,   _astreamrK   r   r>   rN   rO   rP   rQ   rH   rR   rS   s               r1   _acallzTextGen._acall   s    . >>#% ,t}}  Dk EK  3 3e %

2$ ^^$$45C))$/FkkmG &GH}}Sw7H##s*!3A6v>
  )(45'3   *F s&   %CC
CC
BCC

Cc              +   6  K   	 ddl }i | j                  |      |}| j                   d}|j	                         }||d<   |j                         }	|	j                  |       |	j                  t        j                  |             	 |	j                         }
t        j                  |
      }
|
d   dk(  r3t        |
d   d	      }|r|j                  |j                  
       | n|
d   dk(  r|	j                          yz# t        $ r t        d      w xY wwa  Yields results objects as they are generated in real time.

        It also calls the callback manager's on_llm_new_token event with
        similar parameters to the OpenAI LLM class method of the same name.

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

        Returns:
            A generator representing the stream of tokens being generated.

        Yields:
            A dictionary like objects containing a string token and metadata.
            See text-generation-webui docs and below for more.

        Example:
            .. code-block:: python

                from langchain_community.llms import TextGen
                llm = TextGen(
                    model_url = "ws://localhost:5005"
                    streaming=True
                )
                for chunk in llm.stream("Ask 'Hi, how are you?' like a pirate:'",
                        stop=["'","
"]):
                    print(chunk, end='', flush=True)  # noqa: T201

        r   Nz9The `websocket-client` package is required for streaming.z/api/v1/streamr?   eventtext_streamrK   )rK   generation_info)token
stream_end	websocketImportErrorr>   r   rN   	WebSocketconnectsendrH   dumpsrecvloadsr   on_llm_new_tokenrK   closer0   r?   r:   r@   rA   rf   r=   rW   rX   websocket_clientrV   rU   s               r1   rM   zTextGen._stream  s#    H	 :D((.9&9 /++-"$..0  %djj12%**,FZZ'Fg-/'$( 00uzz0BL0 &&( %  	K 	s   DD C9DDDc                L  K   	 ddl }i | j                  |      |}| j                   d}|j	                         }||d<   |j                         }	|	j                  |       |	j                  t        j                  |             	 |	j                         }
t        j                  |
      }
|
d   dk(  r<t        |
d   d	      }|r$|j                  |j                  
       d{    | n|
d   dk(  r|	j                          y# t        $ r t        d      w xY w7 <wr_   re   rp   s               r1   r\   zTextGen._astreamY  s0    H	 :D((.9&9 /++-"$..0  %djj12%**,FZZ'Fg-/'$( %66UZZ6HHHL0 &&( %  	K 	8 Is(   D$D
 CD$%D"&$D$
DD$)N)NN)3__name__
__module____qualname____doc__str__annotations__r   r   r   intr   r   boolr   floatr   r   r   r   r   r   r   r    r!   r"   r#   r$   r&   r'   r(   r)   r*   r+   r   r,   propertyr   r   r2   r5   r9   r>   r
   rZ   r	   r]   r   r   rM   r   r\   r8   r3   r1   r   r      s   $ NJ FHSM 1$'NHSM'3D4It4#&K%&M !E8E? G "#Ix"8 '(NHUO'"#J#*..F  E8E?? !"J!.*+(3-+<
  !Ix} %&M8E?&&'NHUO' .>?ND?b'D#'O<M4<: (,x}+T  _=M4=V %d2G HHD,.htCy).@It8
c3h 
 
4 IT#s(^ I I 3  HT#Y$7 4S> : %):>	,, tCy!, 67	,
 , 
,b %)?C	,, tCy!, ;<	,
 , 
,b %):>	FF tCy!F 67	F
 F 
/	"FV %)?C	FF tCy!F ;<	F
 F 
	'Fr3   r   )rH   loggingtypingr   r   r   r   r   r   rO   langchain_core.callbacksr	   r
   #langchain_core.language_models.llmsr   langchain_core.outputsr   pydanticr   	getLoggerrs   loggerr   r8   r3   r1   <module>r      sD      E E  4 2 			8	$Nc Nr3   