import os import subprocess # Ensure the required library is installed try: import huggingface_hub except ImportError: subprocess.run(["pip", "install", "huggingface_hub"]) # Access Hugging Face token from environment variables hf_token = os.getenv("HF_TOKEN") if not hf_token: raise ValueError("Hugging Face token not found. Please set it as an environment variable.") # Log in programmatically from huggingface_hub import login login(token=hf_token) print("Successfully logged in to Hugging Face!") import torch from transformers import AutoTokenizer, AutoModelForCausalLM from ast import literal_eval import gradio as gr import time # Device configuration device = "cuda" if torch.cuda.is_available() else "cpu" # Load tokenizer and model, and move model to device for marketing schedule generation tokenizer_schedule = AutoTokenizer.from_pretrained("meta-llama/Llama-3.2-1B-Instruct") model_schedule = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-1B-Instruct").to(device) # Load tokenizer and model, and move model to device for captions generation tokenizer_caption = AutoTokenizer.from_pretrained("meta-llama/Llama-3.2-1B-Instruct") model_caption = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-1B-Instruct").to(device) # Function to clean and extract schedule from raw output def clean_and_extract_schedule(raw_output): try: start_idx = raw_output.find("{") end_idx = raw_output.rfind("}") + 1 if start_idx != -1 and end_idx != -1: dictionary_text = raw_output[start_idx:end_idx] return literal_eval(dictionary_text) else: raise ValueError("No valid dictionary structure found.") except Exception as e: print(f"Error extracting dictionary: {e}") return None # Generate the marketing schedule based on user prompt def generate_marketing_schedule(prompt): complete_prompt = f""" You are an expert marketing strategist. Your task is to create a detailed marketing schedule based on the user's request. User request: {prompt} Provide a weekly marketing schedule in the following format: - Each day of the week (Monday to Sunday) should have a specific marketing activity. - Activities should be tailored to the user's campaign goal and brand. - The output should be in a Python dictionary format, like: {{ "Monday": "Task description", "Tuesday": "Task description", ... }} Output only the schedule. Do not include explanations or additional text. Marketing schedule: """ inputs = tokenizer_schedule(complete_prompt, return_tensors="pt").to(device) outputs = model_schedule.generate( **inputs, max_new_tokens=200, num_return_sequences=1, temperature=0.8, top_p=0.9, top_k=50, do_sample=True, pad_token_id=tokenizer_schedule.eos_token_id ) raw_output = tokenizer_schedule.decode(outputs[0], skip_special_tokens=True) raw_output = raw_output[len(complete_prompt):].strip() schedule = clean_and_extract_schedule(raw_output) return schedule or "Failed to generate a valid marketing schedule." # Generate custom social media caption for each day's task def generate_custom_caption(day, task): prompt = f""" You are a social media expert helping a brand schedule posts for their upcoming campaigns. Today is '{day}', and the task is: '{task}'. Create an engaging and captivating social media caption based on the following: 1. Tailor the caption to the specific product or event described in the task. 2. Ensure the caption is relevant to the day and highlights why followers should pay attention today. 3. Include a call to action and optional hashtags or emojis that match the tone of the post. 4. Output only the caption. Do not include reasoning or additional text. Caption: """ inputs = tokenizer_caption(prompt, return_tensors="pt").to(device) outputs = model_caption.generate( **inputs, max_new_tokens=100, num_return_sequences=1, temperature=0.9, no_repeat_ngram_size=3, top_p=0.9, top_k=60, do_sample=True, pad_token_id=tokenizer_caption.eos_token_id ) caption = tokenizer_caption.decode(outputs[0], skip_special_tokens=True) caption = caption[len(prompt):].strip() return caption def gradio_interface(user_prompt): conversation = [] # Generate the marketing schedule conversation.append('Hassan - Marketing Dept.: I\'m processing your request. Please wait a moment...') yield "
".join(conversation) # Update the interface with each message on a new line schedule = generate_marketing_schedule(user_prompt) if isinstance(schedule, dict): conversation.append('Hassan - Marketing Dept.: I have created the marketing schedule based on your request.') yield "
".join(conversation) # Update the interface with schedule processing time.sleep(2) conversation.append('Hassan - Marketing Dept.: Let\'s now consult the Caption Generator to create captions for each day.') yield "
".join(conversation) # Update the interface with new dialogue captions = {} for day, task in schedule.items(): conversation.append(f'Hassan - Marketing Dept.: For {day}, the task is \'{task}\'. Caption Generator, can you create a caption?') yield "
".join(conversation) # Update the interface with the conversation time.sleep(2) caption = generate_custom_caption(day, task) captions[day] = caption conversation.append(f'Ahmed - Media Dept.: Here\'s the caption for {day}: \'{caption}\'') yield "
".join(conversation) # Update the interface with the caption for the day conversation.append('Hassan - Marketing Dept.: The final marketing schedule with captions is ready.') yield "
".join(conversation) # Final update else: yield schedule # If there was an error, just return the error message # Launch Gradio interface with improved design interface = gr.Interface( fn=gradio_interface, inputs=gr.Textbox(label="Enter Your Marketing Prompt", placeholder="e.g., Campaign for a new hoodie release.", lines=2), outputs=gr.Markdown(label="Generated Marketing Schedule & Captions"), # Changed this to Markdown title="✨ laibor Marketing Demo ✨", description="🧑‍💻 Enter a campaign description to generate a weekly marketing schedule with captions tailored to your brand.", theme="compact", # Sleek compact theme css=""" .gradio-container { background-color: #000000; color: white; font-family: 'Arial', sans-serif; border-radius: 10px; border: 2px solid #dee2e6; } .gr-button { background-color: #4CAF50; color: white; font-size: 16px; font-weight: bold; } .gr-textbox, .gr-markdown { background-color: #333333; color: white; border: 1px solid #555555; border-radius: 8px; } .gr-textbox input, .gr-markdown textarea { background-color: #333333; color: white; } """ ) interface.launch()