Spaces:
Running
Running
import solara | |
import time | |
import random | |
from typing import List | |
from typing_extensions import TypedDict | |
def GithubAvatar(name: str, handle: str, img: str): | |
with solara.v.Html(tag="a", attributes={"href": f"https://github.com/{handle}/", "target": "_blank"}): | |
with solara.v.ListItem(class_="pa-0"): | |
with solara.v.ListItemAvatar(color="grey darken-3"): | |
solara.v.Img( | |
class_="elevation-6", | |
src=img, | |
) | |
with solara.v.ListItemContent(): | |
solara.v.ListItemTitle(children=["By " + name]) | |
# Streamed response emulator | |
def response_generator(): | |
response = random.choice( | |
[ | |
"Hello! How can I assist you today?", | |
"Hey there! If you have any questions or need help with something, feel free to ask.", | |
] | |
) | |
for word in response.split(): | |
yield word + " " | |
time.sleep(0.05) | |
class MessageDict(TypedDict): | |
role: str | |
content: str | |
messages: solara.Reactive[List[MessageDict]] = solara.reactive([]) | |
def add_chunk_to_ai_message(chunk: str): | |
messages.value = [ | |
*messages.value[:-1], | |
{ | |
"role": "assistant", | |
"content": messages.value[-1]["content"] + chunk, | |
}, | |
] | |
def Page(): | |
title = "StreamBot" | |
with solara.Head(): | |
solara.Title(f"{title}") | |
with solara.Sidebar(): | |
solara.Markdown(f"#{title}") | |
GithubAvatar( | |
"Alonso Silva Allende", | |
"alonsosilvaallende", | |
"https://avatars.githubusercontent.com/u/30263736?v=4", | |
) | |
with solara.Column(align="center"): | |
user_message_count = len([m for m in messages.value if m["role"] == "user"]) | |
def send(message): | |
messages.value = [ | |
*messages.value, | |
{"role": "user", "content": message}, | |
] | |
def response(message): | |
messages.value = [*messages.value, {"role": "assistant", "content": ""}] | |
for chunk in response_generator(): | |
add_chunk_to_ai_message(chunk) | |
def result(): | |
if messages.value !=[]: response(messages.value[-1]["content"]) | |
result = solara.lab.use_task(result, dependencies=[user_message_count]) # type: ignore | |
with solara.Column(align="center"): | |
with solara.lab.ChatBox(style={"position": "fixed", "overflow-y": "scroll", "scrollbar-width": "none", "-ms-overflow-style": "none", "top": "4.5rem", "bottom": "10rem", "width": "60%"}): | |
for item in messages.value: | |
with solara.lab.ChatMessage( | |
user=item["role"] == "user", | |
name="StreamBot" if item["role"] == "assistant" else "User", | |
avatar_background_color="#33cccc" if item["role"] == "assistant" else "#ff991f", | |
border_radius="20px", | |
): | |
solara.Markdown(item["content"]) | |
solara.lab.ChatInput(send_callback=send, style={"position": "fixed", "bottom": "3rem", "width": "60%"}) | |