braunaleMPG's picture
Update app.py
2a45a92 verified
import gradio as gr
from openai import OpenAI
from os import getenv
import json
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=getenv("OPENROUTER_API_KEY"),
)
# Initialize the chat log
with gr.Blocks() as app:
dialog_state_var = gr.State([])
def api_call(prompt, model_id):
completion = client.chat.completions.create(
model=model_id,
max_tokens = 2000,
messages=[
{
"role": "user",
"content": prompt,
},
],
)
answer = completion.choices[0].message.content
return answer
def format(str):
s = str.split("\",")
for i in range(len(s)):
key = s[i].split(":")[0]
value = s[i].split(":")[1]
value = value.replace("\"", "")
s[i]=key+":"+"\""+value+"\""
str_new = ",".join(s)
str_new = str_new.replace("}\"", "\"}")
str_new = str_new.replace("\n", "")
return str_new
def generate_next(intro, setting, topic, student_identity, teacher_identity, student_start, student_base, teacher_base, dialog_state, llm_teacher, llm_student):
dialog_prev = "\n\n".join(dialog_state)
# STUDENT
prompt_student = intro+"\n\nBisheriger Dialog:\n"+dialog_prev+"\n\Verlauf des Dialogs: "+setting+"\n\nThema, bei dem der Schüler Hilfe braucht:"+topic+"\n\nBeschreibung des Schülers:"+student_identity+"\n\n"
if len(dialog_state) == 0:
prompt_student+=student_start
else:
prompt_student+=student_base
student = api_call(prompt_student, llm_student)
print(student)
student = format(student)
student = json.loads(student,strict=False)
analysis_student = student["analyse"]
response = "Schüler: "+student["antwort"]
dialog_state.append(response)
dialog_prev = "\n\n".join(dialog_state)
# TEACHER
prompt_teacher = intro+"\n\nBisheriger Dialog:\n"+dialog_prev+"\n\Verlauf des Dialogs: "+setting+"\n\nThema, bei dem der Schüler Hilfe braucht:"+topic+"\n\nBeschreibung des Tutors:"+teacher_identity+"\n\n"+teacher_base
teacher = api_call(prompt_teacher, llm_teacher)
teacher = format(teacher)
print(teacher)
teacher = json.loads(teacher,strict=False)
analysis_teacher = teacher["analyse"]
response = "Tutor: "+teacher["antwort"]
dialog_state.append(response)
dialog_new = "\n\n".join(dialog_state)
return prompt_student,prompt_teacher, dialog_new, dialog_state, analysis_student, analysis_teacher
def reset():
return "", "", "", []
# Text boxes for user inputs
txt_llm_teacher = gr.Textbox(label="LLM Tutor (https://openrouter.ai/models)", lines=1, value = "mistralai/mixtral-8x22b-instruct")
txt_llm_student = gr.Textbox(label="LLM Schüler (https://openrouter.ai/models)", lines=1, value = "mistralai/mixtral-8x22b-instruct")
txt_intro = gr.Textbox(label="Einleitung", lines=4, value = "Ich möchte einen möglichst realistischen Dialog zwischen einem Schüler und einem Tutor simulieren.")
txt_setting = gr.Textbox(label="Dialogverlauf", lines=4, value = "Der Schüler kommt bei seinen Hausaufgaben nicht weiter und bittet den Tutorum Hilfe. Der Tutor diagnostiziert welches Vorwissen der Schülers hat und welche Art von Hilfe er genau braucht. Dann erabeiten Tutor und Schüler Schritt für Schritt das Thema.")
txt_topic = gr.Textbox(label="Thema des Dialogs", lines=4, value="Zellteilung - Die Phasen der Mitose")
txt_student_identity = gr.Textbox(label="Schüler-Identität", lines=4, value="Der Schüler ist in der 8. Klasse. Er hat große Schwierigkeiten in der Schule und kann nicht selbständig arbeiten. Er hat kaum Vorwissen in dem Thema. Er braucht viel Unterstützung und muss in kleinen Schritten an eine Aufgabe herangeführt werden. Der Schüler ist sehr passiv, antwortet meist sehr kurz und umgangssprachlich und ist unsicher.")
txt_teacher_identity = gr.Textbox(label="Tutor-Identität", lines=4, value="Der Tutor ist ein intelligenter KI-Assistent der speziell für die Unterstützung von Schülern entwickelt wurde. Er hat eine sehr starke didaktische Kompetenz,ist geduldig, motivierend und unterstützend. Er ist besonders gut darin, Schüler Schritt fürSchritt an ein Thema heranzuführen und komplexe Themen oder Aufgaben anschaulich und schüler-gerecht zu erklären. Der Tutor gibt niemals lange Erklärungen oder Verrät die Lösung zu einer Aufgabe, sondern er leitet den Schüler durch geschicktes Nachfragen und kleinere Tipps, bis dieser selbst auf die Lösung kommt.")
txt_student_start = gr.Textbox(label="Schüler Start Prompt (wird nur für den Start des Dialoges verwendet)", lines=4, value="Basierend auf diesen Vorgaben, analysiere welches Vorwissen der Schüler hat und wie motiviert er ist. Basierend auf dieser analyse, schreibe einen möglichen Satz, wie wie der Schüler den Dialog starten würde und schreibe einen realistischen ersten Satz des Schülers. Antworte im json Format mit folgenden variablen: {analyse:<DEINE_ANALYSE>, antwort:<DEIN_SATZ>}")
txt_student_base = gr.Textbox(label="Base-Prompt Schüler", lines=4, value="Analysiere die Beschreibung des Szene und den bisherigen Dialog. Analysiere welchen Wissenstand der Schüler hat und was sein Ziel ist. Überlege auch wie er sich wohl gerade fühlt und wie motiviert er ist. Der Schüler antwortet sehr kurz, und verhält sich sehr passiv im Gespräch. Schreibe nun basierend auf deinen Analyse eine realistische Antwort des Schülers. Antworte im JSON Format mit folgenden Variablen: {analyse:<DEINE_ANALYSE>, antwort:<ANTWORT_DES_SCHÜLERS>}")
txt_teacher_base = gr.Textbox(label="Base-Prompt Tutor", lines=4, value="Analysiere die Beschreibung der Szene, des Schülers und des Tutors sowie den bisherigen Dialog. Überlege genau, was das aktuelle Ziel des Tutors ist und wie gut er dieses bereits erfüllt hat. Überlege auch, welches Wissen der Schüler bereits hat und welches Problem er lösen möchte. Nutze ausschließlich Informationen und Wissen, dass der Tutor aus dem bisheren Dialogverlauf haben kann. Der Tutor ist der aktive Part in diesem Gespräch und leitet den Schüler mit geschickten Fragen und kleinen Aufgaben durch das Thema. Wenn der Schüler Rückfragen hat, nimmst sich der Tutor genügend Zeit diese zu beantworten, verliert aber auch nie das eigentliche Thema aus den Augen und übernimmt wieder den aktiven Part wenn die Frage des Schülers beantwortet ist. Überlege dir nun wie der Tutor am besten vorgehen sollte und schreibe dann eine realistische Antwort des Tutors. Antworte im JSON Format mit folgenden Variablen: {analyse:<DEINE_ANALYSE>, antwort:<ANTWORT_DES_TUTORS>}")
btn_submit = gr.Button("Submit")
btn_reset = gr.Button("Reset")
# The chat display area
prompt_student = gr.Textbox(label="Prompt Schüler", lines=10, interactive=False)
prompt_teacher = gr.Textbox(label="Prompt Tutor", lines=10, interactive=False)
analysis_student = gr.Textbox(label="Analyse Schüler", lines=10, interactive=False)
analysis_teacher = gr.Textbox(label="Analyse Tutor", lines=10, interactive=False)
chat_interface = gr.Textbox(label="Chat", lines=10, interactive=False)
# Define the layout and how components interact
btn_submit.click(
fn=generate_next,
inputs=[txt_intro, txt_setting, txt_topic, txt_student_identity, txt_teacher_identity,txt_student_start, txt_student_base, txt_teacher_base, dialog_state_var,txt_llm_teacher,txt_llm_student],
outputs=[prompt_student,prompt_teacher, chat_interface, dialog_state_var, analysis_student, analysis_teacher],
)
btn_reset.click(fn=reset, inputs = [], outputs = [prompt_student,prompt_teacher, chat_interface, dialog_state_var])
# Launch the interface
app.launch()