File size: 4,978 Bytes
c7d8b3f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0d88527
c7d8b3f
 
 
 
 
 
 
 
 
 
 
 
 
 
0d88527
c7d8b3f
 
 
0d88527
c7d8b3f
 
0d88527
c7d8b3f
 
 
 
 
 
 
 
 
 
 
 
 
 
0d88527
 
2ecd770
 
 
 
 
 
 
50c822a
 
 
 
2ecd770
0d88527
7c2acfb
710ae14
0d88527
 
 
 
 
 
 
 
 
 
 
 
50c822a
710ae14
8fa9440
90909c6
0d88527
 
8fa9440
0d88527
 
 
 
710ae14
 
 
0d88527
710ae14
 
 
 
0d88527
710ae14
 
0d88527
710ae14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import streamlit as st
import requests
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

# Load model and tokenizer
@st.cache_resource
def load_model():
    model = AutoModelForSeq2SeqLM.from_pretrained("shreyanshjha0709/watch-description-generator")
    tokenizer = AutoTokenizer.from_pretrained("shreyanshjha0709/watch-description-generator")
    return model, tokenizer

model, tokenizer = load_model()

# Load the JSON file from a URL
@st.cache_data
def load_json_from_url(url):
    response = requests.get(url)
    return response.json()

# Provide your JSON URL here
json_url = "https://www.ethoswatches.com/feeds/holbox_ai.json"
data = load_json_from_url(json_url)

# Extract unique brands
brands = sorted(set(item["brand"] for item in data))

# Streamlit UI
st.title("Watch Description Generator")

# Select brand
selected_brand = st.selectbox("Select a Brand", ["Select"] + brands)

if selected_brand != "Select":
    watches = [item["name"] for item in data if item["brand"] == selected_brand]
    skus = [item["sku"] for item in data if item["brand"] == selected_brand]
    selected_watch = st.selectbox("Select Watch Name (Optional)", ["Select"] + watches)
    selected_sku = st.selectbox("Select SKU (Optional)", ["Select"] + skus)

    # Get the selected watch data from the JSON
    watch_data = next((item for item in data if item["name"] == selected_watch or item["sku"] == selected_sku), None)

    if watch_data:
        # Display the image from the JSON
        if image_url := watch_data.get("image"):
            st.image(image_url, caption=f"{watch_data['name']} Image")

        # Attributes without price
        attributes = {
            "brand": watch_data["brand"],
            "name": watch_data.get("name", "Unknown Watch"),
            "sku": watch_data.get("sku", "Unknown SKU"),
            "features": watch_data.get("features", "Unknown Features"),
            "casesize": watch_data.get("casesize", "Unknown Case Size"),
            "movement": watch_data.get("movement", "Unknown Movement"),
            "gender": watch_data.get("gender", "Unknown Gender"),
            "water_resistance": watch_data.get("water_resistance", "Unknown Water Resistance"),
            "power_reserve": watch_data.get("power_reserve", "Unknown Power Reserve"),
            "dial_color": watch_data.get("dial_color", "Unknown Dial Color"),
            "strap_material": watch_data.get("strap_material", "Unknown Strap Material")
        }

        # Create a detailed description prompt
        input_text = f"""Generate a detailed 200-word description for the following watch:
Brand: {attributes['brand']}
Name: {attributes['name']}
SKU: {attributes['sku']}
Features: {attributes['features']}
Case Size: {attributes['casesize']}
Movement: {attributes['movement']}
Gender: {attributes['gender']}
Water Resistance: {attributes['water_resistance']}
Power Reserve: {attributes['power_reserve']}
Dial Color: {attributes['dial_color']}
Strap Material: {attributes['strap_material']}

Description: Provide a luxurious, detailed description focusing on the craftsmanship, innovation, and design. Highlight the unique features and selling points of this watch. Use vivid language to paint a picture of the watch's appearance and functionality. Discuss how this watch stands out in the {attributes['brand']} collection and why it would appeal to watch enthusiasts."""

        # Tokenize input and generate description
        inputs = tokenizer(input_text, return_tensors="pt", max_length=512, truncation=True)
        outputs = model.generate(
            **inputs,
            max_length=300,  # Increased to allow for longer descriptions
            num_return_sequences=1,
            temperature=0.8,
            top_k=50,
            top_p=0.95,
            do_sample=True,
            repetition_penalty=1.2,
            no_repeat_ngram_size=3  # Prevent repetition of 3-gram phrases
        )

        # Decode generated text
        description = tokenizer.decode(outputs[0], skip_special_tokens=True)

        # Display the result
        st.write("### Generated Description")
        st.write(description)

        # Add word count
        word_count = len(description.split())
        st.write(f"Word count: {word_count}")
else:
    st.warning("Please select a brand.")

# Add some information about the app
st.sidebar.title("About")
st.sidebar.info(
    "This app uses a fine-tuned AI model to generate descriptions for watches. "
    "Select a brand and a watch to get started. The model will generate a unique "
    "description based on the watch's attributes."
)

# Add a footer
st.markdown(
    """
    <style>
    .footer {
        position: fixed;
        left: 0;
        bottom: 0;
        width: 100%;
        background-color: #f1f1f1;
        color: black;
        text-align: center;
    }
    </style>
    <div class="footer">
        <p>Developed with ❤️ by Shreyansh Jha</p>
    </div>
    """,
    unsafe_allow_html=True
)