a
    bgM                     @  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d d!d"d#Zd d!d$d%Zedd!d&d'Zedd!d(d)Zedd!d*d+Zedd!d,d-Zd.d/d0d1d2Zd.dd0d3d4Zdd5d6d7dd8d9 fd:d;Zd<d=d>ddd?d@dAdBZdSdCddDddEdFdGdHZdTdCddDddIdFdJdKZdUdCdLdMddEdF fdNdOZ dVdCdLdMddPdF fdQdRZ!  Z"S )W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_tokensz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_factoryzDict[str, Any]model_kwargsafter)modez'ChatOutlines')returnc                 C  s@   t t| jt| jt| jt| jg}|dkr8t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.)sumr3   r5   r6   r7   r8   
ValueErrorbuild_client)selfnum_constraints rF   v/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/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Y n0 ddddd}| jdkr|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
f d| ji| j| _	n| jdkr t|drddl
m} |j| jfd|i| j| _	ntdn| jdkrft dkrBtd|dg |j| jfi | j| _	n@| 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`.z!List[Union[str, Tuple[str, str]]]None)packagesr>   c                 S  s6   dd | D }|r2t dd| dd| d S )Nc                 S  sD   g | ]<}t jt|tr |d  n|du rt|tr8|n|d qS )r?   Nr   )	importlibutil	find_spec
isinstancetupler+   ).0pkgrF   rF   rG   
<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)rJ   Zmissing_packagesrF   rF   rG   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: )Zoutlines.modelsmodelsrT   r.   r,   splitrB   rW   r;   r*   r-   hasattrr\   r[   platformsystemr]   r_   )rD   r`   rV   Zcreator	repo_name	file_nameZrepo_idr\   rF   rF   rG   rC      sT    









zChatOutlines.build_clientc                 C  s   dS )Nzoutlines-chatrF   rD   rF   rF   rG   	_llm_type  s    zChatOutlines._llm_typec                 C  s   | j | jd| jS )N)r1   stop_at)r1   r2   r;   rg   rF   rF   rG   _default_params  s
    zChatOutlines._default_paramsc                 C  s$   | j | j| j| j| j| jd| jS )N)r,   r.   r5   r6   r7   r8   )r,   r.   r5   r6   r7   r8   rj   rg   rF   rF   rG   _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rV|dkrVtd| jrn|j| j	| jdS | jr|j
| j	| jdS | jr|j| j	| jd	S | jr|j| j	| jd
S || j	S )Nr   )generatec                 s  s   | ]}|d uV  qd S )NrF   )rP   
constraintrF   rF   rG   	<genexpr>;      z*ChatOutlines._generator.<locals>.<genexpr>r?   r@   )Z	regex_str)Zpython_type)Zschema_object)Zcfg_str)Zoutlinesrl   r9   r5   r6   r7   r8   rA   rB   r*   formatjsoncfgtext)rD   rl   constraintsrE   rF   rF   rG   
_generator.  s,    zChatOutlines._generatorzlist[BaseMessage]z
list[dict])messagesr>   c                 C  s   dd |D S )Nc                 S  s   g | ]}t |qS rF   r%   )rP   messagerF   rF   rG   rR   N  ro   zCChatOutlines._convert_messages_to_openai_format.<locals>.<listcomp>rF   )rD   rv   rF   rF   rG   "_convert_messages_to_openai_formatK  s    z/ChatOutlines._convert_messages_to_openai_formatc           	      C  s   | j dkrdddlm} | jd\}}}|| d| }t|jdrR|jj}qjt	d| j n| j}ddl
m} ||j| |dd	d
S )z.Convert a list of messages to a single prompt.rW   r   )	ModelCardrX   
base_modelzBase model name not found for )AutoTokenizerFT)tokenizeZadd_generation_prompt)r.   Zhuggingface_hubry   r,   ra   loadrb   datarz   rB   r-   r{   Zfrom_pretrainedZapply_chat_templaterx   )	rD   rv   ry   Zrepo_creatorZgguf_repo_namerf   Z
model_cardrZ   r{   rF   rF   rG   _convert_messages_to_promptP  s    


z(ChatOutlines._convert_messages_to_prompttool_choicez?Sequence[Dict[str, Any] | type | Callable[..., Any] | BaseTool]z Optional[Union[Dict, bool, str]]z)Runnable[LanguageModelInput, BaseMessage])toolsr   kwargsr>   c                  s   dd |D }dd |D } rt  trXt fdd|D std d| dnjt  tr fd	d|D }|std d| dn2t  trt|d
krtdt| d|d   |d< dd |D }t jf 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  s   g | ]}t |qS rF   r   rP   ZtoolrF   rF   rG   rR   s  ro   z+ChatOutlines.bind_tools.<locals>.<listcomp>c                 S  s   g | ]}|d  d qS functionnamerF   )rP   ftrF   rF   rG   rR   t  ro   c                 3  s   | ]} d  d |kV  qdS )r   r   NrF   )rP   r   r   rF   rG   rn   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   rF   )rP   fr   rF   rG   rR     s   r?   zQtool_choice=True can only be specified when a single tool is passed in. Received z tools.r   r   c                 S  s   g | ]}t |qS rF   r   r   rF   rF   rG   rR     ro   r   )	rN   dictanyrB   r+   r3   lensuper
bind_tools)rD   r   r   r   Zformatted_toolsZ
tool_namesZchosen	__class__r   rG   r   f  sB    



