53 lines
2.1 KiB
Python
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}") |