o
    ॵi%                     @   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 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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
ThirdParty)read_config)register_modelhub_reporegister_plugins_repo)Registrybuild_from_cfg   )Pipeline)is_official_hub_path	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   KEYPIPELINEr   r   listrangelen)modelmodel_revisionthird_partyr   r   idx r*   P/home/ubuntu/.local/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.
    )	group_keyr/   )r   	PIPELINES)r-   r.   r/   r*   r*   r+   build_pipeline6   s   r2   gputaskr&   config_filepipeline_name	frameworkdevicer'   r   returnc	                 K   s  | du r|du rt d|	tj}
|
dur|	tj |du r,|	dr,t|||	}nt|||
|d}d|i}|du rt|tsMt|t	rt|d trt
||drt|tr^t||dnt|d |d}t|d t||d	d
 |	drt|||	nd}|durd|i}n<t| |j}n4|durt|t	r|d n|}t|dst|j}t| |j|_|j}nt| \}}t||}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 required	llm_first)r(   r   typer   )r   pluginsallow_remoteFpipeliner&   r8   )r.   )
ValueErrorgetr   r!   popllm_first_checkerr,   r   r   r#   r   r   r   safe_getr   r   r>   hasattr	model_dirget_default_pipeline_infor   clear_llm_infoupdatepreprocessorr2   )r4   r&   rI   r5   r6   r7   r8   r'   r   kwargsr(   pipeline_propsr-   first_modeldefault_model_repor*   r*   r+   r>   E   s   (





r>   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   )r4   rN   rO   rP   r*   r*   r+   add_default_pipeline_info   s
   

rQ   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#   r1   moduleskeys)r4   r6   default_modelr*   r*   r+   rF      s   rF   r   rJ   c                 C   sj   ddl m}m} t| tr| d } t| ts| j} |ddkr"dS |j| |dddd	}||r3dS d S )
Nr   )ModelTypeHelperLLMAdapterRegistryr   llm_frameworkswiftllmT-)with_adaptersplit	use_cache)	nlp.llm_pipelinerU   rV   r   r#   r   rE   r@   contains)r&   r   rJ   rU   rV   
model_typer*   r*   r+   rB      s   



rB   c                 C   s$   ddl m} | dd  |  d S )Nr   )rU   r:   )"modelscope.utils.model_type_helperrU   rA   clear_cache)rJ   rU   r*   r*   r+   rG      s   rG   )NN)NF)+r   typingr   r   r   r   r    modelscope.hub.snapshot_downloadr   modelscope.metainfor	   modelscope.models.baser
   modelscope.utils.configr   r   modelscope.utils.constantr   r   r   modelscope.utils.hubr   modelscope.utils.pluginsr   r   modelscope.utils.registryr   r   baser   utilr   r1   r,   r   dictr2   r>   boolrQ   rF   rB   rG   r*   r*   r*   r+   <module>   s   
!
	
i


