david-oplatka's picture
Add refs for rerendering components
684067e
import asyncio
import threading
import time
from reactpy import component, html, hooks, use_effect, run
from reactpy.backend.starlette import configure
from starlette.applications import Starlette
from vectara_agentic.agent import AgentStatusType
from agent import initialize_agent, get_agent_config
from header import Header
from footer import Footer
from chatbox import ChatBox
from chatui import ChatUI
from utils import wait_message
@component
def App():
# State hooks
show_logs, set_show_logs = hooks.use_state(False)
show_logs_button, set_show_logs_button = hooks.use_state(False)
collapsed, set_collapsed = hooks.use_state(False) # Whether or not the footer is collapsed
first_turn, set_first_turn = hooks.use_state(True)
messages, set_messages = hooks.use_state([])
message, set_message = hooks.use_state("")
def use_agent_logger():
agent_log_entries, set_agent_log_entries = hooks.use_state([])
def reset_log_entries():
set_agent_log_entries([])
def add_log_entry(new_log_entry):
set_agent_log_entries(lambda previous_entries: previous_entries + [new_log_entry])
return agent_log_entries, add_log_entry, reset_log_entries
# Logger setup
log_entries, add_log_entry, reset_log_entries = use_agent_logger()
def update_func(status_type: AgentStatusType, msg: str):
if status_type != AgentStatusType.AGENT_UPDATE:
output = f"{status_type.value} - {msg}"
add_log_entry(output)
# Agent setup
cfg, _ = hooks.use_state(get_agent_config())
agent, _ = hooks.use_state(initialize_agent(cfg, update_func))
def start_over(event=None):
set_messages([])
set_first_turn(True)
def display_message(new_messages):
if first_turn:
set_first_turn(False)
set_messages(messages + list(new_messages))
async def chat_response(user_message):
response = await asyncio.to_thread(agent.chat, user_message)
return response
async def send_message_async(sent_message):
response = await chat_response(sent_message)
set_messages(messages[:-1])
display_message(
[
{"user": "human", "message": sent_message},
{"user": "bot", "message": response},
]
)
set_show_logs_button(True)
def send_message(event=None):
if message.strip():
sent_message = message
set_message("")
set_show_logs_button(False)
set_show_logs(False)
reset_log_entries()
display_message([{"user": "human", "message": sent_message}])
display_message([{"user": "bot", "message": wait_message}])
asyncio.create_task(send_message_async(sent_message))
def send_example(ex_prompt):
if ex_prompt.strip():
sent_message = ex_prompt
set_message("")
reset_log_entries()
display_message([{"user": "human", "message": sent_message}])
display_message([{"user": "bot", "message": wait_message}])
asyncio.create_task(send_message_async(sent_message))
return html.div(
{
"style": {
"backgroundColor": "#F4F1F4",
"margin": "0",
"padding": "0",
"minHeight": "100vh",
"display": "flex",
"boxSizing": "border-box",
"flexDirection": "column",
"overflowX": "hidden",
"position": "relative",
}
},
html.head(
html.style(
"""
body {
margin: 0;
padding: 0;
}
"""
)
),
Header(
demo_name=cfg['demo_name'],
short_description=cfg['short_description'],
extra_info=cfg['extra_info'],
start_over=start_over
),
ChatUI(
messages=messages,
first_turn=first_turn,
examples=cfg['examples'],
send_example=send_example,
log_entries=log_entries,
show_logs=show_logs,
set_show_logs=set_show_logs,
show_logs_button=show_logs_button,
collapsed=collapsed
),
ChatBox(message, set_message, send_message, collapsed),
Footer(collapsed, set_collapsed),
)
app = Starlette()
configure(app, App)
# if __name__ == "__main__":
# run(App)