Some checks failed
构建并部署 AI Agent 服务 / deploy (push) Failing after 1m17s
docs(quickstart): 更新快速开始文档以支持Nginx反向代理配置 - 修改环境变量配置方式,从直接创建.env文件改为复制模板文件 - 添加必需和可选配置项的详细说明 - 更新Docker Compose启动命令以使用正确的路径 - 增加Nginx反向代理访问方式的说明 - 为本地开发模式添加额外的数据库配置说明 fix(readme): 修正部署说明中的环境变量配置方法 - 将硬编码的环境变量配置改为使用模板文件复制方式 - 更新Docker Compose启动命令路径 - 补充Nginx反向代理访问说明 - 修正数据库配置注意事项 feat(backend): 支持从环境变量读取数据库连接配置 - 添加os模块导入 - 修改DB_URI配置逻辑,优先从环境变量读取 - 适配Docker和本地开发环境的不同数据库连接地址 refactor(docker): 优化Docker Compose配置支持Nginx代理 - 限制后端端口仅本机访问 - 修改前端API URL为相对路径,通过Nginx代理访问 - 限制前端端口仅本机访问 refactor(frontend): 适配Nginx反向代理后端API调用 - 将硬编码的后端API地址改为相对路径 - 支持通过Nginx代理转发请求到后端服务 chore(scripts): 更新启动脚本中的访问地址提示信息 - 修改前端启动成功后的访问地址提示 - 添加Nginx代理访问方式的说明 ```
99 lines
3.0 KiB
Python
99 lines
3.0 KiB
Python
"""
|
||
Streamlit 前端 - 支持模型选择
|
||
"""
|
||
|
||
# 标准库
|
||
import uuid
|
||
|
||
# 第三方库
|
||
import requests
|
||
import streamlit as st
|
||
|
||
|
||
# 原来的硬编码,本地测试
|
||
# API_URL = "http://115.190.121.151:8001/chat"
|
||
|
||
# 改为相对路径(由 Nginx 代理转发)
|
||
API_URL = "/api/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})
|