Spaces:
Running
Running
Update Chatbot template
Browse files
components/antdx/suggestion/demos/block.py
CHANGED
|
@@ -28,7 +28,7 @@ with gr.Blocks() as demo:
|
|
| 28 |
with ms.Application():
|
| 29 |
with antdx.XProvider():
|
| 30 |
antd.Typography.Paragraph(
|
| 31 |
-
"Set `block` to display in a whole row.
|
| 32 |
)
|
| 33 |
with antdx.Suggestion(
|
| 34 |
items=items,
|
|
|
|
| 28 |
with ms.Application():
|
| 29 |
with antdx.XProvider():
|
| 30 |
antd.Typography.Paragraph(
|
| 31 |
+
"Set `block` to display in a whole row. `extra` can be used to configure additional information."
|
| 32 |
)
|
| 33 |
with antdx.Suggestion(
|
| 34 |
items=items,
|
layout_templates/chatbot/demos/app.py
CHANGED
|
@@ -20,6 +20,8 @@ client = OpenAI(
|
|
| 20 |
|
| 21 |
model = "Qwen/Qwen2.5-VL-72B-Instruct"
|
| 22 |
|
|
|
|
|
|
|
| 23 |
# =========== Configuration
|
| 24 |
|
| 25 |
DEFAULT_PROMPTS = [{
|
|
@@ -111,7 +113,8 @@ class Gradio_Events:
|
|
| 111 |
}] + [{
|
| 112 |
"type": "image_url",
|
| 113 |
"image_url": image_to_base64(file["path"])
|
| 114 |
-
} for file in item["content"]["files"]
|
|
|
|
| 115 |
})
|
| 116 |
elif item["role"] == "assistant":
|
| 117 |
messages.append(item)
|
|
@@ -307,7 +310,7 @@ class Gradio_Events:
|
|
| 307 |
value=state_value)
|
| 308 |
|
| 309 |
@staticmethod
|
| 310 |
-
def
|
| 311 |
conversation_key = e._data["component"]["conversationKey"]
|
| 312 |
history = state_value["conversations_history"][
|
| 313 |
state_value["conversation_id"]]
|
|
@@ -324,6 +327,37 @@ class Gradio_Events:
|
|
| 324 |
# custom code
|
| 325 |
return gr.update(items=history), gr.update(value=state_value)
|
| 326 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 327 |
@staticmethod
|
| 328 |
def select_suggestion(sender_value, e: gr.EventData):
|
| 329 |
return gr.update(value=sender_value[:-1] + e._data["payload"][0])
|
|
@@ -400,6 +434,30 @@ class Gradio_Events:
|
|
| 400 |
e._data["payload"][0]), gr.update(
|
| 401 |
open=True), gr.update(value=state_value)
|
| 402 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 403 |
|
| 404 |
css = """
|
| 405 |
#chatbot {
|
|
@@ -464,13 +522,15 @@ def logo():
|
|
| 464 |
ms.Span("Chatbot")
|
| 465 |
|
| 466 |
|
| 467 |
-
with gr.Blocks(css=css) as demo:
|
| 468 |
state = gr.State({
|
| 469 |
"conversations_history": {},
|
| 470 |
"conversations": [],
|
| 471 |
"conversation_id": "",
|
|
|
|
| 472 |
"attachments_open": False,
|
| 473 |
})
|
|
|
|
| 474 |
with ms.Application(), antdx.XProvider(
|
| 475 |
theme=DEFAULT_THEME, locale=DEFAULT_LOCALE), ms.AutoLoading():
|
| 476 |
with antd.Row(gutter=[20, 20], wrap=False, elem_id="chatbot"):
|
|
@@ -592,6 +652,7 @@ with gr.Blocks(css=css) as demo:
|
|
| 592 |
copy_btn: {
|
| 593 |
copyable: { text: typeof bubble.content === 'string' ? bubble.content : bubble.content?.text, tooltips: false },
|
| 594 |
},
|
|
|
|
| 595 |
delete_btn: { conversationKey: bubble.key, disabled: bubble.meta.disabled },
|
| 596 |
};
|
| 597 |
}"""):
|
|
@@ -611,6 +672,14 @@ with gr.Blocks(css=css) as demo:
|
|
| 611 |
variant="text"):
|
| 612 |
with ms.Slot("icon"):
|
| 613 |
antd.Icon("CheckOutlined")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 614 |
with antd.Popconfirm(
|
| 615 |
title="Delete the message",
|
| 616 |
description=
|
|
@@ -660,8 +729,9 @@ with gr.Blocks(css=css) as demo:
|
|
| 660 |
copy_btn: {
|
| 661 |
copyable: { text: bubble.content, tooltips: false },
|
| 662 |
},
|
| 663 |
-
|
| 664 |
delete_btn: { conversationKey: bubble.key, disabled: bubble.meta.disabled },
|
|
|
|
| 665 |
like_btn: {
|
| 666 |
conversationKey: bubble.key,
|
| 667 |
color: bubble.meta?.action === 'like' ? 'primary' : 'default',
|
|
@@ -714,23 +784,30 @@ with gr.Blocks(css=css) as demo:
|
|
| 714 |
with ms.Slot("icon"):
|
| 715 |
antd.Icon("DislikeOutlined")
|
| 716 |
with antd.Popconfirm(
|
| 717 |
-
title=
|
| 718 |
-
"Regenerating the message",
|
| 719 |
description=
|
| 720 |
-
"
|
| 721 |
ok_button_props=dict(
|
| 722 |
danger=True),
|
| 723 |
-
as_item="
|
| 724 |
-
) as
|
| 725 |
with antd.Button(
|
| 726 |
value=None,
|
| 727 |
size="small",
|
| 728 |
color="default",
|
| 729 |
variant="text",
|
| 730 |
-
as_item="
|
| 731 |
):
|
| 732 |
with ms.Slot("icon"):
|
| 733 |
antd.Icon("SyncOutlined")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 734 |
with antd.Popconfirm(
|
| 735 |
title="Delete the message",
|
| 736 |
description=
|
|
@@ -839,8 +916,30 @@ with gr.Blocks(css=css) as demo:
|
|
| 839 |
):
|
| 840 |
antd.Icon(
|
| 841 |
"CloudUploadOutlined")
|
| 842 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 843 |
# Events Handler
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 844 |
add_conversation_btn.click(fn=Gradio_Events.new_chat,
|
| 845 |
inputs=[state],
|
| 846 |
outputs=[conversations, chatbot, state])
|
|
@@ -875,6 +974,16 @@ with gr.Blocks(css=css) as demo:
|
|
| 875 |
chatbot_dislike_btn.click(fn=Gradio_Events.dislike,
|
| 876 |
inputs=[state],
|
| 877 |
outputs=[chatbot, state])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 878 |
gr.on(triggers=[
|
| 879 |
chatbot_delete_popconfirm.confirm, user_delete_popconfirm.confirm
|
| 880 |
],
|
|
@@ -882,8 +991,8 @@ with gr.Blocks(css=css) as demo:
|
|
| 882 |
inputs=[state],
|
| 883 |
outputs=[chatbot, state])
|
| 884 |
|
| 885 |
-
regenerating_event =
|
| 886 |
-
fn=Gradio_Events.
|
| 887 |
inputs=[state],
|
| 888 |
outputs=[chatbot, state
|
| 889 |
]).then(fn=Gradio_Events.preprocess_submit(clear_input=False),
|
|
|
|
| 20 |
|
| 21 |
model = "Qwen/Qwen2.5-VL-72B-Instruct"
|
| 22 |
|
| 23 |
+
save_history = False
|
| 24 |
+
|
| 25 |
# =========== Configuration
|
| 26 |
|
| 27 |
DEFAULT_PROMPTS = [{
|
|
|
|
| 113 |
}] + [{
|
| 114 |
"type": "image_url",
|
| 115 |
"image_url": image_to_base64(file["path"])
|
| 116 |
+
} for file in item["content"]["files"]
|
| 117 |
+
if os.path.exists(file["path"])]
|
| 118 |
})
|
| 119 |
elif item["role"] == "assistant":
|
| 120 |
messages.append(item)
|
|
|
|
| 310 |
value=state_value)
|
| 311 |
|
| 312 |
@staticmethod
|
| 313 |
+
def regenerate_message(state_value, e: gr.EventData):
|
| 314 |
conversation_key = e._data["component"]["conversationKey"]
|
| 315 |
history = state_value["conversations_history"][
|
| 316 |
state_value["conversation_id"]]
|
|
|
|
| 327 |
# custom code
|
| 328 |
return gr.update(items=history), gr.update(value=state_value)
|
| 329 |
|
| 330 |
+
@staticmethod
|
| 331 |
+
def edit_message(state_value, e: gr.EventData):
|
| 332 |
+
conversation_key = e._data["component"]["conversationKey"]
|
| 333 |
+
history = state_value["conversations_history"][
|
| 334 |
+
state_value["conversation_id"]]
|
| 335 |
+
index = -1
|
| 336 |
+
for i, conversation in enumerate(history):
|
| 337 |
+
if conversation["key"] == conversation_key:
|
| 338 |
+
index = i
|
| 339 |
+
break
|
| 340 |
+
if index == -1:
|
| 341 |
+
return gr.skip()
|
| 342 |
+
state_value["editing_message_index"] = index
|
| 343 |
+
text = ''
|
| 344 |
+
if isinstance(history[index]["content"], str):
|
| 345 |
+
text = history[index]["content"]
|
| 346 |
+
else:
|
| 347 |
+
text = history[index]["content"]["text"]
|
| 348 |
+
return gr.update(value=text), gr.update(value=state_value)
|
| 349 |
+
|
| 350 |
+
@staticmethod
|
| 351 |
+
def confirm_edit_message(edit_textarea_value, state_value):
|
| 352 |
+
history = state_value["conversations_history"][
|
| 353 |
+
state_value["conversation_id"]]
|
| 354 |
+
message = history[state_value["editing_message_index"]]
|
| 355 |
+
if isinstance(message["content"], str):
|
| 356 |
+
message["content"] = edit_textarea_value
|
| 357 |
+
else:
|
| 358 |
+
message["content"]["text"] = edit_textarea_value
|
| 359 |
+
return gr.update(items=history), gr.update(value=state_value)
|
| 360 |
+
|
| 361 |
@staticmethod
|
| 362 |
def select_suggestion(sender_value, e: gr.EventData):
|
| 363 |
return gr.update(value=sender_value[:-1] + e._data["payload"][0])
|
|
|
|
| 434 |
e._data["payload"][0]), gr.update(
|
| 435 |
open=True), gr.update(value=state_value)
|
| 436 |
|
| 437 |
+
@staticmethod
|
| 438 |
+
def close_modal():
|
| 439 |
+
return gr.update(open=False)
|
| 440 |
+
|
| 441 |
+
@staticmethod
|
| 442 |
+
def open_modal():
|
| 443 |
+
return gr.update(open=True)
|
| 444 |
+
|
| 445 |
+
@staticmethod
|
| 446 |
+
def update_browser_state(state_value):
|
| 447 |
+
|
| 448 |
+
return gr.update(value=dict(
|
| 449 |
+
conversations=state_value["conversations"],
|
| 450 |
+
conversations_history=state_value["conversations_history"]))
|
| 451 |
+
|
| 452 |
+
@staticmethod
|
| 453 |
+
def apply_browser_state(browser_state_value, state_value):
|
| 454 |
+
state_value["conversations"] = browser_state_value["conversations"]
|
| 455 |
+
state_value["conversations_history"] = browser_state_value[
|
| 456 |
+
"conversations_history"]
|
| 457 |
+
return gr.update(
|
| 458 |
+
items=browser_state_value["conversations"]), gr.update(
|
| 459 |
+
value=state_value)
|
| 460 |
+
|
| 461 |
|
| 462 |
css = """
|
| 463 |
#chatbot {
|
|
|
|
| 522 |
ms.Span("Chatbot")
|
| 523 |
|
| 524 |
|
| 525 |
+
with gr.Blocks(css=css, fill_width=True) as demo:
|
| 526 |
state = gr.State({
|
| 527 |
"conversations_history": {},
|
| 528 |
"conversations": [],
|
| 529 |
"conversation_id": "",
|
| 530 |
+
"editing_message_index": -1,
|
| 531 |
"attachments_open": False,
|
| 532 |
})
|
| 533 |
+
|
| 534 |
with ms.Application(), antdx.XProvider(
|
| 535 |
theme=DEFAULT_THEME, locale=DEFAULT_LOCALE), ms.AutoLoading():
|
| 536 |
with antd.Row(gutter=[20, 20], wrap=False, elem_id="chatbot"):
|
|
|
|
| 652 |
copy_btn: {
|
| 653 |
copyable: { text: typeof bubble.content === 'string' ? bubble.content : bubble.content?.text, tooltips: false },
|
| 654 |
},
|
| 655 |
+
edit_btn: { conversationKey: bubble.key, disabled: bubble.meta.disabled },
|
| 656 |
delete_btn: { conversationKey: bubble.key, disabled: bubble.meta.disabled },
|
| 657 |
};
|
| 658 |
}"""):
|
|
|
|
| 672 |
variant="text"):
|
| 673 |
with ms.Slot("icon"):
|
| 674 |
antd.Icon("CheckOutlined")
|
| 675 |
+
with antd.Button(value=None,
|
| 676 |
+
size="small",
|
| 677 |
+
color="default",
|
| 678 |
+
variant="text",
|
| 679 |
+
as_item="edit_btn"
|
| 680 |
+
) as user_edit_btn:
|
| 681 |
+
with ms.Slot("icon"):
|
| 682 |
+
antd.Icon("EditOutlined")
|
| 683 |
with antd.Popconfirm(
|
| 684 |
title="Delete the message",
|
| 685 |
description=
|
|
|
|
| 729 |
copy_btn: {
|
| 730 |
copyable: { text: bubble.content, tooltips: false },
|
| 731 |
},
|
| 732 |
+
regenerate_btn: { conversationKey: bubble.key, disabled: bubble.meta.disabled },
|
| 733 |
delete_btn: { conversationKey: bubble.key, disabled: bubble.meta.disabled },
|
| 734 |
+
edit_btn: { conversationKey: bubble.key, disabled: bubble.meta.disabled },
|
| 735 |
like_btn: {
|
| 736 |
conversationKey: bubble.key,
|
| 737 |
color: bubble.meta?.action === 'like' ? 'primary' : 'default',
|
|
|
|
| 784 |
with ms.Slot("icon"):
|
| 785 |
antd.Icon("DislikeOutlined")
|
| 786 |
with antd.Popconfirm(
|
| 787 |
+
title="Regenerate the message",
|
|
|
|
| 788 |
description=
|
| 789 |
+
"Regenerate the message will also delete all subsequent messages.",
|
| 790 |
ok_button_props=dict(
|
| 791 |
danger=True),
|
| 792 |
+
as_item="regenerate_btn"
|
| 793 |
+
) as chatbot_regenerate_popconfirm:
|
| 794 |
with antd.Button(
|
| 795 |
value=None,
|
| 796 |
size="small",
|
| 797 |
color="default",
|
| 798 |
variant="text",
|
| 799 |
+
as_item="regenerate_btn",
|
| 800 |
):
|
| 801 |
with ms.Slot("icon"):
|
| 802 |
antd.Icon("SyncOutlined")
|
| 803 |
+
with antd.Button(value=None,
|
| 804 |
+
size="small",
|
| 805 |
+
color="default",
|
| 806 |
+
variant="text",
|
| 807 |
+
as_item="edit_btn"
|
| 808 |
+
) as chatbot_edit_btn:
|
| 809 |
+
with ms.Slot("icon"):
|
| 810 |
+
antd.Icon("EditOutlined")
|
| 811 |
with antd.Popconfirm(
|
| 812 |
title="Delete the message",
|
| 813 |
description=
|
|
|
|
| 916 |
):
|
| 917 |
antd.Icon(
|
| 918 |
"CloudUploadOutlined")
|
| 919 |
+
# Modals
|
| 920 |
+
with antd.Modal(title="Edit Message",
|
| 921 |
+
open=False,
|
| 922 |
+
centered=True,
|
| 923 |
+
width="60%") as edit_modal:
|
| 924 |
+
edit_textarea = antd.Input.Textarea(auto_size=dict(minRows=2,
|
| 925 |
+
maxRows=6),
|
| 926 |
+
elem_style=dict(width="100%"))
|
| 927 |
# Events Handler
|
| 928 |
+
if save_history:
|
| 929 |
+
browser_state = gr.BrowserState(
|
| 930 |
+
{
|
| 931 |
+
"conversations_history": {},
|
| 932 |
+
"conversations": [],
|
| 933 |
+
},
|
| 934 |
+
storage_key="ms_chatbot_storage")
|
| 935 |
+
state.change(fn=Gradio_Events.update_browser_state,
|
| 936 |
+
inputs=[state],
|
| 937 |
+
outputs=[browser_state])
|
| 938 |
+
|
| 939 |
+
demo.load(fn=Gradio_Events.apply_browser_state,
|
| 940 |
+
inputs=[browser_state, state],
|
| 941 |
+
outputs=[conversations, state])
|
| 942 |
+
|
| 943 |
add_conversation_btn.click(fn=Gradio_Events.new_chat,
|
| 944 |
inputs=[state],
|
| 945 |
outputs=[conversations, chatbot, state])
|
|
|
|
| 974 |
chatbot_dislike_btn.click(fn=Gradio_Events.dislike,
|
| 975 |
inputs=[state],
|
| 976 |
outputs=[chatbot, state])
|
| 977 |
+
gr.on(triggers=[user_edit_btn.click, chatbot_edit_btn.click],
|
| 978 |
+
fn=Gradio_Events.edit_message,
|
| 979 |
+
inputs=[state],
|
| 980 |
+
outputs=[edit_textarea, state]).then(fn=Gradio_Events.open_modal,
|
| 981 |
+
outputs=[edit_modal])
|
| 982 |
+
edit_modal.ok(fn=Gradio_Events.confirm_edit_message,
|
| 983 |
+
inputs=[edit_textarea, state],
|
| 984 |
+
outputs=[chatbot, state]).then(fn=Gradio_Events.close_modal,
|
| 985 |
+
outputs=[edit_modal])
|
| 986 |
+
edit_modal.cancel(fn=Gradio_Events.close_modal, outputs=[edit_modal])
|
| 987 |
gr.on(triggers=[
|
| 988 |
chatbot_delete_popconfirm.confirm, user_delete_popconfirm.confirm
|
| 989 |
],
|
|
|
|
| 991 |
inputs=[state],
|
| 992 |
outputs=[chatbot, state])
|
| 993 |
|
| 994 |
+
regenerating_event = chatbot_regenerate_popconfirm.confirm(
|
| 995 |
+
fn=Gradio_Events.regenerate_message,
|
| 996 |
inputs=[state],
|
| 997 |
outputs=[chatbot, state
|
| 998 |
]).then(fn=Gradio_Events.preprocess_submit(clear_input=False),
|
layout_templates/coder_artifacts/demos/app.py
CHANGED
|
@@ -263,6 +263,8 @@ with gr.Blocks(css=css) as demo:
|
|
| 263 |
with antd.Flex(gap="small", wrap=True):
|
| 264 |
for example in EXAMPLES:
|
| 265 |
with antd.Card(
|
|
|
|
|
|
|
| 266 |
hoverable=True) as example_card:
|
| 267 |
antd.Card.Meta(
|
| 268 |
title=example['title'],
|
|
|
|
| 263 |
with antd.Flex(gap="small", wrap=True):
|
| 264 |
for example in EXAMPLES:
|
| 265 |
with antd.Card(
|
| 266 |
+
elem_style=dict(
|
| 267 |
+
flex="1 1 fit-content"),
|
| 268 |
hoverable=True) as example_card:
|
| 269 |
antd.Card.Meta(
|
| 270 |
title=example['title'],
|