import streamlit as st import os import re from claude import embed_base64_for_claude, create_claude_image_request_for_image_captioning, \ create_claude_request_for_text_completion, extract_data_from_text_xml from prompts import prompts from constants import JSON_SCHEMA_FOR_GPT, UPDATED_MODEL_ONLY_SCHEMA, JSON_SCHEMA_FOR_LOC_ONLY from gpt import runAssistant, checkRunStatus, retrieveThread, createAssistant, saveFileOpenAI, startAssistantThread, \ create_chat_completion_request_open_ai_for_summary, addMessageToThread, create_image_completion_request_gpt from summarizer import create_brand_html, create_langchain_openai_query, create_screenshot_from_scrap_fly, check_and_compress_image from theme import flux_generated_image, flux_generated_image_seed import time from PIL import Image import io from streamlit_gsheets import GSheetsConnection # conn = st.connection("gsheets", type=GSheetsConnection) def process_run(st, thread_id, assistant_id): run_id = runAssistant(thread_id, assistant_id) status = 'running' while status != 'completed': with st.spinner('. . .'): time.sleep(20) status = checkRunStatus(thread_id, run_id) thread_messages = retrieveThread(thread_id) for message in thread_messages: if not message['role'] == 'user': return message["content"] else: pass def page5(): st.title('Initialize your preferences!') system_prompt_passed = st.text_area("System Prompt", value=prompts["PROMPT_FOR_MOOD_AND_IDEA"], key="System Prompt") caption_system_prompt = st.text_area("Captioning System Prompt", value=prompts["CAPTION_SYSTEM_PROMPT"], key="Caption Generation System Prompt") caption_prompt = st.text_area("Caption Prompt", value=prompts["CAPTION_PROMPT"], key="Caption Generation Prompt") brand_summary_prompt = st.text_area("Prompt for Brand Summary", value=prompts["BRAND_SUMMARY_PROMPT"], key="Brand summary prompt") st.text("Running on Claude") col1, col2 = st.columns([1, 2]) with col1: if st.button("Save the Prompt"): st.session_state["system_prompt"] = system_prompt_passed print(st.session_state["system_prompt"]) st.session_state["caption_system_prompt"] = caption_system_prompt st.session_state["caption_prompt"] = caption_prompt st.session_state["brand_prompt"] = brand_summary_prompt st.success("Saved your prompts") with col2: if st.button("Start Testing!"): st.session_state['page'] = "Page 1" def page1(): st.title("Upload Product") st.markdown("

Add a Product

", unsafe_allow_html=True) st.markdown("

Upload your product images, more images you upload better the AI learns

", unsafe_allow_html=True) uploaded_files = st.file_uploader("Upload Images", accept_multiple_files=True, key="uploaded_files_key") product_description = st.text_area("Describe the product", value=st.session_state.get("product_description", "")) col1, col2 = st.columns([1, 2]) with col1: if st.button("Save"): st.session_state['uploaded_files'] = uploaded_files st.session_state['product_description'] = product_description st.success("Product information saved!") with col2: if st.button("Add product and move to next page"): if not uploaded_files: st.warning("Please upload at least one image.") elif not product_description: st.warning("Please provide a description for the product.") else: st.session_state['uploaded_files'] = uploaded_files st.session_state['product_description'] = product_description st.session_state['page'] = "Page 2" def page2(): import random st.title("Tell us about your shoot preference") st.markdown("

What are you shooting today?

