This commit is contained in:
yueye 2026-01-07 15:29:01 +08:00
parent 758785e57b
commit 35771a9a60
2 changed files with 53 additions and 34 deletions

Binary file not shown.

87
app.py
View File

@ -4,6 +4,7 @@ Multi-Agent Decision Workshop - 主应用
""" """
import streamlit as st import streamlit as st
import os import os
import base64
from dotenv import load_dotenv from dotenv import load_dotenv
# 加载环境变量 # 加载环境变量
@ -197,6 +198,23 @@ with st.sidebar:
on_change=save_current_config on_change=save_current_config
) )
# 页面背景图片(全局)
bg_file = st.file_uploader("页面背景图片(可选)", type=['png', 'jpg', 'jpeg', 'gif'], key='page_bg_uploader')
if bg_file:
# 保存到 assets 并在 session_state 中保存 data url 用于注入样式
saved_path = st.session_state.storage.save_asset(bg_file)
st.session_state.bg_image_path = saved_path
try:
buf = bg_file.getbuffer()
except Exception:
buf = bg_file.read()
# detect mime
ext = (bg_file.name.split('.')[-1].lower() if hasattr(bg_file, 'name') and bg_file.name else 'png')
mime = 'image/png' if ext == 'png' else ('image/gif' if ext == 'gif' else 'image/jpeg')
data_url = f"data:{mime};base64,{base64.b64encode(buf).decode()}"
st.session_state.bg_image_data_url = data_url
st.success("页面背景已上传并保存")
st.divider() st.divider()
# 模式选择 # 模式选择
@ -275,9 +293,23 @@ with st.sidebar:
del st.session_state.custom_agents[agent_id] del st.session_state.custom_agents[agent_id]
st.rerun() st.rerun()
# 注入全局页面背景样式(如果已上传)
if st.session_state.get("bg_image_data_url"):
st.markdown(
f"""<style>
.stApp {{
background-image: url('{st.session_state.get('bg_image_data_url')}');
background-size: cover;
background-position: center;
background-attachment: fixed;
}}
</style>""",
unsafe_allow_html=True
)
# ==================== 主界面逻辑 ==================== # ==================== 主界面逻辑 ====================
if mode == "Deep Research": if st.session_state.mode == "Deep Research":
st.title("🧪 Multi-Model Council V4") st.title("🧪 Multi-Model Council V4")
st.markdown("*多模型智囊团:自定义 N 个专家进行多轮对话讨论,最后由最后一位专家决策*") st.markdown("*多模型智囊团:自定义 N 个专家进行多轮对话讨论,最后由最后一位专家决策*")
@ -312,7 +344,6 @@ if mode == "Deep Research":
}) })
research_context = st.text_area("补充背景 (可选)", placeholder="任何额外的背景信息...", height=80) research_context = st.text_area("补充背景 (可选)", placeholder="任何额外的背景信息...", height=80)
research_image = st.file_uploader("上传背景图片(可选)", type=['png', 'jpg', 'jpeg', 'gif'], key='research_bg')
start_research_btn = st.button("🚀 开始多模型协作", type="primary", disabled=not research_topic) start_research_btn = st.button("🚀 开始多模型协作", type="primary", disabled=not research_topic)
@ -320,16 +351,14 @@ if mode == "Deep Research":
st.session_state.research_started = True st.session_state.research_started = True
st.session_state.research_output = "" st.session_state.research_output = ""
st.session_state.research_steps_output = [] st.session_state.research_steps_output = []
# 如果上传了背景图片,保存到 assets # 使用全局页面背景(若已上传)
research_bg_path = None research_bg_path = st.session_state.get("bg_image_path")
if research_image: if st.session_state.get("bg_image_data_url"):
research_bg_path = st.session_state.storage.save_asset(research_image) try:
if research_bg_path: st.markdown("**页面背景预览**")
st.success("背景图片已上传并保存") st.image(st.session_state.get("bg_image_data_url"), use_column_width=True)
try: except Exception:
st.image(research_image, caption="已上传背景图片预览", use_column_width=True) pass
except Exception:
pass
manager = ResearchManager( manager = ResearchManager(
api_key=api_key, api_key=api_key,
@ -418,7 +447,7 @@ if mode == "Deep Research":
st.divider() st.divider()
elif mode == "Debate Workshop": elif st.session_state.mode == "Debate Workshop":
# ==================== 原始 Debate UI 逻辑 ==================== # ==================== 原始 Debate UI 逻辑 ====================
st.title("🎭 多 Agent 决策工作坊") st.title("🎭 多 Agent 决策工作坊")
st.markdown("*让多个 AI 角色从不同视角辩论,帮助你做出更全面的决策*") st.markdown("*让多个 AI 角色从不同视角辩论,帮助你做出更全面的决策*")
@ -451,7 +480,7 @@ elif mode == "Debate Workshop":
placeholder="提供更多上下文信息,如:\n- 当前状况\n- 已有的资源和限制\n- 相关数据和事实", placeholder="提供更多上下文信息,如:\n- 当前状况\n- 已有的资源和限制\n- 相关数据和事实",
height=100 height=100
) )
context_image = st.file_uploader("上传背景图片(可选)", type=['png', 'jpg', 'jpeg', 'gif'], key='debate_bg') # 页面背景请使用侧边栏的“页面背景图片”上传控件进行设置(全局)
context = context if 'context' in dir() else "" context = context if 'context' in dir() else ""
with col2: with col2:
@ -570,20 +599,14 @@ elif mode == "Debate Workshop":
model=ag_model model=ag_model
) )
# 如果在界面上传了背景图片,自动保存到 assets # 使用全局页面背景(若已上传)
debate_bg_path = None debate_bg_path = st.session_state.get("bg_image_path")
try: if st.session_state.get("bg_image_data_url"):
if 'context_image' in locals() and context_image: try:
debate_bg_path = st.session_state.storage.save_asset(context_image) st.markdown("**页面背景预览**")
if debate_bg_path: st.image(st.session_state.get("bg_image_data_url"), use_column_width=True)
st.success("背景图片已上传并保存") except Exception:
try: pass
st.image(context_image, caption="已上传背景图片预览", use_column_width=True)
except Exception:
pass
except Exception:
# ignore upload errors but continue
debate_bg_path = None
debate_manager = DebateManager(llm_client) debate_manager = DebateManager(llm_client)
@ -628,11 +651,7 @@ elif mode == "Debate Workshop":
"round": current_round "round": current_round
}) })
st.divider() st.divider()
elif event["type"] == "debate_end":
st.session_state.debate_finished = True
st.success("✅ 辩论结束!正在生成决策报告...")
# 生成报告 # 生成报告
if st.session_state.debate_finished: if st.session_state.debate_finished:
report_generator = ReportGenerator(llm_client) report_generator = ReportGenerator(llm_client)
@ -661,7 +680,7 @@ elif mode == "Debate Workshop":
"rounds": max_rounds, "rounds": max_rounds,
"agents": selected_agents, "agents": selected_agents,
"language": output_language, "language": output_language,
**({"background_image": debate_bg_path} if debate_bg_path else {}) **({"background_image": st.session_state.get("bg_image_path")} if st.session_state.get("bg_image_path") else {})
} }
) )
st.toast("✅ 记录已保存到历史档案") st.toast("✅ 记录已保存到历史档案")