o
    ZhM                     @  sV  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/dZ6ee
e7ef ee6 ef Z8G d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                      s  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dZded< 	 edddVd"d#ZdVd$d%ZedWd&d'ZedXd(d)ZedXd*d+ZedYd,d-ZdZd1d2Zd[d3d4Zdd5d\ fd<d=Zd>d?d]dDdEZ		d^d_dJdKZ		d^d`dMdNZ		d^da fdQdRZ 		d^db fdTdUZ!  Z"S )c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                 C  s@   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.)sumr4   r6   r7   r8   r9   
ValueErrorbuild_client)selfnum_constraints rI   _/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/chat_models/outlines.pyvalidate_environment   s   z!ChatOutlines.validate_environmentc                 C  s  zdd l m} W n ty   tdw ddd}| jd	krL|d
g d| jv r:| jdd\}}}| d| }ntd|j||fi | j| _	| S | jdkrf|g d |j
dd| ji| j| _	| S | jdkrt|drddl
m} |j| jfd|i| j| _	| S td| jdkrt dkrtd|dg |j| jfi | j| _	| S | jdkr|dg |j| jfi | j| _	| S td| j )Nr   zUCould not import the Outlines library. Please install it with `pip install outlines`.packages!List[Union[str, Tuple[str, str]]]r@   Nonec                 S  s6   dd | D }|rt dd| dd| d S )Nc                 S  sD   g | ]}t jt|tr|d  n|du rt|tr|n|d qS )rB   Nr   )	importlibutil	find_spec
isinstancetupler+   ).0pkgrI   rI   rJ   
<listcomp>   s    zOChatOutlines.build_client.<locals>.check_packages_installed.<locals>.<listcomp>zMissing packages: z, z.. You can install them with:

    pip install  )ImportErrorjoin)rL   Zmissing_packagesrI   rI   rJ   check_packages_installed   s   z;ChatOutlines.build_client.<locals>.check_packages_installedllamacpp)zllama-cpp-pythonZ	llama_cppz.gguf/   z.GGUF file_name must be provided for llama.cpp.r-   )r-   ZtorchZdatasets
model_nametransformers_vision)!LlavaNextForConditionalGenerationZmodel_classz,transformers_vision backend is not supportedvllmDarwinz'vLLM backend is not supported on macOS.mlxlmZmlxzUnsupported backend: )rL   rM   r@   rN   rI   )Zoutlines.modelsmodelsrX   r.   r,   splitrE   r[   r=   r*   r-   hasattrr`   r_   platformsystemra   rc   )rG   rd   rZ   Zcreator	repo_name	file_nameZrepo_idr`   rI   rI   rJ   rF      s^   










zChatOutlines.build_clientc                 C  s   dS )Nzoutlines-chatrI   rG   rI   rI   rJ   	_llm_type  s   zChatOutlines._llm_typec                 C  s   | j | jd| jS )N)r1   stop_at)r1   r3   r=   rk   rI   rI   rJ   _default_params  s
   zChatOutlines._default_paramsc                 C  s$   | j | j| j| j| j| jd| jS )N)r,   r.   r6   r7   r8   r9   )r,   r.   r6   r7   r8   r9   rn   rk   rI   rI   rJ   _identifying_params"  s   z ChatOutlines._identifying_paramsc                 C  s   ddl m} | jr| jS | j| j| j| jg}tdd |D }|dkr+|dkr+td| jr7|j| j	| jdS | jrC|j
| j	| jdS | jrO|j| j	| jd	S | jr[|j| j	| jd
S || j	S )Nr   )generatec                 s  s    | ]}|d uV  qd S )NrI   )rT   
constraintrI   rI   rJ   	<genexpr>;  s    z*ChatOutlines._generator.<locals>.<genexpr>rB   rC   )Z	regex_str)Zpython_type)Zschema_object)Zcfg_str)Zoutlinesrp   r:   r6   r7   r8   r9   rD   rE   r*   formatjsoncfgtext)rG   rp   constraintsrH   rI   rI   rJ   
_generator.  s,   zChatOutlines._generatormessageslist[BaseMessage]
list[dict]c                 C  s   dd |D S )Nc                 S     g | ]}t |qS rI   r%   )rT   messagerI   rI   rJ   rV   N      zCChatOutlines._convert_messages_to_openai_format.<locals>.<listcomp>rI   )rG   ry   rI   rI   rJ   "_convert_messages_to_openai_formatK  s   z/ChatOutlines._convert_messages_to_openai_formatc           	      C  s   | j dkr1ddlm} | jd\}}}|| d| }t|jdr)|jj}nt	d| j | j}ddl
m} ||j| |dd	d
S )z.Convert a list of messages to a single prompt.r[   r   )	ModelCardr\   
base_modelzBase model name not found for )AutoTokenizerFT)tokenizeZadd_generation_prompt)r.   Zhuggingface_hubr   r,   re   loadrf   datar   rE   r-   r   Zfrom_pretrainedZapply_chat_templater   )	rG   ry   r   Zrepo_creatorZgguf_repo_namerj   Z
model_cardr^   r   rI   rI   rJ   _convert_messages_to_promptP  s   


