Spaces:
Runtime error
Runtime error
import inspect | |
import json | |
import ast | |
import gradio as gr | |
def function_to_json(func_str, func_description, param_descriptions, required_params): | |
# Create a new Module instance with the missing field | |
module_ast = ast.Module(body=[ast.Pass()], type_ignores=[]) | |
# Parse the function string into the AST and replace the body | |
func_ast = ast.parse(func_str) | |
module_ast.body = func_ast.body | |
# Extract the function definition node | |
func_def = next(node for node in module_ast.body if isinstance(node, ast.FunctionDef)) | |
# Get function signature | |
code_obj = compile(module_ast, '<string>', 'exec') | |
func_globals = {} | |
exec(code_obj, func_globals) | |
signature = inspect.signature(func_globals[func_def.name]) | |
parameters = signature.parameters | |
# Convert param_descriptions string to a dictionary | |
param_desc_dict = json.loads(param_descriptions) | |
# Create JSON structure | |
function_json = { | |
"name": func_def.name, | |
"description": func_description, | |
"parameters": { | |
"type": "object", | |
"properties": {} | |
} | |
} | |
# Add parameter information to JSON structure | |
for param_name, param in parameters.items(): | |
param_info = param_desc_dict.get(param_name, {}) | |
param_type = param_info.get("type", str(param.annotation)) | |
param_desc = param_info.get("description", param_name.replace('_', ' ')) | |
function_json["parameters"]["properties"][param_name] = { | |
"type": param_type, | |
"description": param_desc | |
} | |
# Add required parameters based on user input | |
if param_name in required_params: | |
if "required" not in function_json["parameters"]: | |
function_json["parameters"]["required"] = [] | |
function_json["parameters"]["required"].append(param_name) | |
return json.dumps(function_json, indent=4) | |
""" Example uasge: | |
# Example usage with user-provided function information | |
sample_function_str = ''' | |
def generate_music(input_text, input_melody): | |
''' generate music based on an input text ''' | |
client = Client("https://ysharma-musicgendupe.hf.space/", hf_token="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") | |
result = client.predict( | |
"melody", | |
input_text, | |
input_melody, | |
5, | |
250, | |
0, | |
1, | |
3, | |
fn_index=1 | |
) | |
return result | |
''' | |
sample_func_description = "generate music based on an input text and input melody" | |
sample_param_descriptions = ''' | |
{ | |
"input_text": { | |
"type": "str", | |
"description": "Input text for music generation." | |
}, | |
"input_melody": { | |
"type": "str", | |
"description": "File path of the input melody." | |
} | |
} | |
''' | |
sample_required_params = ["input_text"] | |
# Convert the sample function information to JSON | |
json_str = function_to_json(sample_function_str, sample_func_description, sample_param_descriptions, sample_required_params) | |
print(json_str) | |
{ | |
"name": "generate_music", | |
"description": "generate music based on an input text and input melody", | |
"parameters": { | |
"type": "object", | |
"properties": { | |
"input_text": { | |
"type": "str", | |
"description": "Input text for music generation." | |
}, | |
"input_melody": { | |
"type": "str", | |
"description": "File path of the input melody." | |
} | |
}, | |
"required": [ | |
"input_text" | |
] | |
} | |
} | |
""" | |
title = "<h1 align='center'>Convert any function to function definitions required for GPT</h1>" | |
demo = gr.Blocks() | |
with demo: | |
gr.HTML(title) | |
with gr.Row(): | |
input_function_str = gr.Code(label="Enter function definition", language='python', lines=10) | |
#input_function_str = gr.Textbox(lines=10, label='Enter function definition') | |
with gr.Column(): | |
input_func_description = gr.Textbox(placeholder='', label='Enter your function description:') | |
input_param_description = gr.Textbox( | |
placeholder="""Enter description as a dictionary with keys as param_name and values as param type and description as shown, eg. - | |
{ | |
"param1": { | |
"type": "str", | |
"description": "description of param1" | |
}, | |
"param2": { | |
"type": "int/float/list/tuple/dict/set/bool etc..", | |
"description": "description of param2" | |
} | |
}""", | |
label='Enter descriptions for parameters:') | |
input_required_params = gr.Textbox(placeholder="""Enter a list of required parameters, eg. - ['param1', 'param2', ...]""", | |
label='Enter required parameters for your function:') | |
generate_json = gr.Button('Get JSON definition') | |
gpt_function = gr.Code(label="GPT function definition", language='python', lines=7) | |
generate_json.click(function_to_json, | |
[input_function_str, input_func_description, input_param_description, input_required_params], | |
[gpt_function]) | |
gr.Examples( | |
[ [""" | |
def generate_music(input_text, input_melody): | |
"generate music based on an input text" | |
client = Client("https://ysharma-musicgendupe.hf.space/", hf_token="hf_...") | |
result = client.predict( | |
"melody", | |
input_text, | |
input_melody, | |
5, | |
250, | |
0, | |
1, | |
3, | |
fn_index=1 | |
) | |
return result | |
""", | |
"""Generate music based on an input text.""", | |
"""{ | |
"input_text": { | |
"type": "string", | |
"description": "Input text for music generation." | |
}, | |
"input_melody": { | |
"type": "string", | |
"description": "File path of the input melody." | |
} | |
}""", | |
"""["input_text"]""" ], | |
[""" | |
def generate_image(prompt): | |
client = Client("https://jingyechen22-textdiffuser.hf.space/") | |
result = client.predict( | |
prompt, | |
20, | |
7.5, | |
1, | |
"Stable Diffusion v2.1", | |
fn_index=1) | |
return result[0] | |
""", | |
"""generate image based on the input text prompt""", | |
"""{ | |
"prompt": { | |
"type": "string", | |
"description": "input text prompt for the image generation." | |
} | |
}""", | |
"""["prompt"]""" , | |
], | |
], | |
[input_function_str, input_func_description, input_param_description, input_required_params], | |
) | |
demo.launch() #(debug=True) | |