Anupam251272
commited on
Commit
•
3ab0741
1
Parent(s):
40eeeff
Update app.py
Browse files
app.py
CHANGED
@@ -4,7 +4,6 @@ import logging
|
|
4 |
from typing import Dict, Any, Optional
|
5 |
from dataclasses import dataclass, asdict
|
6 |
import json
|
7 |
-
import gradio as gr
|
8 |
|
9 |
# Configuration Management
|
10 |
@dataclass
|
@@ -33,10 +32,7 @@ class MarketingLogger:
|
|
33 |
"CRITICAL": logging.CRITICAL
|
34 |
}
|
35 |
|
36 |
-
#
|
37 |
-
log_dir = os.path.dirname("marketing_assistant.log")
|
38 |
-
os.makedirs(log_dir, exist_ok=True)
|
39 |
-
|
40 |
logging.basicConfig(
|
41 |
level=logging_levels.get(level.upper(), logging.INFO),
|
42 |
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
@@ -47,8 +43,226 @@ class MarketingLogger:
|
|
47 |
)
|
48 |
return logging.getLogger(__name__)
|
49 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
50 |
|
51 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
|
53 |
# Main Execution
|
54 |
def main():
|
@@ -64,7 +278,7 @@ def main():
|
|
64 |
|
65 |
# Create and launch Gradio interface
|
66 |
interface = create_marketing_interface(strategy_generator)
|
67 |
-
interface.launch(
|
68 |
|
69 |
if __name__ == "__main__":
|
70 |
main()
|
|
|
4 |
from typing import Dict, Any, Optional
|
5 |
from dataclasses import dataclass, asdict
|
6 |
import json
|
|
|
7 |
|
8 |
# Configuration Management
|
9 |
@dataclass
|
|
|
32 |
"CRITICAL": logging.CRITICAL
|
33 |
}
|
34 |
|
35 |
+
# Configure logging
|
|
|
|
|
|
|
36 |
logging.basicConfig(
|
37 |
level=logging_levels.get(level.upper(), logging.INFO),
|
38 |
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
|
|
43 |
)
|
44 |
return logging.getLogger(__name__)
|
45 |
|
46 |
+
# Strategy Generation Core
|
47 |
+
class MarketingStrategyGenerator:
|
48 |
+
def __init__(self, config: MarketingConfiguration):
|
49 |
+
"""
|
50 |
+
Initialize marketing strategy generator
|
51 |
+
|
52 |
+
:param config: Configuration for strategy generation
|
53 |
+
"""
|
54 |
+
self.config = config
|
55 |
+
self.logger = MarketingLogger.setup_logging(config.logging_level)
|
56 |
+
|
57 |
+
# Ensure output directory exists
|
58 |
+
os.makedirs(config.output_directory, exist_ok=True)
|
59 |
+
|
60 |
+
def validate_inputs(self, inputs: Dict[str, Any]) -> bool:
|
61 |
+
"""
|
62 |
+
Validate input parameters
|
63 |
+
|
64 |
+
:param inputs: Dictionary of input parameters
|
65 |
+
:return: Boolean indicating input validity
|
66 |
+
"""
|
67 |
+
required_keys = [
|
68 |
+
'product_description',
|
69 |
+
'audience_details',
|
70 |
+
'budget',
|
71 |
+
'channels'
|
72 |
+
]
|
73 |
+
|
74 |
+
for key in required_keys:
|
75 |
+
if not inputs.get(key):
|
76 |
+
self.logger.error(f"Missing required input: {key}")
|
77 |
+
return False
|
78 |
+
|
79 |
+
try:
|
80 |
+
budget = float(inputs['budget'])
|
81 |
+
if budget <= 0:
|
82 |
+
self.logger.error("Budget must be a positive number")
|
83 |
+
return False
|
84 |
+
except ValueError:
|
85 |
+
self.logger.error("Invalid budget format")
|
86 |
+
return False
|
87 |
+
|
88 |
+
return True
|
89 |
+
|
90 |
+
def generate_marketing_strategy(self, inputs: Dict[str, Any]) -> Dict[str, Any]:
|
91 |
+
"""
|
92 |
+
Generate a comprehensive marketing strategy
|
93 |
+
|
94 |
+
:param inputs: Marketing strategy inputs
|
95 |
+
:return: Generated marketing strategy
|
96 |
+
"""
|
97 |
+
# Input validation
|
98 |
+
if not self.validate_inputs(inputs):
|
99 |
+
return {"error": "Invalid input parameters"}
|
100 |
+
|
101 |
+
try:
|
102 |
+
# Professional strategy generation template
|
103 |
+
strategy = {
|
104 |
+
"product": inputs['product_description'],
|
105 |
+
"target_audience": inputs['audience_details'],
|
106 |
+
"budget": inputs['budget'],
|
107 |
+
"channels": inputs['channels'],
|
108 |
+
"strategy_components": {
|
109 |
+
"market_positioning": self._generate_positioning(inputs),
|
110 |
+
"channel_strategy": self._generate_channel_strategy(inputs),
|
111 |
+
"budget_allocation": self._allocate_budget(inputs),
|
112 |
+
"performance_metrics": self._define_performance_metrics(inputs)
|
113 |
+
},
|
114 |
+
"risk_assessment": self._assess_marketing_risks(inputs)
|
115 |
+
}
|
116 |
+
|
117 |
+
# Log strategy generation
|
118 |
+
self.logger.info(f"Strategy generated for: {inputs['product_description']}")
|
119 |
+
|
120 |
+
return strategy
|
121 |
+
|
122 |
+
except Exception as e:
|
123 |
+
self.logger.error(f"Strategy generation error: {str(e)}")
|
124 |
+
return {"error": str(e)}
|
125 |
+
|
126 |
+
def _generate_positioning(self, inputs: Dict[str, Any]) -> Dict[str, str]:
|
127 |
+
"""
|
128 |
+
Generate market positioning strategy
|
129 |
+
"""
|
130 |
+
return {
|
131 |
+
"unique_value_proposition": f"Innovative solution for {inputs['audience_details']}",
|
132 |
+
"brand_messaging": f"Targeting {inputs['channels']} with focused approach"
|
133 |
+
}
|
134 |
+
|
135 |
+
def _generate_channel_strategy(self, inputs: Dict[str, Any]) -> Dict[str, Any]:
|
136 |
+
"""
|
137 |
+
Generate channel-specific marketing strategies
|
138 |
+
"""
|
139 |
+
channels = inputs['channels'].lower().split(',')
|
140 |
+
strategies = {}
|
141 |
+
|
142 |
+
channel_mapping = {
|
143 |
+
'instagram': {
|
144 |
+
'content_type': 'Visual storytelling',
|
145 |
+
'engagement_strategy': 'Influencer partnerships'
|
146 |
+
},
|
147 |
+
'linkedin': {
|
148 |
+
'content_type': 'Professional thought leadership',
|
149 |
+
'engagement_strategy': 'B2B networking'
|
150 |
+
},
|
151 |
+
'email': {
|
152 |
+
'content_type': 'Personalized nurture campaigns',
|
153 |
+
'engagement_strategy': 'Segmented communication'
|
154 |
+
}
|
155 |
+
}
|
156 |
+
|
157 |
+
for channel in channels:
|
158 |
+
channel = channel.strip()
|
159 |
+
strategies[channel] = channel_mapping.get(
|
160 |
+
channel,
|
161 |
+
{'content_type': 'Generic digital marketing', 'engagement_strategy': 'Multi-channel approach'}
|
162 |
+
)
|
163 |
+
|
164 |
+
return strategies
|
165 |
+
|
166 |
+
def _allocate_budget(self, inputs: Dict[str, Any]) -> Dict[str, float]:
|
167 |
+
"""
|
168 |
+
Intelligent budget allocation
|
169 |
+
"""
|
170 |
+
total_budget = float(inputs['budget'])
|
171 |
+
channels = inputs['channels'].lower().split(',')
|
172 |
+
|
173 |
+
# Basic budget allocation strategy
|
174 |
+
base_allocation = {
|
175 |
+
'digital_advertising': 0.4,
|
176 |
+
'content_creation': 0.25,
|
177 |
+
'channel_specific': 0.25,
|
178 |
+
'analytics_tools': 0.1
|
179 |
+
}
|
180 |
+
|
181 |
+
allocated_budget = {
|
182 |
+
category: total_budget * percentage
|
183 |
+
for category, percentage in base_allocation.items()
|
184 |
+
}
|
185 |
+
|
186 |
+
return allocated_budget
|
187 |
|
188 |
+
def _define_performance_metrics(self, inputs: Dict[str, Any]) -> Dict[str, str]:
|
189 |
+
"""
|
190 |
+
Define key performance indicators
|
191 |
+
"""
|
192 |
+
return {
|
193 |
+
"conversion_rate": "Track sales and lead generation",
|
194 |
+
"customer_acquisition_cost": "Monitor marketing efficiency",
|
195 |
+
"engagement_metrics": "Analyze channel-specific interactions",
|
196 |
+
"roi_tracking": "Measure return on marketing investment"
|
197 |
+
}
|
198 |
+
|
199 |
+
def _assess_marketing_risks(self, inputs: Dict[str, Any]) -> Dict[str, str]:
|
200 |
+
"""
|
201 |
+
Conduct basic marketing risk assessment
|
202 |
+
"""
|
203 |
+
return {
|
204 |
+
"market_saturation": "Potential challenges in competitive landscape",
|
205 |
+
"audience_alignment": f"Relevance to {inputs['audience_details']}",
|
206 |
+
"budget_constraints": f"Limited budget of ${inputs['budget']}",
|
207 |
+
"channel_effectiveness": f"Risks in {inputs['channels']} channels"
|
208 |
+
}
|
209 |
+
|
210 |
+
def save_strategy(self, strategy: Dict[str, Any], filename: Optional[str] = None) -> str:
|
211 |
+
"""
|
212 |
+
Save marketing strategy to a JSON file
|
213 |
+
|
214 |
+
:param strategy: Generated marketing strategy
|
215 |
+
:param filename: Optional custom filename
|
216 |
+
:return: Path to saved strategy file
|
217 |
+
"""
|
218 |
+
if not filename:
|
219 |
+
filename = f"marketing_strategy_{strategy['product'].replace(' ', '_').lower()}.json"
|
220 |
+
|
221 |
+
filepath = os.path.join(self.config.output_directory, filename)
|
222 |
+
|
223 |
+
try:
|
224 |
+
with open(filepath, 'w') as f:
|
225 |
+
json.dump(strategy, f, indent=4)
|
226 |
+
|
227 |
+
self.logger.info(f"Strategy saved to {filepath}")
|
228 |
+
return filepath
|
229 |
+
except Exception as e:
|
230 |
+
self.logger.error(f"Error saving strategy: {e}")
|
231 |
+
return ""
|
232 |
+
|
233 |
+
# Gradio Interface
|
234 |
+
def create_marketing_interface(generator):
|
235 |
+
import gradio as gr
|
236 |
+
|
237 |
+
def generate_strategy_wrapper(product, audience, budget, channels):
|
238 |
+
inputs = {
|
239 |
+
'product_description': product,
|
240 |
+
'audience_details': audience,
|
241 |
+
'budget': budget,
|
242 |
+
'channels': channels
|
243 |
+
}
|
244 |
+
strategy = generator.generate_marketing_strategy(inputs)
|
245 |
+
|
246 |
+
# Save strategy to file
|
247 |
+
generator.save_strategy(strategy)
|
248 |
+
|
249 |
+
# Convert strategy to readable format
|
250 |
+
return json.dumps(strategy, indent=2)
|
251 |
+
|
252 |
+
interface = gr.Interface(
|
253 |
+
fn=generate_strategy_wrapper,
|
254 |
+
inputs=[
|
255 |
+
gr.Textbox(label="Product Description"),
|
256 |
+
gr.Textbox(label="Target Audience Details"),
|
257 |
+
gr.Number(label="Marketing Budget ($)"),
|
258 |
+
gr.Textbox(label="Marketing Channels")
|
259 |
+
],
|
260 |
+
outputs="text",
|
261 |
+
title="Professional Marketing Strategy Generator",
|
262 |
+
description="Generate comprehensive marketing strategies with advanced analytics"
|
263 |
+
)
|
264 |
+
|
265 |
+
return interface
|
266 |
|
267 |
# Main Execution
|
268 |
def main():
|
|
|
278 |
|
279 |
# Create and launch Gradio interface
|
280 |
interface = create_marketing_interface(strategy_generator)
|
281 |
+
interface.launch(debug=True)
|
282 |
|
283 |
if __name__ == "__main__":
|
284 |
main()
|