Spaces:
Running
Running
| import gradio as gr | |
| import modelscope_studio.components.antd as antd | |
| import modelscope_studio.components.antdx as antdx | |
| import modelscope_studio.components.base as ms | |
| def get_bubble_items(count): | |
| result = [] | |
| for i in range(count): | |
| is_ai = i % 2 != 0 | |
| content = 'Mock AI content. ' * 20 if is_ai else f'Mock User content `{i}`.' | |
| result.append({ | |
| "role": "ai" if is_ai else "user", | |
| "content": content, | |
| "key": i - 1 | |
| }) | |
| return result | |
| def add_bubble(state_value): | |
| state_value["history_count"] = state_value["history_count"] + 1 | |
| return gr.update(value=state_value), gr.update( | |
| items=get_bubble_items(state_value["history_count"])) | |
| with gr.Blocks() as demo: | |
| with ms.Application(): | |
| state = gr.State({"history_count": 3}) | |
| with antdx.XProvider(): | |
| antd.Typography.Paragraph( | |
| "Preset Bubble list. Support auto scroll. Use roles to set default properties of Bubble." | |
| ) | |
| with antd.Flex(gap="small", vertical=True): | |
| with antd.Flex(gap="small", | |
| elem_style=dict(alignSelf="flex-end")): | |
| add_bubble_btn = antd.Button("Add Bubble") | |
| scroll_btn = antd.Button("Scroll To First") | |
| with antdx.Bubble.List(items=get_bubble_items(3), | |
| elem_style=dict(maxHeight=300), | |
| elem_id="bubble-list") as bubble_list: | |
| # Define Roles | |
| with ms.Slot("roles"): | |
| with antdx.Bubble.List.Role( | |
| role="ai", | |
| placement="start", | |
| typing=dict(step=5, interval=20), | |
| elem_style=dict(maxWidth=600)): | |
| with ms.Slot("avatar"): | |
| with antd.Avatar(elem_style=dict( | |
| backgroundColor="#fde3cf")): | |
| with ms.Slot("icon"): | |
| antd.Icon("UserOutlined") | |
| # use messageRender to render markdown content | |
| with ms.Slot( | |
| "messageRender", | |
| params_mapping="""content => content"""): | |
| ms.Markdown() | |
| with antdx.Bubble.List.Role( | |
| role="user", | |
| placement="end", | |
| ): | |
| with ms.Slot("avatar"): | |
| with antd.Avatar(elem_style=dict( | |
| backgroundColor="#87d068")): | |
| with ms.Slot("icon"): | |
| antd.Icon("UserOutlined") | |
| with ms.Slot( | |
| "messageRender", | |
| params_mapping="(content) => content"): | |
| ms.Markdown() | |
| add_bubble_btn.click(fn=add_bubble, | |
| inputs=[state], | |
| outputs=[state, bubble_list]) | |
| scroll_btn.click(fn=None, | |
| js="""() => { | |
| const bubbleList = document.getElementById("bubble-list"); | |
| bubbleList.scrollTo({ top:0, behavior:'smooth' }); | |
| }""") | |
| if __name__ == "__main__": | |
| demo.queue().launch() | |