o
    ॵinx                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ 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 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$ e$ Z%	 dwde&de&de'fddZ(dd Z)defddZ*de&de+fddZ,de&fddZ-de&fddZ.de&fd d!Z/de&fd"d#Z0d$d% Z1d&d' Z2d(d) Z3G d*d+ d+e j4Z5G d,d- d-e j4Z6d.e&d/e&fd0d1Z7d2d3d4d5d6d6d7d7d6d6d6d8Z8d9d: Z9d;efd<d=Z:G d>d? d?Z;d@e&fdAdBZ<dCdD Z=dEdF Z>dGdH Z?dIdJ Z@dKdL ZAdMdN ZBdOdP ZCejDe=ejEe@ejFe>ejGe?ejHeAejIe@ejJe@ejKe@iZLdQe;d;edRe&fdSdTZMdUdV ZNdWdX ZOdYdZ ZPd[d\ ZQd]d^ ZRd_d` ZSeOePeQeReSdaZTejUeViZWdbdc ZXddde ZYdfdg ZZdhdi Z[e\djkrCd dkl]m^Z^ e^ Z_i Z`e_dl a D ]\ZbZceb\ZdZeZfeddmkreednkregdoecdp  dqef  e7ecdp ef\ZhZiz`eeev reeev re9eiZje,eedZke-eeZlekejeldrZmn@e%ndseeeeev eeev f  dZkdZleeev re,eedZkeeev re-eeZle9eiZjekreknejekrejni elrelndtd6idrZmW n eoy   Y qw eme`ee< qepe`ZqerdudvZsesteq W d   dS 1 s<w   Y  dS dS )x    N)BytesIO)Any)urlparse)model_file_download)TASK_OUTPUTS
OutputKeysOutputTypesOutputTypeSchema)
INPUT_TYPEINPUT_TYPE_SCHEMATASK_INPUTS	InputType)pipeline)Pipeline)Config)	ModelFileTasks)
get_loggerTmodel_idrevision	llm_firstc                 C   s,   t | tj|d}t|}t|j| ||dS )N)r   	file_pathr   )taskmodelmodel_revisionr   )r   r   CONFIGURATIONr   	from_filer   r   )r   r   r   model_configuration_filecfg r   Q/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/utils/input_output.pycreate_pipelineF   s   
r!   c                 C   s"   t | dd }dd |D }|S )Nc                 S   s   t |  S N)inspect	isroutine)ar   r   r    <lambda>T   s    z+get_class_user_attributes.<locals>.<lambda>c                 S   s,   g | ]}|d   dr|d  ds|qS )r   __)
startswithendswith).0r%   r   r   r    
<listcomp>U   s    z-get_class_user_attributes.<locals>.<listcomp>)r#   
getmembers)cls
attributesuser_attributesr   r   r    get_class_user_attributesS   s
   r0   task_inputsc                 C   s   t | trt|  }|S t | tst | tr'| D ]}t |tr$t|  S qdS t | tr?i }|  D ]
\}}t|||< q2|S td|  )zNGet task input schema.

    Args:
        task_name (str): The task name.
    invalid input_type definition N)	
isinstancestrr
   tuplelistdictget_input_typeitems
ValueError)r1   
input_typeitem
input_infokvr   r   r    r8   \   s"   

r8   	task_namer;   c                 C   s,  |du rt |  }t|trd|t| idS n|}t|tr"t| S |du r>t|tr>|D ]}t|tr;td|  S q-dS t|tsHt|trqdi d}|D ]}t|tretd|}||d d< |  S t| |d< |  S dS t|trdi d}| D ]\}}td||d |< q|S t	d	| )
zxGet task input schema.

    Args:
        task_name (str): The task name.
        input_type (type): The input type
    Nobjecttype
propertiesarray)rC   r9   r9   rC   rD   r2   )
r   r3   r4   r   r6   r7   get_input_schemar5   r9   r:   )r@   r;   r1   r<   input_schemaitem_schemar>   r?   r   r   r    rF   u   sJ   	





	rF   c                 C   sF   t |  }di d}t|tstd|  |D ]
}t| |d |< q|S )zOGet task output schema.

    Args:
        task_name (str): The task name.
    rA   rB    TASK_OUTPUTS for %s is not list.rD   )r   r3   r6   r:   r	   )r@   task_outputsoutput_schema
output_keyr   r   r    get_output_schema   s   

rM   c                 C   s   t |  }t|trt| }|S t|tr|S t|tr/|D ]}t|tr,dt|i  S qd S t|trIi }| D ]
\}}t|||< q:d|iS t	d| )Ninputr2   )
r   r3   r4   r
   r5   r6   r7   r8   r9   r:   )r@   r1   r;   r<   r=   r>   r?   r   r   r    get_input_info   s(   



rO   c                 C   s<   t |  }i }t|tstd|  |D ]}t| ||< q|S )NrI   )r   r3   r6   r:   r   )r@   output_keysoutput_typerL   r   r   r    get_output_info   s   
rR   c                 C   sR   t t}d}|D ]\}}|| ks|| krd} nq|sdS t| }t| }||fS )zUGet task input output schema.

    Args:
        task_name (str): The task name.
    FT)NN)r0   r   rO   rR   )r@   tasks
task_existkeyvaluer1   rJ   r   r   r    get_task_io_info   s   rW   c                 C   s   | j d ur7t| j tjr| j| j jjfS t| j tjr"| j| j jfS t| j tjr0| j| j j	fS t
d| j  |d urC| jt|jfS td| j  | jdfS )NzInvalid annotation: %sz1arg: %s has no data type annotation, use default!rA   )
annotationr3   ast	SubscriptargrV   idName	Attributeattr	ExceptionrC   __name__loggerwarning)r[   default_valuer   r   r    process_arg_type_annotation   s   

re   c                 C   s   t | tjr	| jS ttdrt | tjr| jS t | tjr'tdd | jD S t | tj	r0| j
S t | tjrHt| d}ddd d}||j|S t | tjrQ| jS t S )NBytesc                 s   s    | ]}t |V  qd S r"   )convert_to_value)r*   ir   r   r    	<genexpr>  s    z#convert_to_value.<locals>.<genexpr>)r<   TF)TrueFalseNone)r3   rY   Strshasattrrf   Tupler5   eltsNumnr]   VariableKeygetnameNameConstantrV   UnhandledKeyType)r<   resultconstants_lookupr   r   r    rg     s*   
rg   c                 C   s:  g }t | j}t | j}| jd||  D ]}|jdkrqt|d \}}|||dd f qt| j|| d  | jD ]\}}t|}t||\}}|||d|f q;t | j}	t | j	}
| jd|	|
  D ]}t|\}}|||dd f qgt| j|	|
 d  | j	D ]\}}t|\}}|||d|j
f q|S )Nr   selfFT)lenargsdefaultsr[   re   appendziprg   
kwonlyargskw_defaultsrV   )r}   	argumentsn_argsn_args_defaultr[   arg_namearg_typedftrV   n_kwargsn_kwargs_defaultkwargr   r   r    process_args  s.   


"

r   c                       s>   e Zd ZdZd fddZdejdefddZd	d
 Z	  Z
S )PipelineClassAnalyzerz>Analysis pipeline class define get inputs and parameters.
    returnNc                    sJ   t    g | _d| _g | _d| _d| _d| _g | _g | _	d| _
d| _d S )NFr   )super__init__
parametershas_callpreprocess_parametershas_preprocesshas_postprocesshas_forwardforward_parameterspostprocess_parameterslineno
end_linenor{   	__class__r   r    r   C  s   

zPipelineClassAnalyzer.__init__nodec                 C   s   |j dkrt|j| _d| _|j dkrt|j| _d| _d S |j dkr.t|j| _d| _d S |j dkr>t|j| _	d| _
d S d S )N__call__T
preprocesspostprocessforward)rv   r   r}   r   r   r   r   r   r   r   r   r{   r   r   r   r    visit_FunctionDefP  s   






z'PipelineClassAnalyzer.visit_FunctionDefc                 C   s~   | j r| jd fS g }| jr|| jdd   | jr$|| jdd   | jr1|| jdd   t	|dkr;d |fS d g fS )N   r   )
r   r   r   extendr   r   r   r   r   r|   )r{   r   r   r   r    get_input_parameters^  s   
z*PipelineClassAnalyzer.get_input_parametersr   N)ra   
__module____qualname____doc__r   rY   FunctionDefr   r   r   __classcell__r   r   r   r    r   ?  s
    r   c                       s2   e Zd ZdZd	 fddZdejfddZ  ZS )
!AnalysisSourceFileRegisterModulesah  Get register_module call of the python source file.


    Args:
        ast (NodeVisitor): The ast node.

    Examples:
        >>> with open(source_file_path, "rb") as f:
        >>>     src = f.read()
        >>>     analyzer = AnalysisSourceFileRegisterModules(source_file_path)
        >>>     analyzer.visit(ast.parse(src, filename=source_file_path))
    r   Nc                    s    t    || _|| _d | _d S r"   )r   r   source_file_path
class_nameclass_define)r{   r   r   r   r   r    r     s   

z*AnalysisSourceFileRegisterModules.__init__r   c                 C   s   |j | jkr|| _d S d S r"   )rv   r   r   r   r   r   r    visit_ClassDef  s   
z0AnalysisSourceFileRegisterModules.visit_ClassDefr   )	ra   r   r   r   r   rY   ClassDefr   r   r   r   r   r    r   q  s    r   r   r   c                 C   sz   t | d.}| }t| |}|tj|| d t }||j | \}}||fW  d   S 1 s6w   Y  dS )zGet pipeline input and parameter

    Args:
        source_file_path (str): The pipeline source code path
        class_name (str): The pipeline class name
    rb)filenameN)	openreadr   visitrY   parser   r   r   )r   r   fsrcanalyzerclzrN   pipeline_parametersr   r   r    get_pipeline_input_parameters  s    
$r   stringintegernumberbooleanrA   rE   )r4   intfloatboolDictr7   r6   ListUnionInputrA   c                 C   s`   di d}| d u st | dkri S | D ]}|\}}}}dt| i}|r'||d< ||d |< q|S )NrA   rB   r   rC   defaultrD   )r|   meta_type_schema_map)r   parameters_schemaparamrv   
param_typehas_defaultrd   propr   r   r    #generate_pipeline_parameters_schema  s   
r   r   c                 C   s2   | j }| jj}tj| j}|j}t|||}|S )zcGet pipeline input output schema.

    Args:
        pipeline (Pipeline): The pipeline object.
    )		group_keyr   ra   	importlibutil	find_specr   originPipelineInfomation)r   r@   pipeline_classspecpipeline_file_pathinfor   r   r    $get_pipeline_information_by_pipeline  s   r   c                   @   sv   e Zd ZdZdefddZdd Zedd Zed	d
 Z	edd Z
