Spaces:
Runtime error
Runtime error
File size: 11,057 Bytes
5b91c80 ab2b8cb 5b91c80 0972786 5b91c80 d0d3131 ab2b8cb d0d3131 5b91c80 f31204b 5b91c80 f31204b 5b91c80 f31204b 5b91c80 f31204b 5b91c80 f02a3ed ca7a119 f02a3ed ca7a119 5b91c80 f02a3ed ca7a119 5b91c80 ca7a119 5b91c80 f02a3ed 5b91c80 ab2b8cb 5b91c80 67541fb 5b91c80 ab2b8cb 5b91c80 67541fb |
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 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
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") |