o
    /ѹg,                     @   s  d dl Z d dl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 d dlmZmZmZmZ d dlmZ d d	lmZmZ d d
lmZmZ ddlmZ ddlm Z  edZ!		d0ddZ"		d0dede#de$fddZ%dddddddedf	de#dee#ee# eee f de#de#de#de#dee# dee# defd d!Z&		"d1de#d#e#d$e#d%e'fd&d'Z(d(d) Z)dee#ee# eee f d*ee# d+ee#ef dee# fd,d-Z*d+ede#fd.d/Z+dS )2    N)AnyDictListOptionalUnion)snapshot_downloadDEFAULT_MODEL_FOR_PIPELINE)Model)
ConfigDictcheck_config)DEFAULT_MODEL_REVISIONInvokeTasks
ThirdParty)read_config)register_modelhub_reporegister_plugins_repo)Registrybuild_from_cfg   )Pipeline)is_official_hub_pathZ	pipelinesc                 C   s   t | tr)t| |r)tj| s'tjtji}|dur||t	j< t
| |||d} | S t | trgt | d trgtt| D ]+}t| | |rftj| | sftjtji}|dur[||t	j< t
| | ||d| |< q;| S )z normalize the input model, to ensure that a model str is a valid local path: in other words,
    for model represented by a model id, the model shall be downloaded locally
    N)revision
user_agentignore_file_patternr   )r   r   )
isinstancestrr   ospathexistsr   KEYZPIPELINEr   r   listrangelen)modelmodel_revisionthird_partyr   r   idx r)   `/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/modelscope/pipelines/builder.pynormalize_model_input   s8   



r+   cfg	task_namedefault_argsc                 C   s   t | t||dS )a#   build pipeline given model config dict.

    Args:
        cfg (:obj:`ConfigDict`): config dict for model object.
        task_name (str, optional):  task name, refer to
            :obj:`Tasks` for more details.
        default_args (dict, optional): Default initialization arguments.
    )Z	group_keyr.   N)r   	PIPELINES)r,   r-   r.   r)   r)   r*   build_pipeline6   s   r0   Zgputaskr%   config_filepipeline_name	frameworkdevicer&   r   returnc	                 K   s*  | du r|du rt d|du rt|ts!t|trt|d trt||drt|tr2t||dnt|d |d}
|
rF|
di dd}|du rv|	d}| durc|  t	j
t	jfv rc|du rcd}|rv|	d	du rpd
|	d	< t|||	}|du s~|dkr|	tj}|dur|	tj t||||d}t|
d t||
dd |rd|i}nAt|
 |
j}n9|durt|tr|d n|}t|dst|j}
t|
 |
j|_|j}nt| \}}t||}d|i}nd|i}||d< ||d< t|}
t|	| |	r|
|	 |dur||
_t|
| dS )a   Factory method to build an obj:`Pipeline`.


    Args:
        task (str): Task name defining which pipeline will be returned.
        model (str or List[str] or obj:`Model` or obj:list[`Model`]): (list of) model name or model object.
        preprocessor: preprocessor object.
        config_file (str, optional): path to config file.
        pipeline_name (str, optional): pipeline class name or alias name.
        framework (str, optional): framework type.
        model_revision: revision of model(s) if getting from model hub, for multiple models, expecting
        all models to have the same revision
        device (str, optional): whether to use gpu or cpu is used to do inference.
        ignore_file_pattern(`str` or `List`, *optional*, default to `None`):
            Any file pattern to be ignored in downloading, like exact file names or file extensions.

    Return:
        pipeline (obj:`Pipeline`): pipeline object for certain task.

    Examples:
        >>> # Using default model for a task
        >>> p = pipeline('image-classification')
        >>> # Using pipeline with a model name
        >>> p = pipeline('text-classification', model='damo/distilbert-base-uncased')
        >>> # Using pipeline with a model object
        >>> resnet = Model.from_pretrained('Resnet')
        >>> p = pipeline('image-classification', model=resnet)
        >>> # Using pipeline with a list of model names
        >>> p = pipeline('audio-kws', model=['damo/audio-tts', 'damo/auto-tts2'])
    Nz!task or pipeline_name is requiredr   )r   pipelinetypeexternal_engine_for_llmTllm_frameworkswiftllm)r'   r   ZpluginsZallow_remoteFr%   r5   )r-   )
ValueErrorr   r   r"   r   r   Zsafe_getgetlowerr   Ztext_generationZchatexternal_engine_for_llm_checkerr   r!   popr+   r   r   r   r7   hasattr	model_dirget_default_pipeline_infor   clear_llm_infoupdatepreprocessorr0   )r1   r%   rG   r2   r3   r4   r5   r&   r   kwargsr,   Zprefer_llm_pipeliner'   Zpipeline_propsZfirst_modelZdefault_model_repor)   r)   r*   r7   E   s   (










r7   F
model_namemodelhub_name	overwritec                 C   s,   |s| t vsJ d|  d||ft | < dS )z Add default model for a task.

    Args:
        task (str): task name.
        model_name (str): model_name.
        modelhub_name (str): name for default modelhub.
        overwrite (bool): overwrite default info.
    ztask z already has default model.Nr   )r1   rI   rJ   rK   r)   r)   r*   add_default_pipeline_info   s
   

rL   c                 C   s>   | t vrttj|   d }d}||fS t |  \}}||fS )z Get default info for certain task.

    Args:
        task (str): task name.

    Return:
        A tuple: first element is pipeline name(model_name), second element
            is modelhub name.
    r   N)r	   r"   r/   moduleskeys)r1   r3   Zdefault_modelr)   r)   r*   rD      s   rD   r   rH   c                 C   s   ddl m}m} ddlm} ddlm} t| tr| d } t| t	s%| j
} |ddkrltj| r7|| }n| }z||}|d j}	W n# tyg }
 ztd	| d
tj d|
  d }	W Y d }
~
nd }
~
ww |	rldS |j| |dddd}	||	r}dS d S )Nr   )ModelTypeHelperLLMAdapterRegistry   )get_model_id_from_cacher   )get_model_info_metar:   r;   z Cannot using llm_framework with z, ignoring llm_framework=z : r<   T-)Zwith_adaptersplitZ	use_cache)Znlp.llm_pipelinerO   rP   Zhub.check_modelrR   Z	swift.llmrS   r   r"   r   rC   r>   r   r   r    
model_type	Exceptionloggerwarningselfr:   contains)r%   r   rH   rO   rP   rR   rS   Zmodel_idinforV   er)   r)   r*   r@      sB   




r@   c                 C   s8   ddl m} | dd  |dkr| dd  |  d S )Nr   )rO   r9   r<   r:   )Z"modelscope.utils.model_type_helperrO   rA   clear_cache)rH   r3   rO   r)   r)   r*   rE     s
   rE   )NN)NF),r   typingr   r   r   r   r   Z modelscope.hub.snapshot_downloadr   Zmodelscope.metainfor	   Zmodelscope.models.baser
   Zmodelscope.utils.configr   r   Zmodelscope.utils.constantr   r   r   r   Zmodelscope.utils.hubr   Zmodelscope.utils.pluginsr   r   Zmodelscope.utils.registryr   r   baser   utilr   r/   r+   r   dictr0   r7   boolrL   rD   r@   rE   r)   r)   r)   r*   <module>   s   
!
	
~


$