david-oplatka's picture
Reorganize Files
757fbed
raw
history blame
7.14 kB
from markdown_it import MarkdownIt
from mdit_py_plugins import front_matter
from reactpy import component, html
from utils import wait_message
def markdown_to_html(markdown_text):
md = (
MarkdownIt("commonmark", {"breaks": True, "html": True})
.use(front_matter.front_matter_plugin)
)
return md.render(markdown_text)
@component
def MarkdownRenderer(content):
html_content = markdown_to_html(content)
return html.div(
{
"style": {
"fontFamily": "Arial",
"color": "#49454F",
"fontSize": "14px",
},
"dangerouslySetInnerHTML": {"__html": html_content}
}
)
@component
def ExamplePrompts(examples, send_example, first_turn):
example_questions = [example.strip() for example in examples.split(";")] if examples else []
def create_prompt_button(question):
return html.button(
{
"style": {
"backgroundColor": "#FFFFFF",
"borderWidth": "1px",
"borderColor": "#65558F",
"borderRadius": "20px",
"padding": "5px 7px",
"margin": "5px",
"cursor": "pointer",
"color": "#21005D",
"fontSize": "13px",
},
"type": "button",
"onClick": lambda _: send_example(question),
},
question
)
if first_turn:
return html.div(
{
"style": {
"display": "flex",
"transform": "translate(4%, 100%)",
"flexDirection": "column",
"justifyContent": "center",
"width": "90%",
}
},
html.p(
{
"style": {
"fontSize": "16px",
"fontFamily": "Arial",
"color": "#49454F",
"marginBottom": "5px",
"transform": "translateX(3%)",
"textAlign": "left",
}
},
"Queries to try:"
),
html.div(
{
"style": {
"display": "flex",
"flexWrap": "wrap",
"justifyContent": "center",
}
},
*[create_prompt_button(q) for q in example_questions]
)
)
return None
@component
def ChatMessage(user, message):
return html.div(
{
"style": {
"display": "flex",
"width": "75%",
"transform": "translateX(20%)",
"justifyContent": "flex-end" if user == "human" else "flex-start",
"margin": "20px 0px 10px 0px"
}
},
html.div(
{
"style": {
"maxWidth": "50%",
"padding": "0px 15px 0px 10px",
"borderRadius": "15px",
"backgroundColor": "#E8DEF8" if user == "human" else "#ECE6F0",
"color": "#000000",
}
},
MarkdownRenderer(message)
)
)
@component
def Logs(messages, log_entries, show_logs, set_show_logs, show_logs_button):
if (len(messages) > 0) and (len(log_entries) > 0) and (messages[-1]["message"] != wait_message) and (show_logs_button):
if not show_logs:
return html.div(
{
"style": {
"display": "flex",
"transform": "translateX(75%)",
"width": "20%",
"margin": "0px",
}
},
html.button(
{
"style": {
"position": "flex",
"background": "none",
"color": "#757575",
"border": "none",
"cursor": "pointer",
"fontFamily": "Arial",
"fontSize": "14px",
},
"type": "button",
"onClick": lambda _: set_show_logs(True)
},
"Show Logs"
)
)
else:
return html.div(
{
"style": {
"display": "flex",
"transform": "translateX(20%)",
"border": "2px solid #e2dfdf",
"borderRadius": "10px",
"width": "75%",
}
},
html.div(
[
html.p(
{
"style": {
"fontSize": "14px",
"marginLeft": "10px",
}
},
entry
) for entry in log_entries
],
html.button(
{
"style": {
"position": "flex",
"background": "none",
"color": "#757575",
"border": "none",
"cursor": "pointer",
"fontFamily": "Arial",
"fontSize": "14px",
"marginBottom": "10px",
"marginLeft": "5px",
},
"type": "button",
"onClick": lambda _: set_show_logs(False)
},
"Hide Logs"
)
)
)
return None
@component
def ChatUI(messages, first_turn, examples, send_example, log_entries, show_logs, set_show_logs, show_logs_button, collapsed):
def render_chat_content():
if first_turn:
return ExamplePrompts(examples, send_example, first_turn)
else:
return [ChatMessage(msg["user"], msg["message"]) for msg in messages]
return html.div(
{
"style": {
"display": "flex",
"flexDirection": "column",
"padding": "10px",
"backgroundColor": "#F4F1F4",
"overflowY": "auto",
"height": f"calc(100vh - {265 if collapsed else 335}px)",
"marginBottom": "15px",
"paddingBottom": "15px",
},
},
render_chat_content(),
Logs(messages, log_entries, show_logs, set_show_logs, show_logs_button)
)