HardbanRecordsLab commited on
Commit
bc89ec6
·
verified ·
1 Parent(s): 508f6af

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +116 -27
app.py CHANGED
@@ -1,55 +1,144 @@
1
- # Importujemy bibliotekę Gradio, która posłuży do budowy interfejsu
2
  import gradio as gr
 
 
 
 
3
 
4
- def handle_course_generation(topic):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  """
6
- Ta funkcja będzie w przyszłości sercem aplikacji.
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
- return f"### Rozpoczynam generowanie kursu na temat: '{topic}'"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
 
14
- # Używamy `gr.Blocks` dla większej kontroli nad układem interfejsu.
15
- # `theme` ustawia przyjemny dla oka wygląd, a `title` to tytuł w zakładce przeglądarki.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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, na który chcesz stworzyć kurs, a sztuczna inteligencja zajmie się resztą!
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 zbudować karmnik dla ptaków z recyklingu?",
31
  lines=2,
32
- scale=4, # Sprawia, że to pole jest szersze
33
  )
34
 
35
- # Przycisk do uruchamiania procesu generowania
36
- generate_button = gr.Button("Wygeneruj Kurs!", variant="primary")
37
 
38
- # Separator wizualny
39
  gr.Markdown("---")
 
 
 
40
 
41
- # Miejsce, w którym wyświetlimy wynik działania aplikacji
42
- output_display = gr.Markdown("### Twój kurs pojawi się tutaj...")
 
 
 
 
 
 
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=handle_course_generation,
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()