
    NgM                       d dl mZ d dlZd dlZd dlmZ d dlmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZm Z  d d
l!m"Z"m#Z# d dl$m%Z%m&Z&m'Z' d dl(m)Z) d dl*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5  ede/          Z6ee
e7ef         ee6         ef         Z8 G d de          Z9dS )    )annotationsN)AsyncIterator)AnyCallableDictIteratorListOptionalSequenceTupleType	TypedDictTypeVarUnion
get_origin)CallbackManagerForLLMRun)AsyncCallbackManagerForLLMRun)LanguageModelInput)BaseChatModel)	AIMessageAIMessageChunkBaseMessage)JsonOutputParserPydanticOutputParser)ChatGenerationChatGenerationChunk
ChatResult)Runnable)BaseToolconvert_to_openai_tool)	BaseModelFieldmodel_validator)Literalconvert_message_to_dict_BM)boundc                      e Zd ZU dZdZded<   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Zded<   	 dZded<   	 dZded<   	 dZded<   	  ee          Zded<   	  ed          dHd"            ZdHd#ZedId$            ZedJd%            ZedJd&            ZedKd'            ZdLd+ZdMd,Zdd-dN fd4Zd5d6dOd;Z	 	 dPdQd@Z	 	 dPdRdBZ	 	 dPdS fdEZ 	 	 dPdT fdGZ! xZ"S )UChatOutlinesuB  Outlines chat model integration.

    Setup:
      pip install outlines

    Key init args — client params:
      backend: Literal["llamacpp", "transformers", "transformers_vision", "vllm", "mlxlm"] = "transformers"
        Specifies the backend to use for the model.

    Key init args — completion params:
      model: str
        Identifier for the model to use with Outlines.
      max_tokens: int = 256
        The maximum number of tokens to generate.
      stop: Optional[List[str]] = None
        A list of strings to stop generation when encountered.
      streaming: bool = True
        Whether to stream the results, token by token.

    See full list of supported init args and their descriptions in the params section.

    Instantiate:
      from langchain_community.chat_models import ChatOutlines
      chat = ChatOutlines(model="meta-llama/Llama-2-7b-chat-hf")

    Invoke:
      chat.invoke([HumanMessage(content="Say foo:")])

    Stream:
      for chunk in chat.stream([HumanMessage(content="Count to 10:")]):
          print(chunk.content, end="", flush=True)

    Nr   clientstrmodeltransformerszKLiteral['llamacpp', 'transformers', 'transformers_vision', 'vllm', 'mlxlm']backend   int
max_tokensOptional[List[str]]stopTbool	streamingzOptional[str]regexzOptional[Union[type, str]]type_constraintsz$Optional[Union[Any, Dict, Callable]]json_schemagrammarzOptional[Any]custom_generator)default_factoryDict[str, Any]model_kwargsafter)modereturn'ChatOutlines'c                
   t          t          | j                  t          | j                  t          | j                  t          | j                  g          }|dk    rt          d          |                                 S )z@Validate that outlines is installed and create a model instance.   _Either none or exactly one of regex, type_constraints, json_schema, or grammar can be provided.)sumr6   r8   r9   r:   r;   
