Update app.py
Browse files
app.py
CHANGED
@@ -80,6 +80,7 @@ os.environ["TAVILY_API_KEY"] = TAVILY_KEY
|
|
80 |
#MODEL_NAME = "gpt-3.5-turbo-1106"
|
81 |
MODEL_NAME= "gpt-4-1106-preview"
|
82 |
MODEL_NAME_IMAGE = "gpt-4-vision-preview"
|
|
|
83 |
|
84 |
|
85 |
#verfügbare Modelle anzeigen lassen
|
@@ -167,6 +168,12 @@ def clear_all(history, uploaded_file_paths, chats):
|
|
167 |
|
168 |
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
|
169 |
|
|
|
|
|
|
|
|
|
|
|
|
|
170 |
|
171 |
|
172 |
|
@@ -198,6 +205,7 @@ def add_text2(chatbot, prompt):
|
|
198 |
print("chatbot nach add_text............")
|
199 |
print(chatbot)
|
200 |
return chatbot, prompt, ""
|
|
|
201 |
|
202 |
############################################
|
203 |
#nach dem Upload soll das zusätzliche Fenster mit dem image drinnen angezeigt werden
|
@@ -491,6 +499,81 @@ def generate_text (prompt, chatbot, history, rag_option, model_option, openai_ap
|
|
491 |
|
492 |
return result, suche_im_Netz
|
493 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
494 |
|
495 |
|
496 |
################################################
|
@@ -531,16 +614,23 @@ with gr.Blocks(css=custom_css(), theme=themeAlex) as demo:
|
|
531 |
# für die Übergabe an die ki aber der Pfad zum Bild behalten werden muss - was in der history der Fall ist!
|
532 |
history = gr.State([])
|
533 |
uploaded_file_paths= gr.State([])
|
|
|
|
|
534 |
#alle chats einer Session sammeln
|
535 |
chats = gr.State({})
|
536 |
#damit der Prompt auch nach dem upload in die History noch für predicts_args verfügbar ist
|
537 |
user_question = gr.State("")
|
|
|
538 |
#damit der Prompt auch nach dem upload in die History noch für predicts_args verfügbar ist
|
539 |
user_question2 = gr.State("")
|
|
|
540 |
attached_file = gr.State(None)
|
541 |
attached_file_history = gr.State(None)
|
|
|
|
|
542 |
status_display = gr.State("")
|
543 |
status_display2 = gr.State("")
|
|
|
544 |
################################################
|
545 |
# Tab zum Chatbot mit Text oder Bildeingabe
|
546 |
################################################
|
@@ -637,8 +727,8 @@ with gr.Blocks(css=custom_css(), theme=themeAlex) as demo:
|
|
637 |
# Tab zum Zeichnen mit Stable Diffusion
|
638 |
################################################
|
639 |
with gr.Tab("LI Zeichnen"):
|
640 |
-
with gr.Row():
|
641 |
-
|
642 |
status_display2 = gr.Markdown("Success", visible = False, elem_id="status_display")
|
643 |
#gr.Markdown(description2)
|
644 |
with gr.Row():
|
@@ -657,14 +747,47 @@ with gr.Blocks(css=custom_css(), theme=themeAlex) as demo:
|
|
657 |
#cancelBtn2 = gr.Button("Stop")
|
658 |
with gr.Row():
|
659 |
emptyBtn2 = gr.ClearButton([user_input, chatbot_bild], value="🧹 Neue Session", scale=10)
|
660 |
-
#additional_inputs_accordion = gr.Accordion(label="Weitere Eingaben...", open=False)
|
661 |
with gr.Column():
|
662 |
with gr.Column(min_width=50, scale=1):
|
663 |
with gr.Tab(label="Parameter Einstellung"):
|
664 |
#gr.Markdown("# Parameters")
|
665 |
model_option_zeichnen = gr.Radio(["Stable Diffusion","DallE"], label="Modellauswahl", value = "Stable Diffusion")
|
666 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
667 |
|
|
|
|
|
668 |
gr.Markdown(description)
|
669 |
|
670 |
######################################
|
@@ -740,6 +863,50 @@ with gr.Blocks(css=custom_css(), theme=themeAlex) as demo:
|
|
740 |
#cancelBtn2.click(
|
741 |
#cancels=[predict_event2_1,predict_event2_2 ]
|
742 |
#)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
743 |
|
744 |
|
745 |
demo.title = "LI-ChatBot"
|
|
|
80 |
#MODEL_NAME = "gpt-3.5-turbo-1106"
|
81 |
MODEL_NAME= "gpt-4-1106-preview"
|
82 |
MODEL_NAME_IMAGE = "gpt-4-vision-preview"
|
83 |
+
MODEL_NAME_CODE = "code-davinci-002"
|
84 |
|
85 |
|
86 |
#verfügbare Modelle anzeigen lassen
|
|
|
168 |
|
169 |
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
|
170 |
|
171 |
+
|
172 |
+
#wenn löschen Button geklickt
|
173 |
+
def clear_all3(history):
|
174 |
+
#die session variable in gradio erweitern und alle fliepath neu in das gr.File hochladen
|
175 |
+
uploaded_file_paths= ""
|
176 |
+
return None, gr.Image(visible=False), [],
|
177 |
|
178 |
|
179 |
|
|
|
205 |
print("chatbot nach add_text............")
|
206 |
print(chatbot)
|
207 |
return chatbot, prompt, ""
|
208 |
+
|
209 |
|
210 |
############################################
|
211 |
#nach dem Upload soll das zusätzliche Fenster mit dem image drinnen angezeigt werden
|
|
|
499 |
|
500 |
return result, suche_im_Netz
|
501 |
|
502 |
+
|
503 |
+
#Funktion wird direkt aufgerufen aus der GUI - von hier muss auch die Rückmeldung kommen....
|
504 |
+
#man kann einen Text-Prompt eingeben , dazu ein Image hochladen, und dann dazu code erzeugen lassen
|
505 |
+
def generate_code(prompt_in, file, 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):
|
506 |
+
#prompt normalisieren bevor er an die KIs geht
|
507 |
+
prompt = normalise_prompt(prompt_in)
|
508 |
+
|
509 |
+
#kein Bild hochgeladen -> auf Text antworten...
|
510 |
+
status = "Antwort der KI ..."
|
511 |
+
if (file == None and file_history == None):
|
512 |
+
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)
|
513 |
+
history = history + [[prompt, result]]
|
514 |
+
else:
|
515 |
+
#Es wurde ein File neu angehängt -> wenn prompt dazu, das Bild analysieren
|
516 |
+
#das history_fiel muss neu gesetzt werden
|
517 |
+
if (file != None):
|
518 |
+
# file_history wird neu gesetzt in der Rückgabe dieser Funktion...
|
519 |
+
neu_file = file
|
520 |
+
|
521 |
+
#herausfinden, ob Bild oder Dokument...
|
522 |
+
ext = analyze_file(neu_file)
|
523 |
+
if (ext == "png" or ext == "PNG" or ext == "jpg" or ext == "jpeg" or ext == "JPG" or ext == "JPEG"):
|
524 |
+
result= generate_text_zu_bild(neu_file, prompt, k, rag_option, chatbot, history, db)
|
525 |
+
else:
|
526 |
+
result = generate_text_zu_doc(neu_file, prompt, k, rag_option, chatbot, history, db)
|
527 |
+
|
528 |
+
#die history erweitern - abhängig davon, ob gerade ein file hochgeladen wurde oder nicht
|
529 |
+
if (file != None):
|
530 |
+
history = history + [[(file,), None],[prompt, result]]
|
531 |
+
else:
|
532 |
+
history = history + [[prompt, result]]
|
533 |
+
|
534 |
+
chatbot[-1][1] = ""
|
535 |
+
for character in result:
|
536 |
+
chatbot[-1][1] += character
|
537 |
+
time.sleep(0.03)
|
538 |
+
yield chatbot, history, None, neu_file, status
|
539 |
+
if shared_state.interrupted:
|
540 |
+
shared_state.recover()
|
541 |
+
try:
|
542 |
+
yield chatbot, history, None, neu_file, "Stop: Success"
|
543 |
+
except:
|
544 |
+
pass
|
545 |
+
|
546 |
+
|
547 |
+
####################################################
|
548 |
+
#aus einem Text-Prompt die Antwort von KI bekommen
|
549 |
+
#mit oder ohne RAG möglich
|
550 |
+
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):
|
551 |
+
suche_im_Netz="Antwort der KI ..."
|
552 |
+
print("Text pur..............................")
|
553 |
+
if (openai_api_key == "" or openai_api_key == "sk-"):
|
554 |
+
#raise gr.Error("OpenAI API Key is required.")
|
555 |
+
#eigenen OpenAI key nutzen
|
556 |
+
openai_api_key= OAI_API_KEY
|
557 |
+
if (prompt == ""):
|
558 |
+
raise gr.Error("Prompt ist erforderlich.")
|
559 |
+
|
560 |
+
|
561 |
+
try:
|
562 |
+
###########################
|
563 |
+
#LLM auswählen (OpenAI oder HF)
|
564 |
+
###########################
|
565 |
+
if (model_option == "Davinci"):
|
566 |
+
#Anfrage an OpenAI ----------------------------
|
567 |
+
print("OpenAI Anfrage.......................")
|
568 |
+
llm = ChatOpenAI(model_name = MODEL_NAME_CODE, openai_api_key = openai_api_key, temperature=temperature)#, top_p = top_p)
|
569 |
+
#Prompt an history anhängen und einen Text daraus machen
|
570 |
+
history_text_und_prompt = generate_prompt_with_history_openai(prompt, history)
|
571 |
+
else:
|
572 |
+
#oder an Hugging Face --------------------------
|
573 |
+
|
574 |
+
print("LLM aufrufen ohne RAG: ...........")
|
575 |
+
resulti = llm_chain(llm, history_text_und_prompt)
|
576 |
+
result = resulti.strip()
|
577 |
|
578 |
|
579 |
################################################
|
|
|
614 |
# für die Übergabe an die ki aber der Pfad zum Bild behalten werden muss - was in der history der Fall ist!
|
615 |
history = gr.State([])
|
616 |
uploaded_file_paths= gr.State([])
|
617 |
+
history3 = gr.State([])
|
618 |
+
uploaded_file_paths3= gr.State([])
|
619 |
#alle chats einer Session sammeln
|
620 |
chats = gr.State({})
|
621 |
#damit der Prompt auch nach dem upload in die History noch für predicts_args verfügbar ist
|
622 |
user_question = gr.State("")
|
623 |
+
#für die anderen Tabs auch...
|
624 |
#damit der Prompt auch nach dem upload in die History noch für predicts_args verfügbar ist
|
625 |
user_question2 = gr.State("")
|
626 |
+
user_question3 = gr.State("")
|
627 |
attached_file = gr.State(None)
|
628 |
attached_file_history = gr.State(None)
|
629 |
+
attached_file3 = gr.State(None)
|
630 |
+
attached_file_history3 = gr.State(None)
|
631 |
status_display = gr.State("")
|
632 |
status_display2 = gr.State("")
|
633 |
+
status_display3 = gr.State("")
|
634 |
################################################
|
635 |
# Tab zum Chatbot mit Text oder Bildeingabe
|
636 |
################################################
|
|
|
727 |
# Tab zum Zeichnen mit Stable Diffusion
|
728 |
################################################
|
729 |
with gr.Tab("LI Zeichnen"):
|
730 |
+
with gr.Row():
|
731 |
+
gr.HTML("Lass den KI-Bot deine Ideen zeichnen...")
|
732 |
status_display2 = gr.Markdown("Success", visible = False, elem_id="status_display")
|
733 |
#gr.Markdown(description2)
|
734 |
with gr.Row():
|
|
|
747 |
#cancelBtn2 = gr.Button("Stop")
|
748 |
with gr.Row():
|
749 |
emptyBtn2 = gr.ClearButton([user_input, chatbot_bild], value="🧹 Neue Session", scale=10)
|
750 |
+
#additional_inputs_accordion = gr.Accordion(label="Weitere Eingaben...", open=False)
|
751 |
with gr.Column():
|
752 |
with gr.Column(min_width=50, scale=1):
|
753 |
with gr.Tab(label="Parameter Einstellung"):
|
754 |
#gr.Markdown("# Parameters")
|
755 |
model_option_zeichnen = gr.Radio(["Stable Diffusion","DallE"], label="Modellauswahl", value = "Stable Diffusion")
|
756 |
|
757 |
+
|
758 |
+
with gr.Tab("LI Codebot"):
|
759 |
+
with gr.Row():
|
760 |
+
gr.HTML("Gib als textuelle Beschreibung ein, was in Programmcode übersetzt werden soll und in welcher Sprache...")
|
761 |
+
status_display3 = gr.Markdown("Success", visible = False, elem_id="status_display")
|
762 |
+
#gr.Markdown(description2)
|
763 |
+
with gr.Row():
|
764 |
+
with gr.Column(scale=5):
|
765 |
+
with gr.Row():
|
766 |
+
chatbot_code = gr.Chatbot(elem_id="li-zeichnen",show_copy_button=True, show_share_button=True)
|
767 |
+
with gr.Row():
|
768 |
+
with gr.Column(scale=12):
|
769 |
+
user_input3 = gr.Textbox(
|
770 |
+
show_label=False, placeholder="Gib hier deinen Prompt ein...",
|
771 |
+
container=False
|
772 |
+
)
|
773 |
+
with gr.Column(min_width=70, scale=1):
|
774 |
+
submitBtn3 = gr.Button("Senden")
|
775 |
+
with gr.Column(min_width=70, scale=1):
|
776 |
+
cancelBtn3 = gr.Button("Stop")
|
777 |
+
with gr.Row():
|
778 |
+
#file_display = gr.File(visible=False)
|
779 |
+
image_display3 = gr.Image( visible=False)
|
780 |
+
upload3 = gr.UploadButton("📁", file_types=["image", "pdf", "docx", "pptx", "xlsx"], scale = 10)
|
781 |
+
emptyBtn3 = gr.ClearButton([user_input, chatbot, history, attached_file, attached_file_history, image_display], value="🧹 Neue Session", scale=10)
|
782 |
+
with gr.Column():
|
783 |
+
with gr.Column(min_width=50, scale=1):
|
784 |
+
with gr.Tab(label="Parameter Einstellung"):
|
785 |
+
#gr.Markdown("# Parameters")
|
786 |
+
model_option_code3 = gr.Radio(["Davinci","kommt noch"], label="Modellauswahl", value = "Davinci")
|
787 |
+
|
788 |
|
789 |
+
|
790 |
+
|
791 |
gr.Markdown(description)
|
792 |
|
793 |
######################################
|
|
|
863 |
#cancelBtn2.click(
|
864 |
#cancels=[predict_event2_1,predict_event2_2 ]
|
865 |
#)
|
866 |
+
|
867 |
+
|
868 |
+
######################################
|
869 |
+
# Für Tab 3: Codebot
|
870 |
+
#Argumente für generate Funktion als Input
|
871 |
+
predict_args = dict(
|
872 |
+
fn=generate_code,
|
873 |
+
inputs=[
|
874 |
+
user_question3,
|
875 |
+
attached_file3,
|
876 |
+
chatbot3,
|
877 |
+
history3,
|
878 |
+
model_option,
|
879 |
+
openai_key,
|
880 |
+
anzahl_docs3,
|
881 |
+
top_p,
|
882 |
+
temperature,
|
883 |
+
max_length_tokens,
|
884 |
+
max_context_length_tokens,
|
885 |
+
repetition_penalty,
|
886 |
+
top_k
|
887 |
+
],
|
888 |
+
outputs=[chatbot_code, history3, attached_file3, status_display3],
|
889 |
+
show_progress=True,
|
890 |
+
)
|
891 |
+
|
892 |
+
|
893 |
+
reset_args3 = dict(
|
894 |
+
fn=reset_textbox, inputs=[], outputs=[user_input3, status_display3]
|
895 |
+
)
|
896 |
+
|
897 |
+
# Chatbot
|
898 |
+
transfer_input_args3 = dict(
|
899 |
+
fn=add_text, inputs=[chatbot_code, history3, user_input3, attached_file3], outputs=[chatbot_code, history3, user_question3, attached_file3, image_display3, user_input3], show_progress3=True
|
900 |
+
)
|
901 |
+
|
902 |
+
predict_event3_1 = user_input3.submit(**transfer_input_args3, queue=False,).then(**predict_args3)
|
903 |
+
predict_event3_2 = submitBtn3.click(**transfer_input_args3, queue=False,).then(**predict_args3)
|
904 |
+
predict_event3_3 = upload3.upload(file_anzeigen3, [upload3], [image_display3, image_display3, attached_file3] ) #.then(**predict_args)
|
905 |
+
emptyBtn3.click(clear_all3, [history3], [attached_file3, image_display3, history3])
|
906 |
+
#Bild Anzeige neben dem Button wieder entfernen oder austauschen..
|
907 |
+
image_display3.select(file_loeschen3, [], [attached_file3, image_display3])
|
908 |
+
#download_button.click(fn=download_chats, inputs=chat_selector, outputs=[file_download])
|
909 |
+
|
910 |
|
911 |
|
912 |
demo.title = "LI-ChatBot"
|