import os import requests GROQ_API_URL = "https://api.groq.com/openai/v1/chat/completions" GROQ_API_KEY = os.getenv("GROQ_API_KEY") # Secure key from Hugging Face Secrets if not GROQ_API_KEY: raise ValueError("GROQ_API_KEY is missing! Set it in Hugging Face Secrets.") OPENAI_API_URL = "https://api.openai.com/v1/images/generations" OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") # Set this in Hugging Face Secrets if not OPENAI_API_KEY: raise ValueError("OPENAI_API_KEY is missing! Set it in Hugging Face Secrets.") # Helper function to load system prompt from txt files def load_prompt(filename): with open(f'config/system_prompts/{filename}', 'r') as file: return file.read() # Function to call Groq API with system prompt and user input def call_groq(system_prompt, user_input): headers = {"Authorization": f"Bearer {GROQ_API_KEY}"} payload = { "model": "deepseek-r1-distill-llama-70b", "messages": [ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_input} ] } print("Sending payload to Groq API...") print(payload) response = requests.post(GROQ_API_URL, json=payload, headers=headers) print("Groq API response status:", response.status_code) print("Groq API response body:", response.text) if response.status_code != 200: raise Exception(f"Groq API error: {response.status_code} - {response.text}") data = response.json() if 'choices' not in data or not data['choices']: raise Exception("Groq API returned no choices.") return data['choices'][0]['message']['content'] import time def generate_ad_image(prompt, n_images=1, size="1024x1024", model="dall-e-3"): headers = { "Authorization": f"Bearer {OPENAI_API_KEY}", "Content-Type": "application/json" } payload = { "model": model, "prompt": prompt, "n": n_images, "size": size } response = requests.post(OPENAI_API_URL, json=payload, headers=headers) if response.status_code != 200: raise Exception(f"OpenAI API error: {response.status_code} - {response.text}") data = response.json() print("OpenAI API raw response:", data) # 👈 ADDED for debugging if 'data' not in data or not data['data']: raise Exception("OpenAI API returned no image data. Check prompt, model, or account limits.") image_urls = [item.get('url') for item in data['data'] if 'url' in item] if not image_urls: raise Exception("No valid image URLs found in OpenAI API response. Possible safety filter block or model issue.") return image_urls def ad_copy_agent(product, description, audience, tone): system_prompt = load_prompt("ad_copy_prompt.txt") user_input = f"Product: {product}\nDescription: {description}\nAudience: {audience}\nTone: {tone}" output = call_groq(system_prompt, user_input) # Split out the image prompt section parts = output.split('Image Prompt:') ad_section = parts[0].strip() image_prompt = parts[1].strip() if len(parts) > 1 else '' # Extract clean ad copies ad_copies = [] for line in ad_section.split('\n'): if line.strip(): ad_copies.append(line.strip()) ad_copy_text = '\n'.join(ad_copies) return ad_copy_text, image_prompt def sentiment_agent(social_data): system_prompt = load_prompt("sentiment_prompt.txt") return call_groq(system_prompt, social_data) def timing_agent(platform): system_prompt = load_prompt("timing_prompt.txt") return call_groq(system_prompt, f"Platform: {platform}")