Spaces:
				
			
			
	
			
			
		Runtime error
		
	
	
	
			
			
	
	
	
	
		
		
		Runtime error
		
	Update app.py
Browse files
    	
        app.py
    CHANGED
    
    | @@ -1,55 +1,144 @@ | |
| 1 | 
            -
            # Importujemy  | 
| 2 | 
             
            import gradio as gr
         | 
|  | |
|  | |
|  | |
|  | |
| 3 |  | 
| 4 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 5 | 
             
                """
         | 
| 6 | 
            -
                 | 
| 7 | 
            -
                Na razie, dla celów demonstracyjnych, po prostu zwraca informację
         | 
| 8 | 
            -
                o temacie wpisanym przez użytkownika.
         | 
| 9 | 
             
                """
         | 
|  | |
|  | |
|  | |
|  | |
| 10 | 
             
                if not topic:
         | 
| 11 | 
            -
                    return "Proszę wpisać temat kursu."
         | 
| 12 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 13 |  | 
| 14 | 
            -
            #  | 
| 15 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 16 | 
             
            with gr.Blocks(theme=gr.themes.Soft(), title="Kreator Kursów DIY") as demo:
         | 
| 17 | 
            -
                # Tytuł główny aplikacji wyświetlany na stronie
         | 
| 18 | 
             
                gr.Markdown(
         | 
| 19 | 
             
                    """
         | 
| 20 | 
             
                    # 🎨 Kreator Kursów DIY
         | 
| 21 | 
            -
                    Wpisz temat,  | 
| 22 | 
             
                    """
         | 
| 23 | 
             
                )
         | 
| 24 |  | 
| 25 | 
            -
                # Tworzymy wiersz, aby lepiej zorganizować elementy
         | 
| 26 | 
             
                with gr.Row():
         | 
| 27 | 
            -
                    # Pole tekstowe do wprowadzania tematu przez użytkownika
         | 
| 28 | 
             
                    topic_input = gr.Textbox(
         | 
| 29 | 
             
                        label="Temat kursu",
         | 
| 30 | 
            -
                        placeholder="np. Jak  | 
| 31 | 
             
                        lines=2,
         | 
| 32 | 
            -
                        scale=4, | 
| 33 | 
             
                    )
         | 
| 34 |  | 
| 35 | 
            -
                 | 
| 36 | 
            -
                generate_button = gr.Button("Wygeneruj Kurs!", variant="primary")
         | 
| 37 |  | 
| 38 | 
            -
                # Separator wizualny
         | 
| 39 | 
             
                gr.Markdown("---")
         | 
|  | |
|  | |
|  | |
| 40 |  | 
| 41 | 
            -
                 | 
| 42 | 
            -
                 | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 43 |  | 
| 44 | 
            -
                # Definiujemy, co ma się stać po kliknięciu przycisku.
         | 
| 45 | 
            -
                # `fn`: funkcja, która ma zostać wywołana (nasza `handle_course_generation`)
         | 
| 46 | 
            -
                # `inputs`: komponent, z którego pobieramy dane (nasze pole tekstowe `topic_input`)
         | 
| 47 | 
            -
                # `outputs`: komponent, w którym wyświetlamy wynik (nasz `output_display`)
         | 
| 48 | 
             
                generate_button.click(
         | 
| 49 | 
            -
                    fn= | 
| 50 | 
             
                    inputs=topic_input,
         | 
| 51 | 
            -
                    outputs=output_display
         | 
| 52 | 
             
                )
         | 
| 53 |  | 
| 54 | 
            -
            # Ta linia uruchamia interfejs Gradio
         | 
| 55 | 
             
            demo.launch()
         | 
|  | |
| 1 | 
            +
            # Importujemy potrzebne biblioteki
         | 
| 2 | 
             
            import gradio as gr
         | 
| 3 | 
            +
            from transformers import pipeline as text_pipeline
         | 
| 4 | 
            +
            from diffusers import DiffusionPipeline
         | 
| 5 | 
            +
            import torch
         | 
| 6 | 
            +
            import re
         | 
| 7 |  | 
| 8 | 
            +
            # --- Konfiguracja Modeli ---
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            # Model językowy do generowania tekstu
         | 
| 11 | 
            +
            LLM_MODEL = "mistralai/Mistral-7B-Instruct-v0.2"
         | 
| 12 | 
            +
            # Model do generowania obrazów - v1.5 jest sprawdzony i działa dobrze na darmowym sprzęcie
         | 
| 13 | 
            +
            IMAGE_MODEL = "runwayml/stable-diffusion-v1-5"
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            # --- Ładowanie Modeli ---
         | 
