Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,24 +1,83 @@
|
|
| 1 |
import gradio as gr
|
|
|
|
| 2 |
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
|
| 3 |
import re
|
|
|
|
| 4 |
|
| 5 |
-
# 1. KONFIGURATION
|
| 6 |
# Ersetzen Sie dies durch den tatsächlichen Pfad oder Namen Ihres Modells auf Hugging Face
|
| 7 |
MODEL_NAME = "CocoEntertainment/CocoAi-1PTE"
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
DESCRIPTION_TEXT = """
|
| 9 |
-
Willkommen bei CocoAi
|
| 10 |
-
|
| 11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 12 |
"""
|
| 13 |
|
| 14 |
-
# 2.
|
| 15 |
-
|
| 16 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
try:
|
| 18 |
-
|
| 19 |
-
|
| 20 |
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
|
| 21 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
|
| 23 |
# Erstellt eine Pipeline für die Textgenerierung
|
| 24 |
coco_pipe = pipeline(
|
|
@@ -26,102 +85,77 @@ try:
|
|
| 26 |
model=model,
|
| 27 |
tokenizer=tokenizer,
|
| 28 |
max_new_tokens=256,
|
| 29 |
-
|
| 30 |
)
|
| 31 |
|
| 32 |
-
print(f"Modell '{MODEL_NAME}' erfolgreich geladen.")
|
| 33 |
|
| 34 |
except Exception as e:
|
| 35 |
-
#
|
| 36 |
-
print(f"
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
# 3. HILFSFUNKTION ZUR ANPASSUNG DER SYNTAX
|
| 41 |
-
# Diese Funktion konvertiert die von Ihnen definierte Syntax in Standard-Markdown,
|
| 42 |
-
# damit Gradio sie korrekt darstellen kann.
|
| 43 |
-
def convert_to_gradio_markdown(text):
|
| 44 |
-
# 1. Inline-Code/Monospace (sehr spezifische Behandlung, da es die anderen Syntaxen stören kann)
|
| 45 |
-
text = re.sub(r"'''(.*?)'''", r"`\1`", text, flags=re.DOTALL) # Code-Block (Gradio nutzt ```)
|
| 46 |
-
text = re.sub(r"'(.*?)'", r"`\1`", text) # Inline Text (Gradio nutzt `)
|
| 47 |
-
|
| 48 |
-
# 2. Fett und Kursiv (***Text example***)
|
| 49 |
-
text = re.sub(r"\*\*\*(.*?)\*\*\*", r"***\1***", text)
|
| 50 |
-
|
| 51 |
-
# 3. Kursiv (**Text example**) -> Gradio/Standard Markdown nutzt *...* oder _..._ für Kursiv
|
| 52 |
-
# Hier nehmen wir an, dass **Text example** in IHRER Syntax Kursiv ist
|
| 53 |
-
text = re.sub(r"\*\*(.*?)\*\*", r"*\1*", text)
|
| 54 |
-
|
| 55 |
-
# 4. Fett (*Text example*) -> Gradio/Standard Markdown nutzt **...** für Fett
|
| 56 |
-
# Hier nehmen wir an, dass *Text example* in IHRER Syntax Fett ist
|
| 57 |
-
text = re.sub(r"\*(.*?)\*", r"**\1**", text)
|
| 58 |
|
| 59 |
-
#
|
| 60 |
-
|
| 61 |
-
text = text.replace("/n", "\n")
|
| 62 |
-
|
| 63 |
-
return text
|
| 64 |
|
| 65 |
-
# 4. CHAT-LOGIK
|
| 66 |
def generate_response(message, chat_history):
|
| 67 |
-
|
| 68 |
-
# In diesem Beispiel verwenden wir einfach nur die aktuelle Nachricht.
|
| 69 |
-
|
| 70 |
-
# 2. Generiere die Antwort
|
| 71 |
-
# Führen Sie hier IHR Modell aus. Die generierte Antwort sollte IHRER CocoAi-Markdown-Syntax folgen!
|
| 72 |
|
| 73 |
-
#
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
|
|
|
|
|
|
| 84 |
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
raw_response =
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
#
|
| 97 |
formatted_response = convert_to_gradio_markdown(raw_response)
|
| 98 |
|
| 99 |
-
#
|
| 100 |
chat_history.append((message, formatted_response))
|
| 101 |
return chat_history, ""
|
| 102 |
|
| 103 |
-
# 5. GRADIO OBERFLÄCHE
|
|
|
|
| 104 |
# Der Tab für die Beschreibung
|
| 105 |
description_tab = gr.Markdown(DESCRIPTION_TEXT)
|
| 106 |
|
| 107 |
# Der Tab für den Chat
|
| 108 |
with gr.Blocks() as chat_tab:
|
| 109 |
-
gr.Markdown("# 💬 Chat mit CocoAi
|
| 110 |
|
| 111 |
-
# Die Haupt-Chat-Komponente von Gradio
|
| 112 |
chatbot = gr.Chatbot(
|
| 113 |
label="CocoAi Chat",
|
| 114 |
height=500,
|
|
|
|
|
|
|
| 115 |
)
|
| 116 |
|
| 117 |
-
# Das Eingabefeld
|
| 118 |
msg = gr.Textbox(
|
| 119 |
show_label=False,
|
| 120 |
placeholder="Geben Sie Ihre Nachricht hier ein...",
|
| 121 |
lines=1
|
| 122 |
)
|
| 123 |
|
| 124 |
-
# Buttons
|
| 125 |
with gr.Row():
|
| 126 |
submit_btn = gr.Button("Senden", variant="primary", scale=2)
|
| 127 |
clear_btn = gr.Button("Chat leeren", scale=1)
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
+
import torch
|
| 3 |
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
|
| 4 |
import re
|
| 5 |
+
import os
|
| 6 |
|
| 7 |
+
# --- 1. KONFIGURATION ---
|
| 8 |
# Ersetzen Sie dies durch den tatsächlichen Pfad oder Namen Ihres Modells auf Hugging Face
|
| 9 |
MODEL_NAME = "CocoEntertainment/CocoAi-1PTE"
|
| 10 |
+
|
| 11 |
+
# Setzt den Datentyp auf float16 (halbe Präzision), um den Speicherbedarf beim Laden zu minimieren.
|
| 12 |
+
DTYPE = torch.float16
|
| 13 |
+
|
| 14 |
DESCRIPTION_TEXT = """
|
| 15 |
+
# 🤖 Willkommen bei CocoAi
|
| 16 |
+
|
| 17 |
+
## Ein Chatbot von CocoEntertainment
|
| 18 |
+
|
| 19 |
+
Hier kannst du auf Deutsch mit **CocoAi** chatten.
|
| 20 |
+
|
| 21 |
+
CocoAi ist ein **Mistral 7B** Modell, das spezifisch für Unterhaltung und kreative Inhalte feingetuned und quantisiert wurde, um eine effiziente Nutzung zu ermöglichen.
|
| 22 |
+
|
| 23 |
+
### 💡 CocoAi Markdown Syntax (wie die Antworten formatiert werden)
|
| 24 |
+
Das Modell antwortet unter Verwendung der folgenden speziellen Formatierungsregeln. Das Interface konvertiert diese in Standard-Markdown zur Anzeige:
|
| 25 |
+
|
| 26 |
+
* **\*Text example\*** = Fett (**Bold**)
|
| 27 |
+
* **\*\*Text example\*\* ** = Kursiv (*Italic*)
|
| 28 |
+
* **\*\*\*Text example\*\*\* ** = Fett und Kursiv (***Bold and Italic***)
|
| 29 |
+
* **#Text example** = Haupttitel (Sehr groß)
|
| 30 |
+
* **/n** = Zeilenumbruch
|
| 31 |
+
* **'Text example'** = Inline-Text/Code (Monospace)
|
| 32 |
+
* **'''Text example'''** = Code-Block (Block Monospace)
|
| 33 |
+
|
| 34 |
"""
|
| 35 |
|
| 36 |
+
# --- 2. HILFSFUNKTION ZUR ANPASSUNG DER SYNTAX ---
|
| 37 |
+
def convert_to_gradio_markdown(text):
|
| 38 |
+
"""Konvertiert die CocoAi-Markdown-Syntax in Gradio-kompatibles Standard-Markdown."""
|
| 39 |
+
|
| 40 |
+
# 1. Code-Block ('''Text example''' -> ```Text example```)
|
| 41 |
+
# Re.DOTALL erlaubt es, über Zeilenumbrüche hinweg zu matchen
|
| 42 |
+
text = re.sub(r"'''(.*?)'''", r"```\1```", text, flags=re.DOTALL)
|
| 43 |
+
|
| 44 |
+
# 2. Inline Text ('Text example' -> `Text example`)
|
| 45 |
+
text = re.sub(r"'(.*?)'", r"`\1`", text)
|
| 46 |
+
|
| 47 |
+
# 3. Fett und Kursiv (***Text example*** -> ***Text example***)
|
| 48 |
+
# Standard-Markdown wird hier beibehalten.
|
| 49 |
+
|
| 50 |
+
# 4. Kursiv (**Text example** -> *Text example*)
|
| 51 |
+
# Wenn **Ihr** Modell **kursiv** mit **zwei** Sternen markiert (Abweichung vom Standard).
|
| 52 |
+
# Hier nehmen wir an, dass Sie die Standard-Logik von *fett* (CocoAi:*) und *kursiv* (CocoAi:**) invertieren wollen.
|
| 53 |
+
text = re.sub(r"\*\*(.*?)\*\*", r"*\1*", text)
|
| 54 |
+
|
| 55 |
+
# 5. Fett (*Text example* -> **Text example**)
|
| 56 |
+
# Wenn **Ihr** Modell **fett** mit **einem** Stern markiert.
|
| 57 |
+
text = re.sub(r"\*(.*?)\*", r"**\1**", text)
|
| 58 |
+
|
| 59 |
+
# 6. Zeilenumbruch (/n -> \n)
|
| 60 |
+
text = text.replace("/n", "\n")
|
| 61 |
+
|
| 62 |
+
return text
|
| 63 |
+
|
| 64 |
+
# --- 3. MODELL LADEN (SPEICHEROPTIMIERT) ---
|
| 65 |
+
# Führen Sie den Ladevorgang nur einmal durch
|
| 66 |
try:
|
| 67 |
+
print(f"--- Starte Ladevorgang für {MODEL_NAME} ---")
|
| 68 |
+
|
| 69 |
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
|
| 70 |
+
|
| 71 |
+
# Lädt das Modell:
|
| 72 |
+
# - device_map="auto": Essentiell, um das Modell automatisch auf den begrenzten RAM aufzuteilen.
|
| 73 |
+
# - torch_dtype=DTYPE: Erzwingt das Laden mit halber Präzision (Float16) zur Speichereinsparung.
|
| 74 |
+
model = AutoModelForCausalLM.from_pretrained(
|
| 75 |
+
MODEL_NAME,
|
| 76 |
+
torch_dtype=DTYPE,
|
| 77 |
+
device_map="auto",
|
| 78 |
+
# Falls Ihr Modell spezifische Konfigurationsdateien enthält
|
| 79 |
+
trust_remote_code=True,
|
| 80 |
+
)
|
| 81 |
|
| 82 |
# Erstellt eine Pipeline für die Textgenerierung
|
| 83 |
coco_pipe = pipeline(
|
|
|
|
| 85 |
model=model,
|
| 86 |
tokenizer=tokenizer,
|
| 87 |
max_new_tokens=256,
|
| 88 |
+
model_kwargs={"torch_dtype": DTYPE, "device_map": "auto"}
|
| 89 |
)
|
| 90 |
|
| 91 |
+
print(f"Modell '{MODEL_NAME}' erfolgreich geladen und Pipeline erstellt.")
|
| 92 |
|
| 93 |
except Exception as e:
|
| 94 |
+
# DIESER BLOCK WIRD BEI SPEICHERFEHLERN AUSGELÖST
|
| 95 |
+
print(f"FATALER FEHLER beim Laden des Modells {MODEL_NAME}: {e}")
|
| 96 |
+
print("--- Verwende GPT-2 als langsamen Platzhalter ---")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 97 |
|
| 98 |
+
# Sicherstellung eines funktionierenden Platzhalters
|
| 99 |
+
coco_pipe = pipeline("text-generation", model="gpt2")
|
|
|
|
|
|
|
|
|
|
| 100 |
|
| 101 |
+
# --- 4. CHAT-LOGIK ---
|
| 102 |
def generate_response(message, chat_history):
|
| 103 |
+
"""Generiert die Antwort des Chatbots."""
|
|
|
|
|
|
|
|
|
|
|
|
|
| 104 |
|
| 105 |
+
# Hier müssten Sie das Prompt-Template Ihres Mistral-Modells anwenden (z.B. ChatML, Alpaca, etc.)
|
| 106 |
+
# Dies ist ein generisches Beispiel:
|
| 107 |
+
prompt = f"### Instruction: Beantworte die folgende Frage als CocoAi und verwende die CocoAi Markdown Syntax. ###\n\nUser: {message}\n\nCocoAi:"
|
| 108 |
+
|
| 109 |
+
try:
|
| 110 |
+
# Generierung mit der Pipeline
|
| 111 |
+
model_output = coco_pipe(
|
| 112 |
+
prompt,
|
| 113 |
+
num_return_sequences=1,
|
| 114 |
+
do_sample=True,
|
| 115 |
+
temperature=0.7,
|
| 116 |
+
top_p=0.9
|
| 117 |
+
)
|
| 118 |
|
| 119 |
+
# Extrahieren des Texts und Entfernen des Prompts
|
| 120 |
+
raw_response = model_output[0]['generated_text']
|
| 121 |
+
|
| 122 |
+
# WICHTIG: Nur der Teil nach "CocoAi:" ist die eigentliche Antwort
|
| 123 |
+
if "CocoAi:" in raw_response:
|
| 124 |
+
raw_response = raw_response.split("CocoAi:", 1)[-1].strip()
|
| 125 |
+
|
| 126 |
+
except Exception as e:
|
| 127 |
+
raw_response = f"Entschuldigung, beim Generieren der Antwort ist ein technischer Fehler aufgetreten: /n'Fehler: {e}'"
|
| 128 |
+
|
| 129 |
+
|
| 130 |
+
# 2. Konvertiere die rohe Antwort in Gradio-kompatibles Markdown
|
| 131 |
formatted_response = convert_to_gradio_markdown(raw_response)
|
| 132 |
|
| 133 |
+
# 3. Füge die Nachricht zur Historie hinzu
|
| 134 |
chat_history.append((message, formatted_response))
|
| 135 |
return chat_history, ""
|
| 136 |
|
| 137 |
+
# --- 5. GRADIO OBERFLÄCHE ---
|
| 138 |
+
|
| 139 |
# Der Tab für die Beschreibung
|
| 140 |
description_tab = gr.Markdown(DESCRIPTION_TEXT)
|
| 141 |
|
| 142 |
# Der Tab für den Chat
|
| 143 |
with gr.Blocks() as chat_tab:
|
| 144 |
+
gr.Markdown(f"# 💬 Chat mit CocoAi ({MODEL_NAME})")
|
| 145 |
|
|
|
|
| 146 |
chatbot = gr.Chatbot(
|
| 147 |
label="CocoAi Chat",
|
| 148 |
height=500,
|
| 149 |
+
# Wenn Sie die Syntax-Regeln im Chat sehen wollen, lassen Sie die Markdown-Verarbeitung zu:
|
| 150 |
+
render_markdown=True
|
| 151 |
)
|
| 152 |
|
|
|
|
| 153 |
msg = gr.Textbox(
|
| 154 |
show_label=False,
|
| 155 |
placeholder="Geben Sie Ihre Nachricht hier ein...",
|
| 156 |
lines=1
|
| 157 |
)
|
| 158 |
|
|
|
|
| 159 |
with gr.Row():
|
| 160 |
submit_btn = gr.Button("Senden", variant="primary", scale=2)
|
| 161 |
clear_btn = gr.Button("Chat leeren", scale=1)
|