z(ChatOutlines._convert_messages_to_prompttool_choicetools?Sequence[Dict[str, Any] | type | Callable[..., Any] | BaseTool]r    Optional[Union[Dict, bool, str]]kwargs)Runnable[LanguageModelInput, BaseMessage]c                  s   dd |D }dd |D } rat  tr,t fdd|D s+td d| dn5t  trH fd	d|D }|sGtd d| dnt  trat|d
kr]tdt| d|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                 S  r|   rI   r   rT   ZtoolrI   rI   rJ   rV   s  r~   z+ChatOutlines.bind_tools.<locals>.<listcomp>c                 S  s   g | ]}|d  d qS functionnamerI   )rT   ftrI   rI   rJ   rV   t  s    c                 3  s     | ]} d  d |kV  qdS )r   r   NrI   )rT   r   r   rI   rJ   rr   w  s    
z*ChatOutlines.bind_tools.<locals>.<genexpr>zTool choice tool_choice=z1 was specified, but the only provided tools were .c                   s    g | ]}|d  d  kr|qS r   rI   )rT   fr   rI   rJ   rV     s    rB   zQtool_choice=True can only be specified when a single tool is passed in. Received z tools.r   r   c                 S  r|   rI   r   r   rI   rI   rJ   rV     r~   r   NrI   )	rR   dictanyrE   r+   r4   lensuper
bind_tools)rG   r   r   r   Zformatted_toolsZ
tool_namesZchosen	__class__r   rJ   r   f  sF   



zChatOutlines.bind_toolsF)include_rawschemaOptional[_DictOrPydanticClass]r   4Runnable[LanguageModelInput, Union[dict, BaseModel]]c                K  sT   t |tu r
td|| _t|trt|trt|d}nt	 }|r&td| |B S )Nz*TypedDict is not supported yet by Outlines)Zpydantic_objectz include_raw is not yet supported)
r   r   NotImplementedErrorr8   rR   type
issubclassr!   r   r   )rG   r   r   r   parserrI   rI   rJ   with_structured_output  s   z#ChatOutlines.with_structured_outputList[BaseMessage]run_manager"Optional[CallbackManagerForLLMRun]r   c                 K  s   i | j |}|r||d< | |}d}| jr?| jd|||d|D ]}t|jjtr3||jj7 }q#tdt	|jj n	| j
|fi |}t|d}	t|	d}
t|
gdS )	Nrm    )ry   r3   r   z1Invalid content type, only str is supported, got contentr}   ZgenerationsrI   )rn   r   r5   _streamrR   r}   r   r+   rE   r   rx   r   r   r   )rG   ry   r3   r   r   paramspromptresponsechunkr}   
generationrI   rI   rJ   	_generate  s2   




zChatOutlines._generateIterator[ChatGenerationChunk]c           
      k  sl    i | j |}|r||d< | |}| jj|fi |D ]}|r&|| t|d}t|d}	|	V  qd S )Nrm   r   r   )rn   r   rx   streamon_llm_new_tokenr   r   
rG   ry   r3   r   r   r   r   tokenZmessage_chunkr   rI   rI   rJ   r     s   



zChatOutlines._streamList[str] | None$AsyncCallbackManagerForLLMRun | Nonec                   s   t | jdr6i | j|}|r||d< | |}| jj|fi |I d H }t|d}t|d}	t|	gdS | jrfd}| j	|||fi |2 z3 d H W }
||
j
jpRd7 }qF6 t|d}t|d}	t|	gdS t j|||fi |I d H S )N	ageneraterm   r   r   r   r   )rf   rx   rn   r   r   r   r   r   r5   _astreamr}   r   r   
_agenerate)rG   ry   r3   r   r   r   r   r   r}   r   r   r   rI   rJ   r     s&   


"

zChatOutlines._agenerate"AsyncIterator[ChatGenerationChunk]c           
       s   t | jdrDi | j|}|r||d< | |}| jj|fi |2 z3 d H W }|r3||I d H  t|d}t|d}	|	V  q#6 d S t j	|||fi |2 z	3 d H W }	|	V  qP6 d S )Nastreamrm   r   r   )
rf   rx   rn   r   r   r   r   r   r   r   r   r   rI   rJ   r     s    
 

$zChatOutlines._astream)r@   rA   )r@   r+   )r@   r<   )r@   r   )ry   rz   r@   r{   )ry   rz   r@   r+   )r   r   r   r   r   r   r@   r   )r   r   r   r4   r   r   r@   r   )NN)
ry   r   r3   r2   r   r   r   r   r@   r   )
ry   r   r3   r2   r   r   r   r   r@   r   )
ry   r   r3   r   r   r   r   r   r@   r   )
ry   r   r3   r   r   r   r   r   r@   r   )#__name__
__module____qualname____doc__r*   __annotations__r.   r1   r3   r5   r6   r7   r8   r9   r:   r"   r   r=   r#   rK   rF   propertyrl   rn   ro   rx   r   r   r   r   r   r   r   r   __classcell__rI   rI   r   rJ   r)   )   sn   
 "

=

1&r)   ):
__future__r   importlib.utilrO   rg   collections.abcr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   Zlangchain_core.callbacksr   Z langchain_core.callbacks.managerr   Zlangchain_core.language_modelsr   Z*langchain_core.language_models.chat_modelsr   Zlangchain_core.messagesr   r   r   Zlangchain_core.output_parsersr   r   Zlangchain_core.outputsr   r   r   Zlangchain_core.runnablesr   Zlangchain_core.toolsr   Z%langchain_core.utils.function_callingr    Zpydanticr!   r"   r#   Ztyping_extensionsr$   Z#langchain_community.adapters.openair&   r'   r+   Z_DictOrPydanticClassr)   rI   rI   rI   rJ   <module>   s*    <