Update app.py
Browse files
app.py
CHANGED
@@ -5,15 +5,14 @@ import math
|
|
5 |
import re
|
6 |
from deep_translator import GoogleTranslator
|
7 |
import warnings
|
|
|
8 |
|
9 |
warnings.filterwarnings("ignore")
|
10 |
|
11 |
# Load models
|
12 |
-
from xgboost import Booster
|
13 |
xgb = Booster()
|
14 |
xgb.load_model("xgb_model.json")
|
15 |
-
|
16 |
-
rf = joblib.load("rf_model.pkl") # Needs scikit-learn
|
17 |
|
18 |
# Load tile catalog and sizes
|
19 |
with open("tile_catalog.json", "r", encoding="utf-8") as f:
|
@@ -33,7 +32,7 @@ def translate(text, lang="en"):
|
|
33 |
def extract_tile_area(msg, unit):
|
34 |
msg = msg.lower().replace("Γ", "x").replace("into", "x").replace("*", "x")
|
35 |
msg = msg.replace("mm", "").replace("ft", "").replace("feet", "").strip()
|
36 |
-
|
37 |
if "x" in msg:
|
38 |
parts = re.split(r"x", msg)
|
39 |
if len(parts) == 2:
|
@@ -48,7 +47,6 @@ def extract_tile_area(msg, unit):
|
|
48 |
except:
|
49 |
return None
|
50 |
else:
|
51 |
-
# Single value fallback for ft
|
52 |
try:
|
53 |
val = float(re.sub(r"[^\d.]", "", msg))
|
54 |
return val if unit == "ft" else None
|
@@ -77,7 +75,7 @@ def chat_fn(message, history, user_state={}):
|
|
77 |
user_state["step"] = "get_length"
|
78 |
return reply(f"Great! You chose {user_state['tile_type']} tiles.\nPlease enter the **length** of the space in feet:"), None, user_state
|
79 |
|
80 |
-
# Stepwise
|
81 |
if user_state.get("step") == "get_length":
|
82 |
try:
|
83 |
user_state["length"] = float(re.sub(r"[^\d.]", "", message))
|
@@ -91,7 +89,7 @@ def chat_fn(message, history, user_state={}):
|
|
91 |
user_state["width"] = float(re.sub(r"[^\d.]", "", message))
|
92 |
user_state["area"] = round(user_state["length"] * user_state["width"], 2)
|
93 |
user_state["step"] = "get_unit"
|
94 |
-
return reply(f"
|
95 |
except:
|
96 |
return reply("Please enter a valid number for width (e.g. 10):"), None, user_state
|
97 |
|
@@ -100,12 +98,12 @@ def chat_fn(message, history, user_state={}):
|
|
100 |
return reply("Please type either **mm** or **ft** to choose your preferred unit."), None, user_state
|
101 |
user_state["unit"] = message
|
102 |
user_state["step"] = "get_tile_size"
|
103 |
-
return reply(f"Enter the tile size in {message.upper()} (e.g. 600x600 or 2x2):"), None, user_state
|
104 |
|
105 |
if user_state.get("step") == "get_tile_size":
|
106 |
area_per_tile = extract_tile_area(message, user_state["unit"])
|
107 |
if not area_per_tile:
|
108 |
-
return reply("I couldn't understand that size. Try something like `600x600`, `2x2`, or just `4`
|
109 |
|
110 |
user_state["tile_area"] = area_per_tile
|
111 |
user_state["step"] = "done"
|
@@ -151,18 +149,15 @@ def chat_fn(message, history, user_state={}):
|
|
151 |
|
152 |
return reply("π Please type 'Floor' or 'Wall' to begin tile estimation."), None, user_state
|
153 |
|
154 |
-
# UI
|
155 |
-
with gr.Blocks() as demo:
|
156 |
gr.ChatInterface(
|
157 |
fn=chat_fn,
|
158 |
title="π§± TileBot β Smart Tile Estimator",
|
159 |
description=(
|
160 |
"Plan your tile needs easily. Just type `hi` to begin or start with `Floor` or `Wall`.\n"
|
161 |
-
"I
|
162 |
-
)
|
163 |
-
theme=gr.themes.Soft(),
|
164 |
-
retry_btn=None,
|
165 |
-
undo_btn=None
|
166 |
)
|
167 |
|
168 |
demo.launch()
|
|
|
5 |
import re
|
6 |
from deep_translator import GoogleTranslator
|
7 |
import warnings
|
8 |
+
from xgboost import Booster
|
9 |
|
10 |
warnings.filterwarnings("ignore")
|
11 |
|
12 |
# Load models
|
|
|
13 |
xgb = Booster()
|
14 |
xgb.load_model("xgb_model.json")
|
15 |
+
rf = joblib.load("rf_model.pkl") # Requires scikit-learn
|
|
|
16 |
|
17 |
# Load tile catalog and sizes
|
18 |
with open("tile_catalog.json", "r", encoding="utf-8") as f:
|
|
|
32 |
def extract_tile_area(msg, unit):
|
33 |
msg = msg.lower().replace("Γ", "x").replace("into", "x").replace("*", "x")
|
34 |
msg = msg.replace("mm", "").replace("ft", "").replace("feet", "").strip()
|
35 |
+
|
36 |
if "x" in msg:
|
37 |
parts = re.split(r"x", msg)
|
38 |
if len(parts) == 2:
|
|
|
47 |
except:
|
48 |
return None
|
49 |
else:
|
|
|
50 |
try:
|
51 |
val = float(re.sub(r"[^\d.]", "", msg))
|
52 |
return val if unit == "ft" else None
|
|
|
75 |
user_state["step"] = "get_length"
|
76 |
return reply(f"Great! You chose {user_state['tile_type']} tiles.\nPlease enter the **length** of the space in feet:"), None, user_state
|
77 |
|
78 |
+
# Stepwise input
|
79 |
if user_state.get("step") == "get_length":
|
80 |
try:
|
81 |
user_state["length"] = float(re.sub(r"[^\d.]", "", message))
|
|
|
89 |
user_state["width"] = float(re.sub(r"[^\d.]", "", message))
|
90 |
user_state["area"] = round(user_state["length"] * user_state["width"], 2)
|
91 |
user_state["step"] = "get_unit"
|
92 |
+
return reply(f"β
Total area is {user_state['area']} sq.ft.\nWould you like to enter tile size in **mm** or **ft**?"), None, user_state
|
93 |
except:
|
94 |
return reply("Please enter a valid number for width (e.g. 10):"), None, user_state
|
95 |
|
|
|
98 |
return reply("Please type either **mm** or **ft** to choose your preferred unit."), None, user_state
|
99 |
user_state["unit"] = message
|
100 |
user_state["step"] = "get_tile_size"
|
101 |
+
return reply(f"Enter the tile size in {message.upper()} (e.g. 600x600 or 2x2 or 4):"), None, user_state
|
102 |
|
103 |
if user_state.get("step") == "get_tile_size":
|
104 |
area_per_tile = extract_tile_area(message, user_state["unit"])
|
105 |
if not area_per_tile:
|
106 |
+
return reply("I couldn't understand that size. Try something like `600x600`, `2x2`, or just `4` (for square tile in ft)."), None, user_state
|
107 |
|
108 |
user_state["tile_area"] = area_per_tile
|
109 |
user_state["step"] = "done"
|
|
|
149 |
|
150 |
return reply("π Please type 'Floor' or 'Wall' to begin tile estimation."), None, user_state
|
151 |
|
152 |
+
# Gradio UI
|
153 |
+
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
154 |
gr.ChatInterface(
|
155 |
fn=chat_fn,
|
156 |
title="π§± TileBot β Smart Tile Estimator",
|
157 |
description=(
|
158 |
"Plan your tile needs easily. Just type `hi` to begin or start with `Floor` or `Wall`.\n"
|
159 |
+
"I'll ask for room size, tile size, and recommend the best-fit tiles for your space."
|
160 |
+
)
|
|
|
|
|
|
|
161 |
)
|
162 |
|
163 |
demo.launch()
|