decodingdatascience's picture
Update app.py
1693c7c verified
from crewai import Agent, Task, Crew
import gradio as gr
import re
from datetime import datetime
from pathlib import Path
import os
from openai import OpenAI # make sure `openai` is in requirements.txt
# ---- OpenAI setup (explicit) -------------------------------------------------
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
if not OPENAI_API_KEY:
raise RuntimeError(
"OPENAI_API_KEY is not set. In your Hugging Face Space, go to "
"Settings → Secrets and add OPENAI_API_KEY."
)
# ---------- Agents ----------
lead_market_analyst = Agent(
role="Lead Market Analyst",
goal="Deliver sharp, data-driven market insights for {product_brand}",
backstory=(
"A senior analyst skilled in competitor intelligence, audience segmentation, "
"channel dynamics, and market sizing, with a bias for actionable insights."
),
allow_delegation=False,
verbose=True
)
chief_marketing_strategist = Agent(
role="Chief Marketing Strategist",
goal="Turn research into a focused, measurable go-to-market strategy for {product_brand}",
backstory=(
"A veteran strategist who crafts positioning, messaging pillars, channel mix, "
"and KPI frameworks—aligning cross-functional stakeholders and timelines."
),
# Manager/orchestrator: can hand off sub-tasks or ask questions to teammates
allow_delegation=True,
verbose=True
)
creative_content_creator = Agent(
role="Creative Content Creator",
goal="Transform the strategy into compelling creative concepts and a content calendar",
backstory=(
"A concept-to-copy creative who converts strategy into campaign ideas, ad copy, "
"social posts, and SEO-ready long-form content."
),
allow_delegation=False,
verbose=True
)
# ---------- Crew runner ----------
def run_crewai_marketing_strategy(product_brand: str, target_audience: str, objective: str):
# Compose a shared topic string for clarity across tasks
topic = f"{product_brand} | Audience: {target_audience} | Objective: {objective}"
# 1) Market Analysis
market_analysis_task = Task(
description=(
"Conduct a concise but thorough market analysis for the topic: {topic}. "
"Cover: (1) ICP & segments, (2) JTBD/pain points & objections, "
"(3) competitive landscape & whitespace, (4) demand signals & seasonality, "
"(5) channel dynamics (search/social/email/partners/events), "
"(6) keyword themes & content gaps, (7) risks/assumptions."
),
expected_output=(
"A structured brief with bullet points for each section above, "
"ending with a 5–8 point summary of the most actionable insights."
),
agent=lead_market_analyst,
input_variables={"topic": topic}
)
# 2) Strategy Formulation (manager)
strategy_task = Task(
description=(
"Using the Market Analysis brief, craft a go-to-market strategy for {topic}. "
"Include: positioning statement, value prop, 3–5 messaging pillars, "
"priority segments, channel mix with rationale, offer/CTA ideas, "
"90-day roadmap (phases & owners), KPI tree (primary/leading indicators), "
"and a lightweight budget allocation (% by channel)."
),
expected_output=(
"A strategy document with clear sections as listed, plus a one-page executive summary."
),
agent=chief_marketing_strategist,
input_variables={"topic": topic},
context=[market_analysis_task]
)
# 3) Creative & Content Plan
creative_task = Task(
description=(
"Based on the Strategy, produce: (a) 3 campaign concepts (hook, angle, proof), "
"(b) ad copy variants (paid search, paid social), "
"(c) a 4-week content calendar (blog/LI/X/YouTube/Newsletter) with titles, "
"briefs, CTAs, and intended KPIs, and (d) landing-page wireframe outline "
"(hero, value blocks, social proof, FAQ)."
),
expected_output=(
"Campaign concepts + copy, a tabular content calendar, and a structured LP outline."
),
agent=creative_content_creator,
input_variables={"topic": topic},
context=[strategy_task]
)
crew = Crew(
agents=[lead_market_analyst, chief_marketing_strategist, creative_content_creator],
tasks=[market_analysis_task, strategy_task, creative_task]
)
result = crew.kickoff()
return result
# ---------- Gradio app ----------
def generate_strategy(product_brand, target_audience, objective):
return run_crewai_marketing_strategy(product_brand, target_audience, objective)
iface = gr.Interface(
fn=generate_strategy,
inputs=[
gr.Textbox(lines=1, label="Product / Brand", placeholder="e.g., SaaS analytics platform"),
gr.Textbox(lines=1, label="Target Audience", placeholder="e.g., mid-market product managers in EMEA"),
gr.Textbox(lines=1, label="Primary Objective", placeholder="e.g., drive free trials / demo requests")
],
outputs=gr.Textbox(lines=28, label="Marketing Strategy & Content Plan"),
title="DDS • AI Crew for Marketing Strategy",
description="Provide brand, audience, and objective. The crew analyzes the market, builds a GTM strategy, and outputs creative + a content calendar."
)
if __name__ == "__main__":
iface.launch()