feat: Integrated Google Ads Generator feature
- Added GoogleAdsGenerator component with comprehensive keyword research and ad copy generation. - Updated Sidebar and Home page for navigation. - Added necessary UI components (Badge, Tabs) and dependencies. - Added custom animations for progress indicators.
This commit is contained in:
@@ -207,6 +207,25 @@ export class ModelAdapter {
|
||||
return this.callWithFallback((service) => service.generateSlides(topic, options, model), providers);
|
||||
}
|
||||
|
||||
async generateGoogleAds(
|
||||
websiteUrl: string,
|
||||
options: {
|
||||
productsServices: string[];
|
||||
targetAudience?: string;
|
||||
budgetRange?: { min: number; max: number; currency: string };
|
||||
campaignDuration?: string;
|
||||
industry?: string;
|
||||
competitors?: string[];
|
||||
language?: string;
|
||||
} = { productsServices: [] },
|
||||
provider?: ModelProvider,
|
||||
model?: string
|
||||
): Promise<APIResponse<string>> {
|
||||
const fallback = this.buildFallbackProviders(this.preferredProvider, "qwen", "ollama", "zai");
|
||||
const providers: ModelProvider[] = provider ? [provider] : fallback;
|
||||
return this.callWithFallback((service) => service.generateGoogleAds(websiteUrl, options, model), providers);
|
||||
}
|
||||
|
||||
async chatCompletion(
|
||||
messages: ChatMessage[],
|
||||
model: string,
|
||||
|
||||
@@ -434,7 +434,100 @@ Generate SPECTACULAR slides with CSS3 animations, SVG charts, modern gradients,
|
||||
|
||||
return this.chatCompletion([systemMessage, userMessage], model || "gpt-oss:120b");
|
||||
}
|
||||
|
||||
async generateGoogleAds(
|
||||
websiteUrl: string,
|
||||
options: {
|
||||
productsServices: string[];
|
||||
targetAudience?: string;
|
||||
budgetRange?: { min: number; max: number; currency: string };
|
||||
campaignDuration?: string;
|
||||
industry?: string;
|
||||
competitors?: string[];
|
||||
language?: string;
|
||||
} = { productsServices: [] },
|
||||
model?: string
|
||||
): Promise<APIResponse<string>> {
|
||||
const {
|
||||
productsServices = [],
|
||||
targetAudience = "General consumers",
|
||||
budgetRange,
|
||||
campaignDuration,
|
||||
industry = "General",
|
||||
competitors = [],
|
||||
language = "English"
|
||||
} = options;
|
||||
|
||||
const systemMessage: ChatMessage = {
|
||||
role: "system",
|
||||
content: `You are an EXPERT Google Ads strategist. Create HIGH-CONVERTING campaigns with comprehensive keyword research, compelling ad copy, and optimized campaign structures.
|
||||
|
||||
OUTPUT FORMAT - Return ONLY valid JSON with this structure:
|
||||
\`\`\`json
|
||||
{
|
||||
"keywords": {
|
||||
"primary": [{"keyword": "term", "type": "primary", "searchVolume": 12000, "competition": "medium", "cpc": "$2.50"}],
|
||||
"longTail": [{"keyword": "specific term", "type": "long-tail", "searchVolume": 1200, "competition": "low", "cpc": "$1.25"}],
|
||||
"negative": [{"keyword": "exclude term", "type": "negative", "competition": "low"}]
|
||||
},
|
||||
"adCopies": [{
|
||||
"id": "ad-1",
|
||||
"campaignType": "search",
|
||||
"headlines": ["Headline 1 (30 chars)", "Headline 2", "Headline 3"],
|
||||
"descriptions": ["Description 1 (90 chars)", "Description 2"],
|
||||
"callToAction": "Get Started",
|
||||
"mobileOptimized": true
|
||||
}],
|
||||
"campaigns": [{
|
||||
"id": "campaign-1",
|
||||
"name": "Campaign Name",
|
||||
"type": "search",
|
||||
"budget": {"daily": 50, "monthly": 1500, "currency": "USD"},
|
||||
"targeting": {"locations": [], "demographics": [], "devices": []},
|
||||
"adGroups": [{"id": "adgroup-1", "name": "Group", "theme": "Theme", "keywords": [], "biddingStrategy": "Maximize conversions"}]
|
||||
}],
|
||||
"implementation": {
|
||||
"setupSteps": [],
|
||||
"qualityScoreTips": [],
|
||||
"trackingSetup": [],
|
||||
"optimizationTips": []
|
||||
},
|
||||
"predictions": {
|
||||
"estimatedClicks": "500-800/month",
|
||||
"estimatedImpressions": "15,000-25,000/month",
|
||||
"estimatedCtr": "3.2%-4.5%",
|
||||
"estimatedConversions": "25-50/month"
|
||||
}
|
||||
}
|
||||
\`\`\`
|
||||
|
||||
Requirements:
|
||||
- 10-15 primary keywords, 15-20 long-tail, 5-10 negative
|
||||
- Headlines max 30 chars, descriptions max 90 chars
|
||||
- 3-5 ad variations per campaign
|
||||
- Include budget and targeting recommendations`,
|
||||
};
|
||||
|
||||
const userMessage: ChatMessage = {
|
||||
role: "user",
|
||||
content: `Create a Google Ads campaign for:
|
||||
|
||||
WEBSITE: ${websiteUrl}
|
||||
PRODUCTS/SERVICES: ${productsServices.join(", ")}
|
||||
TARGET AUDIENCE: ${targetAudience}
|
||||
INDUSTRY: ${industry}
|
||||
LANGUAGE: ${language}
|
||||
${budgetRange ? `BUDGET: ${budgetRange.min}-${budgetRange.max} ${budgetRange.currency}/month` : ""}
|
||||
${campaignDuration ? `DURATION: ${campaignDuration}` : ""}
|
||||
${competitors.length > 0 ? `COMPETITORS: ${competitors.join(", ")}` : ""}
|
||||
|
||||
Generate complete Google Ads package with keywords, ad copy, campaigns, and implementation guidance.`,
|
||||
};
|
||||
|
||||
return this.chatCompletion([systemMessage, userMessage], model || "gpt-oss:120b");
|
||||
}
|
||||
}
|
||||
|
||||
export default OllamaCloudService;
|
||||
|
||||
|
||||
|
||||
@@ -762,6 +762,98 @@ Generate SPECTACULAR slides with CSS3 animations, SVG charts, modern gradients,
|
||||
return this.chatCompletion([systemMessage, userMessage], model || "coder-model");
|
||||
}
|
||||
|
||||
async generateGoogleAds(
|
||||
websiteUrl: string,
|
||||
options: {
|
||||
productsServices: string[];
|
||||
targetAudience?: string;
|
||||
budgetRange?: { min: number; max: number; currency: string };
|
||||
campaignDuration?: string;
|
||||
industry?: string;
|
||||
competitors?: string[];
|
||||
language?: string;
|
||||
} = { productsServices: [] },
|
||||
model?: string
|
||||
): Promise<APIResponse<string>> {
|
||||
const {
|
||||
productsServices = [],
|
||||
targetAudience = "General consumers",
|
||||
budgetRange,
|
||||
campaignDuration,
|
||||
industry = "General",
|
||||
competitors = [],
|
||||
language = "English"
|
||||
} = options;
|
||||
|
||||
const systemMessage: ChatMessage = {
|
||||
role: "system",
|
||||
content: `You are an EXPERT Google Ads strategist. Create HIGH-CONVERTING campaigns with comprehensive keyword research, compelling ad copy, and optimized campaign structures.
|
||||
|
||||
OUTPUT FORMAT - Return ONLY valid JSON with this structure:
|
||||
\`\`\`json
|
||||
{
|
||||
"keywords": {
|
||||
"primary": [{"keyword": "term", "type": "primary", "searchVolume": 12000, "competition": "medium", "cpc": "$2.50"}],
|
||||
"longTail": [{"keyword": "specific term", "type": "long-tail", "searchVolume": 1200, "competition": "low", "cpc": "$1.25"}],
|
||||
"negative": [{"keyword": "exclude term", "type": "negative", "competition": "low"}]
|
||||
},
|
||||
"adCopies": [{
|
||||
"id": "ad-1",
|
||||
"campaignType": "search",
|
||||
"headlines": ["Headline 1 (30 chars)", "Headline 2", "Headline 3"],
|
||||
"descriptions": ["Description 1 (90 chars)", "Description 2"],
|
||||
"callToAction": "Get Started",
|
||||
"mobileOptimized": true
|
||||
}],
|
||||
"campaigns": [{
|
||||
"id": "campaign-1",
|
||||
"name": "Campaign Name",
|
||||
"type": "search",
|
||||
"budget": {"daily": 50, "monthly": 1500, "currency": "USD"},
|
||||
"targeting": {"locations": [], "demographics": [], "devices": []},
|
||||
"adGroups": [{"id": "adgroup-1", "name": "Group", "theme": "Theme", "keywords": [], "biddingStrategy": "Maximize conversions"}]
|
||||
}],
|
||||
"implementation": {
|
||||
"setupSteps": [],
|
||||
"qualityScoreTips": [],
|
||||
"trackingSetup": [],
|
||||
"optimizationTips": []
|
||||
},
|
||||
"predictions": {
|
||||
"estimatedClicks": "500-800/month",
|
||||
"estimatedImpressions": "15,000-25,000/month",
|
||||
"estimatedCtr": "3.2%-4.5%",
|
||||
"estimatedConversions": "25-50/month"
|
||||
}
|
||||
}
|
||||
\`\`\`
|
||||
|
||||
Requirements:
|
||||
- 10-15 primary keywords, 15-20 long-tail, 5-10 negative
|
||||
- Headlines max 30 chars, descriptions max 90 chars
|
||||
- 3-5 ad variations per campaign
|
||||
- Include budget and targeting recommendations`,
|
||||
};
|
||||
|
||||
const userMessage: ChatMessage = {
|
||||
role: "user",
|
||||
content: `Create a Google Ads campaign for:
|
||||
|
||||
WEBSITE: ${websiteUrl}
|
||||
PRODUCTS/SERVICES: ${productsServices.join(", ")}
|
||||
TARGET AUDIENCE: ${targetAudience}
|
||||
INDUSTRY: ${industry}
|
||||
LANGUAGE: ${language}
|
||||
${budgetRange ? `BUDGET: ${budgetRange.min}-${budgetRange.max} ${budgetRange.currency}/month` : ""}
|
||||
${campaignDuration ? `DURATION: ${campaignDuration}` : ""}
|
||||
${competitors.length > 0 ? `COMPETITORS: ${competitors.join(", ")}` : ""}
|
||||
|
||||
Generate complete Google Ads package with keywords, ad copy, campaigns, and implementation guidance.`,
|
||||
};
|
||||
|
||||
return this.chatCompletion([systemMessage, userMessage], model || "coder-model");
|
||||
}
|
||||
|
||||
async listModels(): Promise<APIResponse<string[]>> {
|
||||
const models = [
|
||||
"coder-model",
|
||||
@@ -780,3 +872,4 @@ const qwenOAuthService = new QwenOAuthService();
|
||||
export default qwenOAuthService;
|
||||
export { qwenOAuthService };
|
||||
|
||||
|
||||
|
||||
@@ -407,7 +407,206 @@ Return the complete JSON with full htmlContent for each slide. Make each slide V
|
||||
|
||||
return this.chatCompletion([systemMessage, userMessage], model || "glm-4.7", true);
|
||||
}
|
||||
|
||||
async generateGoogleAds(
|
||||
websiteUrl: string,
|
||||
options: {
|
||||
productsServices: string[];
|
||||
targetAudience?: string;
|
||||
budgetRange?: { min: number; max: number; currency: string };
|
||||
campaignDuration?: string;
|
||||
industry?: string;
|
||||
competitors?: string[];
|
||||
language?: string;
|
||||
} = { productsServices: [] },
|
||||
model?: string
|
||||
): Promise<APIResponse<string>> {
|
||||
const {
|
||||
productsServices = [],
|
||||
targetAudience = "General consumers",
|
||||
budgetRange,
|
||||
campaignDuration,
|
||||
industry = "General",
|
||||
competitors = [],
|
||||
language = "English"
|
||||
} = options;
|
||||
|
||||
const systemMessage: ChatMessage = {
|
||||
role: "system",
|
||||
content: `You are an EXPERT Google Ads strategist with 15+ years of experience managing $100M+ in ad spend. You create HIGH-CONVERTING campaigns that consistently outperform industry benchmarks.
|
||||
|
||||
Your expertise includes:
|
||||
- Keyword research and competitive analysis
|
||||
- Ad copywriting that drives clicks and conversions
|
||||
- Campaign structure optimization
|
||||
- Quality Score improvement strategies
|
||||
- ROI maximization techniques
|
||||
|
||||
OUTPUT FORMAT - Return ONLY valid JSON:
|
||||
\`\`\`json
|
||||
{
|
||||
"keywords": {
|
||||
"primary": [
|
||||
{
|
||||
"keyword": "exact keyword phrase",
|
||||
"type": "primary",
|
||||
"searchVolume": 12000,
|
||||
"competition": "medium",
|
||||
"difficultyScore": 65,
|
||||
"relevanceScore": 95,
|
||||
"cpc": "$2.50"
|
||||
}
|
||||
],
|
||||
"longTail": [
|
||||
{
|
||||
"keyword": "longer specific keyword phrase",
|
||||
"type": "long-tail",
|
||||
"searchVolume": 1200,
|
||||
"competition": "low",
|
||||
"difficultyScore": 35,
|
||||
"relevanceScore": 90,
|
||||
"cpc": "$1.25"
|
||||
}
|
||||
],
|
||||
"negative": [
|
||||
{
|
||||
"keyword": "irrelevant term to exclude",
|
||||
"type": "negative",
|
||||
"competition": "low"
|
||||
}
|
||||
]
|
||||
},
|
||||
"adCopies": [
|
||||
{
|
||||
"id": "ad-1",
|
||||
"campaignType": "search",
|
||||
"headlines": [
|
||||
"Headline 1 (max 30 chars)",
|
||||
"Headline 2 (max 30 chars)",
|
||||
"Headline 3 (max 30 chars)"
|
||||
],
|
||||
"descriptions": [
|
||||
"Description line 1 - compelling copy under 90 chars",
|
||||
"Description line 2 - call to action under 90 chars"
|
||||
],
|
||||
"callToAction": "Get Started Today",
|
||||
"displayUrl": "example.com/offers",
|
||||
"mobileOptimized": true
|
||||
}
|
||||
],
|
||||
"campaigns": [
|
||||
{
|
||||
"id": "campaign-1",
|
||||
"name": "Campaign Name",
|
||||
"type": "search",
|
||||
"budget": {
|
||||
"daily": 50,
|
||||
"monthly": 1500,
|
||||
"currency": "USD"
|
||||
},
|
||||
"targeting": {
|
||||
"locations": ["United States", "Canada"],
|
||||
"demographics": ["25-54", "All genders"],
|
||||
"devices": ["Desktop", "Mobile", "Tablet"],
|
||||
"schedule": ["Mon-Fri 8am-8pm"]
|
||||
},
|
||||
"adGroups": [
|
||||
{
|
||||
"id": "adgroup-1",
|
||||
"name": "Product Category Group",
|
||||
"theme": "Main product focus",
|
||||
"keywords": ["keyword1", "keyword2"],
|
||||
"biddingStrategy": "Maximize conversions"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"implementation": {
|
||||
"setupSteps": [
|
||||
"Step 1: Create Google Ads account...",
|
||||
"Step 2: Set up conversion tracking..."
|
||||
],
|
||||
"qualityScoreTips": [
|
||||
"Tip 1: Match keywords to ad copy...",
|
||||
"Tip 2: Optimize landing pages..."
|
||||
],
|
||||
"trackingSetup": [
|
||||
"Install Google Tag Manager...",
|
||||
"Set up conversion goals..."
|
||||
],
|
||||
"optimizationTips": [
|
||||
"Monitor search terms weekly...",
|
||||
"A/B test ad variations..."
|
||||
]
|
||||
},
|
||||
"predictions": {
|
||||
"estimatedClicks": "500-800 per month",
|
||||
"estimatedImpressions": "15,000-25,000 per month",
|
||||
"estimatedCtr": "3.2%-4.5%",
|
||||
"estimatedConversions": "25-50 per month"
|
||||
}
|
||||
}
|
||||
\`\`\`
|
||||
|
||||
KEYWORD RESEARCH REQUIREMENTS:
|
||||
- Generate 10-15 PRIMARY keywords (high-volume, highly relevant)
|
||||
- Generate 15-20 LONG-TAIL keywords (specific, lower-competition)
|
||||
- Generate 5-10 NEGATIVE keywords (terms to exclude)
|
||||
- Include realistic search volume estimates
|
||||
- Provide competition level and CPC estimates
|
||||
|
||||
AD COPY REQUIREMENTS:
|
||||
- Headlines MUST be 30 characters or less
|
||||
- Descriptions MUST be 90 characters or less
|
||||
- Create 3-5 unique ad variations per campaign type
|
||||
- Include strong calls-to-action
|
||||
- Focus on benefits and unique value propositions
|
||||
- Mobile-optimized versions required
|
||||
|
||||
CAMPAIGN STRUCTURE:
|
||||
- Organize by product/service theme
|
||||
- Recommend appropriate bidding strategies
|
||||
- Include targeting recommendations
|
||||
- Suggest budget allocation
|
||||
|
||||
QUALITY STANDARDS:
|
||||
- All keywords must be relevant (>85% match)
|
||||
- Ad copy must comply with Google Ads policies
|
||||
- No trademark violations
|
||||
- Professional, compelling language
|
||||
- Clear value propositions`,
|
||||
};
|
||||
|
||||
const userMessage: ChatMessage = {
|
||||
role: "user",
|
||||
content: `Create a COMPREHENSIVE Google Ads campaign for:
|
||||
|
||||
WEBSITE: ${websiteUrl}
|
||||
|
||||
PRODUCTS/SERVICES TO PROMOTE:
|
||||
${productsServices.map((p, i) => `${i + 1}. ${p}`).join("\n")}
|
||||
|
||||
TARGET AUDIENCE: ${targetAudience}
|
||||
INDUSTRY: ${industry}
|
||||
LANGUAGE: ${language}
|
||||
${budgetRange ? `BUDGET: ${budgetRange.min}-${budgetRange.max} ${budgetRange.currency}/month` : ""}
|
||||
${campaignDuration ? `DURATION: ${campaignDuration}` : ""}
|
||||
${competitors.length > 0 ? `COMPETITORS: ${competitors.join(", ")}` : ""}
|
||||
|
||||
Generate a COMPLETE Google Ads package including:
|
||||
🔍 Comprehensive keyword research (primary, long-tail, negative)
|
||||
✍️ High-converting ad copy (multiple variations)
|
||||
📊 Optimized campaign structure
|
||||
📈 Performance predictions
|
||||
🎯 Implementation guidance
|
||||
|
||||
Make this campaign READY TO LAUNCH with copy-paste ready content!`,
|
||||
};
|
||||
|
||||
return this.chatCompletion([systemMessage, userMessage], model || "glm-4.7", true);
|
||||
}
|
||||
}
|
||||
|
||||
export default ZaiPlanService;
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { create } from "zustand";
|
||||
import type { ModelProvider, PromptEnhancement, PRD, ActionPlan, SlidesPresentation } from "@/types";
|
||||
import type { ModelProvider, PromptEnhancement, PRD, ActionPlan, SlidesPresentation, GoogleAdsResult } from "@/types";
|
||||
|
||||
interface AppState {
|
||||
currentPrompt: string;
|
||||
@@ -7,6 +7,7 @@ interface AppState {
|
||||
prd: PRD | null;
|
||||
actionPlan: ActionPlan | null;
|
||||
slidesPresentation: SlidesPresentation | null;
|
||||
googleAdsResult: GoogleAdsResult | null;
|
||||
selectedProvider: ModelProvider;
|
||||
selectedModels: Record<ModelProvider, string>;
|
||||
availableModels: Record<ModelProvider, string[]>;
|
||||
@@ -29,6 +30,7 @@ interface AppState {
|
||||
setPRD: (prd: PRD) => void;
|
||||
setActionPlan: (plan: ActionPlan) => void;
|
||||
setSlidesPresentation: (slides: SlidesPresentation | null) => void;
|
||||
setGoogleAdsResult: (result: GoogleAdsResult | null) => void;
|
||||
setSelectedProvider: (provider: ModelProvider) => void;
|
||||
setSelectedModel: (provider: ModelProvider, model: string) => void;
|
||||
setAvailableModels: (provider: ModelProvider, models: string[]) => void;
|
||||
@@ -47,6 +49,7 @@ const useStore = create<AppState>((set) => ({
|
||||
prd: null,
|
||||
actionPlan: null,
|
||||
slidesPresentation: null,
|
||||
googleAdsResult: null,
|
||||
selectedProvider: "qwen",
|
||||
selectedModels: {
|
||||
qwen: "coder-model",
|
||||
@@ -72,6 +75,7 @@ const useStore = create<AppState>((set) => ({
|
||||
setPRD: (prd) => set({ prd }),
|
||||
setActionPlan: (plan) => set({ actionPlan: plan }),
|
||||
setSlidesPresentation: (slides) => set({ slidesPresentation: slides }),
|
||||
setGoogleAdsResult: (result) => set({ googleAdsResult: result }),
|
||||
setSelectedProvider: (provider) => set({ selectedProvider: provider }),
|
||||
setSelectedModel: (provider, model) =>
|
||||
set((state) => ({
|
||||
@@ -107,6 +111,7 @@ const useStore = create<AppState>((set) => ({
|
||||
prd: null,
|
||||
actionPlan: null,
|
||||
slidesPresentation: null,
|
||||
googleAdsResult: null,
|
||||
error: null,
|
||||
}),
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user