zChatOutlines.bind_toolsF)include_rawzOptional[_DictOrPydanticClass]z4Runnable[LanguageModelInput, Union[dict, BaseModel]])schemar   r   r>   c                K  sT   t |tu rtd|| _t|tr:t|tr:t|d}nt	 }|rLtd| |B S )Nz*TypedDict is not supported yet by Outlines)Zpydantic_objectz include_raw is not yet supported)
r   r   NotImplementedErrorr7   rN   type
issubclassr!   r   r   )rD   r   r   r   parserrF   rF   rG   with_structured_output  s    z#ChatOutlines.with_structured_outputzList[BaseMessage]z"Optional[CallbackManagerForLLMRun]r   )rv   r2   run_managerr   r>   c                 K  s   i | j |}|r||d< | |}d}| jr| jf |||d|D ]6}t|jjtrf||jj7 }qFtdt	|jj qFn| j
|fi |}t|d}	t|	d}
t|
gdS )Nri    )rv   r2   r   z1Invalid content type, only str is supported, got contentrw   Zgenerations)rj   r   r4   _streamrN   rw   r   r+   rB   r   ru   r   r   r   )rD   rv   r2   r   r   paramspromptresponsechunkrw   
generationrF   rF   rG   	_generate  s0    




zChatOutlines._generatezIterator[ChatGenerationChunk]c           
      k  sj   i | j |}|r||d< | |}| jj|fi |D ],}|rJ|| t|d}t|d}	|	V  q8d S )Nri   r   r   )rj   r   ru   streamon_llm_new_tokenr   r   
rD   rv   r2   r   r   r   r   tokenZmessage_chunkr   rF   rF   rG   r     s    



zChatOutlines._streamzList[str] | Nonez$AsyncCallbackManagerForLLMRun | Nonec                   s   t | jdrji | j|}|r&||d< | |}| jj|fi |I d H }t|d}t|d}	t|	gdS | jrd}| j	|||fi |2 z3 d H W }
||
j
jpd7 }q6 t|d}t|d}	t|	gdS t j|||fi |I d H S d S )N	agenerateri   r   r   r   r   )rb   ru   rj   r   r   r   r   r   r4   _astreamrw   r   r   
_agenerate)rD   rv   r2   r   r   r   r   r   rw   r   r   r   rF   rG   r     s"    


"

zChatOutlines._ageneratez"AsyncIterator[ChatGenerationChunk]c           
       s   t | jdri | j|}|r&||d< | |}| jj|fi |2 z:3 d H W }|rd||I d H  t|d}t|d}	|	V  qD6 n.t j	|||fi |2 z3 d H W }	|	V  q6 d S )Nastreamri   r   r   )
rb   ru   rj   r   r   r   r   r   r   r   r   r   rF   rG   r     s    
 

$zChatOutlines._astream)NN)NN)NN)NN)#__name__
__module____qualname____doc__r*   __annotations__r.   r1   r2   r4   r5   r6   r7   r8   r9   r"   r   r;   r#   rH   rC   propertyrh   rj   rk   ru   rx   r   r   r   r   r   r   r   __classcell__rF   rF   r   rG   r)   )   sV   
"
=1  &      r)   ):
__future__r   importlib.utilrK   rc   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)   rF   rF   rF   rG   <module>   s(   <