Spaces:
Sleeping
Sleeping
import streamlit as st | |
from sentence_transformers import SentenceTransformer | |
import torch | |
import json | |
from streamlit_lottie import st_lottie | |
from notion_client import Client | |
from datetime import datetime | |
# Set page config at the very beginning | |
st.set_page_config(page_title="Prompt easz", layout="centered") | |
# Initialize Notion client | |
notion=Client(auth=st.secrets["NOTION_API_KEY"]) | |
NOTION_DATABASE_ID = st.secrets["notiondb"] | |
# Custom CSS to increase text size, beautify the app, and highlight the final message | |
st.markdown(""" | |
<style> | |
.big-font { | |
font-size:60px !important; | |
text-align: center; | |
} | |
.slider-label { | |
font-size:25px !important; | |
font-weight: bold; | |
} | |
.small-text { | |
font-size:12px !important; | |
} | |
.medium-text { | |
font-size:16px !important; | |
} | |
.center-text { | |
text-align: center; | |
} | |
.highlight { | |
font-family: 'Courier New', Courier, monospace; | |
background-color: #f0f0f0; | |
padding: 10px; | |
border-radius: 5px; | |
} | |
.stTextInput > div > div > input, .stSelectbox > div > div > select, .stButton > button { font-size: 16px; } | |
.stMarkdown { font-size: 14px; } | |
</style> | |
""", unsafe_allow_html=True) | |
def load_model(): | |
return SentenceTransformer('all-MiniLM-L6-v2') | |
def load_prompts(): | |
try: | |
with open('prompts.json', 'r') as file: | |
return json.load(file) | |
except json.JSONDecodeError as e: | |
st.error(f"Error loading prompts.json: {e}") | |
return {} | |
def load_categories(): | |
try: | |
with open('categories.json', 'r') as file: | |
return json.load(file) | |
except json.JSONDecodeError as e: | |
st.error(f"Error loading categories.json: {e}") | |
return {} | |
def load_lottiefile(filepath: str): | |
with open(filepath, "r") as f: | |
return json.load(f) | |
def find_prompt_types(user_input, num_types=3): | |
model = load_model() | |
prompt_types = load_prompts() | |
user_embedding = model.encode(user_input, convert_to_tensor=True) | |
similarities = {} | |
for pt, data in prompt_types.items(): | |
all_keywords = " ".join([" ".join(variation["keywords"]) for variation in data]) | |
pt_embedding = model.encode(all_keywords, convert_to_tensor=True) | |
similarity = torch.cosine_similarity(user_embedding, pt_embedding, dim=0).item() | |
similarities[pt] = similarity | |
return sorted(similarities, key=similarities.get, reverse=True)[:num_types] | |
def generate_prompt(prompt_type, topic, category, complexity, topic2=None, constraint=None): | |
model = load_model() | |
prompt_types = load_prompts() | |
categories_info = load_categories() | |
template = prompt_types[prompt_type][0]["template"] | |
complexity_instructions = { | |
"low": "Use simple language and basic concepts. Avoid technical jargon and provide elementary explanations suitable for beginners.", | |
"medium": "Include more detailed explanations and introduce some field-specific terminology. Provide a balance between depth and accessibility.", | |
"high": "Delve into advanced concepts and use specialized terminology. Assume a high level of prior knowledge and provide in-depth analysis." | |
} | |
category_info = categories_info.get(category, {}) | |
analogy = category_info.get("analogy", "analogous") | |
expert_role = category_info.get("expert_role", "an expert") | |
related_topics = ", ".join(category_info.get("related_topics", [])) | |
return f""" | |
# {prompt_type} Prompt: {topic} in {category} | |
{template.format(topic=topic, category=category, topic2=topic2, constraint=constraint)} | |
**Complexity: {complexity.capitalize()}** | |
{complexity_instructions[complexity]} | |
**Category Details:** | |
- **Analogy:** {analogy} | |
- **Expert Role:** {expert_role} | |
- **Related Topics:** {related_topics} | |
**Additional Instructions:** | |
- Ensure your response is well-structured and easy to follow. | |
- Use relevant examples to illustrate key points. | |
- Tailor your language to the specified complexity level. | |
""".strip() | |
def save_feedback_to_notion(user_prompt, improvement_suggestion, timestamp): | |
try: | |
notion.pages.create( | |
parent={"database_id": NOTION_DATABASE_ID}, | |
properties={ | |
"User Prompt": {"title": [{"text": {"content": user_prompt}}]}, | |
"Improvement Suggestion": {"rich_text": [{"text": {"content": improvement_suggestion}}]} | |
} | |
) | |
return True | |
except Exception as e: | |
# Log the error to the console instead of displaying it in the Streamlit app | |
print(f"Error saving to Notion: {str(e)}") | |
return False | |
def main(): | |
# Display the title and animation | |
st.markdown('<h1 class="big-font">Prompt easz</h1>', unsafe_allow_html=True) | |
st.markdown('<h2 class="center-text">AI Prompt Generator</h2>', unsafe_allow_html=True) | |
# Load and display Lottie animation | |
lottie_animation = load_lottiefile("animation.json") # Replace with your Lottie file path | |
col1, col2, col3 = st.columns([1,2,1]) | |
with col2: | |
st_lottie(lottie_animation, speed=1, height=400, key="initial") | |
# Add About link with icon below the Lottie animation | |
col1, col2, col3 = st.columns([1,2,1]) | |
with col2: | |
st.markdown( | |
'<div style="text-align: center;">' | |
'<a href="/About" target="_blank" style="text-decoration: none;">' | |
'<span style="font-size: 24px;">βΉοΈ</span> ' | |
'<span style="vertical-align: middle;">About</span>' | |
'</a>' | |
'</div>', | |
unsafe_allow_html=True | |
) | |
user_input = st.text_input("What would you like a prompt for?") | |
if user_input: | |
suggested_types = find_prompt_types(user_input) | |
prompt_types = load_prompts() | |
categories_info = load_categories() | |
unique_types = list(set(list(prompt_types.keys()) + suggested_types)) | |
topic = st.text_input("π Main Topic:", value=user_input) | |
category = st.selectbox("π·οΈ Category or Field:", options=list(categories_info.keys()), index=0) | |
complexity = st.select_slider("π§ Complexity Level:", options=["low", "medium", "high"], value="medium") | |
st.write("Choose Your Prompt") | |
selected_tab = st.selectbox("Select Prompt Type:", unique_types) | |
if selected_tab in prompt_types: | |
topic2 = st.text_input(f"π Second Topic for {selected_tab}:", key=f"{selected_tab}_topic2") if selected_tab == "Comparative Analysis" else None | |
constraint = st.number_input(f"π’ Word Limit for {selected_tab}:", min_value=10, max_value=500, value=50, key=f"{selected_tab}_constraint") if selected_tab == "Constraint Addition" else None | |
prompt = generate_prompt(selected_tab, topic, category, complexity, topic2, constraint) | |
st.markdown(prompt) | |
# Add feedback collection section | |
st.subheader("Provide Feedback") | |
improvement_suggestion = st.text_area("What can be improved in this prompt?", height=100) | |
if st.button("Submit Feedback"): | |
if improvement_suggestion: | |
timestamp = datetime.now().isoformat() | |
if save_feedback_to_notion(prompt, improvement_suggestion, timestamp): | |
st.success("Feedback saved to Notion successfully!") | |
else: | |
st.error("Failed to save feedback to Notion.") | |
else: | |
st.warning("Please provide feedback before submitting.") | |
st.markdown("---") | |
st.markdown(""" | |
### π How to Use AI Prompt Wizard Ultimate | |
1. Enter your desired topic or question. | |
2. Adjust the main topic, category, and complexity if needed. | |
3. Select the prompt type from the dropdown. | |
4. View the generated prompt. | |
5. Provide feedback on what can be improved in the prompt. | |
6. Submit your feedback to help us enhance our prompt generation. | |
""") | |
if __name__ == "__main__": | |
main() | |