ValueErrorbuild_client)selfnum_constraintss     d/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/outlines.pyvalidate_environmentz!ChatOutlines.validate_environment   s     TZ  T*++T%&&T\""	
 
 Q;     """    c                   	 dd l m} n# t          $ r t          d          w xY wdd}| j        dk    rf |d	g           d
| j        v r'| j                            dd          \  }}}| d| }nt          d           |j        ||fi | j        | _	        n.| j        dk    r, |g d            |j
        dd| j        i| j        | _	        n| j        dk    rEt          |d          r&ddl
m}  |j        | j        fd|i| j        | _	        nt          d          | j        dk    rPt          j                    dk    rt          d           |dg            |j        | j        fi | j        | _	        nL| j        dk    r* |dg            |j        | j        fi | j        | _	        nt          d| j                   | S )Nr   zUCould not import the Outlines library. Please install it with `pip install outlines`.packages!List[Union[str, Tuple[str, str]]]rB   Nonec                    d | D             }|r;t          dd                    |           dd                    |                     d S )Nc                    g | ]^}t           j                            t          |t                    r|d          n|          	 ?t          |t
                    r|n|d         _S )rE   Nr   )	importlibutil	find_spec
isinstancetupler-   ).0pkgs     rL   
<listcomp>zOChatOutlines.build_client.<locals>.check_packages_installed.<locals>.<listcomp>   sr          >++je6L6L,UCFFRUVV "#s++7Q  rN   zMissing packages: z, z.. You can install them with:

    pip install  )ImportErrorjoin)rP   missing_packagess     rL   check_packages_installedz;ChatOutlines.build_client.<locals>.check_packages_installed   s       #        !D3C)D)D D D'*xx0@'A'AD D   rN   llamacpp)zllama-cpp-python	llama_cppz.gguf/   z.GGUF file_name must be provided for llama.cpp.r/   )r/   torchdatasets
model_nametransformers_vision)!LlavaNextForConditionalGenerationmodel_classz,transformers_vision backend is not supportedvllmDarwinz'vLLM backend is not supported on macOS.mlxlmmlxzUnsupported backend: )rP   rQ   rB   rR    )outlines.modelsmodelsr^   r0   r.   splitrH   rb   r?   r,   r/   hasattrrj   ri   platformsystemrl   rn   )rJ   rr   ra   creator	repo_name	file_namerepo_idrj   s           rL   rI   zChatOutlines.build_client   s   	,,,,,,, 	 	 	A  		 	 	 	  <:%%$$&G%HIII$*$$04
0@0@a0H0H-I$22y22 !QRRR)&/'9RR@QRRDKK\^++$$%J%J%JKKK-&-  :)-): DKK \222v455 	QJJJJJJ8f8J  A '  !!OPPP\V##  H,, !JKKK$$fX...%&+djFFD4EFFDKK\W$$$$eW---&&,tzGGT5FGGDKKCT\CCDDDs   	 #c                    dS )Nzoutlines-chatrp   rJ   s    rL   	_llm_typezChatOutlines._llm_type  s    rN   c                .    | j         | j        d| j        S )N)r3   stop_at)r3   r5   r?   r|   s    rL   _default_paramszChatOutlines._default_params  s*     /y
 
 
 	
rN   c                ^    | j         | j        | j        | j        | j        | j        d| j        S )N)r.   r0   r8   r9   r:   r;   )r.   r0   r8   r9   r:   r;   r   r|   s    rL   _identifying_paramsz ChatOutlines._identifying_params"  s@     Z|Z $ 5+|
 
 "
 	
rN   c                :   ddl m} | j        r| j        S | j        | j        | j        | j        g}t          d |D                       }|dk    r|dk    rt          d          | j        r!|                    | j	        | j                  S | j        r!|
                    | j	        | j                  S | j        r!|                    | j	        | j                  S | j        r!|                    | j	        | j        	          S |                    | j	                  S )
Nr   )generatec              3     K   | ]}|d uV  	d S )Nrp   )rZ   
constraints     rL   	<genexpr>z*ChatOutlines._generator.<locals>.<genexpr>;  s'      SSj4SSSSSSrN   rE   rF   )	regex_str)python_type)schema_object)cfg_str)outlinesr   r<   r8   r9   r:   r;   rG   rH   r,   formatjsoncfgtext)rJ   r   constraintsrK   s       rL   
_generatorzChatOutlines._generator.  s=   %%%%%%  	)((J!L	
 SS{SSSSSaOq$8$8;   : 	E>>$+>DDD  	S??4;D<Q?RRR 	N==D<L=MMM< 	C<<T\<BBB}}T[)))rN   messageslist[BaseMessage]
list[dict]c                    d |D             S )Nc                ,    g | ]}t          |          S rp   r&   )rZ   messages     rL   r\   zCChatOutlines._convert_messages_to_openai_format.<locals>.<listcomp>N  s!    IIIW'00IIIrN   rp   )rJ   r   s     rL   "_convert_messages_to_openai_formatz/ChatOutlines._convert_messages_to_openai_formatK  s     JIIIIIrN   c                   | j         dk    rwddlm} | j                            d          \  }}}|                    | d|           }t          |j        d          r|j        j        }nt          d| j                   | j        }ddl
m} |                    |                              |                     |          dd	
          S )z.Convert a list of messages to a single prompt.rb   r   )	ModelCardrd   
base_modelzBase model name not found for )AutoTokenizerFT)tokenizeadd_generation_prompt)r0   huggingface_hubr   r.   rs   loadrt   datar   rH   r/   r   from_pretrainedapply_chat_templater   )	rJ   r   r   repo_creatorgguf_repo_namery   
model_cardrh   r   s	            rL   _convert_messages_to_promptz(ChatOutlines._convert_messages_to_promptP  s    <:%%1111116:j6F6Fs6K6K3L.)"<(J(J.(J(JKKJz55 P'_7

 !N$*!N!NOOOJ......,,Z88LL33H=="& M 
 
 	
rN   )tool_choicetools?Sequence[Dict[str, Any] | type | Callable[..., Any] | BaseTool]r    Optional[Union[Dict, bool, str]]kwargs)Runnable[LanguageModelInput, BaseMessage]c               8   d |D             }d |D             }rt          t                    r2t          fd|D                       st          dd| d          nt          t                    r'fd|D             }|st          dd| d          nPt          t
                    r;t          |          dk    r t          d	t          |           d
          |d         |d<   d |D             } t                      j        dd|i|S )a  Bind tool-like objects to this chat model

        tool_choice: does not currently support "any", "auto" choices like OpenAI
            tool-calling API. should be a dict of the form to force this tool
            {"type": "function", "function": {"name": <<tool_name>>}}.
        c                ,    g | ]}t          |          S rp   r    rZ   tools     rL   r\   z+ChatOutlines.bind_tools.<locals>.<listcomp>s  !    JJJD1$77JJJrN   c                *    g | ]}|d          d         S functionnamerp   )rZ   fts     rL   r\   z+ChatOutlines.bind_tools.<locals>.<listcomp>t  s!    GGGbnV,GGGrN   c              3  <   K   | ]}d          d         |k    V  dS )r   r   Nrp   )rZ   r   r   s     rL   r   z*ChatOutlines.bind_tools.<locals>.<genexpr>w  sC        @DK
+F3t;     rN   zTool choice tool_choice=z1 was specified, but the only provided tools were .c                8    g | ]}|d          d         k    |S r   rp   )rZ   fr   s     rL   r\   z+ChatOutlines.bind_tools.<locals>.<listcomp>  s3       !J-2G;2V2VA2V2V2VrN   rE   zQtool_choice=True can only be specified when a single tool is passed in. Received z tools.r   r   c                ,    g | ]}t          |          S rp   r    r   s     rL   r\   z+ChatOutlines.bind_tools.<locals>.<listcomp>  r   rN   r   rp   )	rX   dictanyrH   r-   r6   lensuper
bind_tools)rJ   r   r   r   formatted_tools
tool_nameschosen	__class__s     `    rL   r   zChatOutlines.bind_toolsf  s    KJEJJJGGGGG
 	1+t,, 1    HR      %={ = =/9= = =   K-- 1   .    $={ = =/9= = =  
 K.. 1''!++$C/25zzC C C   .a0 +}JJEJJJ!uww!BBB6BBBrN   F)include_rawschemaOptional[_DictOrPydanticClass]r   4Runnable[LanguageModelInput, Union[dict, BaseModel]]c                  t          |          t          u rt          d          || _        t	          |t
                    r&t          |t                    rt          |          }nt                      }|rt          d          | |z  S )Nz*TypedDict is not supported yet by Outlines)pydantic_objectz include_raw is not yet supported)
r   r   NotImplementedErrorr:   rX   type
issubclassr"   r   r   )rJ   r   r   r   parsers        rL   with_structured_outputz#ChatOutlines.with_structured_output  s     f**%&RSSS!fd## 	(
69(E(E 	($V<<< F &''F 	J%&HIIIf}rN   List[BaseMessage]run_manager"Optional[CallbackManagerForLLMRun]r   c                   i | j         |}|r||d<   |                     |          }d}| j        rl | j        d|||d|D ]Y}t	          |j        j        t                    r||j        j        z  }1t          dt          |j        j                             n | j
        |fi |}t          |          }	t          |	          }
t          |
g          S )	Nr    )r   r5   r   z1Invalid content type, only str is supported, got contentr   generationsrp   )r   r   r7   _streamrX   r   r   r-   rH   r   r   r   r   r   )rJ   r   r5   r   r   paramspromptresponsechunkr   
generations              rL   	_generatezChatOutlines._generate  s2    4D(3F3 	% $F911(;;> 	9% !'  	    em3S99  55HH$=#EM$9::= =   'tv8888HH---#G444
zl3333rN   Iterator[ChatGenerationChunk]c              +     K   i | j         |}|r||d<   |                     |          } | j        j        |fi |D ]=}|r|                    |           t          |          }t          |          }	|	V  >d S )Nr   r   r   )r   r   r   streamon_llm_new_tokenr   r   )
rJ   r   r5   r   r   r   r   tokenmessage_chunkr   s
             rL   r   zChatOutlines._stream  s       4D(3F3 	% $F911(;;+T_+F==f== 	 	E 4,,U333*5999M'>>>EKKKK	 	rN   List[str] | None$AsyncCallbackManagerForLLMRun | Nonec                   K   t          | j        d          rqi | j        |}|r||d<   |                     |          } | j        j        |fi | d {V }t          |          }t          |          }	t          |	g          S | j        r]d} | j	        |||fi |2 3 d {V }
||
j
        j        pdz  }6 t          |          }t          |          }	t          |	g          S  t                      j        |||fi | d {V S )N	agenerater   r   r   r   r   )rt   r   r   r   r   r   r   r   r7   _astreamr   r   r   
_agenerate)rJ   r   r5   r   r   r   r   r   r   r   r   r   s              rL   r   zChatOutlines._agenerate  s      4?K00 	S7,77F )$(y!55h??F6T_6vHHHHHHHHHHH111G'888J:,7777^ 	SH,t}Xt[SSFSS 8 8 8 8 8 8 8eEM17R7  T111G'888J:,7777++HdKRR6RRRRRRRRRs   #B<"AsyncIterator[ChatGenerationChunk]c                 K   t          | j        d          ri | j        |}|r||d<   |                     |          } | j        j        |fi |2 3 d {V }|r|                    |           d {V  t          |          }t          |          }	|	W V  J6 d S  t                      j	        |||fi |2 3 d {V }	|	W V  6 d S )Nastreamr   r   r   )
rt   r   r   r   r   r   r   r   r   r   )rJ   r   r5   r   r   r   r   r   r   r   r   s             rL   r   zChatOutlines._astream  sZ      4?I.. 	7,77F )$(y!55h??F6t6vHHHH       e >%66u========= .u = = =+MBBB  IHH  0uww/$VVvVV       e  WVVs   B<C	)rB   rC   )rB   r-   )rB   r>   )rB   r   )r   r   rB   r   )r   r   rB   r-   )r   r   r   r   r   r   rB   r   )r   r   r   r6   r   r   rB   r   )NN)
r   r   r5   r4   r   r   r   r   rB   r   )
r   r   r5   r4   r   r   r   r   rB   r   )
r   r   r5   r   r   r   r   r   rB   r   )
r   r   r5   r   r   r   r   r   rB   r   )#__name__
__module____qualname____doc__r,   __annotations__r0   r3   r5   r7   r8   r9   r:   r;   r<   r#   r   r?   r$   rM   rI   propertyr}   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r   s   @rL   r+   r+   )   s/           D FJJJ 	      J3 $D$$$$@I8E 487777	 9=K<<<<$ "G!!!!0 '+****R#(5#>#>#>L>>>> _'"""# # # #"#"; ; ; ;z    X 
 
 
 X
 	
 	
 	
 X	
 * * * X*8J J J J

 
 
 
