Files
SillyTavern_replica/frontend/components/chat_window.py

53 lines
2.1 KiB
Python

import streamlit as st
import requests
def render_chat_window(backend_url):
st.subheader("💬 流式对话")
# 聊天历史显示
chat_container = st.container()
with chat_container:
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# 如果有关联图片,也可以在这里显示
if "images" in message:
for img_url in message["images"]:
st.image(img_url, width=200)
# 输入框
if prompt := st.chat_input("输入消息..."):
# 1. 显示用户消息
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)
# 2. 调用后端流式接口
with st.chat_message("assistant"):
message_placeholder = st.empty()
full_response = ""
# 模拟流式接收 (实际需使用 requests stream 或 websocket)
# POST /api/role/stream
try:
# 伪代码示例:
# with requests.post(f"{backend_url}/api/chat/stream", json={"message": prompt}, stream=True) as r:
# for chunk in r.iter_content(chunk_size=None):
# if chunk:
# full_response += chunk.decode('utf-8')
# message_placeholder.markdown(full_response + "▌")
# 演示用静态延迟
import time
response_text = "这是一个流式响应的演示。后端正在处理您的请求..."
for char in response_text:
full_response += char
message_placeholder.markdown(full_response + "")
time.sleep(0.05)
message_placeholder.markdown(full_response)
st.session_state.messages.append({"role": "assistant", "content": full_response})
except Exception as e:
st.error(f"连接后端失败: {e}")