edd Zedd Zedd Zdd ZdS )r   z5Analyze pipeline information, task_name, schema.
    r@   c                 C   s$   || _ || _|| _d| _|   d S )NF)
_task_name_class_name_source_path_is_custom_call_method_analyze)r{   r@   r   source_pathr   r   r    r     s
   zPipelineInfomation.__init__c                 C   s  t | j| j\}}| jtv r/| jtv r/|d u ri | _nt|| _t| jd | _	t
| j| _d S |d urWd| _t|| _	d| j	d< i | _ddi| _| jtv rUt
| j| _d S d S td| j| jtv | jtv f  d | _	d | _| jtv rzt| jd | _	| jtv rt
| j| _t|| _d S )NTzBFor binary input such as image audio video, only url is supported.descriptionrC   rA   KTask: %s input is defined: %s, output is defined: %s which is not completed)r   r   r   r   r   r   _parameters_schemar   rF   _input_schemarM   _output_schemar   rb   rc   )r{   rN   r   r   r   r    r     sT   




zPipelineInfomation._analyzec                 C      | j S r"   )r   r   r   r   r    r@        zPipelineInfomation.task_namec                 C   r   r"   )r   r   r   r   r    is_custom_call  r   z!PipelineInfomation.is_custom_callc                 C   r   r"   )r   r   r   r   r    rG     r   zPipelineInfomation.input_schemac                 C   r   r"   )r   r   r   r   r    rK     r   z PipelineInfomation.output_schemac                 C   r   r"   )r   r   r   r   r    r     r   z$PipelineInfomation.parameters_schemac                 C   s:   | j r| j n| j| j r| jni | jr| jdS ddidS )NrC   rA   rN   r   output)r   r   r   r   r   r   r    schema  s   
zPipelineInfomation.schemac                 C   s   | j d| S )Nz_%s)__dict__ru   )r{   rU   r   r   r    __getitem__#     zPipelineInfomation.__getitem__N)ra   r   r   r   r4   r   r   propertyr@   r   rG   rK   r   r   r   r   r   r   r    r     s"    &





r   urlc                 C   s   t | }|jdv rdS dS )zCheck the input url is valid url.

    Args:
        url (str): The url

    Returns:
        bool: If is url return True, otherwise False.
    )httphttpsossTF)r   scheme)r   
