o
    Zh,                     @  s   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 d dlmZ d dlmZ d dlmZmZmZ eeZG dd	 d	eZdS )
    )annotationsN)	AnyCallableDictIteratorListLiteralOptionalTupleUnion)CallbackManagerForLLMRun)LLM)GenerationChunk)	BaseModelFieldmodel_validatorc                   @  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d9d"d#Zd9d$d%Zed:d&d'Zed;d(d)Zed;d*d+Zed<d,d-Z		d=d>d2d3Z		d=d?d5d6Zed<d7d8ZdS )@Outlinesz%LLM wrapper for the Outlines library.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[BaseModel, Dict, Callable]]json_schemagrammarzOptional[Any]custom_generator)default_factoryDict[str, Any]model_kwargsafter)modereturn
'Outlines'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.   z_Either none or exactly one of regex, type_constraints, json_schema, or grammar can be provided.)sumr   r   r    r!   r"   
ValueErrorbuild_client)selfZnum_constraints r0   X/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/llms/outlines.pyvalidate_environment   s   zOutlines.validate_environmentc                 C  s  zdd l m} W n ty   tdw ddd}| jd	krLd
| jv r5| jdd\}}}| d| }ntd|dg |j||fi | j| _	| S | jdkre|g d |j
| jfi | j| _	| S | jdkr|g d ddl
m} t|dstd|j| jfd|i| j| _	| S | 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 )r+   Nr   )	importlibutil	find_spec
isinstancetupler   ).0pkgr0   r0   r1   
<listcomp>   s    zKOutlines.build_client.<locals>.check_packages_installed.<locals>.<listcomp>zMissing packages: z, z.. You can install them with:

    pip install  )ImportErrorjoin)r3   Zmissing_packagesr0   r0   r1   check_packages_installed   s   z7Outlines.build_client.<locals>.check_packages_installedllamacppz.gguf/   z.GGUF file_name must be provided for llama.cpp.)zllama-cpp-pythonZ	llama_cppr   )r   Ztorchdatasetstransformers_vision)r   rE   ZtorchvisionZPILZ
flash_attn)!LlavaNextForConditionalGenerationzZtransformers_vision backend is not supported, please install the correct outlines version.Zmodel_classvllmDarwinz'vLLM backend is not supported on macOS.mlxlmZmlxzUnsupported backend: )r3   r4   r)   r5   )Zoutlines.modelsmodelsr?   r   r   splitr-   rB   r&   r   r   rG   hasattrrF   platformsystemrH   rJ   )r/   rK   rA   Zcreator	repo_name	file_nameZrepo_idrG   r0   r0   r1   r.      s`   



%
"
	




zOutlines.build_clientc                 C  s   dS )Noutlinesr0   r/   r0   r0   r1   	_llm_type   s   zOutlines._llm_typec                 C  s   | j | jd| jS )N)r   stop_at)r   r   r&   rS   r0   r0   r1   _default_params   s
   zOutlines._default_paramsc                 C  s$   | j | j| j| j| j| jd| jS )N)r   r   r   r    r!   r"   )r   r   r   r    r!   r"   rV   rS   r0   r0   r1   _identifying_params   s   zOutlines._identifying_paramsc                 C  s   ddl m} | jr| jS | jr|j| j| jdS | jr$|j| j| jdS | jr0|j| j| jdS | j	r<|j
| j| j	dS || jS )Nr   )generate)Z	regex_str)Zpython_type)Zschema_object)Zcfg_str)rR   rX   r#   r   r   r    formatr!   jsonr"   cfgtext)r/   rX   r0   r0   r1   
_generator   s   zOutlines._generatorpromptrun_manager"Optional[CallbackManagerForLLMRun]kwargsc                 K  sj   i | j |}|r||d< d}| jr*| jd||d |d|D ]}||j7 }q |S | j|fi |}|S )NrU    )r^   r   r_   r0   )rV   r   _streamr\   r]   )r/   r^   r   r_   ra   paramsresponsechunkr0   r0   r1   _call  s    
zOutlines._callIterator[GenerationChunk]c                 k  sT    i | j |}|r||d< | jj|fi |D ]}|r!|| t|dV  qd S )NrU   )r\   )rV   r]   streamZon_llm_new_tokenr   )r/   r^   r   r_   ra   rd   tokenr0   r0   r1   rc   '  s   
zOutlines._streamc                 C  s   t | jdr
| jjS td)zAccess the tokenizer for the underlying model.

        .encode() to tokenize text.
        .decode() to convert tokens back to text.
        	tokenizerzTokenizer not found)rM   r   rk   r-   rS   r0   r0   r1   rk   7  s   zOutlines.tokenizer)r)   r*   )r)   r   )r)   r%   )r)   r   )NN)
r^   r   r   r   r_   r`   ra   r   r)   r   )
r^   r   r   r   r_   r`   ra   r   r)   rh   )__name__
__module____qualname____doc__r   __annotations__r   r   r   r   r   r    r!   r"   r#   r   dictr&   r   r2   r.   propertyrT   rV   rW   r]   rg   rc   rk   r0   r0   r0   r1   r      sZ   
 

Gr   )
__future__r   importlib.utilr6   loggingrN   typingr   r   r   r   r   r   r	   r
   r   Zlangchain_core.callbacksr   Z#langchain_core.language_models.llmsr   Zlangchain_core.outputsr   Zpydanticr   r   r   	getLoggerrl   loggerr   r0   r0   r0   r1   <module>   s    ,
