from typing import List import numpy as np import requests import gradio as gr from huggingface_hub import ( create_repo, get_full_repo_name, upload_file, ) def file_as_a_string(name_list: List[str]) -> str: """ Returns the file that is going to be created in the new space as string. :param name_list: list of space names :return: file as a string """ return ( f"import gradio as gr" f"\nname_list = {name_list} " f"\ninterfaces = [gr.Interface.load(name) for name in name_list]" f"\ngr.mix.Parallel(*interfaces).launch()" ) def combine_several_space_inputs(names: str) -> str: """ Combines several space inputs and returns the file that is going to be created in the new space as string. :param names: space inputs :return: file as a string """ name_list = names.split("\n") interfaces = [gr.Interface.load(name) for name in name_list] if not control_input_and_output_types(interfaces): print("Spaces have different input or output types, could not combine them!") return "" else: return file_as_a_string(name_list) def control_input_and_output_types(interface_list: List["gr.Interface"]) -> bool: """ Controls whether if input and output types of the given interfaces are the same. :param interface_list: list of interfaces :return: True if all input and output types are the same """ first_input_types = [type(input) for input in interface_list[0].input_components] first_output_types = [ type(output) for output in interface_list[0].output_components ] for interface in interface_list: interface_input_types = [type(input) for input in interface.input_components] if not np.all( interface_input_types == first_input_types ): # Vectorize the comparison and don't use double for loop return False interface_output_types = [ type(output) for output in interface.output_components ] if not np.all(interface_output_types == first_output_types): return False return True def check_space_name_availability(hf_token: str, space_name: str) -> bool: """ Check whether if the space_name is currently used. :param hf_token: hugging_face token :param space_name: :return: True if the space_name is available """ try: repo_name = get_full_repo_name(model_id=space_name, token=hf_token) except Exception as ex: return False url = f"https://huggingface.co/spaces/{repo_name}" response = requests.get(url) return not response.status_code == 200 def space_builder(spaces: str, hf_token: str, username: str, space_name: str, space_description: str) -> str: """ Creates a space with given inputs :param spaces: :param hf_token: :param username: :param space_name: :param space_description: :return: """ # return "Thank you for using the draft, it will be completed later" if spaces == "" or hf_token == "" or username == "" or space_name == "" or space_description == "": return "Please fill all the inputs" if check_space_name_availability(hf_token, space_name): return "The space_name is available" else: return ( f"The space_name is not available, either" "\n-The the username/space_name is already used for the given token's user" "\n-Or the given token is false, please check!" ) iface = gr.Interface( fn=space_builder, inputs=[ gr.inputs.Textbox( lines=4, placeholder=( f"Drop space links at each line, ie:" f"\nspaces/Norod78/ComicsHeroHD" f"\nspaces/Amrrs/gradio-sentiment-analyzer" ), ), gr.inputs.Textbox(lines=1, placeholder="HF Write Token"), gr.inputs.Textbox(lines=1, placeholder="Your username"), gr.inputs.Textbox(lines=1, placeholder="Name for the space"), gr.inputs.Textbox(lines=1, placeholder="Description for the space"), ], outputs="text", ) iface.launch()