aimlresearch2023's picture
initial commit:
89c54bf
"""Gradio UI for bill vs non-bill v3_teacher (teacher / DeBERTa LoRA)."""
from __future__ import annotations
import os
from typing import Any, Tuple
import gradio as gr
from csv_inference import run_csv_inference, validate_csv_path
from inference import classify_one
DEFAULT_BILL_TEXT = (
"Your bill of Rs. 1,250.00 for account ****42 is due by 25-Apr-2026. "
"Pay via MyProvider app or https://pay.example.com to avoid late fees."
)
def _file_path(file_obj: object) -> str | None:
if file_obj is None:
return None
if isinstance(file_obj, str):
return file_obj if os.path.isfile(file_obj) else None
path = getattr(file_obj, "name", None)
if path and os.path.isfile(path):
return path
return None
def on_csv_change(file_obj: object) -> Tuple[Any, Any, Any]:
path = _file_path(file_obj)
if not path:
return (
gr.update(interactive=False),
gr.update(value="Upload a CSV file to begin."),
gr.update(value=None, interactive=False),
)
ok, msg = validate_csv_path(path)
if not ok:
print("CSV validation:", msg)
return (
gr.update(interactive=False),
gr.update(value=f"Validation failed: {msg}"),
gr.update(value=None, interactive=False),
)
return (
gr.update(interactive=True),
gr.update(value="File looks good. Click Process CSV."),
gr.update(value=None, interactive=False),
)
def run_text_classify(text: str) -> str:
return classify_one(text)
def run_csv_start(file_obj: object, progress: gr.Progress = gr.Progress()) -> Tuple[Any, Any]:
path = _file_path(file_obj)
if not path:
return gr.update(interactive=False, value=None), gr.update(value="No file uploaded.")
try:
def cb(done: int, total: int) -> None:
if total > 0:
progress((done, total), desc=f"{done} / {total}", total=total)
out_path = run_csv_inference(path, progress_cb=cb)
return (
gr.update(interactive=True, value=out_path),
gr.update(value="Done. Download your CSV below."),
)
except Exception as exc:
print("run_csv_start:", exc)
return (
gr.update(interactive=False, value=None),
gr.update(value=f"Error: {exc}"),
)
def build_demo() -> gr.Blocks:
with gr.Blocks(title="Bill vs non-bill v3_teacher (teacher)") as demo:
gr.Markdown("## Bill vs non-bill v3_teacher (teacher)")
with gr.Tabs():
with gr.Tab("Text"):
inp = gr.Textbox(
label="Message",
lines=6,
value=DEFAULT_BILL_TEXT,
)
go = gr.Button("Classify", variant="primary")
out = gr.Textbox(label="Result JSON", lines=14)
with gr.Tab("CSV"):
csv_file = gr.File(label="CSV file", file_types=[".csv"], interactive=True)
csv_status = gr.Textbox(
label="Status",
value="Upload a CSV with a `text` column.",
interactive=False,
)
start_btn = gr.Button("Process CSV", interactive=False, variant="primary")
dl = gr.DownloadButton(label="Download result CSV", interactive=False)
go.click(run_text_classify, inputs=[inp], outputs=[out])
csv_file.change(on_csv_change, inputs=[csv_file], outputs=[start_btn, csv_status, dl])
start_btn.click(run_csv_start, inputs=[csv_file], outputs=[dl, csv_status])
return demo