4 9=	+C +C +C +C +C +C +C +Cb "	     6 %):>	!4 !4 !4 !4 !4L %):>	    . "&<@	S S S S S S S> "&<@	          rN   r+   ):
__future__r   importlib.utilrU   ru   collections.abcr   typingr   r   r   r   r	   r
   r   r   r   r   r   r   r   langchain_core.callbacksr    langchain_core.callbacks.managerr   langchain_core.language_modelsr   *langchain_core.language_models.chat_modelsr   langchain_core.messagesr   r   r   langchain_core.output_parsersr   r   langchain_core.outputsr   r   r   langchain_core.runnablesr   langchain_core.toolsr   %langchain_core.utils.function_callingr!   pydanticr"   r#   r$   typing_extensionsr%   #langchain_community.adapters.openair'   r(   r-   _DictOrPydanticClassr+   rp   rN   rL   <module>r     sZ   " " " " " "      ) ) ) ) ) )                               > = = = = = J J J J J J = = = = = = D D D D D D J J J J J J J J J J P P P P P P P P R R R R R R R R R R - - - - - - ) ) ) ) ) ) H H H H H H 6 6 6 6 6 6 6 6 6 6 % % % % % % G G G G G Gge9%%%T#s(^T#Y<= k k k k k= k k k k krN   