
    7|hM                    j   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      Z9y)    )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      d1d        Zd1d!Zed2d"       Zed3d#       Zed3d$       Zed4d%       Z	 	 	 	 d5d&Zd6d'Zdd(	 	 	 	 	 	 	 d7 fd)Zd*d+	 	 	 	 	 	 	 d8d,Z	 	 d9	 	 	 	 	 	 	 	 	 d:d-Z	 	 d9	 	 	 	 	 	 	 	 	 d;d.Z	 	 d9	 	 	 	 	 	 	 	 	 d< fd/Z 	 	 d9	 	 	 	 	 	 	 	 	 d= fd0Z! xZ"S )>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)modec                    t        t        | j                        t        | j                        t        | j                        t        | j
                        g      }|dkD  rt        d      | j                         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.)sumr5   r7   r8   r9   r:   
ValueErrorbuild_client)selfnum_constraintss     g/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/chat_models/outlines.pyvalidate_environmentz!ChatOutlines.validate_environment   st     TZZ T**+T%%&T\\"	
 Q;    ""    c                    	 dd l m} 	 	 	 	 dd}| j                  dk(  ro |dg       d| j                  v r(| j                  j                  dd      \  }}}| d| }nt        d	       |j                  ||fi | j                  | _	        | S | j                  d
k(  r9 |g d        |j                  dd| j                  i| j                  | _	        | S | j                  dk(  rMt        |d      r6ddl
m}  |j                  | j                  fd|i| j                  | _	        | S t        d      | j                  dk(  rYt        j                         dk(  rt        d       |dg        |j                   | j                  fi | j                  | _	        | S | j                  dk(  r7 |dg        |j"                  | j                  fi | j                  | _	        | S t        d| j                         # t        $ r t        d      w xY w)Nr   zUCould not import the Outlines library. Please install it with `pip install outlines`.c           	     "   | D cg c]N  }t         j                  j                  t        |t              r|d   n|      	 t        |t
              r|n|d   P }}|r/t        ddj                  |       ddj                  |             y c c}w )NrB   r   zMissing packages: z, z.. You can install them with:

    pip install  )	importlibutil	find_spec
isinstancetupler,   ImportErrorjoin)packagespkgmissing_packagess      rI   check_packages_installedz;ChatOutlines.build_client.<locals>.check_packages_installed   s    
 $ >>++je6LCFRUV "#s+Q7     !(3C)D(E F''*xx0@'A&BD    s   AB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: )rV   z!List[Union[str, Tuple[str, str]]]returnNone )outlines.modelsmodelsrT   r/   r-   splitrE   rZ   r>   r+   r.   hasattrrb   ra   platformsystemrd   rf   )rG   rl   rY   creator	repo_name	file_namerepo_idrb   s           rI   rF   zChatOutlines.build_client   s,   	,	7		  <<:%$&G%HI$**$04

0@0@a0H-I$IQyk2 !QRR)&//'9R@Q@QRDK6 5 \\^+$%JK-&-- ::)-):):DK0 + \\22v45J8f88JJ A ''"  !!OPP\\V# H, !JKK$fX.%&++djjFD4E4EFDK  \\W$$eW-&&,,tzzGT5F5FGDK  4T\\NCDDo  	A 	s   G8 8Hc                     y)Nzoutlines-chatrj   rG   s    rI   	_llm_typezChatOutlines._llm_type  s    rK   c                L    | j                   | j                  d| j                  S )N)r2   stop_at)r2   r4   r>   rv   s    rI   _default_paramszChatOutlines._default_params  s,     //yy
 
 	
rK   c                    | j                   | j                  | j                  | j                  | j                  | j
                  d| j                  S )N)r-   r/   r7   r8   r9   r:   )r-   r/   r7   r8   r9   r:   rz   rv   s    rI   _identifying_paramsz ChatOutlines._identifying_params"  sL     ZZ||ZZ $ 5 5++||
 ""
 	
rK   c                   ddl m} | j                  r| j                  S | j                  | j                  | j
                  | j                  g}t        d |D              }|dk7  r|dk7  rt        d      | j                  r'|j                  | j                  | j                        S | j                  r'|j                  | j                  | j                        S | j
                  r'|j                  | j                  | j
                        S | j                  r'|j                  | j                  | j                  	      S |j                  | j                        S )
