
    Ng4+                        d dl mZ d dlZd dlZd dlZd dlmZmZmZm	Z	m
Z
mZmZmZmZ d dlmZmZ d dlmZ d dlmZmZ erd dlZe
d         Z G d d	e          Z ej        e          Z G d
 de          ZdS )    )annotationsN)	TYPE_CHECKINGAnyDictListLiteralOptional	TypedDictUnionoverload)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)LLM)
ConfigDictPrivateAttr)httpgrpcc                  P    e Zd ZU dZded<   ded<   ded<   ded<   d	ed
<   ded<   dS )IdentifyingParamsz3Parameters for identifying a model as a typed dict.str
model_nameOptional[str]model_id
server_urlzOptional[ServerType]server_typeboolembeddedDict[str, Any]
llm_kwargsN)__name__
__module____qualname____doc____annotations__     \/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/llms/openllm.pyr   r       sZ         ==OOO%%%%NNNr&   r   c                      e Zd ZU dZdZded<   	 dZded<   	 dZded<   	 dZded	<   	 d
Z	ded<   	 dZ
ded<   	 ded<   	  ed          Zded<    ed          Zded<    ed          Ze	 d4dddd5d            Zeddd d6d#            Z	 d7dddd
dd$d8 fd%Zed9d'            Zed:d)            Zed;d*            Z	 	 d<d=d1Z	 	 d<d>d3Z xZS )?OpenLLMa  OpenLLM, supporting both in-process model
    instance and remote OpenLLM servers.

    To use, you should have the openllm library installed:

    .. code-block:: bash

        pip install openllm

    Learn more at: https://github.com/bentoml/openllm

    Example running an LLM model locally managed by OpenLLM:
        .. code-block:: python

            from langchain_community.llms import OpenLLM
            llm = OpenLLM(
                model_name='flan-t5',
                model_id='google/flan-t5-large',
            )
            llm.invoke("What is the difference between a duck and a goose?")

    For all available supported models, you can run 'openllm models'.

    If you have a OpenLLM server running, you can also use it remotely:
        .. code-block:: python

            from langchain_community.llms import OpenLLM
            llm = OpenLLM(server_url='http://localhost:3000')
            llm.invoke("What is the difference between a duck and a goose?")
    Nr   r   r   r      inttimeoutr   
ServerTyper   Tr   r   r   r   )defaultzOptional[openllm.LLMRunner]_runnerzAUnion[openllm.client.HTTPClient, openllm.client.GrpcClient, None]_clientforbid)extra.)r   r   Literal[True, False]r   returnNonec                   d S Nr%   )selfr   r   r   r   s        r'   __init__zOpenLLM.__init__h   s	     sr&   )r   r   r   Literal['grpc', 'http']c                   d S r7   r%   )r8   r   r   r   s       r'   r9   zOpenLLM.__init__r   s	     sr&   )r   r   r,   r   r   c          	        	 dd l }n"# t          $ r}	t          d          |	d }	~	ww xY w|pi }|t                              d           ||
J d            |dk    r|j        j        n|j        j        }
 |
||          } t                      j        di ||||d d | _	        || _
        d S |
J d             |j        d|||dd	|} t                      j        di ||||d
 d | _
        || _	        d S )Nr   zMCould not import openllm. Make sure to install it with 'pip install openllm.'z4'server_url' is provided, returning a openllm.ClientzB'server_url' and {'model_id', 'model_name'} are mutually exclusiver   )r   r,   r   r   z)Must provide 'model_name' or 'server_url'T)r   r   
init_localensure_available)r   r   r   r   r%   )openllmImportErrorloggerdebugclient
HTTPClient
GrpcClientsuperr9   r/   r0   Runner)r8   r   r   r   r,   r   r   r   r?   e
client_clsrC   runner	__class__s                r'   r9   zOpenLLM.__init__{   s   	NNNN 	 	 	)  	  %2
!LLOPPP Z%7%7S &8%7%7 &(( ))^. 
  Z
G44FEGG  ",&#.",	     DL!DLLL))+V))) $W^ %!#!%	 
  F EGG  ", ( (",	     DL!DLLLs    
'"'openllm.LLMRunnerc                <    | j         t          d          | j         S )a  
        Get the underlying openllm.LLMRunner instance for integration with BentoML.

        Example:
        .. code-block:: python

            llm = OpenLLM(
                model_name='flan-t5',
                model_id='google/flan-t5-large',
                embedded=False,
            )
            tools = load_tools(["serpapi", "llm-math"], llm=llm)
            agent = initialize_agent(
                tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION
            )
            svc = bentoml.Service("langchain-openllm", runners=[llm.runner])

            @svc.api(input=Text(), output=Text())
            def chat(input_text: str):
                return agent.run(input_text)
        Nz5OpenLLM must be initialized locally with 'model_name')r/   