", unsafe_allow_html=True) shoot_type = st.radio("Select your shoot type:", ["Editorial", "Catalogue"], index=0) st.session_state['shoot_type'] = shoot_type brand_link = st.text_input("Add your brand link:", value=st.session_state.get("brand_link", "")) st.session_state['brand_link'] = brand_link if st.button("Get Brand Summary"): if brand_link: st.text("Using Scrapfly") brand_summary_html = create_screenshot_from_scrap_fly(brand_link) if brand_summary_html["success"]: # compressed_image = f"comp_brand_{random.randint(1, 100000000)}.png" # comp = check_and_compress_image(brand_summary_html["location"], compressed_image) # if comp["success"]: # st.image(compressed_image) # brand_image_embed = embed_base64_for_claude(compressed_image) # else: st.image(brand_summary_html["location"]) # brand_image_embed = embed_base64_for_claude(brand_summary_html["location"]) brand_summary_response = create_image_completion_request_gpt(brand_summary_html["location"], st.session_state["brand_prompt"]) st.session_state['brand_summary'] = brand_summary_response else: st.text(f"Scrapfly failed due to: {brand_summary_html}") st.text("Using Langchain") brand_summary_html = create_brand_html(brand_link) brand_summary = create_langchain_openai_query(brand_summary_html) st.session_state['brand_summary'] = brand_summary st.success("Brand summary fetched!") else: st.warning("Please add a brand link.") brand_summary_value = st.session_state.get('brand_summary', "") editable_summary = st.text_area("Brand Summary:", value=brand_summary_value, height=100) st.session_state['brand_summary'] = editable_summary product_info = st.text_area("Tell us something about your product:", value=st.session_state.get("product_info", "")) st.session_state['product_info'] = product_info reference_images = st.file_uploader("Upload Reference Images", accept_multiple_files=True, key="reference_images_key") st.session_state['reference_images'] = reference_images if st.button("Give Me Ideas"): st.session_state['page'] = "Page 3" def page3(): import random st.title("Scene Suggestions") st.write("Based on your uploaded product and references!") feedback = st.chat_input("Provide feedback:") if not st.session_state.get("assistant_initialized", False): file_locations_for_product = [] for uploaded_file in st.session_state['uploaded_files']: bytes_data = uploaded_file.getvalue() image = Image.open(io.BytesIO(bytes_data)) image.verify() location = f"temp_image_{random.randint(1, 100000000)}.png" with open(location, "wb") as f: f.write(bytes_data) file_locations_for_product.append(location) image.close() file_base64_embeds_product = [embed_base64_for_claude(location) for location in file_locations_for_product] caption_list_from_claude_product = [] for file_embeds_base64 in file_base64_embeds_product: caption_from_claude = create_claude_image_request_for_image_captioning( st.session_state["caption_system_prompt"], st.session_state["caption_prompt"], file_embeds_base64) caption_list_from_claude_product.append(caption_from_claude) string_caption_list_product = str(caption_list_from_claude_product) file_locations_for_others = [] for uploaded_file in st.session_state['reference_images']: bytes_data = uploaded_file.getvalue() image = Image.open(io.BytesIO(bytes_data)) image.verify() location = f"temp2_image_{random.randint(1, 1000000)}.png" with open(location, "wb") as f: f.write(bytes_data) file_locations_for_others.append(location) image.close() file_base64_embeds = [embed_base64_for_claude(location) for location in file_locations_for_others] st.session_state.assistant_initialized = True caption_list_from_claude = [] for file_embeds_base64 in file_base64_embeds: caption_from_claude = create_claude_image_request_for_image_captioning( st.session_state["caption_system_prompt"], st.session_state["caption_prompt"], file_embeds_base64) caption_list_from_claude.append(caption_from_claude) string_caption_list = str(caption_list_from_claude) st.session_state["caption_product"] = string_caption_list_product st.session_state["additional_caption"] = string_caption_list additional_info_param_for_prompt = f"Brand have provided reference images whose details are:" \ f"```{string_caption_list}```. Apart from this brand needs" \ f"{st.session_state['shoot_type']}" product_info = str(string_caption_list_product) + st.session_state['product_info'] updated_prompt_for_claude = st.session_state["system_prompt"].replace( "{{BRAND_DETAILS}}", str(st.session_state['brand_summary'])).replace( "{{PRODUCT_DETAILS}}", str(product_info)).replace( "{{ADDITIONAL_INFO}}", str(additional_info_param_for_prompt) ) print(f"UP PROMPT:{updated_prompt_for_claude}") st.session_state["updated_prompt"] = updated_prompt_for_claude message_schema_for_claude = [ { "role": "user", "content": [ { "type": "text", "text": updated_prompt_for_claude } ] } ] response_from_claude = create_claude_request_for_text_completion(message_schema_for_claude) campaign_pattern = r"(.*?)" campaigns = re.findall(campaign_pattern, response_from_claude, re.DOTALL) concat_prompt_list = [] for idx, campaign in enumerate(campaigns, start=1): get_model_prompt = extract_data_from_text_xml(campaign, "model_prompt") get_background_prompt = extract_data_from_text_xml(campaign, "background_prompt") if get_model_prompt and get_background_prompt: # Ensure both prompts exist # Clean and concatenate the prompts concat_prompt_flux = (get_model_prompt.strip() + " " + get_background_prompt.strip()).strip() concat_prompt_list.append(concat_prompt_flux) flux_generated_theme_image = [] for concat_prompt in concat_prompt_list: theme_image = flux_generated_image(concat_prompt) flux_generated_theme_image.append(theme_image["file_name"]) # Debugging: print generated image file names # print(flux_generated_theme_image) # Store the session state st.session_state["descriptions"] = concat_prompt_list st.session_state["claude_context"] = response_from_claude st.session_state["images"] = flux_generated_theme_image if feedback: updated_context = st.session_state["claude_context"] if 'images' in st.session_state and 'descriptions' in st.session_state: for image_path in st.session_state['images']: os.remove(image_path) del st.session_state['images'] del st.session_state['descriptions'] del st.session_state["claude_context"] message_schema_for_claude = [ { "role": "user", "content": [ { "type": "text", "text": st.session_state["updated_prompt"] } ] }, { "role": "assistant", "content": [ { "type": "text", "text": updated_context} ] }, { "role": "user", "content": [ { "type": "text", "text": feedback } ] }, ] response_from_claude = create_claude_request_for_text_completion(message_schema_for_claude) campaign_pattern = r"(.*?)" campaigns = re.findall(campaign_pattern, response_from_claude, re.DOTALL) concat_prompt_list = [] for idx, campaign in enumerate(campaigns, start=1): get_model_prompt = extract_data_from_text_xml(campaign, "model_prompt") get_background_prompt = extract_data_from_text_xml(campaign, "background_prompt") if get_model_prompt and get_background_prompt: # Ensure both prompts exist # Clean and concatenate the prompts concat_prompt_flux = (get_model_prompt.strip() + " " + get_background_prompt.strip()).strip() concat_prompt_list.append(concat_prompt_flux) flux_generated_theme_image = [] for concat_prompt in concat_prompt_list: theme_image = flux_generated_image(concat_prompt) flux_generated_theme_image.append(theme_image["file_name"]) # Debugging: print generated image file names # print(flux_generated_theme_image) # Store the session state st.session_state["descriptions"] = concat_prompt_list st.session_state["claude_context"] = response_from_claude st.session_state["images"] = flux_generated_theme_image selected_image_index = None cols = st.columns(4) for i in range(len(st.session_state["images"])): with cols[i]: st.image(st.session_state.images[i], caption=st.session_state.descriptions[i], use_column_width=True) if st.radio(f"Select {i + 1}", [f"Select Image {i + 1}"], key=f"radio_{i}"): selected_image_index = i if selected_image_index is not None and st.button("Refine"): st.session_state.selected_image_index = selected_image_index st.session_state.selected_image = st.session_state.images[selected_image_index] st.session_state.selected_text = st.session_state.descriptions[selected_image_index] st.session_state['page'] = "Page 4" if st.button("Go Back!"): st.session_state.page = "Page 2" def page4(): import json selected_theme_text_by_user = st.session_state.descriptions[st.session_state.selected_image_index] print(selected_theme_text_by_user) with (st.sidebar): st.title(st.session_state["product_info"]) st.write("Product Image") st.image(st.session_state['uploaded_files']) st.text("Scene Suggestion:") st.image(st.session_state.selected_image) dimensions = st.text_input("Enter Dimensions e.g 3:4, 1:2", key="Dimensions") seed = st.selectbox( "Seed Preference", ("Fixed", "Random"), ) if seed == "Fixed": seed_number = st.number_input("Enter an integer:", min_value=1, max_value=100000, value=10, step=1) else: seed_number = 0 st.text("Thanks will take care") model__bg_preference = st.text_area("Edit Model & BG Idea", value=selected_theme_text_by_user, key="Model & BG Idea") start_chat = st.button("Start Chat") if "mood_chat_messages" not in st.session_state: st.session_state["mood_chat_messages"] = [] if seed and dimensions and model__bg_preference: if start_chat: if seed == "Fixed": generated_flux_image = flux_generated_image_seed(model__bg_preference, seed_number, dimensions) else: generated_flux_image = flux_generated_image(model__bg_preference) st.session_state["mood_chat_messages"].append({ "role": "AI", "message": model__bg_preference, "image": generated_flux_image["file_name"] }) # for message in st.session_state["mood_chat_messages"]: # if message["role"] == "AI": # st.write(f"Caimera AI: {message['message']}") # st.image(message['image']) #else: # st.write(f"**You**: {message['message']}") user_input = st.chat_input("Type your message here...") if user_input: st.session_state["mood_chat_messages"].append({"role": "User", "message": user_input}) updated_flux_prompt = prompts["PROMPT_TO_UPDATE_IDEA_OR_MOOD"].format( EXISTING_MODEL_BG_PROMPT=model__bg_preference, USER_INSTRUCTIONS=user_input ) message_schema_for_claude = [ { "role": "user", "content": [ { "type": "text", "text": updated_flux_prompt } ] }, { "role": "assistant", "content": [ { "type": "text", "text": str(st.session_state["mood_chat_messages"])} ] }, { "role": "user", "content": [ { "type": "text", "text": user_input + "Reference of previous conversation is also added." } ] }, ] response_from_claude = create_claude_request_for_text_completion(message_schema_for_claude) cleaned_prompt = extract_data_from_text_xml(response_from_claude, "updated_prompt") if seed == "Fixed": generated_flux_image_n = flux_generated_image_seed(cleaned_prompt, seed_number, dimensions) else: generated_flux_image_n = flux_generated_image(cleaned_prompt) st.session_state["mood_chat_messages"].append({ "role": "AI", "message": cleaned_prompt, "actual_response": response_from_claude, "image": generated_flux_image_n["file_name"] }) for message in st.session_state["mood_chat_messages"]: if message["role"] == "AI": st.write(f"**AI**: {message['message']}") st.image(message['image']) else: st.write(f"**You**: {message['message']}") print(seed_number) if 'page' not in st.session_state: st.session_state.page = "Page 5" if st.session_state.page == "Page 5": page5() if st.session_state.page == "Page 1": page1() elif st.session_state.page == "Page 2": page2() elif st.session_state.page == "Page 3": page3() elif st.session_state.page == "Page 4": page4()