From e536e93ad762b19c9b1f4c0c258a970325cb5632 Mon Sep 17 00:00:00 2001 From: Joachim Happel Date: Fri, 3 May 2024 16:17:59 +0200 Subject: [PATCH] add panel apps --- .vscode/settings.json | 3 + chat-panel.py | 224 ++++++++++++++++++++++++++++++++++++++++++ panel_test.py | 17 ++++ reli-chat-ai-panel.py | 146 +++++++++++++++++++++++++++ reli.py | 118 ++++++++++++++++++++++ 5 files changed, 508 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 chat-panel.py create mode 100644 panel_test.py create mode 100644 reli-chat-ai-panel.py create mode 100644 reli.py diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3ebdbc0 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "CodeGPT.apiKey": "CodeGPT Plus Beta" +} \ No newline at end of file diff --git a/chat-panel.py b/chat-panel.py new file mode 100644 index 0000000..a96c238 --- /dev/null +++ b/chat-panel.py @@ -0,0 +1,224 @@ +# start with the following comando: panel serve chat-panel.py + +import os +import platform + + +# Environment Variablen importieren +from dotenv import load_dotenv +load_dotenv() + + +from crewai import Crew, Process, Agent, Task +from langchain_openai import ChatOpenAI + +from langchain_core.callbacks import BaseCallbackHandler +from typing import TYPE_CHECKING, Any, Dict, Optional + +from crewai_tools import Tool + + + +# pip install panel +import panel as pn +pn.extension(design="material") + + +import threading + +from crewai.agents import CrewAgentExecutor +import time + +def user_input_callback(content): + + global human_chat_user_input + + #prompt = self._i18n.slice("getting_input").format(final_answer=final_answer) + print(content); + + chat_interface.send("Bitte prüfen Sie, ob der Plan ihre Anforderungen erfüllt", user="User", respond=False) + + while human_chat_user_input == None: + time.sleep(1) + + human_comments = human_chat_user_input + human_chat_user_input = None + + return human_comments + + +def custom_ask_human_input(self, final_answer: dict) -> str: + + global human_chat_user_input + + #prompt = self._i18n.slice("getting_input").format(final_answer=final_answer) + + chat_interface.send(final_answer, user="User", respond=False) + + while human_chat_user_input == None: + time.sleep(1) + print("Waiting for human input...") + + human_comments = human_chat_user_input + human_chat_user_input = None + + return human_comments + + +#CrewAgentExecutor._ask_human_input = custom_ask_human_input + + +human_chat_user_input = None +initiate_chat_task_created = False + +def initiate_chat(message): + + global initiate_chat_task_created + # Indicate that the task has been created + initiate_chat_task_created = True + + message=message+' auf deutsch.' + + StartCrew(message) + + + +def callback(contents: str, user: str, instance: pn.chat.ChatInterface): + + print(f"User: {user} - Message: {contents}") + + global initiate_chat_task_created + global human_chat_user_input + + if not initiate_chat_task_created: + thread = threading.Thread(target=initiate_chat, args=(contents,)) + thread.start() + + else: + human_chat_user_input = contents + +avators = {"theologe":"https://cdn-icons-png.flaticon.com/512/320/320336.png", + "religionswissenschaftler":"https://cdn-icons-png.freepik.com/512/9408/9408201.png", + "moderator":"https://cdn-icons-png.freepik.com/512/9408/9408201.png"} + +class MyCustomHandler(BaseCallbackHandler): + + def __init__(self, agent_name: str) -> None: + self.agent_name = agent_name + + def on_chain_start( + self, serialized: Dict[str, Any], inputs: Dict[str, Any], **kwargs: Any + ) -> None: + """We start a chain.""" + + chat_interface.send(inputs['input'], user="assistent", respond=False) + + def on_chain_end(self, outputs: Dict[str, Any], **kwargs: Any) -> None: + """Print out that we finished a chain.""" + + print(f"Finished chain with output: {outputs}") + + chat_interface.send(outputs['output'], user=self.agent_name, avatar=avators[self.agent_name], respond=False) + + + + +llm = ChatOpenAI(model="gpt-3.5-turbo-0125") +#llm = ChatOpenAI(model="gpt-4") + +theologe = Agent( + name="Theologe", + role='Theologische Inhalte entwickeln', + backstory='''Langjähriger Theologieprofessor mit Spezialisierung auf historisch-kritische Bibelinterpretation''', + goal="Verständnis für biblische Texte und christliche Lehren fördern.", + llm=llm, + allow_delegation=False, + verbose=True, + callbacks=[MyCustomHandler("theologe")], +) +religionswissenschaftler = Agent( + name="Religionswissenschaftler", + role='Interreligiösen Dialog fördern', + backstory='''Religionswissenschaftler mit internationaler Erfahrung im Dialog zwischen Weltreligionen.''', + goal="Förderung von ethischer Argumentation und philosophischem Denken", + llm=llm, + callbacks=[MyCustomHandler("religionswissenschaftler")], + allow_delegation=False, + verbose=True, +) + +moderator = Agent( + name="Moderator", + role='Generiert einen minutiösen Verlaufsplan für eine Stunde Religionsunterricht', + backstory='''Methoden und Didaktik Enthusiast mit besonderem Interesse am religionsbezogener Bildung.''', + goal="Entwicklung von perfekten Unterrichtsstunden für den Religionsunterricht.", + llm=llm, + callbacks=[MyCustomHandler("moderator")], + allow_delegation=False, + verbose=True, + +) + +def StartCrew(prompt): + + task1 = Task( + description=f"""Entwickeln Sie Unterrichtsideen auf deutsch zum Thema {prompt}. Berücksichtigen Sie bei ihren Überlegungen, dass eine Religionsstunde nur 45 Minuten dauert. """ , + agent=theologe, + expected_output="Vorschlag für den inhaltlichen Fokus. Danach eine kurze Liste mit maximal 3 Unterrichtsideen und je einem methodischen Vorschlag mit relevante theologischen Perspektiven in deutscher Sprache.", + + ) + + task2 = Task( + description=("""Erweitern Sie den Fokus aus Ihrer Perspektive. Prüfen Sie die Unterrichtsideen und ergänzen Sie diese um maximal 2 weitere vor allem aus Ihrer religionswissenschaftlichen Perspektive. + Ergänzen Sie die Unterrichtsideen um Aspekte des interreligiösen Dialogs und angemessener Methoden. + Berücksichtigen Sie dabei, dass eine Religionsstunde nur 45 Minuten dauert. + Geben Sie Feedback und Verbesserungsvorschläge auf deutsch."""), + agent=religionswissenschaftler, + expected_output="Feedback und Ergänzungsvorschläge zu den Unterrichtsideen.", + context=[task1], + ) + + task3 = Task( + description=("""Erstellen Sie aus dem Gesprächverlauf einen finalen Ablaufplan für den Unterricht auf deutsch. + Stellen Sie sicher, dass der Ablaufplan für eine 45-minütige Stunde geeignet ist. + Versichern Sie sich, dass sowohl theologische als auch religionswissenschaftliche, religionsübergreifende Aspekte berücksichtigt wurden. + Entwickeln sie aud sem Vroschlägen mit zeitgemäßen Methoden eine mitreißende Unterrichtstunde. + Schreiben Sie den Ablaufplan in tabellarischer Form auf. Geben Sie erklärrende Hinweise zu den einzelnen Schritten. + Wenn das Ergebniss Ihrer Meinung nach gut ist, legen Sie das Ergebnis einem Menschen zur Prüfung vor. + Make sure to check with a human if the draft is good before finalizing your answer.! + """), + agent=moderator, + expected_output="Ein perfekter Ablaufplan für den Unterricht in tabellarischer Form auf deutsch.", + human_input=True, + callback=user_input_callback, + context=[task1, task2], + ) + task4 = Task( + description=("""Nehmen Sie Argumente aus dem menschlichen Feedback auf und ändern Sie den Ablaufplan so,dass das Feedback des Menschen berücksichtigt ."""), + agent=moderator, + expected_output="Finale Version des tabellarischen Ablaufplans für eine spannende Religionsstunde", + context=[task3], + ) + + # Establishing the crew with a hierarchical process + project_crew = Crew( + tasks=[task1, task2, task3, task4], # Tasks to be delegated and executed under the manager's supervision + agents=[theologe, religionswissenschaftler, moderator], + manager_llm=llm, + process=Process.sequential, # Specifies the hierarchical management approach + memory=True, + name="Religionsunterrichtsentwickelerrunde", + verbose=True, + ) + + result = project_crew.kickoff() + #print(result) + + chat_interface.send("## Gemeinsames Ergebnis\n"+result, user="assistant", respond=False) + + +chat_interface = pn.chat.ChatInterface(callback=callback) +chat_interface.send("Beschreibe dein Unterrichttsvorhaben!", user="System", respond=False) +chat_interface.servable() + +#StartCrew('Teufel') \ No newline at end of file diff --git a/panel_test.py b/panel_test.py new file mode 100644 index 0000000..49001e0 --- /dev/null +++ b/panel_test.py @@ -0,0 +1,17 @@ +# start with the following comando: panel serve panel_test.py + +import panel as pn + +pn.extension(design="material") + +def callback(contents: str, user: str, instance: pn.chat.ChatInterface): + message = f"Echoing {user}: {contents}" + return message + +chat_interface = pn.chat.ChatInterface(callback=callback) +chat_interface.send( + "Enter a message in the TextInput below and receive an echo!", + user="System", + respond=False, +) +chat_interface.servable() \ No newline at end of file diff --git a/reli-chat-ai-panel.py b/reli-chat-ai-panel.py new file mode 100644 index 0000000..2d7b04e --- /dev/null +++ b/reli-chat-ai-panel.py @@ -0,0 +1,146 @@ +# start with the following comando: panel serve chat-panel.py + +import os +import platform + + +# Environment Variablen importieren +from dotenv import load_dotenv +load_dotenv() + +from crewai import Crew, Process, Agent, Task +from langchain_openai import ChatOpenAI + +from langchain_core.callbacks import BaseCallbackHandler +from typing import TYPE_CHECKING, Any, Dict, Optional + +from langchain.agents import load_tools +#human = load_tools(["human"]) + +# pip install panel +import panel as pn +pn.extension(design="material") + + + +import threading + +from crewai.agents import CrewAgentExecutor +import time + +def custom_ask_human_input(self, final_answer: dict) -> str: + + global user_input + + prompt = self._i18n.slice("getting_input").format(final_answer=final_answer) + + chat_interface.send(prompt, user="Lehrkraft", respond=False) + + while user_input == None: + time.sleep(1) + + human_comments = user_input + user_input = None + + return human_comments + + +CrewAgentExecutor._ask_human_input = custom_ask_human_input + +user_input = None +initiate_chat_task_created = False + +def initiate_chat(message): + + global initiate_chat_task_created + # Indicate that the task has been created + initiate_chat_task_created = True + + StartCrew(message) + +def callback(contents: str, user: str, instance: pn.chat.ChatInterface): + + global initiate_chat_task_created + global user_input + + if not initiate_chat_task_created: + thread = threading.Thread(target=initiate_chat, args=(contents,)) + thread.start() + + else: + user_input = contents + +avators = {"Writer":"https://cdn-icons-png.flaticon.com/512/320/320336.png", + "Reviewer":"https://cdn-icons-png.freepik.com/512/9408/9408201.png"} + +class MyCustomHandler(BaseCallbackHandler): + + + def __init__(self, agent_name: str) -> None: + self.agent_name = agent_name + + def on_chain_start( + self, serialized: Dict[str, Any], inputs: Dict[str, Any], **kwargs: Any + ) -> None: + """Print out that we are entering a chain.""" + + chat_interface.send(inputs['input'], user=BaseCallbackHandler, respond=False) + + def on_chain_end(self, outputs: Dict[str, Any], **kwargs: Any) -> None: + """Print out that we finished a chain.""" + + chat_interface.send(outputs['output'], user=self.agent_name, avatar=avators[self.agent_name], respond=False) + +llm = ChatOpenAI(model="gpt-3.5-turbo-0125") +#llm = ChatOpenAI(model="gpt-4") + +writer = Agent( + + role='Theologische Inhalte entwickeln', + backstory='''Langjähriger Theologieprofessor mit Spezialisierung auf historisch-kritische Bibelinterpretation''', + goal="Verständnis für biblische Texte und christliche Lehren fördern.", + llm=llm, + callbacks=[MyCustomHandler("Thelogical Content Developer")], +) +reviewer = Agent( + role='Interreligiösen Dialog fördern', + backstory='''Religionswissenschaftler mit internationaler Erfahrung im Dialog zwischen Weltreligionen.''', + goal="Förderung von ethischer Argumentation und philosophischem Denken", + llm=llm, + callbacks=[MyCustomHandler("Religious Dialogue Promoter")], + allow_delegation=True +) + +def StartCrew(prompt): + + task1 = Task( + description=f"""Entwickeln Sie einen Unterrichtsplan zum Thema {prompt}. """, + agent=writer, + expected_output="Unterrichtsplan mit relevante theologischen Perspektiven und zeitgemäßen Methoden." + ) + + task2 = Task( + description=("Entwickeln Sie zusammen mit Ihren Kollegen an einen Unterrichtsplan unter Berücksichtigung der religionswissenschaftlicher und interreligiöser Aspekte"), + agent=reviewer, + expected_output="Kollaborativ entwickelter Unterrichtsplan", + human_input=True, + allow_delegation=True + + ) + # Establishing the crew with a hierarchical process + project_crew = Crew( + tasks=[task1, task2], # Tasks to be delegated and executed under the manager's supervision + agents=[writer, reviewer], + manager_llm=llm, + language="de", + process=Process.hierarchical # Specifies the hierarchical management approach + ) + + result = project_crew.kickoff() + + chat_interface.send("## Final Result\n"+result, user="assistant", respond=False) + + +chat_interface = pn.chat.ChatInterface(callback=callback) +chat_interface.send("Beschreibe dein Unterrichttsvorhaben!", user="System", respond=False) +chat_interface.servable() \ No newline at end of file diff --git a/reli.py b/reli.py new file mode 100644 index 0000000..675bced --- /dev/null +++ b/reli.py @@ -0,0 +1,118 @@ +# start with the following comando: panel serve chat-panel.py + +import os +import platform + + +# Environment Variablen importieren +from dotenv import load_dotenv +load_dotenv() + + +from crewai import Crew, Process, Agent, Task +from langchain_openai import ChatOpenAI + +from langchain_core.callbacks import BaseCallbackHandler +from typing import TYPE_CHECKING, Any, Dict, Optional + +def user_input_callback(content): + input("Bitte geben Sie Ihr Feedback zur Unterrichtsstunde ein: ") + + +llm = ChatOpenAI(model="gpt-3.5-turbo-0125") + +theologe = Agent( + name="Theologe", + role='Theologische Inhalte entwickeln', + backstory='''Langjähriger Theologieprofessor mit Spezialisierung auf historisch-kritische Bibelinterpretation''', + goal="Verständnis für biblische Texte und christliche Lehren fördern.", + llm=llm, + allow_delegation=False, + verbose=True +) +religionswissenschaftler = Agent( + name="Religionswissenschaftler", + role='Interreligiösen Dialog fördern', + backstory='''Religionswissenschaftler mit internationaler Erfahrung im Dialog zwischen Weltreligionen.''', + goal="Förderung von ethischer Argumentation und philosophischem Denken", + llm=llm, + allow_delegation=False, + verbose=True, +) +ethiker = Agent( + name="Ethiker", + role='Ethiker', + backstory='''Ethiker mit Schwerpunkt auf angewandter Ethik''', + goal="Förderung von ethischer Argumentation und philosophischem Denken", + llm=llm, + allow_delegation=False, + verbose=True, +) + +moderator = Agent( + name="Moderator", + role='Generiert einen minutiösen Verlaufsplan für eine Stunde Religionsunterricht', + backstory='''Methoden und Didaktik Enthusiast mit besonderem Interesse am religionsbezogener Bildung.''', + goal="Entwicklung von perfekten Unterrichtsstunden für den Religionsunterricht.", + llm=llm, + allow_delegation=True, + verbose=True, + +) + + + +def StartCrew(prompt): + + task1 = Task( + description=f"""Entwickeln Sie Unterrichtsideen auf deutsch zum Thema {prompt} """, + agent=theologe, + expected_output="Kurze Liste mit Unterrichtsideen mit relevante theologischen Perspektiven und zeitgemäßen Methoden in deutscher Sprache.", + + ) + + task2 = Task( + description=("""Prüfen Sie die Unterrichtsiddeen Ihrer Kollegen und ergänzsen Sie diese vor allem aus Ihrer religionswissenschaftlichen Perspektive. + Ergänzen Sie die Unterrichtsideen um Aspekte des interreligiösen Dialogs und angemessener Methoden."""), + agent=religionswissenschaftler, + expected_output="Feedback und Ergänzungsvorschläge zu den Unterrichtsideen.", + context=[task1], + ) + + task3 = Task( + description=("""Erstellen Sie aus dem Gesprächverlauf einen finalen Ablaufplan für den Unterricht auf deutsch. + Versichern Sie sich, dass sowohl theologische als auch religionswissenschaftliche Aspekte berücksichtigt wurden. + Stellen Sie sicher, dass der interreligiöse Dialog und zeitgemäße Methoden im Unterrichtsplan enthalten sind. + Wenn das Ergebniss Ihrer Meinung nach gut ist, legen Sie das Ergebnis + einem Menschen zur Prüfung vor. + Make sure to check with a human if the draft is good before finalizing your answer.! + """), + agent=moderator, + expected_output="Ein perfekter Ablaufplan für den Unterricht in tabellarischer Form auf deutsch.", + context=[task1, task2], + human_input=True, + callback=user_input_callback, + ) + task4 = Task( + description=("""Nehmen sie Argumente aus dem menschlichen Feedback auf und ändern sie den Plan entsprechend."""), + agent=moderator, + expected_output="Das Feedback berücksichtigender überarbeiteter tabellarischer Ablauf.", + context=[task3], + ) + + # Establishing the crew with a hierarchical process + project_crew = Crew( + tasks=[task1, task2, task3, task4], # Tasks to be delegated and executed under the manager's supervision + agents=[theologe, religionswissenschaftler, moderator], + manager_llm=llm, + process=Process.sequential, # Specifies the hierarchical management approach + memory=False, + name="Religionsunterrichtsentwickelerrunde", + verbose=True + ) + + result = project_crew.kickoff() + print(result) + + +StartCrew('10 Gebote') \ No newline at end of file