o
    rqiey                     @   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rDd 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external_engine_for_llmc                 C   s,   t | tj|d}t|}t|j| ||dS )N)r   	file_pathr   )taskmodelZmodel_revisionr   )r   r   ZCONFIGURATIONr   	from_filer   r   )r   r   r   Zmodel_configuration_filecfg r   d/home/app/PaddleOCR-VL/.venv_paddleocr/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>V   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>W   s    z-get_class_user_attributes.<locals>.<listcomp>)r    
getmembers)cls
attributesZuser_attributesr   r   r   get_class_user_attributesU   s
   r,   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)r-   
input_typeitem
input_infokvr   r   r   r4   ^   s"   

r4   	task_namer7   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)r?   r5   r5   r?   r@   r.   )
r   r/   r0   r   r2   r3   get_input_schemar1   r5   r6   )r<   r7   r-   r8   input_schemaZitem_schemar:   r;   r   r   r   rB   w   sJ   	





	rB   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.
    r=   r>    TASK_OUTPUTS for %s is not list.r@   )r   r/   r2   r6   r	   )r<   task_outputsoutput_schema
output_keyr   r   r   get_output_schema   s   

rH   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inputr.   )
r   r/   r0   r
   r1   r2   r3   r4   r5   r6   )r<   r-   r7   r8   r9   r:   r;   r   r   r   get_input_info   s(   



rJ   c                 C   s<   t |  }i }t|tstd|  |D ]}t| ||< q|S )NrD   )r   r/   r2   r6   r   )r<   Zoutput_keysoutput_typerG   r   r   r   get_output_info   s   
rL   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)r,   r   rJ   rL   )r<   tasksZ
task_existkeyvaluer-   rE   r   r   r   get_task_io_info   s   rP   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!r=   )
annotationr/   ast	SubscriptargrO   idName	Attributeattr	Exceptionr?   __name__loggerwarning)rT   default_valuer   r   r   process_arg_type_annotation   s   

r^   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>)r8   TF)TrueFalseNone)r/   rR   Strshasattrr_   Tupler1   eltsNumnrV   ZVariableKeygetnameNameConstantrO   ZUnhandledKeyType)r8   resultZconstants_lookupr   r   r   r`     s*   
r`   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defaultsrT   r^   appendzipr`   
kwonlyargskw_defaultsrO   )rs   	argumentsZn_argsZn_args_defaultrT   Zarg_nameZarg_typeZdftrO   Zn_kwargsZ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rq   	__class__r   r   r   E  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)rn   r{   rs   r   r   r   r   r   r   r   r   rq   r   r   r   r   visit_FunctionDefR  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   rr   )rq   r   r   r   r   get_input_parameters`  s   
z*PipelineClassAnalyzer.get_input_parametersr}   N)rZ   
__module____qualname____doc__r   rR   FunctionDefr   r   r   __classcell__r   r   r   r   r|   A  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)rq   r   r   r   r   r   r     s   

