Renday commited on
Commit
415c618
·
verified ·
1 Parent(s): 722982a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +82 -66
app.py CHANGED
@@ -2,82 +2,98 @@ import os
2
  import gradio as gr
3
  from huggingface_hub import InferenceClient
4
 
5
- def generate_novel_chapter(genre, style, premise, tone, length_tokens, previous_story=""):
6
-     print(f"--- GENERIERUNG GESTARTET: Genre={genre} ---")
7
-     
8
-     if not premise or not premise.strip():
9
-         raise gr.Error("Bitte gib eine Handlungsvorgabe ein.")
10
 
11
-     HF_TOKEN = os.getenv("HF_TOKEN")
12
-     if not HF_TOKEN:
13
-         raise gr.Error("HF_TOKEN ist nicht in den Space-Secrets hinterlegt.")
 
 
 
 
 
 
14
 
15
-     try:
16
-         client = InferenceClient(token=HF_TOKEN)
 
17
 
18
-         system_instruction = (
19
-             f"Du bist ein preisgekrönter Romanautor. Genre: {genre}. Stil: {style}. Ton: {tone}. "
20
-             "WICHTIGE ANWEISUNG: Schreibe das gesamte Kapitel AUSSCHLIESSLICH auf DEUTSCH."
21
-         )
22
 
23
-         # Wenn es bereits eine vorherige Geschichte gibt, bauen wir eine Fortsetzung an
24
-         if previous_story and previous_story.strip():
25
-             user_prompt = (
26
-                 f"Hier ist die bisherige Geschichte (Auszug/Zusammenfassung der letzten Teile):\n{previous_story[-1000:]}\n\n"
27
-                 f"Schreibe basierend darauf das NÄCHSTE Kapitel nahtlos weiter. Die neue Handlungsvorgabe für dieses Kapitel ist: {premise}"
28
-             )
29
-         else:
30
-             user_prompt = f"Schreibe ein detailliertes erstes Kapitel basierend auf: {premise}"
31
 
32
-         response = client.chat_completion(
33
-             model="Qwen/Qwen2.5-72B-Instruct",
34
-             messages=[
35
-                 {"role": "system", "content": system_instruction},
36
-                 {"role": "user", "content": user_prompt}
37
-             ],
38
-             max_tokens=int(length_tokens),
39
-             temperature=0.7,
40
-             stream=False 
41
-         )
42
 
43
-         full_text = response.choices[0].message.content
44
-         print("--- KAPITEL ERFOLGREICH GENERIERT ---")
45
-         
46
-         # Wir geben das neue Kapitel zurück und hängen es an die Gesamthistorie an
47
-         updated_story = (previous_story + "\n\n--- NÄCHSTES KAPITEL ---\n\n" + full_text) if previous_story else full_text
48
-         return updated_story, updated_story
 
 
 
 
49
 
