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( """
""", unsafe_allow_html=True )