url_parsedr   r   r    is_url'  s   	
r   c                 C   sJ   |  ds|  dstj| r| S ddlm} t| d}|t	|S )Nr   r   r   )Imagez-_)
r(   ospathexistsPILr   base64	b64decoder   r   )contentr   image_file_contentr   r   r    decode_base64_to_image7  s   
r  c                 C   2   |  ds|  dstj| r| S t| }|S Nr   r   r(   r   r   r   r   r   r  file_contentr   r   r    decode_base64_to_audioA     

r	  c                 C   r  r  r  r  r   r   r    decode_base64_to_videoJ  r
  r  c                 C   s   | S r"   r   r  r   r   r    return_originS     r  c                 C   s   d S r"   r   r  r   r   r    
decode_boxW  r  r  c                 C      dS )zfConvert multipart data to pipeline input.

    Args:
        body (dict): The multipart data body
    Nr   )bodyr   r   r    )service_multipart_input_to_pipeline_input[     r  c                 C   r  )zjConvert multipart data to service multipart output.

    Args:
        output (dict): Multipart body.
    Nr   )r   r   r   r    +pipeline_output_to_service_multipart_outputd  r  r  pipeline_infor  c                 C   s&   t | d |\}}||fi |}|S )zCall pipeline with json input.

    Args:
        pipeline_info (PipelineInfomation): The pipeline information object.
        pipeline (Pipeline): The pipeline object.
        body (Dict): The input object, include input and parameters
    r@   )&service_base64_input_to_pipeline_input)r  r   r  pipeline_inputsr   ry   r   r   r    call_pipeline_with_jsony  s
   r  c           
      C   s  d|vrt d|d }d|v r|d }ni }i }t|tttfr%||fS t| d}t|trKt|trCt| t	|
 d |fS t| ||fS t|trXt|}||fS t|tr| D ]$\}}|| }t|tss|||< qa|tvr}t d| t| |||< qa||fS t|t	r|D ],}	t|	tr| D ]\}}|	| }|tvrt d| t| |||< q||f  S qdS ||fS )zConvert service base64 input to pipeline input and parameters

    Args:
        task_name (str): The task name.
        body (Dict): The input object, include input and parameters
    rN   zNo input data!r   Nr   zInvalid input field: %s)r:   r3   r4   r   r   r   ru   r7   base64_decoder_mapr6   valuesr5   r9   r
   )
