Spaces:
Sleeping
Sleeping
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() |