import base64 import gradio as gr from openai import OpenAI import os import dotenv dotenv.load_dotenv() client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) script_dir = os.path.dirname(os.path.abspath(__file__)) printer_1 = """ printerOne Product: Business Cards Size 2x3.5 Quantity,Price per Unit ($) 25,2.0 50,1.6 100,1.0 200,0.7 500,0.36 1000,0.2 2000,0.14 5000,0.12 10000,0.09 20000,0.07 """ printer_2 = """ BannerLord Product: Business Cards Size 2x3.5 Quantity,Price per Unit ($) 25,2.4 50,1.8 100,1.2 200,0.75 500,0.4 1000,0.22 2000,0.15 5000,0.14 10000,0.1 20000,0.075 """ printer_3 = """ PrintMaster Product: Business Cards Size 2x3.5 Quantity,Price per Unit ($) 50,1.4 75,1.2 100,1.05 150,1 200,0.875 250,0.72 500,0.4 750,0.4 1000,0.35 1500,0.3 2000,0.25 """ def find_best_price(request): chat_prompt = ( "You are a customer assistant and you have to find the best price for the customer. " "Here are the prices from the printers:\n" f"Printer 1:\n{printer_1}\n" f"Printer 2:\n{printer_2}\n" f"Printer 3:\n{printer_3}\n" "Check if the requested size is available from the printers. If not, provide the nearest size available." "Do not do a linear interpolation. Use the nearest lower quantity pricing and multiply user's amount by nearest price per unit." "Example:\n" "User: I want to print 600 brochures\n" "Answer:\n" "Printer 1: 500 brochures for $0.36 each. 600 * 0.36 = $216\n" "###" "Printer 2: 500 brochures for $0.4 each. 600 * 0.4 = $240\n" "###" "Printer 3: 500 brochures for $0.4 each. 600 * 0.4 = $240\n" "The '###' symbol separates the printer options. It is important to keep it in the response." ) chat_response = client.chat.completions.create( model="gpt-4o-mini", messages=[ {"role": "system", "content": chat_prompt}, {"role": "user", "content": request}, ], ) chat_text = chat_response.choices[0].message.content html_page = render_html_page(chat_text) return chat_text, html_page def render_html_page(chat_text): images = [ os.path.join(script_dir, "public/src/brochure3-400x400.jpg"), os.path.join(script_dir, "public/src/quality-unfolded-brochures_1_.png"), os.path.join(script_dir, "public/src/unfolded-glossy-brochures.png"), ] product_links = [ "https://www.example.com/product_image.jpg", "https://www.example.com/product_image.jpg", "https://www.example.com/product_image.jpg", ] # Split chat_text into product descriptions product_descriptions = chat_text.split("###") # Generate HTML content html_content = """ Product Cards """ for i, description in enumerate(product_descriptions): image = images[i % len(images)] with open(image, "rb") as img_file: base64_image = base64.b64encode(img_file.read()).decode("utf-8") product_link = product_links[i % len(product_links)] html_content += f"""
Product Image

{description}

""" html_content += """ """ return html_content logo = os.path.join(script_dir, "public/src/logo.svg") with open(logo, "rb") as logo_file: base64_logo = base64.b64encode(logo_file.read()).decode("utf-8") iface = gr.Interface( fn=find_best_price, inputs=gr.Textbox(lines=3, placeholder="Enter what are you looking for"), outputs=[ gr.Textbox(label="Result"), gr.HTML(label="Product Image"), ], title="Get Instant Quote", description=f"""
Logo
""", submit_btn="Get quote", ) valid_users = [("admin", "password123"), ("user1", "pass456")] iface.launch( debug=True, auth=("username", "password"), auth_message="Try this", )