Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import os | |
| from groq import Groq | |
| GROQ_API_KEY = os.environ.get("GROQ_API_KEY") | |
| if not GROQ_API_KEY: | |
| raise ValueError("GROQ_API_KEY environment variable not set") | |
| client = Groq(api_key=GROQ_API_KEY) | |
| MODEL = "llama-3.3-70b-versatile" | |
| print(f"✅ Groq client initialized with model: {MODEL}") | |
| OPTIMIZER_SYSTEM_PROMPT = """You are an expert prompt engineer. Your task is to analyze and optimize user prompts to get better results from AI language models. | |
| When given a prompt, you will: | |
| 1. Analyze its weaknesses (vagueness, missing context, unclear output format, etc.) | |
| 2. Rewrite it as an optimized version applying best practices | |
| 3. Explain what changes you made and why | |
| ## Optimization Techniques to Apply: | |
| ### 1. Clarity & Specificity | |
| - Replace vague terms with specific ones | |
| - Add necessary context the AI needs | |
| - Define any ambiguous terms | |
| ### 2. Role/Persona Framing | |
| - Add "You are a [relevant expert]..." when it would improve response quality | |
| - Match expertise level to the task | |
| ### 3. Output Format Instructions | |
| - Specify desired format (bullet points, paragraphs, table, JSON, etc.) | |
| - Include length guidance if appropriate | |
| - Request specific sections or structure | |
| ### 4. Constraints & Guardrails | |
| - Add what to include AND what to exclude | |
| - Specify tone (professional, casual, technical, etc.) | |
| - Set boundaries for scope | |
| ### 5. Task Decomposition | |
| - Break complex requests into numbered steps | |
| - Add "Think step by step" for reasoning tasks | |
| - Sequence multi-part requests logically | |
| ## Response Format: | |
| You MUST respond in this exact format: | |
| **ANALYSIS:** | |
| [2-3 sentences identifying the main weaknesses of the original prompt] | |
| **OPTIMIZED PROMPT:** | |
| [The complete rewritten prompt - ready to copy and use] | |
| **CHANGES MADE:** | |
| - [Change 1]: [Brief explanation why] | |
| - [Change 2]: [Brief explanation why] | |
| - [Change 3]: [Brief explanation why] | |
| [Continue for all significant changes] | |
| ## Important Rules: | |
| - The optimized prompt should be self-contained (user can copy-paste it directly) | |
| - Don't over-engineer simple prompts - match complexity to the task | |
| - Preserve the user's original intent completely | |
| - Keep the optimized prompt concise but complete""" | |
| def optimize_prompt(user_prompt: str, context: str = "") -> dict: | |
| if not user_prompt.strip(): | |
| return { | |
| "analysis": "No prompt provided.", | |
| "optimized_prompt": "", | |
| "changes": "", | |
| "raw_response": "" | |
| } | |
| user_message = "Please optimize this prompt:\n\n" + user_prompt | |
| if context.strip(): | |
| user_message += "\n\nAdditional context: " + context | |
| response = client.chat.completions.create( | |
| model=MODEL, | |
| messages=[ | |
| {"role": "system", "content": OPTIMIZER_SYSTEM_PROMPT}, | |
| {"role": "user", "content": user_message} | |
| ], | |
| max_tokens=2000, | |
| temperature=0.7 | |
| ) | |
| raw_response = response.choices[0].message.content | |
| result = { | |
| "analysis": "", | |
| "optimized_prompt": "", | |
| "changes": "", | |
| "raw_response": raw_response | |
| } | |
| if "**ANALYSIS:**" in raw_response: | |
| parts = raw_response.split("**ANALYSIS:**") | |
| if len(parts) > 1: | |
| remainder = parts[1] | |
| if "**OPTIMIZED PROMPT:**" in remainder: | |
| analysis_part, remainder = remainder.split("**OPTIMIZED PROMPT:**", 1) | |
| result["analysis"] = analysis_part.strip() | |
| if "**CHANGES MADE:**" in remainder: | |
| prompt_part, changes_part = remainder.split("**CHANGES MADE:**", 1) | |
| result["optimized_prompt"] = prompt_part.strip() | |
| result["changes"] = changes_part.strip() | |
| else: | |
| result["optimized_prompt"] = remainder.strip() | |
| if not result["optimized_prompt"]: | |
| result["optimized_prompt"] = raw_response | |
| result["analysis"] = "Could not parse structured response." | |
| return result | |
| def process_optimization(prompt: str, context: str) -> tuple: | |
| if not prompt.strip(): | |
| return ("⚠️ Please enter a prompt to optimize.", "", "") | |
| try: | |
| result = optimize_prompt(prompt, context) | |
| analysis = "### 🔍 Analysis\n\n" + result['analysis'] | |
| optimized = result['optimized_prompt'] | |
| changes = "### 📝 Changes Made\n\n" + result['changes'] | |
| return analysis, optimized, changes | |
| except Exception as e: | |
| return (f"❌ Error: {str(e)}", "", "") | |
| EXAMPLES = [ | |
| ["write about dogs", ""], | |
| ["help me with my code", ""], | |
| ["explain quantum computing", "For a blog post aimed at beginners"], | |
| ["write an email to my boss", "Requesting time off next week"], | |
| ["create a marketing plan", "For a new mobile app startup"], | |
| ["summarize this article", ""], | |
| ["give me recipe ideas", "Vegetarian, quick weeknight meals"], | |
| ["help me prepare for interview", "Software engineering position at Google"], | |
| ] | |
| demo = gr.Blocks() | |
| with demo: | |
| gr.Markdown(""" | |
| # ✨ Prompt Optimizer | |
| Transform basic prompts into powerful, well-structured instructions that get better results from AI. | |
| [](https://groq.com) | |
| **How it works:** Enter your rough prompt → AI analyzes weaknesses → Returns an optimized version with explanations. | |
| **Optimization Techniques Applied:** | |
| - 🎯 Clarity & Specificity | |
| - 🎭 Role/Persona Framing | |
| - 📋 Output Format Instructions | |
| - 🚧 Constraints & Guardrails | |
| - 🔢 Task Decomposition | |
| """) | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| gr.Markdown("### 📝 Input") | |
| prompt_input = gr.Textbox( | |
| label="Your Prompt", | |
| placeholder="Enter the prompt you want to optimize...\n\nExample: 'write about dogs'", | |
| lines=4 | |
| ) | |
| context_input = gr.Textbox( | |
| label="Additional Context (Optional)", | |
| placeholder="Any extra context about how you'll use this prompt...", | |
| lines=2 | |
| ) | |
| optimize_btn = gr.Button("✨ Optimize Prompt", variant="primary") | |
| gr.Markdown("### 💡 Example Prompts") | |
| gr.Examples(examples=EXAMPLES, inputs=[prompt_input, context_input], label="") | |
| with gr.Column(scale=1): | |
| gr.Markdown("### 🎯 Results") | |
| analysis_output = gr.Markdown(label="Analysis") | |
| optimized_output = gr.Textbox( | |
| label="Optimized Prompt (Ready to Copy)", | |
| lines=10, | |
| show_copy_button=True, | |
| interactive=False | |
| ) | |
| changes_output = gr.Markdown(label="Changes Made") | |
| optimize_btn.click( | |
| fn=process_optimization, | |
| inputs=[prompt_input, context_input], | |
| outputs=[analysis_output, optimized_output, changes_output] | |
| ) | |
| with gr.Accordion("📚 Prompt Engineering Tips", open=False): | |
| gr.Markdown(""" | |
| ### Best Practices for Writing Prompts | |
| **1. Be Specific** - ❌ "Write about history" → ✅ "Write a 500-word overview of the causes of World War I" | |
| **2. Define the Output Format** - ❌ "Give me some ideas" → ✅ "Give me 5 ideas as a numbered list" | |
| **3. Set the Role/Persona** - ❌ "Explain machine learning" → ✅ "You are a CS professor. Explain ML to a first-year student" | |
| **4. Add Constraints** - ❌ "Write a story" → ✅ "Write a 300-word short story set in Tokyo with a surprise ending" | |
| **5. Break Down Complex Tasks** - ❌ "Analyze this data" → ✅ "1) Summarize trends. 2) Identify issues. 3) Provide recommendations." | |
| """) | |
| with gr.Accordion("🔧 Technical Details", open=False): | |
| gr.Markdown(""" | |
| | Component | Details | | |
| |-----------|---------| | |
| | **LLM Backend** | Groq API | | |
| | **Model** | Llama 3.3 70B Versatile | | |
| | **Optimization Techniques** | 5 (Clarity, Role, Format, Constraints, Decomposition) | | |
| """) | |
| if __name__ == "__main__": | |
| demo.launch(server_name="0.0.0.0", server_port=7860) | |