
    Ig4+                        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j4                  e      Z G d
 de      Zy)    )annotationsN)	TYPE_CHECKINGAnyDictListLiteralOptional	TypedDictUnionoverload)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)LLM)
ConfigDictPrivateAttr)httpgrpcc                  N    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<   y)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/answerous/venv/lib/python3.12/site-packages/langchain_community/llms/openllm.pyr   r       s'    =O%%N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	 d%ddd	 	 	 	 	 	 	 	 	 d&d       Zeddd	 	 	 	 	 	 	 d'd       Z	 d(dddd
dd	 	 	 	 	 	 	 	 	 	 	 	 	 d) fdZed*d        Zed+d!       Zed,d"       Z	 	 d-	 	 	 	 	 	 	 	 	 d.d#Z	 	 d-	 	 	 	 	 	 	 	 	 d/d$Z xZS )0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   c                    y Nr%   )selfr   r   r   r   s        r'   __init__zOpenLLM.__init__h   s     r&   )r   r   c                    y r4   r%   )r5   r   r   r   s       r'   r6   zOpenLLM.__init__r   s     r&   )r   r   r,   r   r   c          	        	 dd l }|xs i }|}t        j                  d       ||J d       |dk(  r|j                  j
                  n|j                  j                  }
 |
||      }t        |    di ||||d d | _	        || _
        y |J d        |j                  d|||dd	|}t        |    di ||||d
 d | _
        || _	        y # t        $ r}	t        d      |	d }	~	ww xY w)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superr6   r/   r0   Runner)r5   r   r   r   r,   r   r   r   r;   e
client_clsr?   runner	__class__s                r'   r6   zOpenLLM.__init__{   sQ   	  %2
!LLOP Z%7TST7 &( ))^^.. 
  
G4FG ",&#.",	  DL!DL)V+VV) $W^^ %!#!%	
 F G ", ( (",	  DL!DLm  	) 	s   C 	C)C$$C)c                H    | 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)
        z5OpenLLM must be initialized locally with 'model_name')r/   
ValueErrorr5   s    r'   rF   zOpenLLM.runner   s$    . <<TUU||r&   c                   | j                   ~| j                  j                  | j                   j                         | j                   j                  j                         d   }| j                   j                  j                         d   }nu| j                  t        d      | j                  }| j                  }	 | j                  j                  t        j                  | j                  j                  d                t        | j                   | j"                  | j$                  | j                  ||      S # t        t        j                  f$ r Y Tw xY w)zGet the identifying parameters.r   r   zRunner must be initialized.configuration)r   r   r   r   r   r   )r0   r   update_config	_metadata
model_dumpr/   rI   r   r   jsonloadsidentifying_params	TypeErrorJSONDecodeErrorr   r   r   r   )r5   r   r   s      r'   _identifying_paramszOpenLLM._identifying_params   s    <<#OO""4<<#7#78//::<\JJ||--88::FH||# !>??J}}H&&JJt||>>OP
 !((]]!
 	
 t334 s   ;AD9 9EEc                "    | j                   rdS dS )Nopenllm_clientr;   )r0   rJ   s    r'   	_llm_typezOpenLLM._llm_type   s    #'<<>Y>r&   c                p   	 dd l }t        j                  | j                        }|j                  |        |j                  j                  | j                  d   fi |}| j                  rE | j                  j                  |fi |j                  d      j                  d   j                  }	n1| j                  J  | j                  |fi |j                  d      }	t        |	t               r	d|	v r|	d   S t        |	t"              r|	S t%        d|	       # t        $ r}t        d      |d }~ww xY w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   rM   
AutoConfig	for_modelrV   r0   generaterP   outputsr]   r/   
isinstancedictr   rI   )
r5   promptstoprun_managerkwargsr;   rD   copiedconfigress
             r'   _callzOpenLLM._call   sA   	 t/f-##--$$\2
6<
 <<%%%fP0A0A$0A0OP  <<+++$,,vI):):4):)HICc4 Vs]v;S!J5" 3  	) 	s   D 	D5$D00D5c                  K   	 dd l }t        j                  | j                        }|j                  |        |j                  j                  | j                  d   fi |}| j                  rs|j                  j                  | j                  | j                        }	 |	j                  |fi |j                  d       d {   j                   d   j"                  }
n| j$                  J  | j$                  j&                  j(                  |fi |\  }}} | j$                  j                  j*                  |fi | d {   } | j$                  j&                  j,                  ||fi |}
t/        |
t0              r	d|
v r|
d   S t/        |
t2              r|
S t5        d|
       # t        $ r}t        d      |d }~ww xY w7 7 wr[   )r;   r<   r^   r_   r   rM   r`   ra   rV   r0   r?   AsyncHTTPClientr   r,   rb   rP   rc   r]   r/   llmsanitize_parameters	async_runpostprocess_generaterd   re   r   rI   )r5   rf   rg   rh   ri   r;   rD   rj   rk   async_clientrl   generate_kwargspostprocess_kwargsgenerated_results                 r'   _acallzOpenLLM._acall!  s    	 t/f-##--$$\2
6<
 <<">>99$//4<<XL,|,,VWv7H7HQU7H7VWW  <<+++
 5  44VFvF	"%DT\\%:%:%D%D&)&   8$,,""77(,>C c4 Vs]v;S!J5" K  	) 	 X sH   GF* B<GGA?GG
A%G*	G3F??GG
G).)
r   r   r   r   r   zLiteral[True, False]r   r   returnNone)r   r   r   Literal['grpc', 'http']r   r   ry   rz   r4   )r   r   r   r   r   r   r,   r+   r   r{   r   r   r   r   )ry   zopenllm.LLMRunner)ry   r   )ry   r   )NN)
rf   r   rg   Optional[List[str]]rh   z"Optional[CallbackManagerForLLMRun]ri   r   ry   r   )
rf   r   rg   r|   rh   z'Optional[AsyncCallbackManagerForLLMRun]ri   r   ry   r   )r    r!   r"   r#   r   r$   r   r   r,   r   r   r   r/   r0   r   model_configr   r6   propertyrF   rV   rY   rm   rx   __classcell__)rG   s   @r'   r)   r)   .   sY   > !%J$K"Hm"> $J$SGS*$K$8HdI7+6t+DG(DD! N  L  %( #&),!  	
 '  
   /2	  -	
  
  %)C" #'$(/5C"!C"  	C"
 "C" C" -C" C" C"J  4 
 
4 ? ? %):>	%% "% 8	%
 % 
%T %)?C	11 "1 =	1
 1 
1r&   r)   )
__future__r   r^   rQ   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    r=   r)   r%   r&   r'   <module>r      sm    "   
 
 
 4 , ^$
	  
		8	$dc dr&   