r@   r  service_inputr   pipeline_inputtask_input_inforU   rV   r;   r<   r   r   r    r    sj   






r  c                 C   s4   dd l }|d| \}}| }tt|d}|S )Nr   z.pngutf-8)cv2imencodetobytesr4   r   	b64encode)imager  _
img_encode
bytes_data
base64_strr   r   r    encode_numpy_image_to_base64  s
   r(  c                 C      t t| dS Nr  r4   r   r"  )videor   r   r    encode_video_to_base64  r   r-  c                 C   r)  r*  r+  )pcmr   r   r    encode_pcm_to_base64  r   r/  c                 C   r)  r*  r+  )wavr   r   r    encode_wav_to_base64  r   r1  c                 C   r)  r*  r+  )btsr   r   r    encode_bytes_to_base64  r   r3  )r#  r,  r.  r0  bytesc                 C   s   t | ttfrg }| D ]	}|t| q|S t | tr@i }|  D ]\}}t|tv r7tt| |||< q"t|||< q"|S t | t	j
rJ|  S t | t	jrTt| S t | t	jr^t| S | S r"   )r3   r6   r5   r   _convert_to_python_typer7   r9   rC   type_to_python_typenpndarraytolistfloatingr   r   r   )inputsresr<   r>   r?   r   r   r    r5    s&   
r5  c           	      C   s   i }t | g }t|tr|d }| D ]v\}}||vr"|||< q|tjtjtjtj	tj
tjfv ret|trZg }|tjkrBtj}ntj	}|D ]}|tt|  | qG|||< qtt|  |||< qt| tjfv rzt|tjrz| ||< qt|tjr| ||< q|||< qt|S )u   Convert pipeline output to service output,
    convert binary fields to base64 encoding。

    Args:
        task_name (str): The output task name.
        pipeline_output (object): The pipeline output.
    r   )r   ru   r3   r6   r9   r   
