docs(.gitignore/README/QUICKSTART): 更新文档和忽略配置 - 添加IDE配置、日志和数据文件到.gitignore - 重构QUICKSTART.md,提供Docker Compose和本地开发两种部署方式 - 更新README.md,优化项目介绍和架构说明 - 移除旧的agent.py和backend.py文件 ```
This commit is contained in:
94
frontend/frontend.py
Normal file
94
frontend/frontend.py
Normal file
@@ -0,0 +1,94 @@
|
||||
"""
|
||||
Streamlit 前端 - 支持模型选择
|
||||
"""
|
||||
|
||||
# 标准库
|
||||
import uuid
|
||||
|
||||
# 第三方库
|
||||
import requests
|
||||
import streamlit as st
|
||||
|
||||
# 后端 API 地址(端口 8001)
|
||||
API_URL = "http://localhost:8001/chat"
|
||||
|
||||
st.set_page_config(page_title="AI 个人助手", page_icon="🤖")
|
||||
st.title("🤖 个人生活与数据分析助手")
|
||||
|
||||
# 模型选项(与后端支持的模型名称一致)
|
||||
MODEL_OPTIONS = {
|
||||
"zhipu": "智谱 GLM-4.7-Flash(在线)",
|
||||
"local": "本地 vLLM(Gemma-4)"
|
||||
}
|
||||
|
||||
# 初始化会话状态
|
||||
if "messages" not in st.session_state:
|
||||
st.session_state.messages = []
|
||||
if "thread_id" not in st.session_state:
|
||||
st.session_state.thread_id = str(uuid.uuid4())
|
||||
if "selected_model" not in st.session_state:
|
||||
st.session_state.selected_model = "zhipu"
|
||||
|
||||
# 侧边栏:模型选择和会话管理
|
||||
with st.sidebar:
|
||||
st.header("⚙️ 设置")
|
||||
|
||||
# 模型选择
|
||||
selected_model_key = st.selectbox(
|
||||
"选择大模型",
|
||||
options=list(MODEL_OPTIONS.keys()),
|
||||
format_func=lambda x: MODEL_OPTIONS[x],
|
||||
index=0
|
||||
)
|
||||
st.session_state.selected_model = selected_model_key
|
||||
|
||||
# 会话信息显示
|
||||
st.write(f"当前会话 ID: `{st.session_state.thread_id[:8]}...`")
|
||||
|
||||
# 新会话按钮
|
||||
if st.button("🔄 新会话"):
|
||||
st.session_state.thread_id = str(uuid.uuid4())
|
||||
st.session_state.messages = []
|
||||
st.rerun()
|
||||
|
||||
# 显示历史消息
|
||||
for msg in st.session_state.messages:
|
||||
with st.chat_message(msg["role"]):
|
||||
st.markdown(msg["content"])
|
||||
|
||||
# 用户输入
|
||||
if prompt := st.chat_input("请输入您的问题..."):
|
||||
# 显示用户消息
|
||||
with st.chat_message("user"):
|
||||
st.markdown(prompt)
|
||||
st.session_state.messages.append({"role": "user", "content": prompt})
|
||||
|
||||
# 调用后端 API(携带模型参数)
|
||||
with st.chat_message("assistant"):
|
||||
with st.spinner("思考中..."):
|
||||
try:
|
||||
response = requests.post(
|
||||
API_URL,
|
||||
json={
|
||||
"message": prompt,
|
||||
"thread_id": st.session_state.thread_id,
|
||||
"model": st.session_state.selected_model
|
||||
},
|
||||
timeout=60
|
||||
)
|
||||
response.raise_for_status()
|
||||
data = response.json()
|
||||
reply = data["reply"]
|
||||
model_used = data["model_used"]
|
||||
|
||||
# 显示回复
|
||||
st.markdown(reply)
|
||||
|
||||
# 显示使用的模型(小字提示)
|
||||
st.caption(f"🤖 使用模型: {MODEL_OPTIONS.get(model_used, model_used)}")
|
||||
|
||||
st.session_state.messages.append({"role": "assistant", "content": reply})
|
||||
except Exception as e:
|
||||
error_msg = f"请求失败: {e}"
|
||||
st.error(error_msg)
|
||||
st.session_state.messages.append({"role": "assistant", "content": error_msg})
|
||||
Reference in New Issue
Block a user