z*AnalysisSourceFileRegisterModules.__init__r   c                 C   s   |j | jkr|| _d S d S r   )rn   r   r   r   r   r   r   visit_ClassDef  s   
z0AnalysisSourceFileRegisterModules.visit_ClassDefr   )	rZ   r   r   r   r   rR   ClassDefr   r   r   r   r   r   r   s  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   visitrR   parser|   r   r   )r   r   fsrcZanalyzerZclzrI   Zpipeline_parametersr   r   r   get_pipeline_input_parameters  s    
$r   stringintegernumberbooleanr=   rA   )r0   intfloatboolDictr3   r2   ListUnionZInputr=   c                 C   s`   di d}| d u st | dkri S | D ]}|\}}}}dt| i}|r'||d< ||d |< q|S )Nr=   r>   r   r?   defaultr@   )rr   meta_type_schema_map)r   parameters_schemaparamrn   Z
param_typeZhas_defaultr]   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.
    )	Z	group_keyr   rZ   	importlibutil	find_specr   originPipelineInfomation)r   r<   Zpipeline_classspecZ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)rq   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.descriptionr?   r=   KTask: %s input is defined: %s, output is defined: %s which is not completed)r   r   r   r   r   r   _parameters_schemar   rB   _input_schemarH   _output_schemar   r[   r\   )rq   rI   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   rC     r   zPipelineInfomation.input_schemac                 C   r   r   )r   r   r   r   r   rF     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 )Nr?   r=   rI   r   output)r   r   r   r   r   r   r   schema  s   
zPipelineInfomation.schemac                 C   s   | j d| S )Nz_%s)__dict__rm   )rq   rN   r   r   r   __getitem__%     zPipelineInfomation.__getitem__N)rZ   r   r   r   r0   r   r   propertyr<   r   rC   rF   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   Z
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existsZPILr   base64	b64decoder   r   )contentr   Zimage_file_contentr   r   r   decode_base64_to_image9  s   
r   c                 C   2   |  ds|  dstj| r| S t| }|S Nr   r   r%   r   r   r   r   r   r   Zfile_contentr   r   r   decode_base64_to_audioC     

r   c                 C   r   r   r   r   r   r   r   decode_base64_to_videoL  r   r   c                 C   s   | S r   r   r   r   r   r   return_originU     r   c                 C   s   d S r   r   r   r   r   r   
decode_boxY  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_outputf  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   Zpipeline_inputsr   rp   r   r   r   call_pipeline_with_json{  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
    rI   zNo input data!r   Nr   zInvalid input field: %s)r6   r/   r0   r   r   r   rm   r3   base64_decoder_mapr2   valuesr1   r5   r
   )
r<   r   Zservice_inputr   Zpipeline_inputZtask_input_inforN   rO   r7   r8   r   r   r   r     sj   






r   c                 C   s4   dd l }|d| \}}| }tt|d}|S )Nr   z.pngutf-8)cv2Zimencodetobytesr0   r   	b64encode)imager   _Z
img_encode
bytes_dataZ
base64_strr   r   r   encode_numpy_image_to_base64  s
   r  c                 C      t t| dS Nr   r0   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   r  c                 C   r  r  r  )Zbtsr   r   r   encode_bytes_to_base64  r   r  )r   r  r	  r  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   )r/   r2   r1   ru   _convert_to_python_typer3   r5   r?   type_to_python_typenpndarraytolistZfloatingr   r   r   )Zinputsresr8   r:   r;   r   r   r   r    s&   
r  c                 C   sL  i }t | g }t|tr|d }| D ]\}}||vr8ddl}t||jr1t|	 
 }n|}|||< q|tjtjtjtjtjtjfv r{t|trpg }|tjkrXtj}	ntj}	|D ]}
|tt|	  |
 q]|||< qtt|  |||< qt| tjfv rt|tjr|
 ||< 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   N)r   rm   r/   r2   r5   torchZTensorr  rA   cpur  r   Z
OUTPUT_IMGZOUTPUT_IMGSZOUTPUT_VIDEOZ
OUTPUT_PCMZOUTPUT_PCM_LISTZ
OUTPUT_WAVru   base64_encoder_mapr   r  r  )r<   Zpipeline_outputZjson_serializable_outputrE   rN   rO   r  r;   r5   Zoutput_item_typer8   r   r   r   (pipeline_output_to_service_base64_output	  sT   





r  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   Zinput_examplesr   r   r   get_task_input_examples=     r!  c                 C   r  )Nz/pipeline_schema.jsonr  r  )r   r   r   r   r   r   r   get_task_schemasF  r"  r#  __main__)
load_indexindexZ	PIPELINESr   zvalue['filepath']: filepathz, class_name: r   r   r?   z./task_schema.jsonw)T)urR   r   r   r    r   ior   typingr   urllib.parser   r  numpyr  Zmodelscope.hub.file_downloadr   Zmodelscope.outputs.outputsr   r   r   r	   Zmodelscope.pipeline_inputsr
   r   r   r   Zmodelscope.pipelinesr   Zmodelscope.pipelines.baser   Zmodelscope.utils.configr   Zmodelscope.utils.constantr   r   Zmodelscope.utils.loggerr   r[   r0   r   r   r,   r4   r?   rB   rH   rJ   rL   rP   r^   r`   r{   NodeVisitorr|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ZIMAGEZTEXTZAUDIOZVIDEOZBOXDICTLISTNUMBERr   r   r   r  r  r
  r  r  r  Zint64r   r  r  r  r!  r#  rZ   Zmodelscope.utils.ast_utilsr%  r&  Ztask_schemasr5   rN   rO   regr<   r   printrI   r   r   rC   rF   r   r\   BaseExceptiondumpsrg   r   r   writer   r   r   r   <module>   s8  .
	2"2
U
			

;
4	
	







	
$