50
-     except Exception as e:
51
-         print(f"--- FEHLER: {str(e)} ---")
52
-         raise gr.Error(f"Fehler: {str(e)}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
 
54
  # Interface
55
  with gr.Blocks() as demo:
56
-     gr.Markdown("# 📚 GamerJam.de AI Story Studio")
57
-     
58
-     # Zustand, um die gesamte bisherige Story im Hintergrund zu speichern
59
-     story_history_state = gr.State("")
 
 
 
 
 
 
 
 
 
 
60
 
61
-     with gr.Row():
62
-         with gr.Column(scale=1):
63
-             genre = gr.Dropdown(["High Fantasy", "Sci-Fi", "Cyberpunk", "Abenteuer", "Drama", "Krimi", "Thriller"], label="Genre", value="High Fantasy")
64
-             style = gr.Dropdown(["Erzähler (3. Person)", "Ich-Perspektive"], label="Erzählstil", value="Erzähler (3. Person)")
65
-             tone = gr.Dropdown(["Düster", "Episch", "Spannend", "Poetisch", "Humorvoll"], label="Tonalität", value="Episch")
66
-             length = gr.Slider(500, 2500, value=1200, label="Tokens pro Kapitel")
67
-         with gr.Column(scale=2):
68
-             premise = gr.Textbox(label="Handlungsvorgabe (für den nächsten Schritt / das nächste Kapitel)", lines=6, placeholder="Gib hier ein, was im nächsten Kapitel passieren soll...")
69
-             
70
-             with gr.Row():
71
-                 submit_btn = gr.Button("Kapitel generieren / fortsetzen", variant="primary")
72
-             
73
-     output = gr.Textbox(label="Dein fortlaufendes Buch", lines=15)
74
-     
75
-     # Klick-Event verknüpft die Eingaben und aktualisiert sowohl das Ausgabefeld als auch den State
76
-     submit_btn.click(
77
-         fn=generate_novel_chapter, 
78
-         inputs=[genre, style, premise, tone, length, story_history_state], 
79
-         outputs=[output, story_history_state]
80
-     )
81
 
82
  if __name__ == "__main__":
83
-     demo.launch(theme=gr.themes.Default())
 
2
  import gradio as gr
3
  from huggingface_hub import InferenceClient
4
 
5
+ # Einfacher In-Memory-Speicher pro User
6
+ USER_STORIES = {}
 
 
 
7
 
8
+ def generate_novel_chapter(genre, style, premise, tone, length_tokens, previous_story="", request: gr.Request = None):
9
+ username = "Gast"
10
+ if request and request.query_params:
11
+ username = request.query_params.get("username", "Gast")
12
+
13
+ print(f"--- GENERIERUNG FÜR USER: {username} ---")
14
+
15
+ if not premise or not premise.strip():
16
+ raise gr.Error("Bitte gib eine Handlungsvorgabe ein.")
17
 
18
+ HF_TOKEN = os.getenv("HF_TOKEN")
19
+ if not HF_TOKEN:
20
+ raise gr.Error("HF_TOKEN ist nicht in den Space-Secrets hinterlegt.")
21
 
22
+ try:
23
+ client = InferenceClient(token=HF_TOKEN)
 
 
24
 
25
+ system_instruction = (
26
+ f"Du bist ein preisgekrönter Romanautor. Genre: {genre}. Stil: {style}. Ton: {tone}. "
27
+ "WICHTIGE ANWEISUNG: Schreibe das gesamte Kapitel AUSSCHLIESSLICH auf DEUTSCH."
28
+ )
 
 
 
 
29
 
30
+ if previous_story and previous_story.strip():
31
+ user_prompt = (
32
+ f"Hier ist die bisherige Geschichte (Auszug/Zusammenfassung der letzten Teile):\n{previous_story[-1000:]}\n\n"
33
+ f"Schreibe basierend darauf das NÄCHSTE Kapitel nahtlos weiter. Die neue Handlungsvorgabe für dieses Kapitel ist: {premise}"
34
+ )
35
+ else:
36
+ user_prompt = f"Schreibe ein detailliertes erstes Kapitel basierend auf: {premise}"
 
 
 
37
 
38
+ response = client.chat_completion(
39
+ model="Qwen/Qwen2.5-72B-Instruct",
40
+ messages=[
41
+ {"role": "system", "content": system_instruction},
42
+ {"role": "user", "content": user_prompt}
43
+ ],
44
+ max_tokens=int(length_tokens),
45
+ temperature=0.7,
46
+ stream=False
47
+ )
48
 
49
+ full_text = response.choices[0].message.content
50
+
51
+ updated_story = (previous_story + "\n\n--- NÄCHSTES KAPITEL ---\n\n" + full_text) if previous_story else full_text
52
+ USER_STORIES[username] = updated_story
53
+
54
+ return updated_story, updated_story
55
+
56
+ except Exception as e:
57
+ print(f"--- FEHLER: {str(e)} ---")
58
+ raise gr.Error(f"Fehler: {str(e)}")
59
+
60
+ def load_user_session(request: gr.Request = None):
61
+ username = "Gast"
62
+ if request and request.query_params:
63
+ username = request.query_params.get("username", "Gast")
64
+
65
+ welcoming = f"👋 Hallo **{username}**! Deine Schreibsession ist bereit."
66
+ existing_story = USER_STORIES.get(username, "")
67
+ return welcoming, existing_story, existing_story
68
 
69
  # Interface
70
  with gr.Blocks() as demo:
71
+ welcome_message = gr.Markdown("Lade Benutzerdaten...")
72
+ story_history_state = gr.State("")
73
+
74
+ with gr.Row():
75
+ with gr.Column(scale=1):
76
+ genre = gr.Dropdown(["High Fantasy", "Sci-Fi", "Cyberpunk", "Abenteuer", "Drama", "Krimi", "Thriller"], label="Genre", value="High Fantasy")
77
+ style = gr.Dropdown(["Erzähler (3. Person)", "Ich-Perspektive"], label="Erzählstil", value="Erzähler (3. Person)")
78
+ tone = gr.Dropdown(["Düster", "Episch", "Spannend", "Poetisch", "Humorvoll"], label="Tonalität", value="Episch")
79
+ length = gr.Slider(500, 2500, value=1200, label="Tokens pro Kapitel")
80
+ with gr.Column(scale=2):
81
+ premise = gr.Textbox(label="Handlungsvorgabe", lines=6, placeholder="Gib hier ein, was im nächsten Kapitel passieren soll...")
82
+ submit_btn = gr.Button("Kapitel generieren / fortsetzen", variant="primary")
83
+
84
+ output = gr.Textbox(label="Dein fortlaufendes Buch", lines=15)
85
 
86
+ demo.load(
87
+ fn=load_user_session,
88
+ inputs=None,
89
+ outputs=[welcome_message, output, story_history_state]
90
+ )
91
+
92
+ submit_btn.click(
93
+ fn=generate_novel_chapter,
94
+ inputs=[genre, style, premise, tone, length, story_history_state],
95
+ outputs=[output, story_history_state]
96
+ )
 
 
 
 
 
 
 
 
 
97
 
98
  if __name__ == "__main__":
99
+ demo.launch(theme=gr.themes.Default())