MFLF-Demo / src /chatbot /graph_manager.py
Pisek
feat: add logging for user input in graph manager and improve UI
03b3d1d
# graph_manager.py
# graph definition and compilation
from langgraph.graph import StateGraph, START, END
from langgraph.checkpoint.memory import MemorySaver
from nodes import (
State,
speaker_chatbot_node,
tool_node
)
from langgraph.prebuilt import tools_condition
from form_management.form_management import Form
import sys
from IPython.display import Image, display
import logging
class GraphManager:
def __init__(self):
self.graph = None
self.init_graph()
# user input ->
# if user intent is clear -> speaker form management -> audit review and feedback -> speaker generate response based on feedback
# if user intent is unclear -> speaker generate response for clarification
def init_graph(self):
graph_memory = MemorySaver()
graph_builder = StateGraph(State)
graph_builder.add_node("speaker_chatbot", speaker_chatbot_node)
graph_builder.add_node("tools", tool_node)
graph_builder.add_conditional_edges(
"speaker_chatbot",
tools_condition,
)
# Any time a tool is called, we return to the chatbot to decide the next step
graph_builder.add_edge("tools", "speaker_chatbot")
graph_builder.add_edge(START, "speaker_chatbot")
graph_builder.add_edge("speaker_chatbot", END)
self.graph = graph_builder.compile(checkpointer=graph_memory)
def save_graph_image(self):
"""
Save the graph as a PNG image.
"""
image = Image(self.graph.get_graph().draw_mermaid_png())
with open("graph.png", "wb") as f:
f.write(image.data)
def process_user_input(self, user_input, session_id):
"""
Process the user input and update the graph state.
"""
config = {"configurable": {"thread_id": session_id}}
input_dict = {
"messages": [("user", user_input)],
"session_id": session_id
}
for event in self.graph.stream(
input_dict,
config,
stream_mode="values"
):
event["messages"][-1].pretty_print()
snapshot = self.graph.get_state(config)
return snapshot[0]["messages"][-1].content
def user_input_handler(user_input, session_id):
logging.info(user_input)
response = graph_manager.process_user_input(user_input, session_id)
return response
graph_manager = GraphManager()
graph_manager.save_graph_image()
# # Example usage
# response = graph_manager.process_user_input(
# "hi",
# 1
# )
# response = graph_manager.process_user_input(
# r"C:\Users\Gavin\Desktop\hello-earth\data\jpeg_raw_data\bill\กองทุนพัฒนาบ้านห้วยทราย อ.แม่ออน จ.เชียงใหม่_page-0005.jpg",
# 1
# )
# response = graph_manager.process_user_input(
# r"C:\Users\Gavin\Desktop\hello-earth\data\jpeg_raw_data\bill\กองทุนพัฒนาบ้านห้วยทราย อ.แม่ออน จ.เชียงใหม่_page-0004.jpg",
# 1
# )
# response = graph_manager.process_user_input(
# "For the irrigation systems.",
# 1
# )
# response = graph_manager.process_user_input(
# "My name is actually Oya Punpun. Please correct this.",
# 1
# )
# response = graph_manager.process_user_input(
# "My middle name is Baba.",
# 1
# )
# response = graph_manager.process_user_input(
# r"C:\Users\Gavin\Desktop\hello-earth\data\jpeg_raw_data\bill\กองทุนพัฒนาบ้านห้วยทราย อ.แม่ออน จ.เชียงใหม่_page-0004.jpg",
# 1
# )