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( "

🤖 Nauczyciel Promptów - Pomocnik w pisaniu lepszych promptów! 📝✨

") 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")