o
    W+ i2                     @   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 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$ ddl%m&Z& edZ'e Z(		d2ddZ)		d2d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-		$d3de*d%e*d&e*d'e.fd(d)Z/d*d+ Z0dee*ee* eee f d,ee* d-ee*ef d!ee* fd.d/Z1d-ede*fd0d1Z2dS )4    N)AnyDictListOptionalUnion)snapshot_downloadDEFAULT_MODEL_FOR_PIPELINE)Model)
ConfigDictcheck_config)DEFAULT_MODEL_REVISIONInvokeTasks
ThirdParty)read_config)is_transformers_available)
get_logger)register_modelhub_reporegister_plugins_repo)Registrybuild_from_cfg)is_embedding_task   )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,   h/home/app/PaddleOCR-VL-test/.venv_paddleocr/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_keyr1   )r   	PIPELINES)r/   r0   r1   r,   r,   r-   build_pipeline:   s   r3   taskr(   config_filepipeline_name	frameworkdevicer)   r   returnc	              
   K   sj  | du r|du rt dd}
|du r/t|ts$t|trt|d trt||drt|tr5t||dnt|d |d}|rI|di dd}|du ry|	d}| durf|  t	j
t	jfv rf|du rfd}|ry|	d	du rsd
|	d	< t|||	}|du s|dkr|	tj}|dur|	tj t||||d}t|d t||dd |rd|i}
nz	t| |j}
W ny ty } ztt| W Y d}~ned}~ww n_|durt|tr|d n|}t|dst|j}z
t| |j|_W n ty } ztt| W Y d}~nd}~ww |jdr|j}
nt| \}}t||}d|i}
nd|i}
|
sZt| rZzddlm} |dd|i|	W S  tyY   t d  w |
st! rzddlm"} |d| |||d|	W S  ty } zt#d |d}~ww |sd}||
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   pluginsZallow_remoteF)sentence_transformers_pipeliner(   zWe could not find a suitable pipeline from modelscope, so we tried to load it using the sentence_transformers, but that also failed.)hf_pipeline)r4   r(   r7   r8   z{We couldn't find a suitable pipeline from ms, so we tried to load it using the transformers pipeline, but that also failed.Zgpur8   )r0   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   r:   AssertionErrorloggerinfohasattr	model_dir__dict__get_default_pipeline_infor   Zmodelscope.utils.hf_utilrA   	Exception	exceptionr   rB   errorr   clear_llm_infoupdatepreprocessorr3   )r4   r(   rT   r5   r6   r7   r8   r)   r   kwargsZpipeline_propsr/   Zprefer_llm_pipeliner*   eZfirst_modelZdefault_model_reporA   rB   r,   r,   r-   r:   I   s   (






2





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   rW   rX   rY   r,   r,   r-   add_default_pipeline_info   s
   

rZ   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%   r2   moduleskeys)r4   r6   Zdefault_modelr,   r,   r-   rN      s   rN   r   rU   c                 C   s  ddl m}m} ddlm} t| tr| d } t| ts| j} |	dd}|dkrndd	l
m} tj| r:|| }n| }z||}	|	d j}
W n" tyi } ztd
| d| d|  d }
W Y d }~nd }~ww |
rndS |j	| |dddd}
||
rdS d S )Nr   )ModelTypeHelperLLMAdapterRegistry   )get_model_id_from_cacher   r=    r>   )get_model_info_metaz Cannot using llm_framework with z, ignoring llm_framework=z : r?   T-)Zwith_adaptersplitZ	use_cache)Znlp.llm_pipeliner]   r^   Zhub.check_modelr`   r   r%   r    rL   rD   Z	swift.llmrb   r!   r"   r#   
model_typerO   rI   warningcontains)r(   r   rU   r]   r^   r`   r=   rb   Zmodel_idrJ   re   rV   r,   r,   r-   rF     s@   




rF   c                 C   s8   ddl m} | dd  |dkr| dd  |  d S )Nr   )r]   r<   r?   r=   )Z"modelscope.utils.model_type_helperr]   rG   clear_cache)rU   r6   r]   r,   r,   r-   rR   3  s
   rR   )NN)NF)3r!   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.import_utilsr   Zmodelscope.utils.loggerr   Zmodelscope.utils.pluginsr   r   Zmodelscope.utils.registryr   r   Zmodelscope.utils.task_utilsr   baser   utilr   r2   rI   r.   r    dictr3   r:   boolrZ   rN   rF   rR   r,   r,   r,   r-   <module>   s   
!
	
 "


$