Nr   )generatec              3  $   K   | ]  }|d u 
 y wNrj   ).0
constraints     rI   	<genexpr>z*ChatOutlines._generator.<locals>.<genexpr>;  s     Sj4Ss   rB   rC   )	regex_str)python_type)schema_object)cfg_str)outlinesr~   r;   r7   r8   r9   r:   rD   rE   r+   formatjsoncfgtext)rG   r~   constraintsrH   s       rI   
_generatorzChatOutlines._generator.  s   %  (((JJ!!LL	
 S{SSaOq$8;  ::>>$++>DD  ??4;;D<Q<Q?RR==D<L<L=MM<<<<T\\<BB}}T[[))rK   c                >    |D cg c]  }t        |       c}S c c}w r   r%   )rG   messagesmessages      rI   "_convert_messages_to_openai_formatz/ChatOutlines._convert_messages_to_openai_formatK  s      AIIW'0IIIs   c                   | j                   dk(  rddlm} | j                  j	                  d      \  }}}|j                  | d|       }t        |j                  d      r|j                  j                  }n$t        d| j                         | j                  }ddl
m} |j                  |      j                  | j                  |      dd	
      S )z.Convert a list of messages to a single prompt.rZ   r   )	ModelCardr\   
base_modelzBase model name not found for )AutoTokenizerFT)tokenizeadd_generation_prompt)r/   huggingface_hubr   r-   rm   loadrn   datar   rE   r.   r   from_pretrainedapply_chat_templater   )	rG   r   r   repo_creatorgguf_repo_namers   
model_cardr`   r   s	            rI   _convert_messages_to_promptz(ChatOutlines._convert_messages_to_promptP  s    <<:%16:jj6F6Fs6K3L.)"<..9I(JKJz5'__77
 #A$**!NOOJ.,,Z8LL33H="& M 
 	
rK   )tool_choicec               H   |D cg c]  }t        |       }}|D cg c]
  }|d   d    }}rt        t              r&t        fd|D              st	        dd| d      t        t
              r/|D cg c]  }|d   d   k(  s| }	}|	sMt	        dd| d      t        t              r+t        |      dkD  rt	        dt        |       d	      |d
   |d<   |D cg c]  }t        |       }}t        
| $  dd|i|S c c}w c c}w c c}w c c}w )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>>}}.
        functionnamec              3  4   K   | ]  }d    d   |k(    yw)r   r   Nrj   )r   r   r   s     rI   r   z*ChatOutlines.bind_tools.<locals>.<genexpr>w  s%      @DK
+F3t;s   zTool choice tool_choice=z1 was specified, but the only provided tools were .rB   zQtool_choice=True can only be specified when a single tool is passed in. Received z tools.r   r   toolsrj   )
r    rR   dictanyrE   r,   r5   lensuper
bind_tools)rG   r   r   kwargstoolformatted_toolsft
tool_namesfchosen	__class__s     `       rI   r   zChatOutlines.bind_toolsf  s|    EJJD1$7JJ7FGbnV,G
G+t, HR  %3{n 5//9l!=  K-.!J-2G;2VA  $3{n 5//9l!=  K.'!+$//25zl'C  .a0 +}DIJD1$7JJw!BB6BB= KG" Ks   DD<DD+DF)include_rawc                   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   NotImplementedErrorr9   rR   type
issubclassr!   r   r   )rG   schemar   r   parsers        rI   with_structured_outputz#ChatOutlines.with_structured_output  sh     f*%&RSS!fd#
69(E$V<  &'F%&HIIf}rK   c                   i | j                   |}|r||d<   | j                  |      }d}| j                  r | j                  d|||d|D ]j  }t	        |j
                  j                  t              r||j
                  j                  z  }At        dt        |j
                  j                                n | j                  |fi |}t        |      }	t        |	      }
