adowu's picture
Update app.py
67541fb verified
import gradio as gr
import google.generativeai as genai
import time
import yaml
import os
from typing import Any, Generator, Tuple
from pydantic import BaseModel, ValidationError
# Wczytywanie klucza API z zmiennych środowiskowych
GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY")
# Sprawdzenie, czy klucz API został znaleziony
if not GEMINI_API_KEY:
raise ValueError("Nie znaleziono klucza API Gemini. Ustaw zmienną środowiskową GEMINI_API_KEY.")
genai.configure(api_key=GEMINI_API_KEY)
generation_config = {
"temperature": 1,
"top_p": 0.95,
"top_k": 64,
"max_output_tokens": 8192,
"response_mime_type": "text/plain",
}
system_message = """Jesteś "Nauczycielem Promptów", asystentem, który pomaga w pisaniu lepszych promptów. Twoim zadaniem jest ulepszanie promptów, aby były bardziej precyzyjne i dawały lepsze wyniki.
Kiedy otrzymasz prośbę o ulepszenie promptu, odpowiedz tylko ulepszoną wersją promptu.
Kiedy otrzymasz prośbę o wyjaśnienie zmian, opisz je w prosty i zrozumiały sposób."""
inital_usr_text = "Chcę nauczyć się pisać lepsze prompty! Pomożesz mi? 🤔📚"
initial_bot_text = """Witaj! 👋 Jestem Nauczycielem Promptów - pomogę Ci ulepszyć Twoje prompty! 🤖🎓
Zobacz, jak to działa:
1. Wybierz, co chcesz zmienić w swoim prompcie.
2. Wpisz prompt - co chcesz, żeby komputer zrobił?
3. Kliknij "✨Ulepsz prompt!", a ja postaram się go ulepszyć!
4. Kliknij "Wyjaśnij zmiany 💡", jeśli chcesz zrozumieć, co zmieniłem.
Możesz też zobaczyć przykłady na dole strony - kliknij na któryś, żeby go wybrać. 🖱️👇"""
class Metaprompt(BaseModel):
explanation: str
example_prompt: str
example_prompt_explanation: str
name: str
template: str
def __str__(self):
return f"✨**{self.name}**\n\n📝 *{self.explanation}*\n\n📚 **Przykładowy Prompt:** {self.example_prompt}\n\n📖 **Wyjaśnienie Przykładowego Promptu:** {self.example_prompt_explanation}"
class MetapromptLibrary(BaseModel):
Metaprompts: list[Metaprompt]
def read_and_validate(file_path: str = "metaprompts.yml"):
try:
with open(file_path, "r") as file:
data = yaml.safe_load(file)
validated_data = MetapromptLibrary(**data)
return validated_data
except FileNotFoundError:
raise FileNotFoundError(
"Nie znaleziono pliku metaprompts.yml. Upewnij się, że plik znajduje się w tym samym folderze co skrypt.")
except yaml.YAMLError as e:
raise yaml.YAMLError(f"Błąd parsowania pliku YAML: {e}")
except ValidationError as e:
raise ValidationError(f"Błąd walidacji danych: {e}")
metaprompts = read_and_validate().Metaprompts
metaprompts_dict = {mp.name: mp for mp in metaprompts}
def get_llm():
return genai.GenerativeModel(
model_name="gemini-1.5-pro-exp-0827",
generation_config=generation_config,
)
def explain_metaprompt(explanation_history, metaprompt):
explanation_history += [
[f"❓Jak **{metaprompt.capitalize()}** ulepsza mój prompt? 💡🚀", ""]
]
answer = f"""{metaprompts_dict[metaprompt]}"""
for character in answer:
explanation_history[-1][1] += character
time.sleep(0.001)
yield explanation_history
def update_widgets(metaprompt, feedback):
button_variant = "primary" if metaprompt else "secondary"
feedback_visibility = True if metaprompt == "Dodaj uwagi" else False
return [
gr.Button(variant=button_variant),
gr.Textbox(
visible=feedback_visibility, value=feedback if feedback_visibility else ""
),
]
def explain_improvement(
prompt, metaprompt, improved_prompt, prompt_teacher
):
llm = get_llm()
chat_session = llm.start_chat()
response = chat_session.send_message(
f"""Następujący prompt:
---
{prompt}
---
został ulepszony za pomocą metapromptu:
---
{metaprompt}
---
W rezultacie powstała następująca ulepszona wersja:
---
{improved_prompt}
---
Zwięźle wyjaśnij ulepszenie."""
)
prompt_teacher += [
[
"❓Czy możesz proszę **wyjaśnić** **ulepszony prompt**? 📝✨",
"**Wyjaśnienie**:\n\n",
]
]
prompt_teacher[-1][1] += response.text
yield prompt_teacher
def improve_prompt(
prompt: str,
metaprompt: str,
feedback: str | None,
explanation_history,
) -> Generator[Tuple[str, str], Any, Any]:
metaprompt_template = metaprompts_dict[metaprompt].template
llm = get_llm()
chat_session = llm.start_chat()
chat_session.send_message(system_message)
explanation_history += [
[
f"""
**📝 Proszę ulepszyć następujący Prompt:**
```
{prompt}
```
""",
"**Ulepszony Prompt**:\n\n",
]
]
improved_prompt = ""
input_message = {"prompt": prompt, "feedback": feedback} if feedback else {"prompt": prompt}
input_str = ""
for key, value in input_message.items():
input_str += f"{key}: {value}\n"
response = chat_session.send_message(metaprompt_template + "\n" + input_str)
explanation_history[-1][1] += response.text
improved_prompt += response.text
yield improved_prompt, explanation_history
def robustly_improve_prompt(*args, **kwargs):
history = args[3]
user_txt = "Ups, wystąpił błąd!💥 Co powinienem zrobić?"
try:
yield from improve_prompt(*args, **kwargs)
except Exception as e:
msg = "\n\nSpróbuj jeszcze raz! Upewnij się, że wszystko jest dobrze wpisane. 🤔"
try:
error_msg = e.body["message"]
error_msg += msg
history += [[user_txt, error_msg]]
gr.Warning(error_msg)
yield "", history
except Exception as ee:
error_msg = str(e) + msg
history += [[user_txt, error_msg]]
gr.Warning(error_msg)
yield "", history
with gr.Blocks(title="Nauczyciel Promptów", theme=gr.themes.Soft()) as gradio_app:
# Zastosowanie gr.HTML do wyświetlenia HTML
gr.HTML(
"<center><h1>🤖 <font size = '7'>Nauczyciel Promptów</font> - Pomocnik w pisaniu lepszych promptów! 📝✨ </h1></center>")
with gr.Accordion("ℹ️ Co to są prompty?", open=True):
gr.Markdown(
"""
1. **Co to jest prompt?**
Prompt to jakby instrukcja, którą dajemy komputerowi. To tak, jakbyś mówił przyjacielowi, co ma zrobić. Na przykład, jeśli chcesz, żeby przyjaciel narysował kota, mówisz mu: „Narysuj kota z dużymi oczami i puszystym ogonem.” To właśnie jest twój prompt!
2. **Jak działa prompt?**
Kiedy wpisujesz prompt w komputerze, on czyta go i stara się zrobić to, co napisałeś. Im bardziej szczegółowy i jasny jest twój prompt, tym lepszy obrazek lub odpowiedź dostaniesz.
3. **Dlaczego dobry prompt jest ważny?**
Jeśli powiesz komputerowi coś ogólnego, na przykład „narysuj coś”, to może narysować cokolwiek, co niekoniecznie będzie tym, co chcesz. Ale jeśli powiesz: „narysuj piękny zachód słońca z palmami i plażą”, komputer będzie miał lepszy pomysł na to, co powinien stworzyć.
4. **Przykłady dobrych promptów:**
„Napisz krótką bajkę o małym smoku, który szuka przyjaciół.”
„Stwórz obrazek, na którym są dinozaury bawiące się w parku.”
5. **Ćwiczenie!**
Spróbuj stworzyć własny prompt! Co byś chciał, żeby komputer narysował lub napisał? Pamiętaj, im więcej szczegółów dodasz, tym lepszy efekt dostaniesz!
"""
)
with gr.Row():
with gr.Column(scale=2):
prompt_teacher = gr.Chatbot(
height=580,
label="Nauczyciel Promptów",
show_copy_button=True,
value=[[inital_usr_text, initial_bot_text]],
avatar_images=("thinking.svg", "robot.svg"), # Ustawienie avatarów
)
prompt = gr.Textbox(
label="Prompt",
interactive=True,
placeholder="Wpisz swój prompt - co chcesz, żeby komputer zrobił?",
value="Napisz krótkie streszczenie bitwy pod Grunwaldem.",
show_copy_button=True,
)
with gr.Row():
explain_btn = gr.Button(
"Wyjaśnij zmiany 💡",
variant="primary",
visible=False,
)
replace_btn = gr.Button(
"Zatwierdź zmiany 👍",
variant="primary",
visible=False,
)
with gr.Row():
improve_btn = gr.Button("✨Ulepsz prompt!", variant="primary")
with gr.Column(scale=1):
metaprompt = gr.Radio(
label="Ulepszenia",
info="Wybierz, jak chcesz ulepszyć swój prompt.",
value="Dodaj szczegóły",
choices=[mp.name.replace("_", " ").capitalize() for mp in metaprompts],
)
feedback = gr.Textbox(
label="Twoje uwagi",
info="Napisz, co chcesz zmienić w prompcie.",
visible=False,
)
improved_prompt = gr.Textbox(label="Ulepszony Prompt", visible=False)
examples = gr.Examples(
examples=[[mp.name, mp.example_prompt] for mp in metaprompts],
examples_per_page=100,
inputs=[metaprompt, prompt],
label="Przykłady",
)
metaprompt.change(
fn=update_widgets,
inputs=[metaprompt, feedback],
outputs=[improve_btn, feedback],
).success(
lambda: [gr.Button(visible=False), gr.Button(visible=False)],
None,
[replace_btn, explain_btn],
).success(
fn=explain_metaprompt,
inputs=[prompt_teacher, metaprompt],
outputs=[prompt_teacher],
)
improve_btn.click(
fn=robustly_improve_prompt,
inputs=[
prompt,
metaprompt,
feedback,
prompt_teacher,
],
outputs=[improved_prompt, prompt_teacher],
).success(
lambda: [gr.Button(visible=True), gr.Button(visible=True)],
None,
[replace_btn, explain_btn],
)
explain_btn.click(lambda: gr.Button(visible=False), None, explain_btn).success(
explain_improvement,
[
prompt,
metaprompt,
improved_prompt,
prompt_teacher,
],
prompt_teacher,
)
replace_btn.click(lambda x: x, improved_prompt, prompt).success(
lambda: [gr.Button(visible=False), gr.Button(visible=False)],
None,
[replace_btn, explain_btn],
)
if __name__ == "__main__":
gradio_app.queue(default_concurrency_limit=10).launch(favicon_path="robot.svg")