Files
ailine/frontend/frontend.py
root ebbd73ddf0
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代理访问方式的说明
```
2026-04-14 01:44:55 +08:00

99 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
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": "本地 vLLMGemma-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})