t        |
g      S )	Nry    )r   r4   run_managerz1Invalid content type, only str is supported, got contentr   generationsrj   )rz   r   r6   _streamrR   r   r   r,   rE   r   r   r   r   r   )rG   r   r4   r   r   paramspromptresponsechunkr   
generations              rI   	_generatezChatOutlines._generate  s    4D((3F3 $F911(;>>% !' 	  emm33S9 5 55H$#EMM$9$9:;=  'tv88HH-#G4
zl33rK   c              +     K   i | j                   |}|r||d<   | j                  |      } | j                  j                  |fi |D ]1  }|r|j	                  |       t        |      }t        |      }	|	 3 y w)Nry   r   r   )rz   r   r   streamon_llm_new_tokenr   r   )
rG   r   r4   r   r   r   r   tokenmessage_chunkr   s
             rI   r   zChatOutlines._stream  s      4D((3F3 $F911(;+T__++F=f= 	E,,U3*59M'>EK	s   A;A=c                <  K   t        | j                  d      rri | j                  |}|r||d<   | j                  |      } | j                  j                  |fi | d {   }t        |      }t        |      }	t        |	g      S | j                  r>d} | j                  |||fi |2 3 d {   }
||
j                  j                  xs dz  }'t        | 4  |||fi | d {   S 7 7 >6 t        |      }t        |      }	t        |	g      S 7 .w)N	ageneratery   r   r   r   r   )rn   r   rz   r   r   r   r   r   r6   _astreamr   r   r   
_agenerate)rG   r   r4   r   r   r   r   r   r   r   r   r   s              rI   r   zChatOutlines._agenerate  s"     4??K07,,77F$(y!55h?F6T__66vHHHH1G'8J:,77^^H,t}}Xt[SFS 8 8eEMM117R7
 +HdKR6RRR I8S1G'8J:,77RsC   AD"C0#AD/C43C24C474D+D,D2C44'Dc                 K   t        | j                  d      ri | j                  |}|r||d<   | j                  |      } | j                  j                  |fi |2 3 d {   }|r|j                  |       d {    t        |      }t        |      }	|	 Bt        
| $  |||fi |2 3 d {   }	|	 7 ^7 E6 y 7 6 y w)Nastreamry   r   r   )
rn   r   rz   r   r   r   r   r   r   r   )rG   r   r4   r   r   r   r   r   r   r   r   s             rI   r   zChatOutlines._astream  s      4??I.7,,77F$(y!55h?F6t66vHH  e%66u=== .u =+MB$w/$VvV  e=  IVs`   ACC#C$C'C>C?4C3C
7C8C
;CCCCC

C)rh   z'ChatOutlines')rh   r,   )rh   r=   )rh   r   )r   list[BaseMessage]rh   z
list[dict])r   r   rh   r,   )r   z?Sequence[Dict[str, Any] | type | Callable[..., Any] | BaseTool]r   z Optional[Union[Dict, bool, str]]r   r   rh   z)Runnable[LanguageModelInput, BaseMessage])r   zOptional[_DictOrPydanticClass]r   r5   r   r   rh   z4Runnable[LanguageModelInput, Union[dict, BaseModel]])NN)
r   List[BaseMessage]r4   r3   r   "Optional[CallbackManagerForLLMRun]r   r   rh   r   )
r   r   r4   r3   r   r   r   r   rh   zIterator[ChatGenerationChunk])
r   r   r4   List[str] | Noner   $AsyncCallbackManagerForLLMRun | Noner   r   rh   r   )
r   r   r4   r   r   r   r   r   rh   z"AsyncIterator[ChatGenerationChunk])#__name__
__module____qualname____doc__r+   __annotations__r/   r2   r4   r6   r7   r8   r9   r:   r;   r"   r   r>   r#   rJ   rF   propertyrw   rz   r|   r   r   r   r   r   r   r   r   r   __classcell__)r   s   @rI   r*   r*   )   s    D FCJ 	    J3 $D
$@It8E= 4807	 9=K5<$ "G]!0 '+m*R#(#>L.> '"# ##";z   
 
 	
 	
 * *8J)J	J

4 9=	+CN+C 6	+C
 +C 
3+Cb "	. 	
  
>6 %):>	!4#!4 "!4 8	!4
 !4 
!4L %):>	# " 8	
  
'. "&<@	S#S S :	S
 S 
S> "&<@	#  :	
  
, rK   r*   ):
__future__r   importlib.utilrO   ro   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*   rj   rK   rI   <module>r      s    "   )     > J = D J J P R R - ) H 6 6 % Ge9%T#s(^T#Y<= k= krK   