attribution / app.py
thanhnt-cf's picture
add known data
fba754c verified
import json
import gradio as gr
from dotenv import load_dotenv
from openai import BadRequestError
from llm_api.exceptions import RefusalError
# from llm_api.langchain_api import extract_info, follow_structure
from llm_api.native_api import extract_info, follow_structure
load_dotenv(".env", override=True)
garment_categories = [
"Upper Garment",
"Lower Garment",
"Hat",
"Luggage",
"Handbag",
"Makeup",
"Chair",
"Carpet",
"Watch",
"Cookware",
"Tableware",
"Sleepware",
"BathroomItem",
]
schema_categories = [
"UpperGarmentProperties",
"LowerGarmentProperties",
"HatProperties",
"LuggageProperties",
"HandbagProperties",
"MakeupProperties",
"ChairProperties",
"CarpetProperties",
"WatchProperties",
"CookwareProperties",
"TablewareProperties",
"SleepwareProperties",
"BathroomItemProperties",
]
def extract_free_fn(gallery, category, provider, schema, known_data):
img_paths = [item[0] for item in gallery]
category_schema = schema_categories[garment_categories.index(category)]
# write schema to file before calling extract_free_properties
try:
if (
schema is not None
and isinstance(schema, str)
and "import"
not in schema.replace("'import'", "").replace("'important'", "")
):
with open("schema_free.py", "r") as f:
default_schema = f.read()
import_part = default_schema.split("#####")[0]
print("Executing freestyle schema...")
full_schema = import_part + schema
# dynamically change the last line of the schema to include the category schema
if category_schema in schema_categories:
print("Dynamic schema activated")
schema_lines = full_schema.split("\n")
schema_lines[-1] = f" properties: {category_schema}"
full_schema = "\n".join(schema_lines)
with open("read_schema_free.py", "w") as f:
f.write(full_schema)
exec(full_schema, globals())
print("Executed freestyle schema")
else:
print("SCHEMA ELSE")
raise Exception("Invalid schema")
except Exception as e:
print(e)
return (
"Invalid schema! Please check the schema or Reload this page to restore default settings",
{},
[],
)
try:
status_code, free_attributes = extract_info(img_paths, provider, Garment, known_data=known_data)
free_attributes = free_attributes.model_dump_json()
except RefusalError as e:
return e.message, {}, []
except BadRequestError as e:
return e.message, {}, []
return f"status: {status_code} - provider: {provider}", free_attributes, [1] * 100
def follow_schema_fn(free_attributes, provider, probs, schema, known_data):
try:
if (
schema is not None
and isinstance(schema, str)
and "import"
not in schema.replace("'import'", "").replace("'important'", "")
):
with open("schema_structured.py", "r") as f:
default_schema = f.read()
import_part = default_schema.split("#####")[0]
print("executing structured schema\n")
full_schema = import_part + schema
with open("read_schema_structured.py", "w") as f:
f.write(full_schema)
exec(full_schema, globals())
print("executed structured schema")
else:
print("SCHEMA ELSE")
raise Exception("Invalid schema")
except:
return (
"Invalid schema! Please check the schema or Reload this page to restore default settings",
{},
)
try:
status_code, schema_attributes = follow_structure(
free_attributes, provider, Garment, known_data=known_data
)
schema_attributes = schema_attributes.model_dump_json()
except RefusalError as e:
return e.message, {}
except BadRequestError as e:
return e.message, {}
return f"status {status_code} - provider: {provider}", schema_attributes
with gr.Blocks(title="Internal Demo for Attribution") as demo:
with gr.Row():
with gr.Column(scale=12):
gr.Markdown(
"""<div style="text-align: center; font-size: 24px;"><strong>Internal Demo for Attribution</strong></div>"""
)
with gr.Row():
with gr.Column(scale=4):
gallery = gr.Gallery(label='Upload images of your product here',type="filepath")
probs_text = gr.Textbox(
label="Probabilities", placeholder="Probabilities", visible=False
)
category = gr.Dropdown(
label="Category",
choices=garment_categories,
value=garment_categories[0],
)
provider = gr.Dropdown(
label="Provider", choices=["openai", "anthropic"], value="anthropic"
)
known_data = gr.TextArea(
label="Insert known attributes of the product here (Optional)", placeholder="", visible=True
)
button_extract = gr.Button(value="Extract Freestyle")
with gr.Column(scale=4):
status_free_text = gr.Textbox(label="Request Status", placeholder="")
free_attributes = gr.JSON(label="Freestyle Attribute")
button_follow = gr.Button(value="Follow Schema")
with gr.Column(scale=4):
status_structured_text = gr.Textbox(label="Request Status", placeholder="")
schema_attributes = gr.JSON(label="Schema Attributes")
with gr.Row():
with open("schema_free.py", "r") as f:
schema_free_text = f.read()
schema_free_text = schema_free_text.split("#####")[1]
with open("schema_structured.py", "r") as f:
schema_structured_text = f.read()
schema_structured_text = schema_structured_text.split("#####")[1]
free_schema = gr.TextArea(
label="Freestyle Schema",
placeholder="Freestyle Schema",
visible=True,
value=schema_free_text,
interactive=True,
)
structured_schema = gr.TextArea(
label="Structured Schema",
placeholder="Schema",
visible=True,
value=schema_structured_text,
interactive=True,
)
button_extract.click(
extract_free_fn,
[gallery, category, provider, free_schema, known_data],
[status_free_text, free_attributes, probs_text],
)
button_follow.click(
follow_schema_fn,
[free_attributes, provider, probs_text, structured_schema, known_data],
[status_structured_text, schema_attributes],
)
demo.launch()