OUTPUT_IMGOUTPUT_IMGSOUTPUT_VIDEO
OUTPUT_PCMOUTPUT_PCM_LIST
OUTPUT_WAVr   base64_encoder_mapr   r7  r8  r9  r5  )	r@   pipeline_outputjson_serializable_outputrJ   rU   rV   r9   output_item_typer<   r   r   r    (pipeline_output_to_service_base64_output  sL   





rG  c                 C   X   t jt}t|d d}t|}W d    n1 sw   Y  | |v r*||  S d S )Nz/pipeline_inputs.jsonrr   r   dirname__file__r   jsonload)r   current_work_dirr   input_examplesr   r   r    get_task_input_examples6     rQ  c                 C   rH  )Nz/pipeline_schema.jsonrI  rJ  )r   rO  r   r   r   r   r    get_task_schemas?  rR  rS  __main__)
load_indexindex	PIPELINESr   zvalue['filepath']: filepathz, class_name: r   r   rC   z./task_schema.jsonw)T)urY   r   r   r#   r   ior   typingr   urllib.parser   rM  numpyr7  modelscope.hub.file_downloadr   modelscope.outputs.outputsr   r   r   r	   modelscope.pipeline_inputsr
   r   r   r   modelscope.pipelinesr   modelscope.pipelines.baser   modelscope.utils.configr   modelscope.utils.constantr   r   modelscope.utils.loggerr   rb   r4   r   r!   r0   r8   rC   rF   rM   rO   rR   rW   re   rg   r   NodeVisitorr   r   r   r   r   r   r   r   r  r	  r  r  r  r  r  IMAGETEXTAUDIOVIDEOBOXDICTLISTNUMBERr  r  r  r(  r-  r/  r1  r3  rC  int64r   r6  r5  rG  rQ  rS  ra   modelscope.utils.ast_utilsrU  rV  task_schemasr9   rU   rV   regr@   r   printrN   r   r   rG   rK   r   rc   BaseExceptiondumpsrn   r   r   writer   r   r   r    <module>   s.  ,	2"2
U
			

;
/	
	







	
$