| 16 | 
            +
            # Ładujemy modele na starcie aplikacji, aby uniknąć wielokrotnego ładowania.
         | 
| 17 | 
            +
            # To może zająć kilka minut przy pierwszym uruchomieniu.
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            # Ładowanie modelu LLM
         | 
| 20 | 
            +
            try:
         | 
| 21 | 
            +
                text_generator = text_pipeline(
         | 
| 22 | 
            +
                    "text-generation",
         | 
| 23 | 
            +
                    model=LLM_MODEL,
         | 
| 24 | 
            +
                    torch_dtype=torch.bfloat16,
         | 
| 25 | 
            +
                    device_map="auto"
         | 
| 26 | 
            +
                )
         | 
| 27 | 
            +
                LLM_LOADED = True
         | 
| 28 | 
            +
            except Exception as e:
         | 
| 29 | 
            +
                print(f"Błąd ładowania LLM: {e}")
         | 
| 30 | 
            +
                text_generator = None
         | 
| 31 | 
            +
                LLM_LOADED = False
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            # Ładowanie modelu Text-to-Image
         | 
| 34 | 
            +
            try:
         | 
| 35 | 
            +
                image_generator = DiffusionPipeline.from_pretrained(
         | 
| 36 | 
            +
                    IMAGE_MODEL,
         | 
| 37 | 
            +
                    torch_dtype=torch.float16,
         | 
| 38 | 
            +
                    revision="fp16"
         | 
| 39 | 
            +
                )
         | 
| 40 | 
            +
                image_generator.to("cuda")
         | 
| 41 | 
            +
                IMAGE_MODEL_LOADED = True
         | 
| 42 | 
            +
            except Exception as e:
         | 
| 43 | 
            +
                print(f"Błąd ładowania Image Model: {e}")
         | 
| 44 | 
            +
                image_generator = None
         | 
| 45 | 
            +
                IMAGE_MODEL_LOADED = False
         | 
| 46 | 
            +
             | 
| 47 | 
            +
             | 
| 48 | 
            +
            def parse_steps_from_markdown(markdown_text):
         | 
| 49 | 
            +
                """
         | 
| 50 | 
            +
                Funkcja do wyciągania tytułów poszczególnych kroków z wygenerowanego tekstu.
         | 
| 51 | 
            +
                Używa wyrażeń regularnych do znalezienia linii zaczynających się od "X. **".
         | 
| 52 | 
            +
                """
         | 
| 53 | 
            +
                # Wzorzec do znalezienia linii typu "1. **Tytuł kroku**"
         | 
| 54 | 
            +
                pattern = re.compile(r"^\d+\.\s*\*\*(.*?)\*\*", re.MULTILINE)
         | 
| 55 | 
            +
                steps = pattern.findall(markdown_text)
         | 
| 56 | 
            +
                return steps
         | 
| 57 | 
            +
             | 
| 58 | 
            +
             | 
| 59 | 
            +
            def generate_course_and_images(topic, progress=gr.Progress(track_tqdm=True)):
         | 
| 60 | 
             
                """
         | 
| 61 | 
            +
                Główna funkcja aplikacji: generuje tekst kursu, a następnie obrazy do każdego kroku.
         | 
|  | |
|  | |
| 62 | 
             
                """
         | 
| 63 | 
            +
                if not LLM_LOADED or not IMAGE_MODEL_LOADED:
         | 
| 64 | 
            +
                    error_msg = "Błąd krytyczny: Jeden z modeli AI nie został załadowany."
         | 
| 65 | 
            +
                    return error_msg, None
         | 
| 66 | 
            +
             | 
| 67 | 
             
                if not topic:
         | 
| 68 | 
            +
                    return "Proszę wpisać temat kursu.", None
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                # --- Krok 1: Generowanie struktury tekstowej kursu ---
         | 
| 71 | 
            +
                progress(0, desc="Generowanie tekstu kursu...")
         | 
| 72 | 
            +
                prompt = f"""
         | 
| 73 | 
            +
                [INST] Jesteś ekspertem w tworzeniu kursów online. Twoim zadaniem jest stworzenie zwięzłego, 5-etapowego planu kursu DIY na podany temat.
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                Temat kursu: "{topic}"
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                Wygeneruj odpowiedź w formacie Markdown, która zawiera:
         | 
| 78 | 
            +
                1. Chwytliwy tytuł kursu (jako nagłówek H1).
         | 
| 79 | 
            +
                2. Pięć ponumerowanych kroków kursu. Każdy krok powinien mieć tytuł (pogrubiony) i krótki, 2-3 zdaniowy opis.
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                Nie dodawaj żadnych wstępów, podsumowań ani dodatkowych komentarzy. Trzymaj się ściśle podanej struktury. [/INST]
         | 
| 82 | 
            +
                """
         | 
