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