import os import json import requests import gradio as gr # ============================== # GROQ API CONFIG # ============================== GROQ_API_KEY = os.environ.get("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") GROQ_URL = "https://api.groq.com/openai/v1/chat/completions" MODEL = "llama3-70b-8192" # fast + powerful # ============================== # PROPOSAL GENERATION FUNCTION # ============================== def generate_proposal(job_description, skills, experience_level, tone): if not GROQ_API_KEY: return "Error: GROQ_API_KEY not found in environment variables." prompt = f""" You are a top 1% freelancer who writes high-converting proposals. Your task: Generate a professional, persuasive, personalized freelance proposal. Job Description: {job_description} Freelancer Skills: {skills} Experience Level: {experience_level} Tone: {tone} Return ONLY valid JSON in this format: {{ "hook": "", "proposal_body": "", "pricing_suggestion": "", "follow_up_message": "" }} """ headers = { "Authorization": f"Bearer {GROQ_API_KEY}", "Content-Type": "application/json" } payload = { "model": MODEL, "messages": [ {"role": "system", "content": "You write winning freelance proposals."}, {"role": "user", "content": prompt} ], "temperature": 0.7 } try: response = requests.post(GROQ_URL, headers=headers, json=payload) result = response.json() content = result["choices"][0]["message"]["content"] # Clean JSON if wrapped in code block if content.startswith("```"): content = content.split("```")[1] data = json.loads(content) final_output = f""" 🔥 HOOK: {data['hook']} 📄 PROPOSAL: {data['proposal_body']} 💰 PRICING SUGGESTION: {data['pricing_suggestion']} 📩 FOLLOW-UP MESSAGE: {data['follow_up_message']} """ return final_output except Exception as e: return f"Error generating proposal: {str(e)}" # ============================== # GRADIO UI # ============================== with gr.Blocks(title="AI Proposal Generator for Freelancers") as app: gr.Markdown("## 🚀 AI Proposal Generator") gr.Markdown("Generate high-converting freelance proposals instantly.") job_description = gr.Textbox(label="Job Description", lines=8) skills = gr.Textbox(label="Your Skills", lines=5) experience_level = gr.Dropdown( ["Beginner", "Intermediate", "Expert"], label="Experience Level", value="Intermediate" ) tone = gr.Dropdown( ["Professional", "Confident", "Friendly", "Persuasive"], label="Tone", value="Professional" ) generate_btn = gr.Button("Generate Proposal") output = gr.Textbox(label="Generated Proposal", lines=20) generate_btn.click( generate_proposal, inputs=[job_description, skills, experience_level, tone], outputs=output ) app.launch()