| 83 | 
            +
                response = text_generator(prompt, max_new_tokens=1024, do_sample=True, temperature=0.7, top_p=0.95)
         | 
| 84 | 
            +
                course_text = response[0]['generated_text'].split('[/INST]')[-1].strip()
         | 
| 85 |  | 
| 86 | 
            +
                # --- Krok 2: Parsowanie tekstu i generowanie obrazów ---
         | 
| 87 | 
            +
                steps = parse_steps_from_markdown(course_text)
         | 
| 88 | 
            +
                if not steps:
         | 
| 89 | 
            +
                    return course_text, None # Zwróć sam tekst, jeśli nie udało się znaleźć kroków
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                generated_images = []
         | 
| 92 | 
            +
                for i, step_title in enumerate(steps):
         | 
| 93 | 
            +
                    progress((i + 1) / len(steps), desc=f"Generowanie obrazka dla kroku {i+1}/{len(steps)}: {step_title}")
         | 
| 94 | 
            +
                    
         | 
| 95 | 
            +
                    # Tworzymy prosty, ale skuteczny prompt dla modelu obrazkowego
         | 
| 96 | 
            +
                    image_prompt = f"cinematic photo of '{step_title}', professional photography, high detail, 8k"
         | 
| 97 | 
            +
                    
         | 
| 98 | 
            +
                    # Generujemy obraz. `num_inference_steps` jest obniżone do 25 dla szybkości.
         | 
| 99 | 
            +
                    image = image_generator(image_prompt, num_inference_steps=25).images[0]
         | 
| 100 | 
            +
                    generated_images.append(image)
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                return course_text, generated_images
         | 
| 103 | 
            +
             | 
| 104 | 
            +
             | 
| 105 | 
            +
            # --- Budowa Interfejsu Gradio ---
         | 
| 106 | 
             
            with gr.Blocks(theme=gr.themes.Soft(), title="Kreator Kursów DIY") as demo:
         | 
|  | |
| 107 | 
             
                gr.Markdown(
         | 
| 108 | 
             
                    """
         | 
| 109 | 
             
                    # 🎨 Kreator Kursów DIY
         | 
| 110 | 
            +
                    Wpisz temat, a AI wygeneruje dla Ciebie kompletny, ilustrowany kurs!
         | 
| 111 | 
             
                    """
         | 
| 112 | 
             
                )
         | 
| 113 |  | 
|  | |
| 114 | 
             
                with gr.Row():
         | 
|  | |
| 115 | 
             
                    topic_input = gr.Textbox(
         | 
| 116 | 
             
                        label="Temat kursu",
         | 
| 117 | 
            +
                        placeholder="np. Jak uprawiać zioła na balkonie?",
         | 
| 118 | 
             
                        lines=2,
         | 
| 119 | 
            +
                        scale=4,
         | 
| 120 | 
             
                    )
         | 
| 121 |  | 
| 122 | 
            +
                generate_button = gr.Button("Wygeneruj Kurs z Obrazkami!", variant="primary")
         | 
|  | |
| 123 |  | 
|  | |
| 124 | 
             
                gr.Markdown("---")
         | 
| 125 | 
            +
                
         | 
| 126 | 
            +
                gr.Markdown("### 📖 Twój Kurs")
         | 
| 127 | 
            +
                output_display = gr.Markdown("Tutaj pojawi się tekst Twojego kursu...")
         | 
| 128 |  | 
| 129 | 
            +
                gr.Markdown("### 🖼️ Ilustracje do Kursu")
         | 
| 130 | 
            +
                image_gallery = gr.Gallery(
         | 
| 131 | 
            +
                    label="Wygenerowane obrazy",
         | 
| 132 | 
            +
                    show_label=False,
         | 
| 133 | 
            +
                    elem_id="gallery",
         | 
| 134 | 
            +
                    columns=5,
         | 
| 135 | 
            +
                    height="auto"
         | 
| 136 | 
            +
                )
         | 
| 137 |  | 
|  | |
|  | |
|  | |
|  | |
| 138 | 
             
                generate_button.click(
         | 
| 139 | 
            +
                    fn=generate_course_and_images,
         | 
| 140 | 
             
                    inputs=topic_input,
         | 
| 141 | 
            +
                    outputs=[output_display, image_gallery] # Teraz mamy dwa wyjścia!
         | 
| 142 | 
             
                )
         | 
| 143 |  | 
|  | |
| 144 | 
             
            demo.launch()
         |