Files
xcq/app_stream.py

57 lines
2.2 KiB
Python
Raw Normal View History

2026-03-21 12:03:13 +08:00
import streamlit as st
import os
from dotenv import load_dotenv
from DeepseekAi import get_response_stream # 导入流式函数
# 第一步:加载.env配置必须放在最前面
load_dotenv()
API_KEY = os.getenv('api_key')
BASE_URL = os.getenv('base_url')
# 检查配置完整性
if not API_KEY or not BASE_URL:
st.error("❌ 配置缺失:请检查.env文件中的 api_key 和 base_url 是否填写正确!")
st.stop()
# 页面标题
st.title("智聊机器人")
# 初始化会话状态
if "messages" not in st.session_state:
st.session_state["messages"] = [{"role": "assistant", "content": "你好,我是智聊机器人,有什么可以帮助你的么?"}]
# 显示历史对话
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.write(message["content"])
# 处理用户输入
user_input = st.chat_input("请输入你的问题:")
if user_input:
# 1. 添加用户消息到会话状态并显示
st.session_state.messages.append({"role": "user", "content": user_input})
with st.chat_message("user"):
st.write(user_input)
# 2. 流式输出AI回复
full_response = "" # 存储完整回复
with st.chat_message("assistant"):
# 初始化思考状态赋值给status变量用于后续修改
with st.status(label="🤔 正在思考中...", expanded=True) as status:
response_placeholder = st.empty() # 只创建一次占位符
# 逐段获取流式内容
for chunk in get_response_stream(st.session_state.messages, api_key=API_KEY, base_url=BASE_URL):
full_response += chunk
# 实时更新占位符,加光标模拟打字效果
response_placeholder.markdown(full_response + "|")
# 核心修改:思考完成后更新状态文本
status.update(label="✅ 思考结束", state="complete", expanded=False)
# 3. 最终展示完整回复保留你原有逻辑未修改DOM渲染
st.markdown(full_response)
# 4. 把完整回复存入会话状态
st.session_state.messages.append({"role": "assistant", "content": full_response})