alexkueck commited on
Commit
d56d343
·
verified ·
1 Parent(s): f5af06b

Delete app.py

Browse files
Files changed (1) hide show
  1. app.py +0 -1022
app.py DELETED
@@ -1,1022 +0,0 @@
1
- import requests
2
- import os, sys, json
3
- import gradio as gr
4
- import openai
5
- from openai import OpenAI
6
- import time
7
- import re
8
- import io
9
- from PIL import Image, ImageDraw, ImageOps, ImageFont
10
- import base64
11
- import tempfile
12
-
13
- from PyPDF2 import PdfReader, PdfWriter
14
-
15
- from hugchat import hugchat
16
- from hugchat.login import Login
17
- from tavily import TavilyClient
18
-
19
- from langchain.chains import LLMChain, RetrievalQA
20
- from langchain.chat_models import ChatOpenAI
21
- from langchain.document_loaders import PyPDFLoader, WebBaseLoader, UnstructuredWordDocumentLoader, DirectoryLoader
22
- from langchain.document_loaders.blob_loaders.youtube_audio import YoutubeAudioLoader
23
- from langchain.document_loaders.generic import GenericLoader
24
- from langchain.document_loaders.parsers import OpenAIWhisperParser
25
- from langchain.schema import AIMessage, HumanMessage
26
- from langchain.llms import HuggingFaceHub
27
- from langchain.llms import HuggingFaceTextGenInference
28
- from langchain.embeddings import HuggingFaceInstructEmbeddings, HuggingFaceEmbeddings, HuggingFaceBgeEmbeddings, HuggingFaceInferenceAPIEmbeddings
29
- from langchain.retrievers.tavily_search_api import TavilySearchAPIRetriever
30
-
31
- from langchain.embeddings.openai import OpenAIEmbeddings
32
- from langchain.prompts import PromptTemplate
33
- from langchain.text_splitter import RecursiveCharacterTextSplitter
34
- from langchain.vectorstores import Chroma
35
- from chromadb.errors import InvalidDimensionException
36
- from utils import *
37
- from beschreibungen import *
38
-
39
-
40
- #from langchain.vectorstores import MongoDBAtlasVectorSearch
41
- #from pymongo import MongoClient
42
-
43
- from dotenv import load_dotenv, find_dotenv
44
- _ = load_dotenv(find_dotenv())
45
-
46
-
47
- ###############################################
48
- #globale Variablen
49
- ##############################################
50
- #nur bei ersten Anfrage splitten der Dokumente - um die Vektordatenbank entsprechend zu füllen
51
- #splittet = False
52
- #DB für Vektorstore
53
- db = None
54
-
55
- #############################################
56
- # Allgemeine Konstanten
57
- #Filepath zu temp Folder (temp) mit File von ausgewähltem chatverlauf
58
- file_path_download = ""
59
-
60
- ##################################################
61
- #Für MongoDB statt Chroma als Vektorstore
62
- #MONGODB_URI = os.environ["MONGODB_ATLAS_CLUSTER_URI"]
63
- #client = MongoClient(MONGODB_URI)
64
- #MONGODB_DB_NAME = "langchain_db"
65
- #MONGODB_COLLECTION_NAME = "gpt-4"
66
- #MONGODB_COLLECTION = client[MONGODB_DB_NAME][MONGODB_COLLECTION_NAME]
67
- #MONGODB_INDEX_NAME = "default"
68
-
69
-
70
-
71
- #Plattform Keys aus den Secrets holen zu diesem Space
72
- HUGGINGFACEHUB_API_TOKEN = os.getenv("HF_ACCESS_READ")
73
- os.environ["HF_ACCESS_READ"] = HUGGINGFACEHUB_API_TOKEN
74
- OAI_API_KEY=os.getenv("OPENAI_API_KEY")
75
- os.environ["OPENAI_API_KEY"] = OAI_API_KEY
76
- HEADERS = {"Authorization": f"Bearer {HUGGINGFACEHUB_API_TOKEN}"}
77
- TAVILY_KEY = os.getenv("TAVILY_KEY")
78
- os.environ["TAVILY_API_KEY"] = TAVILY_KEY
79
- ANTI_BOT_PW = os.getenv("CORRECT_VALIDATE")
80
-
81
-
82
- ################################################
83
- #LLM Model mit dem gearbeitet wird
84
- #openai-------------------------------------
85
- #MODEL_NAME = "gpt-3.5-turbo-16k"
86
- #MODEL_NAME = "gpt-3.5-turbo-1106"
87
- MODEL_NAME= "gpt-4-1106-preview"
88
- MODEL_NAME_IMAGE = "gpt-4-vision-preview"
89
- MODEL_NAME_CODE = "code-davinci-002"
90
-
91
-
92
- #verfügbare Modelle anzeigen lassen
93
- #HuggingFace Reop ID--------------------------------
94
- #repo_id = "meta-llama/Llama-2-13b-chat-hf"
95
- repo_id = "HuggingFaceH4/zephyr-7b-alpha" #das Modell ist echt gut!!! Vom MIT
96
- #repo_id = "TheBloke/Yi-34B-Chat-GGUF"
97
- #repo_id = "meta-llama/Llama-2-70b-chat-hf"
98
- #repo_id = "tiiuae/falcon-40b"
99
- #repo_id = "Vicuna-33b"
100
- #repo_id = "alexkueck/ChatBotLI2Klein"
101
- #repo_id = "mistralai/Mistral-7B-v0.1"
102
- #repo_id = "internlm/internlm-chat-7b"
103
- #repo_id = "Qwen/Qwen-7B"
104
- #repo_id = "Salesforce/xgen-7b-8k-base"
105
- #repo_id = "Writer/camel-5b-hf"
106
- #repo_id = "databricks/dolly-v2-3b"
107
- #repo_id = "google/flan-t5-xxl"
108
- #repo_id = "mistralai/Mixtral-8x7B-Instruct-v0.1"
109
- #repo_id = "abacusai/Smaug-72B-v0.1"
110
-
111
- #HuggingFace Model name--------------------------------
112
- MODEL_NAME_HF = "mistralai/Mixtral-8x7B-Instruct-v0.1"
113
- #MODLE_NAME_HF = "abacusai/Smaug-72B-v0.1"
114
- MODEL_NAME_OAI_ZEICHNEN = "dall-e-3"
115
- #Alternativ zeichnen: Stabe Diffusion from HF:
116
- #API Inference allgemien: https://api-inference.huggingface.co/models/{model}
117
- #Zeichnen
118
- API_URL = "https://api-inference.huggingface.co/models/stabilityai/stable-diffusion-2-1"
119
- #Textgenerierung
120
- API_URL_TEXT = "https://api-inference.huggingface.co/models/argilla/notux-8x7b-v1"
121
-
122
- ###############################################
123
- # Formatierung im PDF - Konstanten setzen
124
- # Breite und Höhe für Spalten
125
- COLUMN_WIDTH = 150
126
- ROW_HEIGHT = 20
127
- # Bereiche für Spalten
128
- TIMESTAMP_X = 50
129
- USER_X = TIMESTAMP_X + COLUMN_WIDTH
130
- ASSISTANT_X = USER_X + COLUMN_WIDTH
131
- # Rand und Abstand zwischen Zeilen
132
- MARGIN = 50
133
- LINE_SPACING = 10
134
-
135
-
136
-
137
- ################################################
138
- #HF Hub Zugriff ermöglichen
139
- ###############################################
140
- os.environ["HUGGINGFACEHUB_API_TOKEN"] = HUGGINGFACEHUB_API_TOKEN
141
-
142
- ###############################################
143
- #Alternativ: HuggingChat API nutzen
144
- pw=os.getenv("HFPW")
145
- email= os.getenv("HFEMail")
146
- #sign = Login(email, pw)
147
- #cookies = sign.login()
148
- # Save cookies to the local directory
149
- #cookie_path_dir = "cookies_hf"
150
- #sign.saveCookiesToDir(cookie_path_dir)
151
-
152
-
153
- ################################################
154
- #OpenAI Zugang, client und Assistant einmal erzeugen.
155
- ################################################
156
- #zentral einmal erzeugen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
157
- client = OpenAI()
158
- general_assistant_file = client.beta.assistants.create(name="File Analysator",instructions=template, model="gpt-4-1106-preview",)
159
- thread_file = client.beta.threads.create()
160
- general_assistant_suche= openai_assistant_suche(client)
161
-
162
-
163
- #################################################
164
- #################################################
165
- #################################################
166
- #Funktionen zur Verarbeitung
167
- ################################################
168
-
169
- ##############################################
170
- #wenn löschen Button geklickt
171
- def clear_all(history, uploaded_file_paths, chats):
172
- dic_history = {schluessel: wert for schluessel, wert in history}
173
- #später wird die summary auf 50 tokens verkürzt, um die Anfrage nicht so teuer werden zu lassen
174
- #summary wird gebraucht für die Anfrage beim NN, um eine Überschrift des Eintrages zu generieren
175
- summary = "\n\n".join(f'{schluessel}: \n {wert}' for schluessel, wert in dic_history.items())
176
-
177
- #falls file mit summay für download existiert hat: das zunächst löschen
178
- #cleanup(file_path_download)
179
- #noch nicht im Einsatz, aber hier werden alle Chats einer Sitzung gespeichert
180
- #den aktuellen Chatverlauf zum Download bereitstellen:
181
- if chats != {} :
182
- id_neu = len(chats)+1
183
- chats[id_neu]= summary
184
- else:
185
- chats[0]= summary
186
-
187
- #Eine Überschrift zu dem jeweiligen Chatverlauf finden - abhängig vom Inhalt
188
- #file_path_download = save_and_download(summary)
189
- headers, payload = process_chatverlauf(summary, MODEL_NAME, OAI_API_KEY)
190
- response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload)
191
- #als json ausgeben
192
- data = response.json()
193
- # Den "content" auswählen, da dort die Antwort der Ki enthalten ist
194
- result = data['choices'][0]['message']['content']
195
- worte = result.split()
196
- if len(worte) > 2:
197
- file_path_download = "data/" + str(len(chats)) + "_Chatverlauf.pdf"
198
- else:
199
- file_path_download = "data/" + str(len(chats)) + "_" + result + ".pdf"
200
-
201
- erstellePdf(file_path_download, result, dic_history)
202
-
203
-
204
- #die session variable in gradio erweitern und alle fliepath neu in das gr.File hochladen
205
- uploaded_file_paths= uploaded_file_paths + [file_path_download]
206
-
207
- return None, gr.Image(visible=False), uploaded_file_paths, [], gr.File(uploaded_file_paths, label="Download-Chatverläufe", visible=True, file_count="multiple", interactive = False), chats
208
-
209
-
210
- #wenn löschen Button geklickt
211
- def clear_all3(history):
212
- #die session variable in gradio erweitern und alle fliepath neu in das gr.File hochladen
213
- uploaded_file_paths= ""
214
- return None, gr.Image(visible=False), [],
215
-
216
-
217
-
218
- ##############################################
219
- #History - die Frage oder das File eintragen...
220
- #in history_file ist ein file gespeichert, falls voher im Verlauf schon ein File hochgeladen wurde.
221
- #wird ein neuer File hochgeladen, so wird history_fiel dadurch ersetzt
222
- def add_text(chatbot, history, prompt, file, file_history):
223
- if (file == None):
224
- chatbot = chatbot +[(prompt, None)]
225
- else:
226
- file_history = file
227
- if (prompt == ""):
228
- chatbot=chatbot + [((file.name,), "Prompt fehlt!")]
229
- else:
230
- ext = analyze_file(file)
231
- if (ext == "png" or ext == "PNG" or ext == "jpg" or ext == "jpeg" or ext == "JPG" or ext == "JPEG"):
232
- chatbot = chatbot +[((file.name,), None), (prompt, None)]
233
- else:
234
- chatbot = chatbot +[("Hochgeladenes Dokument: "+ get_filename(file) +"\n" + prompt, None)]
235
-
236
- return chatbot, history, prompt, file, file_history, gr.Image(visible = False), "" #gr.Image( label=None, size=(30,30), visible=False, scale=1) #gr.Textbox(value="", interactive=False)
237
-
238
- def add_text2(chatbot, prompt):
239
- if (prompt == ""):
240
- chatbot = chatbot + [("", "Prompt fehlt!")]
241
- else:
242
- chatbot = chatbot + [(prompt, None)]
243
- print("chatbot nach add_text............")
244
- print(chatbot)
245
- return chatbot, prompt, ""
246
-
247
-
248
- ############################################
249
- #nach dem Upload soll das zusätzliche Fenster mit dem image drinnen angezeigt werden
250
- def file_anzeigen(file):
251
- ext = analyze_file(file)
252
- if (ext == "png" or ext == "PNG" or ext == "jpg" or ext == "jpeg" or ext == "JPG" or ext == "JPEG"):
253
- return gr.Image(width=47, visible=True, interactive = False, height=47, min_width=47, show_label=False, show_share_button=False, show_download_button=False, scale = 0.5), file, file
254
- else:
255
- return gr.Image(width=47, visible=True, interactive = False, height=47, min_width=47, show_label=False, show_share_button=False, show_download_button=False, scale = 0.5), "data/file.png", file
256
-
257
- def file_loeschen():
258
- return None, gr.Image(visible = False)
259
-
260
- ############################################
261
- #wenn 'Stop' Button geklickt, dann Message dazu und das Eingabe-Fenster leeren
262
- def cancel_outputing():
263
- reset_textbox()
264
- return "Stop Done"
265
-
266
- def reset_textbox():
267
- return gr.update(value=""),""
268
-
269
-
270
- ##########################################
271
- #Hilfsfunktion, um ein von Stable Diffusion erzeugtes Bild für die Ausgabe in der History vorzubereiten
272
- def umwandeln_fuer_anzeige(image):
273
- buffer = io.BytesIO()
274
- image.save(buffer, format='PNG')
275
- return buffer.getvalue()
276
-
277
-
278
-
279
- ##################################################
280
- #openassistant um uploaded Files zu analysieren
281
- def create_assistant_file(prompt, file):
282
- global client, general_assistant_file
283
- #neues File dem Assistant hinzufügen
284
- file_neu = client.files.create(file=open(file,"rb",),purpose="assistants",)
285
- # Update Assistant
286
- #wenn type: code_interpreter, wird das file mit angehängt an den Prpmt, aber vorher nicht bearbeitet
287
- #wenn type: retrieval, wird das Dokument vorher embedded in einem vektorstore und nur entsprechende chunks mitgegeben.
288
- #pro Assistant 20 cent pro Tag als Nutzung - egal wie viele Fragen dazu.
289
- updated_assistant = client.beta.assistants.update(general_assistant_file.id,tools=[{"type": "code_interpreter"}, {"type": "retrieval"}],file_ids=[file_neu.id],)
290
- thread_file, run = create_thread_and_run(prompt, client, updated_assistant.id)
291
- run = wait_on_run(run, thread_file, client)
292
- response = get_response(thread_file, client, updated_assistant.id)
293
- result = response.data[1].content[0].text.value
294
- return result
295
-
296
- ##################################################
297
- #openassistant um im Netz zu suchen
298
- def create_assistant_suche(prompt):
299
- #global client, general_assistant_suche
300
-
301
- retriever = TavilySearchAPIRetriever(k=4)
302
- result = retriever.invoke(template + prompt)
303
- erg = "Aus dem Internet: " + result[0].page_content + ".\n Quelle: "
304
- src = result[0].metadata['source']
305
-
306
- """
307
- #neues Thread mit akt. prompt dem Assistant hinzufügen
308
- thread_suche, run = create_thread_and_run(prompt, client, general_assistant_suche.id)
309
- run = wait_on_run(run, thread_suche, client)
310
- response = get_response(thread_suche, client, general_assistant_suche.id)
311
- result = response.data[1].content[0].text.value
312
- """
313
- return erg + src
314
-
315
-
316
- #huggingchat um im Netz zu suchen
317
- def create_assistant_suche_hf(chatbot, prompt):
318
- erg, src = hugchat_search(chatbot, prompt)
319
- return erg + src
320
-
321
- ###################################################
322
- #Funktion von Gradio aus, die den dort eingegebenen Prompt annimmt und weiterverarbeitet
323
- ###################################################
324
- #########################################################
325
- #Funktion wird direkt aufgerufen aus der GUI - von hier muss auch die Rückmeldung kommen....
326
- #man kann einen Text-Prompt eingeben (mit oder ohne RAG), dazu ein Image hochladen, ein Bild zu einem reinen textprompt erzeugen lassen
327
- def generate_auswahl(prompt_in, file, file_history, chatbot, history, rag_option, model_option, openai_api_key, k=3, top_p=0.6, temperature=0.5, max_new_tokens=4048, max_context_length_tokens=2048, repetition_penalty=1.3,top_k=35, websuche="Aus", validate=False):
328
- global db
329
- #nur wenn man sich validiert hat, kann die Anwendung los legen
330
- if (validate and not prompt_in == "" and not prompt_in == None):
331
- #wenn RAG angeschaltet - Vektorstore initialisieren
332
- #aber nur, wenn es noch nicht geshehen ist (splittet = False)
333
- #falls schon ein File hochgeladen wurde, ist es in history_file gespeichert - falls ein neues File hochgeladen wurde, wird es anschließend neu gesetzt
334
- neu_file = file_history
335
-
336
- #prompt normalisieren bevor er an die KIs geht
337
- prompt = normalise_prompt(prompt_in)
338
-
339
- if (rag_option == "An"):
340
- #muss nur einmal ausgeführt werden...
341
- if db == None:
342
- print("db neu aufbauen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1")
343
- splits = document_loading_splitting()
344
- document_storage_chroma(splits)
345
- db = document_retrieval_chroma2()
346
- print("db aktiv!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
347
- print(db)
348
- #else: #unnötig, da wenn Vektorstor einmal für alle user eingerichtet, wer weiter besthen bleiben kann - die unterschiedlichen Propmt werden dann später je nach rag_option erzeugt
349
- #db=None
350
- #splittet = False #sonst würde es für alle User wieder ausgeschaltet - Alternative: gr.State(False) dazu anlegen
351
-
352
- #kein Bild hochgeladen -> auf Text antworten...
353
- status = "Antwort der KI ..."
354
- if (file == None and file_history == None):
355
- result, status = generate_text(prompt, chatbot, history, rag_option, model_option, openai_api_key, db, websuche, k=3, top_p=0.6, temperature=0.5, max_new_tokens=4048, max_context_length_tokens=2048, repetition_penalty=1.3, top_k=3)
356
- history = history + [[prompt, result]]
357
- else:
358
- #Es wurde ein File neu angehängt -> wenn prompt dazu, das Bild analysieren
359
- #das history_fiel muss neu gesetzt werden
360
- if (file != None):
361
- # file_history wird neu gesetzt in der Rückgabe dieser Funktion...
362
- neu_file = file
363
-
364
- #herausfinden, ob Bild oder Dokument...
365
- ext = analyze_file(neu_file)
366
- if (ext == "png" or ext == "PNG" or ext == "jpg" or ext == "jpeg" or ext == "JPG" or ext == "JPEG"):
367
- result= generate_text_zu_bild(neu_file, prompt, k, rag_option, chatbot, history, db)
368
- else:
369
- result = generate_text_zu_doc(neu_file, prompt, k, rag_option, chatbot, history, db)
370
-
371
- #die history erweitern - abhängig davon, ob gerade ein file hochgeladen wurde oder nicht
372
- if (file != None):
373
- history = history + [[(file,), None],[prompt, result]]
374
- else:
375
- history = history + [[prompt, result]]
376
-
377
- chatbot[-1][1] = ""
378
- for character in result:
379
- chatbot[-1][1] += character
380
- time.sleep(0.03)
381
- yield chatbot, history, None, neu_file, status
382
- if shared_state.interrupted:
383
- shared_state.recover()
384
- try:
385
- yield chatbot, history, None, neu_file, "Stop: Success"
386
- except:
387
- pass
388
- else: #noch nicht validiert, oder kein Prompt
389
- return chatbot, history, None, file_history, "Erst validieren oder einen Prompt eingeben!"
390
-
391
- ##################################################
392
- #zu einem Text-Prompt ein Bild via Stable Diffusion generieren
393
- def generate_bild(prompt, chatbot, model_option_zeichnen='HuggingFace', temperature=0.5, max_new_tokens=4048,top_p=0.6, repetition_penalty=1.3, validate=False):
394
- global client
395
- if (validate):
396
- if (model_option_zeichnen == "Stable Diffusion"):
397
- print("Bild Erzeugung HF..............................")
398
- #Bild nach Anweisung zeichnen und in History darstellen...
399
- data = {"inputs": prompt}
400
- response = requests.post(API_URL, headers=HEADERS, json=data)
401
- print("fertig Bild")
402
- result = response.content
403
- #Bild ausgeben
404
- image = Image.open(io.BytesIO(result))
405
- image_64 = umwandeln_fuer_anzeige(image)
406
- chatbot[-1][1]= "<img src='data:image/png;base64,{0}'/>".format(base64.b64encode(image_64).decode('utf-8'))
407
- else:
408
- print("Bild Erzeugung DallE..............................")
409
- #als Format ginge auch 'url', n - Anz. der erzeugten Bilder
410
- response = client.images.generate(model="dall-e-3",prompt=prompt,size="1024x1024",quality="standard",n=1, response_format='b64_json')
411
- #chatbot[-1][1]= "<img src='data:image/png;base64,{0}'/>".format(base64.b64encode(image_64).decode('utf-8'))
412
- chatbot[-1][1] = "<img src='data:image/png;base64,{0}'/>".format(response.data[0].b64_json)
413
-
414
- return chatbot, "Antwort KI: Success"
415
- else: #noch nicht validiert ...
416
- return chatbot, "Bitte erst validieren!"
417
-
418
-
419
- ##################################################
420
- #zu einem Bild und Text-Prompt eine Analyse generieren
421
- def generate_text_zu_bild(file, prompt, k, rag_option, chatbot, history, db):
422
- global splittet
423
- print("Text mit Bild ..............................")
424
- prompt_neu = generate_prompt_with_history(prompt, history)
425
- if (rag_option == "An"):
426
- print("Bild mit RAG..............................")
427
- neu_text_mit_chunks = rag_chain2(prompt, db, k)
428
- #für Chat LLM:
429
- #prompt = generate_prompt_with_history_openai(neu_text_mit_chunks, history)
430
- #als reiner prompt:
431
- prompt_neu = generate_prompt_with_history(neu_text_mit_chunks, history)
432
-
433
- headers, payload = process_image(file, prompt_neu, MODEL_NAME_IMAGE, OAI_API_KEY)
434
- response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload)
435
- #als json ausgeben
436
- data = response.json()
437
- # Den "content" auswählen, da dort die Antwort der Ki enthalten ist
438
- result = data['choices'][0]['message']['content']
439
- return result
440
-
441
-
442
- ##################################################
443
- #zu einem Bild und Text-Prompt eine Analyse generieren
444
- def generate_text_zu_doc(file, prompt, k, rag_option, chatbot, history, db):
445
- global splittet
446
- print("text mit doc ..............................")
447
-
448
- prompt_neu = generate_prompt_with_history(prompt, history)
449
- if (rag_option == "An"):
450
- print("Doc mit RAG..............................")
451
- neu_text_mit_chunks = rag_chain2(prompt, db, k)
452
- #für Chat LLM:
453
- #prompt_neu = generate_prompt_with_history_openai(neu_text_mit_chunks, history)
454
- #als reiner prompt:
455
- prompt_neu = generate_prompt_with_history(neu_text_mit_chunks, history)
456
-
457
- result = create_assistant_file(prompt_neu, file)
458
- return result
459
-
460
-
461
- ####################################################
462
- #aus einem Text-Prompt die Antwort von KI bekommen
463
- #mit oder ohne RAG möglich
464
- def generate_text (prompt, chatbot, history, rag_option, model_option, openai_api_key, db, websuche, k=3, top_p=0.6, temperature=0.5, max_new_tokens=4048, max_context_length_tokens=2048, repetition_penalty=1.3, top_k=35):
465
- #global splittet
466
- #hugchat=False
467
- suche_im_Netz="Antwort der KI ..."
468
- print("Text pur..............................")
469
-
470
- if (openai_api_key == "" or openai_api_key == "sk-"):
471
- #raise gr.Error("OpenAI API Key is required.")
472
- #eigenen OpenAI key nutzen
473
- openai_api_key= OAI_API_KEY
474
- if (rag_option is None):
475
- raise gr.Error("Retrieval Augmented Generation ist erforderlich.")
476
- if (prompt == ""):
477
- raise gr.Error("Prompt ist erforderlich.")
478
-
479
- #history für HuggingFace Models formatieren
480
- #history_text_und_prompt = generate_prompt_with_history_hf(prompt, history)
481
- #history für openAi formatieren
482
- #history_text_und_prompt = generate_prompt_with_history_openai(prompt, history)
483
- #history für Langchain formatieren
484
- #history_text_und_prompt = generate_prompt_with_history_langchain(prompt, history)
485
-
486
- try:
487
- if (websuche=="Aus"):
488
- ###########################
489
- #LLM auswählen (OpenAI oder HF)
490
- ###########################
491
- if (model_option == "OpenAI"):
492
- #Anfrage an OpenAI ----------------------------
493
- print("OpenAI Anfrage.......................")
494
- llm = ChatOpenAI(model_name = MODEL_NAME, openai_api_key = openai_api_key, temperature=temperature)#, top_p = top_p)
495
- #Prompt an history anhängen und einen Text daraus machen
496
- #wenn da Dokumenten Teile (RAG dazu kommen, wird das anders zusammengestellt, als ohne...)
497
- if (rag_option == "An"):
498
- history_text_und_prompt = generate_prompt_with_history(prompt, history)
499
- else:
500
- history_text_und_prompt = generate_prompt_with_history_openai(prompt, history)
501
- else:
502
- #oder an Hugging Face --------------------------
503
- print("HF Anfrage.......................")
504
- model_kwargs={"temperature": 0.5, "max_length": 512, "num_return_sequences": 1, "top_k": top_k, "top_p": top_p, "repetition_penalty": repetition_penalty}
505
- llm = HuggingFaceHub(repo_id=repo_id, model_kwargs=model_kwargs)
506
- #llm = HuggingFaceChain(model=MODEL_NAME_HF, model_kwargs={"temperature": 0.5, "max_length": 128})
507
- #llm = HuggingFaceHub(url_??? = "https://wdgsjd6zf201mufn.us-east-1.aws.endpoints.huggingface.cloud", model_kwargs={"temperature": 0.5, "max_length": 64})
508
- #llm = HuggingFaceTextGenInference( inference_server_url="http://localhost:8010/", max_new_tokens=max_new_tokens,top_k=10,top_p=top_p,typical_p=0.95,temperature=temperature,repetition_penalty=repetition_penalty,)
509
- #llm via HuggingChat
510
- #llm = hugchat.ChatBot(cookies=cookies.get_dict())
511
- #hugchat=True #da dieses Model in llm_chain bzw reag_chain anderes verarbeitet wird
512
-
513
- print("HF")
514
- #Prompt an history anhängen und einen Text daraus machen
515
- history_text_und_prompt = generate_prompt_with_history(prompt, history)
516
-
517
- #zusätzliche Dokumenten Splits aus DB zum Prompt hinzufügen (aus VektorDB - Chroma oder Mongo DB)
518
- if (rag_option == "An"):
519
- print("LLM aufrufen mit RAG: ...........")
520
- print(history_text_und_prompt)
521
- print("-------------------------------")
522
- result = rag_chain(llm, history_text_und_prompt, db) #für hugchat noch kein rag möglich...
523
- #weitere Möglichkeit für Rag-Chain - dann auch für HF Modelle möglich, da kein llm in Langchain übergeben werden muss...
524
- #result = rag_chain2(history_text_und_prompt, db, 5)
525
- print("result regchain.....................")
526
- print(result)
527
- else:
528
- #splittet = False
529
- print("LLM aufrufen ohne RAG: ...........")
530
- resulti = llm_chain(llm, history_text_und_prompt)
531
- result = resulti.strip()
532
- """
533
- #Alternativ mit API_URL - aber das model braucht 93 B Space!!!
534
- data = {"inputs": prompt, "options": {"max_new_tokens": max_new_tokens},}
535
- response = requests.post(API_URL_TEXT, headers=HEADERS, json=data)
536
- result = response.json()
537
- print("responseresult.............................")
538
- print(result)
539
- chatbot_response = result[0]['generated_text']
540
- print("anzahl tokens gesamt antwort:------------------")
541
- print (len(chatbot_response.split()))
542
- chatbot_message = chatbot_response[len(prompt):].strip()
543
- print("history/chatbot_rsponse:--------------------------------")
544
- print(history)
545
- print(chatbot_message)
546
- result = chatbot_message
547
- """
548
- else: #Websuche ist An
549
- print("Suche im Netz: ...........")
550
- suche_im_Netz="Antwort aus dem Internet ..."
551
- #Prompt an history anhängen und einen Text daraus machen
552
- history_text_und_prompt = generate_prompt_with_history(prompt, history)
553
- #if (hugchat):
554
- #mit hugchat
555
- #result = create_assistant_suche_hf(llm, history_text_und_prompt)
556
- #else:
557
- #mit tavily:
558
- result = create_assistant_suche(history_text_und_prompt)
559
-
560
-
561
- """
562
- #Wenn keine Antwort möglich "Ich weiß es nicht" etc., dann versuchen mit Suche im Internet.
563
- if (result == None or is_response_similar(result)):
564
- print("Suche im Netz: ...........")
565
- suche_im_Netz="Antwort aus dem Internet ..."
566
- result = create_assistant_suche(prompt)
567
- """
568
- except Exception as e:
569
- raise gr.Error(e)
570
-
571
- return result, suche_im_Netz
572
-
573
-
574
- #Funktion wird direkt aufgerufen aus der GUI - von hier muss auch die Rückmeldung kommen....
575
- #man kann einen Text-Prompt eingeben , dazu ein Image hochladen, und dann dazu code erzeugen lassen
576
- def generate_code(prompt_in, file, file_history, chatbot, history, model_option, openai_api_key, k=3, top_p=0.6, temperature=0.5, max_new_tokens=4048, max_context_length_tokens=2048, repetition_penalty=1.3,top_k=35):
577
- #prompt normalisieren bevor er an die KIs geht
578
- prompt = normalise_prompt(prompt_in)
579
- #falls schon ein File hochgeladen wurde, ist es in history_file gespeichert - falls ein neues File hochgeladen wurde, wird es anschließend neu gesetzt
580
- neu_file = file_history
581
-
582
- #kein Bild hochgeladen -> auf Text antworten...
583
- status = "Antwort der KI ..."
584
- if (file == None and file_history == None):
585
- result, status = generate_code_antwort(prompt, chatbot, history, model_option, openai_api_key, k=3, top_p=0.6, temperature=0.5, max_new_tokens=4048, max_context_length_tokens=2048, repetition_penalty=1.3, top_k=35)
586
- history = history + [[prompt, result]]
587
- else:
588
- #Es wurde ein File neu angehängt -> wenn prompt dazu, das Bild analysieren
589
- #das history_fiel muss neu gesetzt werden
590
- if (file != None):
591
- # file_history wird neu gesetzt in der Rückgabe dieser Funktion...
592
- neu_file = file
593
-
594
- #herausfinden, ob Bild oder Dokument...
595
- ext = analyze_file(neu_file)
596
- if (ext == "png" or ext == "PNG" or ext == "jpg" or ext == "jpeg" or ext == "JPG" or ext == "JPEG"):
597
- result= generate_text_zu_bild(neu_file, prompt, k, rag_option, chatbot, history, db)
598
- else:
599
- result = generate_text_zu_doc(neu_file, prompt, k, rag_option, chatbot, history, db)
600
-
601
- #die history erweitern - abhängig davon, ob gerade ein file hochgeladen wurde oder nicht
602
- if (file != None):
603
- history = history + [[(file,), None],[prompt, result]]
604
- else:
605
- history = history + [[prompt, result]]
606
-
607
- chatbot[-1][1] = ""
608
- for character in result:
609
- chatbot[-1][1] += character
610
- time.sleep(0.03)
611
- yield chatbot, history, None, neu_file, status
612
- if shared_state.interrupted:
613
- shared_state.recover()
614
- try:
615
- yield chatbot, history, None, neu_file, "Stop: Success"
616
- except:
617
- pass
618
-
619
-
620
- ####################################################
621
- #aus einem Text-Prompt die Antwort von KI bekommen
622
- #mit oder ohne RAG möglich
623
- def generate_code_antwort (prompt, chatbot, history, model_option, openai_api_key, k=3, top_p=0.6, temperature=0.5, max_new_tokens=4048, max_context_length_tokens=2048, repetition_penalty=1.3, top_k=35):
624
- suche_im_Netz="Antwort der KI ..."
625
- print("Text pur..............................")
626
- if (openai_api_key == "" or openai_api_key == "sk-"):
627
- #raise gr.Error("OpenAI API Key is required.")
628
- #eigenen OpenAI key nutzen
629
- openai_api_key= OAI_API_KEY
630
- if (prompt == ""):
631
- raise gr.Error("Prompt ist erforderlich.")
632
-
633
-
634
- try:
635
- ###########################
636
- #LLM auswählen (OpenAI oder HF)
637
- ###########################
638
- if (model_option == "Davinci"):
639
- #Anfrage an OpenAI ----------------------------
640
- print("OpenAI Anfrage.......................")
641
- llm = ChatOpenAI(model_name = MODEL_NAME_CODE, openai_api_key = openai_api_key, temperature=temperature)#, top_p = top_p)
642
- #Prompt an history anhängen und einen Text daraus machen
643
- history_text_und_prompt = generate_prompt_with_history_openai(prompt, history)
644
- else:
645
- llm = ChatOpenAI(model_name = MODEL_NAME_IMAGE, openai_api_key = openai_api_key, temperature=temperature)#, top_p = top_p)
646
- #Prompt an history anhängen und einen Text daraus machen
647
- history_text_und_prompt = generate_prompt_with_history_openai(prompt, history)
648
-
649
- print("LLM aufrufen ohne RAG: ...........")
650
- resulti = llm_chain(llm, history_text_und_prompt)
651
- result = resulti.strip()
652
- except Exception as e:
653
- raise gr.Error(e)
654
-
655
- return result, suche_im_Netz
656
-
657
- ################################################
658
- #GUI
659
- ###############################################
660
- #Beschreibung oben in GUI
661
- ################################################
662
-
663
- #css = """.toast-wrap { display: none !important } """
664
- #examples=[['Was ist ChtGPT-4?'],['schreibe ein Python Programm, dass die GPT-4 API aufruft.']]
665
-
666
- def vote(data: gr.LikeData):
667
- if data.liked: print("You upvoted this response: " + data.value)
668
- else: print("You downvoted this response: " + data.value)
669
-
670
- def custom_css():
671
- return """
672
- body, html {
673
- background-color: #303030; /* Dunkler Hintergrund */
674
- color:#353535;
675
- }
676
- """
677
-
678
-
679
- ########################################
680
- # Bot- test gegen schädliche Bots die die Anwendung testen...
681
- # Funktion zur Überprüfung der Benutzereingabe
682
- # Funktion zur Überprüfung der Eingabe und Aktivierung der Hauptanwendung
683
- def validate_input(user_input_validate, validate=False):
684
- user_input_hashed = hash_input(user_input_validate)
685
- if user_input_hashed == hash_input(ANTI_BOT_PW):
686
- return "Richtig! Weiter gehts... ", True, gr.Textbox(visible=False), gr.Button(visible=False)
687
- else:
688
- return "Falsche Antwort!!!!!!!!!", False, gr.Textbox(label = "", placeholder="Bitte tippen Sie das oben im Moodle Kurs angegebene Wort ein, um zu beweisen, dass Sie kein Bot sind.", visible=True, scale= 5), gr.Button("Validieren", visible = True)
689
-
690
-
691
- #############################################################################################
692
- # Start Gui Vorabfrage
693
- # Validierungs-Interface - Bots weghalten...
694
- print ("Start GUI Vorabfrage")
695
- #################################################################################################
696
- print ("Start GUI Hauptanwendung")
697
- with open("custom.css", "r", encoding="utf-8") as f:
698
- customCSS = f.read()
699
-
700
- #Add Inputs für Tab 2
701
- additional_inputs = [
702
- gr.Slider(label="Temperature", value=0.65, minimum=0.0, maximum=1.0, step=0.05, interactive=True, info="Höhere Werte erzeugen diversere Antworten", visible=True),
703
- gr.Slider(label="Max new tokens", value=1024, minimum=0, maximum=4096, step=64, interactive=True, info="Maximale Anzahl neuer Tokens", visible=True),
704
- gr.Slider(label="Top-p (nucleus sampling)", value=0.6, minimum=0.0, maximum=1, step=0.05, interactive=True, info="Höhere Werte verwenden auch Tokens mit niedrigerer Wahrscheinlichkeit.", visible=True),
705
- gr.Slider(label="Repetition penalty", value=1.2, minimum=1.0, maximum=2.0, step=0.05, interactive=True, info="Strafe für wiederholte Tokens", visible=True)
706
- ]
707
- with gr.Blocks(css=customCSS, theme=themeAlex) as demo:
708
- #validiert speichern
709
- validate = gr.State(False)
710
- #Session Variablen, um Weete zu speichern, auch wenn die Felder in der GUI bereits wieder leer sind
711
- # history parallel zu chatbot speichern - da in chatbot bei Bildern zum Anzeigen in der GUI die Bilder speziell formatiert werden,
712
- # für die Übergabe an die ki aber der Pfad zum Bild behalten werden muss - was in der history der Fall ist!
713
- history = gr.State([])
714
- uploaded_file_paths= gr.State([])
715
- history3 = gr.State([])
716
- uploaded_file_paths3= gr.State([])
717
- #alle chats einer Session sammeln
718
- chats = gr.State({})
719
- #damit der Prompt auch nach dem upload in die History noch für predicts_args verfügbar ist
720
- user_question = gr.State("")
721
- #für die anderen Tabs auch...
722
- #damit der Prompt auch nach dem upload in die History noch für predicts_args verfügbar ist
723
- user_question2 = gr.State("")
724
- user_question3 = gr.State("")
725
- attached_file = gr.State(None)
726
- attached_file_history = gr.State(None)
727
- attached_file3 = gr.State(None)
728
- attached_file_history3 = gr.State(None)
729
- status_display = gr.State("")
730
- status_display2 = gr.State("")
731
- status_display3 = gr.State("")
732
- ################################################
733
- # Tab zum Chatbot mit Text oder Bildeingabe
734
- ################################################
735
- gr.Markdown(description_top)
736
- with gr.Row():
737
- user_input_validate =gr.Textbox(label= "Bitte das oben im Moodle Kurs angegebene Wort eingeben, um die Anwendung zu starten", visible=True, interactive=True, scale= 7)
738
- validate_btn = gr.Button("Validieren", visible = True)
739
- #validation_result = gr.Text(label="Validierungsergebnis")
740
-
741
- with gr.Tab("KKG Chatbot"):
742
- with gr.Row():
743
- #gr.HTML("LI Chatot")
744
- status_display = gr.Markdown("Antwort der KI ...", visible = True) #, elem_id="status_display")
745
- with gr.Row():
746
- with gr.Column(scale=5):
747
- with gr.Row():
748
- chatbot = gr.Chatbot(elem_id="li-chat",show_copy_button=True)
749
- with gr.Row():
750
- with gr.Column(scale=12):
751
- user_input = gr.Textbox(
752
- show_label=False, placeholder="Gib hier deinen Prompt ein...",
753
- container=False
754
- )
755
- with gr.Column(min_width=70, scale=1):
756
- submitBtn = gr.Button("Senden")
757
- with gr.Column(min_width=70, scale=1):
758
- cancelBtn = gr.Button("Stop")
759
- with gr.Row():
760
- image_display = gr.Image( visible=False)
761
- upload = gr.UploadButton("📁", file_types=["image", "pdf", "docx", "pptx", "xlsx"], scale = 10)
762
- emptyBtn = gr.ClearButton([user_input, chatbot, history, attached_file, attached_file_history, image_display], value="🧹 Neue Session", scale=10)
763
-
764
- with gr.Column():
765
- with gr.Column(min_width=50, scale=1):
766
- with gr.Tab(label="Chats ..."):
767
- #Geht nicht, da für alle gleichzeitig sichtbar
768
- #chat_selector = gr.CheckboxGroup(label="", choices=update_chat_options())
769
- #download_button = gr.Button("Download ausgewählte Chats")
770
- file_download = gr.File(label="Noch keine Chatsverläufe", visible=True, interactive = False, file_count="multiple",)
771
-
772
- with gr.Tab(label="Parameter"):
773
- #gr.Markdown("# Parameters")
774
- rag_option = gr.Radio(["Aus", "An"], label="KKG Erweiterungen (RAG)", value = "Aus")
775
- model_option = gr.Radio(["OpenAI", "HuggingFace"], label="Modellauswahl", value = "OpenAI")
776
- websuche = gr.Radio(["Aus", "An"], label="Web-Suche", value = "Aus")
777
-
778
-
779
- top_p = gr.Slider(
780
- minimum=-0,
781
- maximum=1.0,
782
- value=0.95,
783
- step=0.05,
784
- interactive=True,
785
- label="Top-p",
786
- visible=False,
787
- )
788
- top_k = gr.Slider(
789
- minimum=1,
790
- maximum=100,
791
- value=35,
792
- step=1,
793
- interactive=True,
794
- label="Top-k",
795
- visible=False,
796
- )
797
- temperature = gr.Slider(
798
- minimum=0.1,
799
- maximum=2.0,
800
- value=0.5,
801
- step=0.1,
802
- interactive=True,
803
- label="Temperature",
804
- visible=False
805
- )
806
- max_length_tokens = gr.Slider(
807
- minimum=0,
808
- maximum=512,
809
- value=512,
810
- step=8,
811
- interactive=True,
812
- label="Max Generation Tokens",
813
- visible=False,
814
- )
815
- max_context_length_tokens = gr.Slider(
816
- minimum=0,
817
- maximum=4096,
818
- value=2048,
819
- step=128,
820
- interactive=True,
821
- label="Max History Tokens",
822
- visible=False,
823
- )
824
- repetition_penalty=gr.Slider(label="Repetition penalty", value=1.2, minimum=1.0, maximum=2.0, step=0.05, interactive=True, info="Strafe für wiederholte Tokens", visible=False)
825
- anzahl_docs = gr.Slider(label="Anzahl Dokumente", value=3, minimum=1, maximum=10, step=1, interactive=True, info="wie viele Dokumententeile aus dem Vektorstore an den prompt gehängt werden", visible=False)
826
- openai_key = gr.Textbox(label = "OpenAI API Key", value = "sk-", lines = 1, visible = False)
827
-
828
-
829
- ################################################
830
- # Tab zum Zeichnen mit Stable Diffusion
831
- ################################################
832
- with gr.Tab("LI Zeichnen"):
833
- with gr.Row():
834
- gr.HTML("Lass den KI-Bot deine Ideen zeichnen...")
835
- status_display2 = gr.Markdown("Success", visible = False, elem_id="status_display")
836
- #gr.Markdown(description2)
837
- with gr.Row():
838
- with gr.Column(scale=5):
839
- with gr.Row():
840
- chatbot_bild = gr.Chatbot(elem_id="li-zeichnen",show_copy_button=True, show_share_button=True)
841
- with gr.Row():
842
- with gr.Column(scale=12):
843
- user_input2 = gr.Textbox(
844
- show_label=False, placeholder="Gib hier deinen Prompt ein...",
845
- container=False
846
- )
847
- with gr.Column(min_width=70, scale=1):
848
- submitBtn2 = gr.Button("Senden")
849
- #with gr.Column(min_width=70, scale=1):
850
- #cancelBtn2 = gr.Button("Stop")
851
- with gr.Row():
852
- emptyBtn2 = gr.ClearButton([user_input, chatbot_bild], value="🧹 Neue Session", scale=10)
853
- #additional_inputs_accordion = gr.Accordion(label="Weitere Eingaben...", open=False)
854
- with gr.Column():
855
- with gr.Column(min_width=50, scale=1):
856
- with gr.Tab(label="Parameter Einstellung"):
857
- #gr.Markdown("# Parameters")
858
- model_option_zeichnen = gr.Radio(["Stable Diffusion","DallE"], label="Modellauswahl", value = "Stable Diffusion")
859
-
860
- """
861
- with gr.Tab("LI Codebot"):
862
- with gr.Row():
863
- gr.HTML("Gib als textuelle Beschreibung ein, was in Programmcode übersetzt werden soll und in welcher Sprache...")
864
- status_display3 = gr.Markdown("Success", visible = False, elem_id="status_display")
865
- #gr.Markdown(description2)
866
- with gr.Row():
867
- with gr.Column(scale=5):
868
- with gr.Row():
869
- chatbot_code = gr.Chatbot(elem_id="li-zeichnen",show_copy_button=True, show_share_button=True)
870
- with gr.Row():
871
- with gr.Column(scale=12):
872
- user_input3 = gr.Textbox(
873
- show_label=False, placeholder="Gib hier deinen Prompt ein...",
874
- container=False
875
- )
876
- with gr.Column(min_width=70, scale=1):
877
- submitBtn3 = gr.Button("Senden")
878
- with gr.Column(min_width=70, scale=1):
879
- cancelBtn3 = gr.Button("Stop")
880
- with gr.Row():
881
- #file_display = gr.File(visible=False)
882
- image_display3 = gr.Image( visible=False)
883
- upload3 = gr.UploadButton("📁", file_types=["image", "pdf", "docx", "pptx", "xlsx"], scale = 10)
884
- emptyBtn3 = gr.ClearButton([user_input3, chatbot_code, history3, attached_file3, image_display3], value="🧹 Neue Session", scale=10)
885
- with gr.Column():
886
- with gr.Column(min_width=50, scale=1):
887
- with gr.Tab(label="Parameter Einstellung"):
888
- #gr.Markdown("# Parameters")
889
- model_option_code3 = gr.Radio(["Davinci","kommt noch"], label="Modellauswahl", value = "Davinci")
890
- """
891
-
892
-
893
- gr.Markdown(description)
894
-
895
- ######################################
896
- # Events und Übergabe Werte an Funktionen
897
- #######################################
898
- ######################################
899
- # Für Tab 1: Chatbot
900
- #Argumente für generate Funktion als Input
901
- predict_args = dict(
902
- fn=generate_auswahl,
903
- inputs=[
904
- user_question,
905
- attached_file,
906
- attached_file_history,
907
- chatbot,
908
- history,
909
- rag_option,
910
- model_option,
911
- openai_key,
912
- anzahl_docs,
913
- top_p,
914
- temperature,
915
- max_length_tokens,
916
- max_context_length_tokens,
917
- repetition_penalty,
918
- top_k,
919
- websuche,
920
- validate
921
- ],
922
- outputs=[chatbot, history, attached_file, attached_file_history, status_display],
923
- show_progress=True,
924
- )
925
-
926
- reset_args = dict(
927
- fn=reset_textbox, inputs=[], outputs=[user_input, status_display]
928
- )
929
-
930
- # Chatbot
931
- transfer_input_args = dict(
932
- fn=add_text, inputs=[chatbot, history, user_input, attached_file, attached_file_history], outputs=[chatbot, history, user_question, attached_file, attached_file_history, image_display , user_input], show_progress=True
933
- )
934
-
935
- ##############################################
936
- # Button Events....
937
- #Validation Button
938
- # Event-Handler für die Validierung
939
- validate_btn.click(validate_input, inputs=[user_input_validate, validate], outputs=[status_display, validate, user_input_validate, validate_btn])
940
- user_input_validate.submit(validate_input, inputs=[user_input_validate, validate], outputs=[status_display, validate, user_input_validate, validate_btn])
941
-
942
- predict_event1 = user_input.submit(**transfer_input_args, queue=False,).then(**predict_args)
943
- predict_event2 = submitBtn.click(**transfer_input_args, queue=False,).then(**predict_args)
944
- predict_event3 = upload.upload(file_anzeigen, [upload], [image_display, image_display, attached_file] ) #.then(**predict_args)
945
- emptyBtn.click(clear_all, [history, uploaded_file_paths, chats], [attached_file, image_display, uploaded_file_paths, history, file_download, chats])
946
- #Bild Anzeige neben dem Button wieder entfernen oder austauschen..
947
- image_display.select(file_loeschen, [], [attached_file, image_display])
948
- #download_button.click(fn=download_chats, inputs=chat_selector, outputs=[file_download])
949
-
950
-
951
- #Berechnung oder Ausgabe anhalten (kann danach fortgesetzt werden)
952
- cancelBtn.click(cancel_outputing, [], [status_display], cancels=[predict_event1,predict_event2, predict_event3])
953
-
954
- ######################################
955
- # Für Tab 2: Zeichnen
956
- predict_args2 = dict(
957
- fn=generate_bild,
958
- inputs=[
959
- user_question2,
960
- chatbot_bild,
961
- model_option_zeichnen,
962
- validate
963
- #additional_inputs,
964
- ],
965
- outputs=[chatbot_bild, status_display2], #[chatbot, history, status_display]
966
- show_progress=True,
967
- )
968
- transfer_input_args2 = dict(
969
- fn=add_text2, inputs=[chatbot_bild, user_input2], outputs=[chatbot_bild, user_question2, user_input2], show_progress=True
970
- )
971
- predict_event2_1 = user_input2.submit(**transfer_input_args2, queue=False,).then(**predict_args2)
972
- predict_event2_2 = submitBtn2.click(**transfer_input_args2, queue=False,).then(**predict_args2)
973
- #emptyBtn2.click(clear_all, [], [file_display, image_display])
974
-
975
- #cancelBtn2.click(
976
- #cancels=[predict_event2_1,predict_event2_2 ]
977
- #)
978
-
979
- """
980
- ######################################
981
- # Für Tab 3: Codebot
982
- #Argumente für generate Funktion als Input
983
- predict_args3 = dict(
984
- fn=generate_code,
985
- inputs=[
986
- user_question3,
987
- attached_file3,
988
- attached_file_history3,
989
- chatbot_code,
990
- history3,
991
- model_option,
992
- openai_key,
993
- top_p,
994
- temperature,
995
- max_length_tokens,
996
- max_context_length_tokens,
997
- repetition_penalty,
998
- top_k
999
- ],
1000
- outputs=[chatbot_code, history3, attached_file3, status_display3],
1001
- show_progress=True,
1002
- )
1003
- reset_args3 = dict(
1004
- fn=reset_textbox, inputs=[], outputs=[user_input3, status_display3]
1005
- )
1006
- # Chatbot
1007
- transfer_input_args3 = dict(
1008
- fn=add_text, inputs=[chatbot_code, history3, user_input3, attached_file3, attached_file_history3], outputs=[chatbot_code, history3, user_question3, attached_file3, attached_file_history3, image_display3, user_input3], show_progress=True
1009
- )
1010
- predict_event3_1 = user_input3.submit(**transfer_input_args3, queue=False,).then(**predict_args3)
1011
- predict_event3_2 = submitBtn3.click(**transfer_input_args3, queue=False,).then(**predict_args3)
1012
- predict_event3_3 = upload3.upload(file_anzeigen, [upload3], [image_display3, image_display3, attached_file3] ) #.then(**predict_args)
1013
- emptyBtn3.click(clear_all3, [history3], [attached_file3, image_display3, history3])
1014
- #Bild Anzeige neben dem Button wieder entfernen oder austauschen..
1015
- image_display3.select(file_loeschen, [], [attached_file3, image_display3])
1016
- #download_button.click(fn=download_chats, inputs=chat_selector, outputs=[file_download])
1017
- """
1018
-
1019
-
1020
- demo.title = "KKG-ChatBot"
1021
- demo.queue(default_concurrency_limit=15).launch(debug=True)
1022
-