ValueErrorr8   s    r'   rJ   zOpenLLM.runner   s#    . <TUUU|r&   r   c                8   | j         m| j                            | j         j                   | j         j                                        d         }| j         j                                        d         }n~| j        t          d          | j        }| j	        }	 | j                            t          j        | j        j        d                              n# t          t          j        f$ r Y nw xY wt          | j        | j        | j        | j        ||          S )zGet the identifying parameters.Nr   r   zRunner must be initialized.configuration)r   r   r   r   r   r   )r0   r   update_config	_metadata
model_dumpr/   rN   r   r   jsonloadsidentifying_params	TypeErrorJSONDecodeErrorr   r   r   r   )r8   r   r   s      r'   _identifying_paramszOpenLLM._identifying_params   s    <#O""4<#7888/::<<\JJ|-88:::FHH|# !>???J}H&&Jt|>OPP    t34    (]!
 
 
 	
s   <C C0/C0c                    | j         rdndS )Nopenllm_clientr?   )r0   rO   s    r'   	_llm_typezOpenLLM._llm_type   s    #'<>Y>r&   promptstopOptional[List[str]]run_manager"Optional[CallbackManagerForLLMRun]kwargsc                R   	 dd l }n"# t          $ r}t          d          |d }~ww xY wt          j        | j                  }|                    |            |j        j        | j        d         fi |}| j	        r8 | j	        j
        |fi |                    d          j        d         j        }	n+| j        J  | j        |fi |                    d          }	t          |	t                     rd|	v r|	d         S t          |	t"                    r|	S t%          d|	           Nr   zMCould not import openllm. Make sure to install it with 'pip install openllm'.r   T)flattentextzCExpected result to be a dict with key 'text' or a string. Received )r?   r@   copydeepcopyr   rR   
AutoConfig	for_modelr[   r0   generaterU   outputsrh   r/   
isinstancedictr   rN   )
r8   r_   r`   rb   rd   r?   rH   copiedconfigress
             r'   _callzOpenLLM._call   s   	NNNN 	 	 	)  	 t//f-#-$\2
 
6<
 
 < 	J%%fPP0A0A$0A0O0OPP C <+++$,vII):):4):)H)HIICc4   	Vs]]v;S!! 	J"" "  s    
&!&'Optional[AsyncCallbackManagerForLLMRun]c                  K   	 dd l }n"# t          $ r}t          d          |d }~ww xY wt          j        | j                  }|                    |            |j        j        | j        d         fi |}| j	        r^|j
                            | j        | j                  }	 |	j        |fi |                    d           d {V j        d         j        }
n\| j        J  | j        j        j        |fi |\  }}} | j        j        j        |fi | d {V } | j        j        j        ||fi |}
t/          |
t0                    rd|
v r|
d         S t/          |
t2                    r|
S t5          d|
           rf   )r?   r@   ri   rj   r   rR   rk   rl   r[   r0   rC   AsyncHTTPClientr   r,   rm   rU   rn   rh   r/   llmsanitize_parameters	async_runpostprocess_generatero   rp   r   rN   )r8   r_   r`   rb   rd   r?   rH   rq   rr   async_clientrs   generate_kwargspostprocess_kwargsgenerated_results                 r'   _acallzOpenLLM._acall!  s0     	NNNN 	 	 	)  	 t//f-#-$\2
 
6<
 
 < 	">99$/4<XXL,|,VWWv7H7HQU7H7V7VWWWWWWWW C <+++
 5 4VFFvFF	"%DT\%:%D& &)& &             8$,"7( ,> C c4   	Vs]]v;S!! 	J"" "  s   	 
(#().)
r   r   r   r   r   r3   r   r   r4   r5   )r   r   r   r:   r   r   r4   r5   r7   )r   r   r   r   r   r   r,   r+   r   r:   r   r   r   r   )r4   rL   )r4   r   )r4   r   )NN)
r_   r   r`   ra   rb   rc   rd   r   r4   r   )
r_   r   r`   ra   rb   ru   rd   r   r4   r   )r    r!   r"   r#   r   r$   r   r   r,   r   r   r   r/   r0   r   model_configr   r9   propertyrJ   r[   r^   rt   r   __classcell__)rK   s   @r'   r)   r)   .   sy         > !%J$$$$K"H""""> $J$$$$SG*$K$$$$8HI7+6;t+D+D+DGDDDDD!!!      :  L  %( #&),     X  /2	     X %)C" #'$(/5C" C" C" C" C" C" C" C"J    X4 
 
 
 X
4 ? ? ? X? %):>	% % % % %T %)?C	1 1 1 1 1 1 1 1 1r&   r)   )
__future__r   ri   rV   loggingtypingr   r   r   r   r   r	   r
   r   r   langchain_core.callbacksr   r   #langchain_core.language_models.llmsr   pydanticr   r   r?   r-   r   	getLoggerr    rA   r)   r%   r&   r'   <module>r      s   " " " " " "   
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
        4 3 3 3 3 3 , , , , , , , , NNN ^$
    	    
	8	$	$d d d d dc d d d d dr&   