
    Ng'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dS )	    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Z2dS )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                 L   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/ai-engine/env/lib/python3.11/site-packages/langchain_community/llms/textgen.py_default_paramszTextGen._default_paramsv   s(   
d1

 4+
 TZ	

 
 d1
 $/
 !$"9
 TZ
 $/
 #D$=
 
 T/
 d1
 d1
  DI!
" T/#
$ "&!7!/#'#; $ 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;/H43GHHr3   c                     dS )zReturn type of llm.textgen r/   s    r1   	_llm_typezTextGen._llm_type   s	     yr3   stopc                     | j         r|t          d          | j        | j        }n	d| j        i}| j         p|p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.
        Nz2`stop` found in both the input and default params.r   r+   )r+   
ValueErrorr   r2   )r0   r:   paramss      r1   _get_parameterszTextGen._get_parameters   sa       	ST%5QRRR;)FF,F &*%:%Hd%Hb!"r3   promptrun_managerkwargsc                    | j         r#d} | j        d|||d|D ]}||j        z  }|}n| j         d}|                     |          }	|	                                }
||
d<   t          j        ||
          }|j        dk    r'|	                                d         d         d	         }n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 3 %
2$$)FF ^555C))$//FkkmmG &GH}Sw777H#s**!3A6v>4(44555r3   c                   K   | j         r)d} | j        d|||d|2 3 d{V }||j        z  }6 |}n| j         d}|                     |          }	|	                                }
||
d<   t          j        ||
          }|j        dk    r'|	                                d         d	         d
         }nt          d|            d}|S )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 3 3 3 3 3 3e %
2$$  *FF ^555C))$//FkkmmG &GH}Sw777H#s**!3A6v>4(44555s   /c              +     K   	 ddl }n# t          $ r t          d          w xY wi |                     |          |}| j         d}|                                }||d<   |                                }	|	                    |           |	                    t          j	        |                     	 |	
                                }
t          j        |
          }
|
d         dk    r9t          |
d	         d
          }|r|                    |j                   |V  n"|
d         dk    r|	                                 dS 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?   T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	 	 	 	K  	
 :D((..9&9///++--"$..00  %%%dj11222	%**,,FZ''Fg-//'$(    C00uz0BBBL00 &&(((	   	 #c                  K   	 ddl }n# t          $ r t          d          w xY wi |                     |          |}| j         d}|                                }||d<   |                                }	|	                    |           |	                    t          j	        |                     	 |	
                                }
t          j        |
          }
|
d         dk    r@t          |
d	         d
          }|r!|                    |j                   d{V  |W V  n"|
d         dk    r|	                                 dS r_   re   rp   s               r1   r\   zTextGen._astreamY  s     H	 	 	 	K  	
 :D((..9&9///++--"$..00  %%%dj11222	%**,,FZ''Fg-//'$(    I%66UZ6HHHHHHHHHL00 &&(((	rr   )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         $ NNNJ FHSM   1$'NHSM'''3eD444It444#&K%&&&M !E8E?   G "#Ix"""8 '(NHUO'''"#J###*....F  E8E?? !"J!!!.*+(3-+++<
  !Ix}   %&M8E?&&&&'NHUO''' 5.>???ND???b'''D#'''%O<<<M4<<<: (,x}+++T  %_===M4===V %d2G H H HHHHD,.htCy)...@It8
c3h 
 
 
 X
4 IT#s(^ I I I XI 3    X HT#Y$7 4S>    : %):>	, ,, tCy!, 67	,
 , 
, , , ,b %)?C	, ,, tCy!, ;<	,
 , 
, , , ,b %):>	F FF tCy!F 67	F
 F 
/	"F F F FV %)?C	F FF tCy!F ;<	F
 F 
	'F F 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   	getLoggerrt   loggerr   r8   r3   r1   <module>r      s      E E E E E E E E E E E E E E E E         4 3 3 3 3 3 2 2 2 2 2 2      		8	$	$N N N N Nc N N N N Nr3   