diff --git a/__pycache__/app.cpython-312.pyc b/__pycache__/app.cpython-312.pyc new file mode 100644 index 0000000..b73177c Binary files /dev/null and b/__pycache__/app.cpython-312.pyc differ diff --git a/app.py b/app.py index 852fff3..553ef42 100644 --- a/app.py +++ b/app.py @@ -4,6 +4,7 @@ Multi-Agent Decision Workshop - 主应用 """ import streamlit as st import os +import base64 from dotenv import load_dotenv # 加载环境变量 @@ -197,6 +198,23 @@ with st.sidebar: 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() # 模式选择 @@ -275,9 +293,23 @@ with st.sidebar: del st.session_state.custom_agents[agent_id] st.rerun() +# 注入全局页面背景样式(如果已上传) +if st.session_state.get("bg_image_data_url"): + st.markdown( + f"""""", + unsafe_allow_html=True + ) + # ==================== 主界面逻辑 ==================== -if mode == "Deep Research": +if st.session_state.mode == "Deep Research": st.title("🧪 Multi-Model Council V4") st.markdown("*多模型智囊团:自定义 N 个专家进行多轮对话讨论,最后由最后一位专家决策*") @@ -312,7 +344,6 @@ if mode == "Deep Research": }) 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) @@ -320,16 +351,14 @@ if mode == "Deep Research": st.session_state.research_started = True st.session_state.research_output = "" st.session_state.research_steps_output = [] - # 如果上传了背景图片,保存到 assets - research_bg_path = None - if research_image: - research_bg_path = st.session_state.storage.save_asset(research_image) - if research_bg_path: - st.success("背景图片已上传并保存") - try: - st.image(research_image, caption="已上传背景图片预览", use_column_width=True) - except Exception: - pass + # 使用全局页面背景(若已上传) + research_bg_path = st.session_state.get("bg_image_path") + if st.session_state.get("bg_image_data_url"): + try: + st.markdown("**页面背景预览**") + st.image(st.session_state.get("bg_image_data_url"), use_column_width=True) + except Exception: + pass manager = ResearchManager( api_key=api_key, @@ -418,7 +447,7 @@ if mode == "Deep Research": st.divider() -elif mode == "Debate Workshop": +elif st.session_state.mode == "Debate Workshop": # ==================== 原始 Debate UI 逻辑 ==================== st.title("🎭 多 Agent 决策工作坊") st.markdown("*让多个 AI 角色从不同视角辩论,帮助你做出更全面的决策*") @@ -451,7 +480,7 @@ elif mode == "Debate Workshop": placeholder="提供更多上下文信息,如:\n- 当前状况\n- 已有的资源和限制\n- 相关数据和事实", height=100 ) - context_image = st.file_uploader("上传背景图片(可选)", type=['png', 'jpg', 'jpeg', 'gif'], key='debate_bg') + # 页面背景请使用侧边栏的“页面背景图片”上传控件进行设置(全局) context = context if 'context' in dir() else "" with col2: @@ -570,20 +599,14 @@ elif mode == "Debate Workshop": model=ag_model ) - # 如果在界面上传了背景图片,自动保存到 assets - debate_bg_path = None - try: - if 'context_image' in locals() and context_image: - debate_bg_path = st.session_state.storage.save_asset(context_image) - if debate_bg_path: - st.success("背景图片已上传并保存") - try: - st.image(context_image, caption="已上传背景图片预览", use_column_width=True) - except Exception: - pass - except Exception: - # ignore upload errors but continue - debate_bg_path = None + # 使用全局页面背景(若已上传) + debate_bg_path = st.session_state.get("bg_image_path") + if st.session_state.get("bg_image_data_url"): + try: + st.markdown("**页面背景预览**") + st.image(st.session_state.get("bg_image_data_url"), use_column_width=True) + except Exception: + pass debate_manager = DebateManager(llm_client) @@ -628,11 +651,7 @@ elif mode == "Debate Workshop": "round": current_round }) st.divider() - - elif event["type"] == "debate_end": - st.session_state.debate_finished = True - st.success("✅ 辩论结束!正在生成决策报告...") - + # 生成报告 if st.session_state.debate_finished: report_generator = ReportGenerator(llm_client) @@ -661,7 +680,7 @@ elif mode == "Debate Workshop": "rounds": max_rounds, "agents": selected_agents, "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("✅ 记录已保存到历史档案")