alexkueck commited on
Commit
c582708
·
verified ·
1 Parent(s): 6b51bda

Delete app.py

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