wanda222's picture
Update app.py
2dadf80 verified
import gradio as gr
import base64
import json
import pandas as pd
from openai import OpenAI
import tempfile
import os
import io
UPSTAGE_API_KEY = ""
# ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ base64 ๋ฌธ์ž์—ด๋กœ ์ธ์ฝ”๋”ฉํ•˜๋Š” ํ•จ์ˆ˜
def encode_img_to_base64(img_path):
with open(img_path, "rb") as img_file:
return base64.b64encode(img_file.read()).decode("utf-8")
# ์ค‘์ฒฉ๋œ JSON์„ ํ‰ํƒ„ํ™”ํ•˜์—ฌ ํ…Œ์ด๋ธ”๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜
def flatten_to_rows(data):
flat = {}
for key, value in data.items():
if isinstance(value, list):
for i, item in enumerate(value):
if isinstance(item, dict):
for sub_key, sub_val in item.items():
flat[f"{key}[{i}].{sub_key}"] = sub_val
else:
flat[f"{key}[{i}]"] = item
elif isinstance(value, dict):
for sub_key, sub_val in value.items():
flat[f"{key}.{sub_key}"] = sub_val
else:
flat[key] = value
return flat
# ๋ช…ํ•จ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›์•„ ์ •๋ณด ์ถ”์ถœ ๋ฐ CSV ์ €์žฅ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ํ•จ์ˆ˜
def extract_info(image_path, UPSTAGE_API_KEY):
# Upstage API ํด๋ผ์ด์–ธํŠธ ์„ค์ • (์Šคํ‚ค๋งˆ ์ƒ์„ฑ์šฉ)
schema_client = OpenAI(
api_key=UPSTAGE_API_KEY,
base_url="https://api.upstage.ai/v1/information-extraction/schema-generation"
)
# Upstage API ํด๋ผ์ด์–ธํŠธ ์„ค์ • (์ •๋ณด ์ถ”์ถœ์šฉ)
extraction_client = OpenAI(
api_key=UPSTAGE_API_KEY,
base_url="https://api.upstage.ai/v1/information-extraction"
)
base64_data = encode_img_to_base64(image_path)
# ์Šคํ‚ค๋งˆ ์ƒ์„ฑ
schema_response = schema_client.chat.completions.create(
model="information-extract",
messages=[{
"role": "user",
"content": [{
"type": "image_url",
"image_url": {"url": f"data:image/jpeg;base64,{base64_data}"}
}]
}]
)
schema = json.loads(schema_response.choices[0].message.content)
# ์ •๋ณด ์ถ”์ถœ
extraction_response = extraction_client.chat.completions.create(
model="information-extract",
messages=[{
"role": "user",
"content": [{
"type": "image_url",
"image_url": {"url": f"data:image/jpeg;base64,{base64_data}"}
}]
}],
response_format={
"type": "json_schema",
"json_schema": {
"name": "business_card_schema",
"schema": schema["json_schema"]["schema"]
}
}
)
result = json.loads(extraction_response.choices[0].message.content)
json_result = json.dumps(result, indent=2, ensure_ascii=False)
# ํ…Œ์ด๋ธ”ํ™”
flat_dict = flatten_to_rows(result)
df_result = pd.DataFrame([flat_dict]).T.reset_index()
df_result.columns = ["Field", "Value"]
return json_result, df_result
# Gradio UI
with gr.Blocks() as demo:
gr.Markdown("## ๐Ÿ“‡ ๋ช…ํ•จ ์ •๋ณด ์ž๋™ ์ถ”์ถœ๊ธฐ")
gr.Markdown("๋ช…ํ•จ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•˜๋ฉด ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๊ณ , ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ CSV๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.")
with gr.Row():
api_key_input = gr.Textbox(label="๐Ÿ”‘ Upstage API Key", type="password", placeholder="Paste your API key here")
with gr.Row():
with gr.Column():
image_input = gr.Image(type="filepath", label="๋ช…ํ•จ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ")
extract_btn = gr.Button("๐Ÿ“ค ์ •๋ณด ์ถ”์ถœํ•˜๊ธฐ")
with gr.Column():
json_output = gr.Textbox(label="๐Ÿ“„ ์ถ”์ถœ๋œ JSON", lines=20)
table_output = gr.Dataframe(label="๐Ÿ“‹ ์ถ”์ถœ๋œ ์ •๋ณด (ํ‘œ ํ˜•ํƒœ)", interactive=False)
extract_btn.click(
fn=extract_info,
inputs=[image_input, api_key_input],
outputs=[json_output, table_output]
)
# ์•ฑ ์‹คํ–‰
if __name__ == "__main__":
demo.launch()