|
from typing import List
|
|
from crewai import Agent, Crew, Process, Task
|
|
from crewai.project import CrewBase, agent, crew, task
|
|
from crewai_tools import SerperDevTool, ScrapeWebsiteTool
|
|
from pydantic import BaseModel, Field
|
|
import os
|
|
|
|
|
|
llm_models = [
|
|
"gemini/gemini-1.5-flash",
|
|
"gemini/gemini-1.5-pro",
|
|
"gemini/gemini-pro"
|
|
]
|
|
selected_model = llm_models[0]
|
|
|
|
def set_model(selected_model_name):
|
|
global selected_model
|
|
selected_model = selected_model_name
|
|
|
|
def configure_api_keys(gemini_api_key):
|
|
if not gemini_api_key:
|
|
raise ValueError("Gemini API key is required")
|
|
os.environ['GEMINI_API_KEY'] = gemini_api_key
|
|
|
|
|
|
class MarketStrategy(BaseModel):
|
|
"""Market strategy model"""
|
|
name: str = Field(..., description="Name of the market strategy")
|
|
tatics: List[str] = Field(..., description="List of tactics to be used in the market strategy")
|
|
channels: List[str] = Field(..., description="List of channels to be used in the market strategy")
|
|
KPIs: List[str] = Field(..., description="List of KPIs to be used in the market strategy")
|
|
|
|
class CampaignIdea(BaseModel):
|
|
"""Campaign idea model"""
|
|
name: str = Field(..., description="Name of the campaign idea")
|
|
description: str = Field(..., description="Description of the campaign idea")
|
|
audience: str = Field(..., description="Audience of the campaign idea")
|
|
channel: str = Field(..., description="Channel of the campaign idea")
|
|
|
|
class Copy(BaseModel):
|
|
"""Copy model"""
|
|
title: str = Field(..., description="Title of the copy")
|
|
body: str = Field(..., description="Body of the copy")
|
|
|
|
@CrewBase
|
|
class MarketingPostsCrew:
|
|
"""MarketingPosts crew"""
|
|
agents_config = 'config/MarketingPostGeneratorAgent/agents.yaml'
|
|
tasks_config = 'config/MarketingPostGeneratorAgent/tasks.yaml'
|
|
|
|
@agent
|
|
def lead_market_analyst(self) -> Agent:
|
|
return Agent(
|
|
config=self.agents_config['lead_market_analyst'],
|
|
tools=[SerperDevTool(), ScrapeWebsiteTool()],
|
|
verbose=True,
|
|
llm=selected_model
|
|
)
|
|
|
|
@agent
|
|
def chief_marketing_strategist(self) -> Agent:
|
|
return Agent(
|
|
config=self.agents_config['chief_marketing_strategist'],
|
|
tools=[SerperDevTool(), ScrapeWebsiteTool()],
|
|
verbose=True,
|
|
llm=selected_model
|
|
)
|
|
|
|
@agent
|
|
def creative_content_creator(self) -> Agent:
|
|
return Agent(
|
|
config=self.agents_config['creative_content_creator'],
|
|
verbose=True,
|
|
llm=selected_model
|
|
)
|
|
|
|
@task
|
|
def research_task(self) -> Task:
|
|
return Task(
|
|
config=self.tasks_config['research_task'],
|
|
agent=self.lead_market_analyst()
|
|
)
|
|
|
|
@task
|
|
def project_understanding_task(self) -> Task:
|
|
return Task(
|
|
config=self.tasks_config['project_understanding_task'],
|
|
agent=self.chief_marketing_strategist()
|
|
)
|
|
|
|
@task
|
|
def marketing_strategy_task(self) -> Task:
|
|
return Task(
|
|
config=self.tasks_config['marketing_strategy_task'],
|
|
agent=self.chief_marketing_strategist(),
|
|
|
|
)
|
|
|
|
@task
|
|
def campaign_idea_task(self) -> Task:
|
|
return Task(
|
|
config=self.tasks_config['campaign_idea_task'],
|
|
agent=self.creative_content_creator(),
|
|
|
|
)
|
|
|
|
@task
|
|
def copy_creation_task(self) -> Task:
|
|
return Task(
|
|
config=self.tasks_config['copy_creation_task'],
|
|
agent=self.creative_content_creator(),
|
|
context=[self.marketing_strategy_task(), self.campaign_idea_task()],
|
|
output_file="post_generation.md"
|
|
)
|
|
|
|
@crew
|
|
def crew(self) -> Crew:
|
|
"""Creates the MarketingPosts crew"""
|
|
return Crew(
|
|
agents=self.agents,
|
|
tasks=self.tasks,
|
|
process=Process.sequential,
|
|
verbose=True,
|
|
output_log_file=True
|
|
)
|
|
|
|
def run_crew_mpga(gemini_api_key, customer_domain, project_description):
|
|
"""
|
|
Run the MarketingPosts crew using the provided Gemini API key and inputs.
|
|
|
|
Args:
|
|
gemini_api_key (str): The Gemini API key.
|
|
customer_domain (str): The customer domain.
|
|
project_description (str): The project description.
|
|
|
|
Returns:
|
|
A tuple (result, logs) from the crew kickoff.
|
|
"""
|
|
try:
|
|
configure_api_keys(gemini_api_key)
|
|
crew_instance = MarketingPostsCrew().crew()
|
|
inputs = {
|
|
"customer_domain": customer_domain,
|
|
"project_description": project_description
|
|
}
|
|
result = crew_instance.kickoff(inputs=inputs)
|
|
with open("post_generation.md", "r", encoding='utf-8') as f:
|
|
post_generation = f.read()
|
|
with open("logs.txt", 'r', encoding='utf-8') as f:
|
|
logs = f.read()
|
|
with open("logs.txt", 'w', encoding='utf-8') as f:
|
|
f.truncate(0)
|
|
return post_generation, logs
|
|
except Exception as e:
|
|
return f"Error: {str(e)}", "" |