-
Notifications
You must be signed in to change notification settings - Fork 0
/
copywriting_quest.py
208 lines (168 loc) Β· 8.38 KB
/
copywriting_quest.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
import time
import os
import json
import openai
import streamlit as st
from streamlit_lottie import st_lottie
from tenacity import retry, stop_after_attempt, wait_random_exponential
def main():
set_page_config()
custom_css()
hide_elements()
sidebar()
title_and_description()
input_section()
def set_page_config():
st.set_page_config(
page_title="Alwrity",
layout="wide",
page_icon="img/logo.png"
)
def custom_css():
st.markdown("""
<style>
.block-container {
padding-top: 0rem;
padding-bottom: 0rem;
padding-left: 1rem;
padding-right: 1rem;
}
</style>
""", unsafe_allow_html=True)
st.markdown("""
<style>
[class="st-emotion-cache-7ym5gk ef3psqc12"] {
display: inline-block;
padding: 5px 20px;
background-color: #4681f4;
color: #FBFFFF;
width: 300px;
height: 35px;
text-align: center;
text-decoration: none;
font-size: 16px;
border-radius: 8px;
}
</style>
""", unsafe_allow_html=True)
def hide_elements():
hide_decoration_bar_style = '<style>header {visibility: hidden;}</style>'
st.markdown(hide_decoration_bar_style, unsafe_allow_html=True)
hide_streamlit_footer = '<style>#MainMenu {visibility: hidden;} footer {visibility: hidden;}</style>'
st.markdown(hide_streamlit_footer, unsafe_allow_html=True)
def sidebar():
st.sidebar.image("img/alwrity.jpeg", use_column_width=True)
st.sidebar.markdown("π§ :red[Checkout Alwrity], complete **AI writer & Blogging solution**:[Alwrity](https://alwrity.netlify.app)")
def title_and_description():
st.title("βοΈ Alwrity - AI Generator for QUEST Copywriting Formula")
with st.expander("What is **QUEST Copywriting Formula** & **How to Use**? πβ"):
st.markdown('''
### What's QUEST Copywriting Formula, and How to use this AI generator π£οΈ
---
#### QUEST Copywriting Formula
QUEST is an acronym for Question-Unpack-Emphasize-Solution-Transform. It's a copywriting framework that focuses on guiding the audience through different stages:
1. **Question**: Presenting a thought-provoking question to engage the audience.
2. **Unpack**: Unpacking the question by elaborating on its implications and relevance.
3. **Emphasize**: Emphasizing the importance or significance of the topic.
4. **Solution**: Presenting your product or service as the solution to the question.
5. **Transform**: Describing the transformation or improvement your solution offers.
The QUEST formula helps in creating engaging and persuasive copy that leads the audience to explore the solution.
#### QUEST Copywriting Formula: Simple Example
- **Question**: "Ever wondered how to boost your productivity?"
- **Unpack**: "Let's delve into the strategies and tools that can help you achieve more in less time."
- **Emphasize**: "Productivity is key to success in today's fast-paced world."
- **Solution**: "Our productivity app provides a seamless solution to streamline your workflow."
- **Transform**: "Experience a new level of efficiency and effectiveness with our app."
---
''')
def input_section():
with st.expander("**PRO-TIP** - Easy Steps to Create Compelling QUEST Copy", expanded=True):
col1, space, col2 = st.columns([5, 0.1, 5])
with col1:
brand_name = st.text_input('Enter Brand/Company Name',
help="Enter the name of your brand or company.")
question = st.text_input('Present a Thought-Provoking Question to Engage Your Audience',
help="Pose a question that resonates with your audience.",
placeholder="Cities less polluted? future of remote work? Stress Free holidays ?")
solution = st.text_input(f'Present Your Product or Service as the Solution for {brand_name}\'s Audience',
help="Introduce your product or service as the solution to the question.",
placeholder="Our new app reduces, Our team ensures comfort, App is fastest...")
with col2:
unpack = st.text_input(f'Elaborate on the Question by Unpacking its Implications',
help="Provide context and detail to the question.",
placeholder="Environmental impact, societal benefits, Safe travels, Better service...")
emphasize = st.text_input(f'Emphasize the Importance or Significance of the Topic',
help="Highlight the relevance and impact of the topic.",
placeholder="Sustainability is crucial, Relaxed holidays, Faster services, Support...")
if st.button('**Get QUEST Copy**'):
if question.strip() and unpack.strip() and emphasize.strip() and solution.strip():
with st.spinner("Generating QUEST Copy..."):
quest_copy = generate_quest_copy(brand_name, question, unpack, emphasize, solution)
if quest_copy:
st.subheader('**π©π¬π©π¬ Your QUEST Copy**')
st.markdown(quest_copy)
else:
st.error("π₯ **Failed to generate QUEST copy. Please try again!**")
else:
st.error("All fields are required!")
page_bottom()
@retry(wait=wait_random_exponential(min=1, max=60), stop=stop_after_attempt(6))
def generate_quest_copy(brand_name, question, unpack, emphasize, solution):
prompt = f"""As an expert copywriter, I need your help in creating a marketing campaign for {brand_name}.
Your task is to use the QUEST (Question-Unpack-Emphasize-Solution-Transform) formula to craft compelling copy.
Here's the breakdown:
- Question: {question}
- Unpack: {unpack}
- Emphasize: {emphasize}
- Solution: {solution}
Do not provide explanations, provide the final marketing copy.
"""
return openai_chatgpt(prompt)
def page_bottom():
"""Display the bottom section of the web app."""
data_oracle = import_json(r"lottie_files/brain_robot.json")
st_lottie(data_oracle, width=600, key="oracle")
st.markdown('''
Copywrite using QUEST Copywriting Formula - powered by AI (OpenAI, Gemini Pro).
Implemented by [Alwrity](https://alwrity.netlify.app).
Learn more about [Google's Stance on AI generated content](https://alwrity.netlify.app/post/googles-guidelines-on-using-ai-generated-content-everything-you-need-to-know).
''')
st.markdown("""
### Question:
Have you ever wondered how to boost your productivity?
### Unpack:
Let's delve into the strategies and tools that can help you achieve more in less time.
### Emphasize:
Productivity is key to success in today's fast-paced world.
### Solution:
Our productivity app provides a seamless solution to streamline your workflow.
### Transform:
Experience a new level of efficiency and effectiveness with our app.
""")
@retry(wait=wait_random_exponential(min=1, max=60), stop=stop_after_attempt(6))
def openai_chatgpt(prompt, model="gpt-3.5-turbo-0125", max_tokens=500, top_p=0.9, n=1):
try:
client = openai.OpenAI(api_key=os.getenv('OPENAI_API_KEY'))
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}],
max_tokens=max_tokens,
n=n,
top_p=top_p
)
return response.choices[0].message.content
except openai.APIError as e:
st.error(f"OpenAI API Error: {e}")
except openai.APIConnectionError as e:
st.error(f"Failed to connect to OpenAI API: {e}")
except openai.RateLimitError as e:
st.error(f"Rate limit exceeded on OpenAI API request: {e}")
except Exception as err:
st.error(f"An error occurred: {err}")
# Function to import JSON data
def import_json(path):
with open(path, "r", encoding="utf8", errors="ignore") as file:
url = json.load(file)
return url
if __name__ == "__main__":
main()