{"repo": "ahijln/opendeekthing", "files": {"app.py": {"b60d915de84ebecddd17e30c445be7f33fff39e1": {"t": 1785674061.1772788, "n": 13968, "h": "df1bd10ccc5d5b2c", "c": "# app.py (修复重复代码版本)\n\nimport streamlit as st\nimport json\nimport os\nfrom datetime import datetime\n\n# 导入重构后的核心模块\nfrom conversation.manager import ConversationManager\nfrom user_configs import prompt_manager\nfrom user_configs.api_config_manager import APIConfigManager\nfrom utils.markdown_export import MarkdownExporter\n\n# --- 0. 页面基础配置 ---\nst.set_page_config(\n page_title=\"🚀 Deepseek Pro\",\n page_icon=\"🚀\",\n layout=\"wide\"\n)\n\n# --- 1. 初始化 & 状态管理 ---\n\ndef initialize_app():\n \"\"\"初始化应用状态\"\"\"\n if \"app_initialized\" in st.session_state:\n return\n\n # 初始化API配置管理器\n api_config_manager = APIConfigManager()\n \n # 步骤1: 确保默认提示模式存在\n prompt_manager.initialize_default_prompts()\n \n # 步骤2: 初始化会话状态\n st.session_state.manager = None\n st.session_state.api_config_manager = api_config_manager\n \n # 加载保存的API配置\n st.session_state.api_config = api_config_manager.load_config()\n \n # 初始化Prompt库相关状态\n st.session_state.prompt_page = 0\n st.session_state.editing_prompt_id = None\n \n # 动态加载可用的提示模式\n available_modes = prompt_manager.get_available_modes()\n st.session_state.available_modes = available_modes\n \n # 设置默认选中的模式\n st.session_state.current_prompt_mode_name = available_modes[0] if available_modes else \"新模式\"\n\n # 加载默认模式的配置\n st.session_state.current_prompt_config = prompt_manager.load_prompt_mode(st.session_state.current_prompt_mode_name)\n\n # 标记为已初始化\n st.session_state.app_initialized = True\n\n# 每次脚本重新运行时都调用初始化函数\ninitialize_app()\n\n# --- 2. 侧边栏 (控制中心) ---\n\nwith st.sidebar:\n st.title(\"🚀 Deepseek Plus\")\n st.caption(\"一个用于增强Deepseek功能的Prompt工具\")\n\n # API配置\n with st.expander(\"🔑 通用API配置\", expanded=False):\n # API Key输入 - 添加唯一的key\n api_key = st.text_input(\n \"API Key\", \n value=st.session_state.api_config.get('api_key', ''), \n type=\"password\", \n help=\"在此输入您的API密钥\",\n key=\"api_key_input\" # 添加唯一key\n )\n st.session_state.api_config['api_key'] = api_key\n \n # Base URL输入 - 添加唯一的key\n st.session_state.api_config['base_url'] = st.text_input(\n \"API Base URL\", \n value=st.session_state.api_config['base_url'], \n help=\"例如: https://api.deepseek.com\",\n key=\"base_url_input\" # 添加唯一key\n )\n \n # 模型选择\n model_options = [\"deepseek-chat\", \"deepseek-reasoner\"]\n current_model = st.session_state.api_config.get('model_name', 'deepseek-chat')\n if current_model not in model_options:\n current_model = model_options[0]\n \n st.session_state.api_config['model_name'] = st.selectbox(\n \"模型选择\",\n options=model_options,\n index=model_options.index(current_model),\n help=\"选择使用的模型\",\n key=\"model_select\" # 添加唯一key\n )\n \n # 温度设置\n st.session_state.api_config['temperature'] = st.slider(\n \"温度 (Temperature)\", \n 0.0, 2.0, \n st.session_state.api_config.get('temperature', 1.0),\n key=\"temperature_slider\" # 添加唯一key\n )\n \n # 最大Tokens设置\n st.session_state.api_config['max_tokens'] = st.slider(\n \"最大Tokens\", \n 256, 8192, \n st.session_state.api_config.get('max_tokens', 4096),\n key=\"max_tokens_slider\" # 添加唯一key\n )\n \n # 保存配置按钮\n if st.button(\"💾 保存API配置\", use_container_width=True, key=\"save_api_config\"):\n st.session_state.api_config_manager.save_config(st.session_state.api_config)\n st.toast(\"API配置已保存!\", icon=\"✅\")\n\n # 提示词模式管理\n with st.expander(\"🧠 提示词模式管理\", expanded=True):\n \n selected_mode = st.selectbox(\n \"选择或编辑模式\",\n options=st.session_state.available_modes,\n index=st.session_state.available_modes.index(st.session_state.current_prompt_mode_name) if st.session_state.current_prompt_mode_name in st.session_state.available_modes else 0,\n help=\"选择一个已保存的模式进行编辑或对话。\",\n key=\"mode_select\" # 添加唯一key\n )\n \n if selected_mode != st.session_state.current_prompt_mode_name:\n st.session_state.current_prompt_mode_name = selected_mode\n st.session_state.current_prompt_config = prompt_manager.load_prompt_mode(selected_mode)\n st.rerun()\n\n st.session_state.current_prompt_config['cognitive'] = st.text_area(\n \"认知架构 (Cognitive)\", \n value=st.session_state.current_prompt_config.get('cognitive', ''), \n height=150,\n key=\"cognitive_textarea\" # 添加唯一key\n )\n st.session_state.current_prompt_config['meta'] = st.text_area(\n \"元提示 (Meta)\", \n value=st.session_state.current_prompt_config.get('meta', ''), \n height=150,\n key=\"meta_textarea\" # 添加唯一key\n )\n st.session_state.current_prompt_config['system'] = st.text_area(\n \"系统提示 (System)\", \n value=st.session_state.current_prompt_config.get('system', ''), \n height=150,\n key=\"system_textarea\" # 添加唯一key\n )\n \n col1, col2 = st.columns(2)\n with col1:\n if st.button(\"💾 更新当前模式\", use_container_width=True, key=\"update_mode\"):\n prompt_manager.save_prompt_mode(st.session_state.current_prompt_mode_name, st.session_state.current_prompt_config)\n st.toast(f\"模式 '{st.session_state.current_prompt_mode_name}' 已更新!\", icon=\"✅\")\n \n with col2:\n new_mode_name = st.text_input(\n \"新模式名称...\", \n label_visibility=\"collapsed\", \n placeholder=\"输入新模式名称...\",\n key=\"new_mode_name\" # 添加唯一key\n )\n if st.button(\"✚ 另存为新模式\", use_container_width=True, key=\"save_as_new\") and new_mode_name:\n if f\"{new_mode_name}.json\" in os.listdir(\"user_configs\"):\n st.warning(f\"模式 '{new_mode_name}' 已存在。\")\n else:\n prompt_manager.save_prompt_mode(new_mode_name, st.session_state.current_prompt_config)\n st.session_state.available_modes = prompt_manager.get_available_modes()\n st.session_state.current_prompt_mode_name = new_mode_name\n st.toast(f\"新模式 '{new_mode_name}' 已创建!\", icon=\"🎉\")\n st.rerun()\n\n # 任务提示库管理\n with st.expander(\"📚 任务提示库管理\", expanded=False):\n # 获取Prompt字典\n prompt_dict = prompt_manager.get_prompt_dictionary()\n \n # 新建/编辑Prompt表单\n st.write(\"### 📝 新建/编辑 Prompt\")\n \n # 如果正在编辑,加载编辑的内容\n if st.session_state.editing_prompt_id:\n editing_prompt = next((p for p in prompt_dict if p['id'] == st.session_state.editing_prompt_id), None)\n if editing_prompt:\n default_title = editing_prompt['title']\n default_content = editing_prompt['content']\n else:\n st.session_state.editing_prompt_id = None\n default_title = \"\"\n default_content = \"\"\n else:\n default_title = \"\"\n default_content = \"\"\n \n prompt_title = st.text_input(\n \"标题\", \n value=default_title, \n placeholder=\"输入Prompt标题...\",\n key=\"prompt_title_input\" # 添加唯一key\n )\n prompt_content = st.text_area(\n \"内容\", \n value=default_content, \n placeholder=\"输入Prompt内容...\", \n height=100,\n key=\"prompt_content_textarea\" # 添加唯一key\n )\n \n col1, col2, col3 = st.columns(3)\n with col1:\n if st.session_state.editing_prompt_id:\n if st.button(\"💾 更新\", use_container_width=True, key=\"update_prompt\"):\n if prompt_title and prompt_content:\n prompt_manager.update_prompt_entry(\n st.session_state.editing_prompt_id, \n prompt_title, \n prompt_content\n )\n st.session_state.editing_prompt_id = None\n st.toast(\"Prompt已更新!\", icon=\"✅\")\n st.rerun()\n else:\n if st.button(\"➕ 添加\", use_container_width=True, key=\"add_prompt\"):\n if prompt_title and prompt_content:\n prompt_manager.add_prompt_entry(prompt_title, prompt_content)\n st.toast(\"Prompt已添加!\", icon=\"✅\")\n st.rerun()\n \n with col2:\n if st.session_state.editing_prompt_id:\n if st.button(\"❌ 取消编辑\", use_container_width=True, key=\"cancel_edit\"):\n st.session_state.editing_prompt_id = None\n st.rerun()\n \n st.divider()\n \n # 显示Prompt列表\n st.write(\"### 📋 Prompt列表\")\n \n # 分页计算\n items_per_page = 10\n total_items = len(prompt_dict)\n total_pages = max(1, (total_items + items_per_page - 1) // items_per_page)\n \n # 确保当前页有效\n if st.session_state.prompt_page >= total_pages:\n st.session_state.prompt_page = max(0, total_pages - 1)\n \n # 获取当前页的项目\n start_idx = st.session_state.prompt_page * items_per_page\n end_idx = min(start_idx + items_per_page, total_items)\n current_page_prompts = prompt_dict[start_idx:end_idx]\n \n # 显示当前页的Prompt\n if current_page_prompts:\n for prompt in current_page_prompts:\n with st.container():\n col1, col2, col3, col4 = st.columns([5, 2, 1, 1])\n with col1:\n if st.button(\n f\"💬 {prompt['title']}\", \n key=f\"use_prompt_{prompt['id']}\", \n use_container_width=True,\n help=\"点击使用此Prompt\"\n ):\n # 将Prompt内容设置为待发送\n st.session_state.pending_prompt = prompt['content']\n st.rerun()\n \n with col2:\n st.caption(f\"更新: {prompt.get('updated', prompt['created'])[:10]}\")\n \n with col3:\n if st.button(\"✏️\", key=f\"edit_{prompt['id']}\", help=\"编辑\"):\n st.session_state.editing_prompt_id = prompt['id']\n st.rerun()\n \n with col4:\n if st.button(\"🗑️\", key=f\"delete_{prompt['id']}\", help=\"删除\"):\n prompt_manager.delete_prompt_entry(prompt['id'])\n st.toast(\"Prompt已删除!\", icon=\"🗑️\")\n st.rerun()\n else:\n st.info(\"暂无Prompt,请添加新的Prompt\")\n \n # 分页控制\n if total_pages > 1:\n col1, col2, col3 = st.columns([2, 3, 2])\n with col1:\n if st.button(\"⬅️ 上一页\", disabled=st.session_state.prompt_page == 0, key=\"prev_page\"):\n st.session_state.prompt_page -= 1\n st.rerun()\n with col2:\n st.write(f\"第 {st.session_state.prompt_page + 1} / {total_pages} 页\")\n with col3:\n if st.button(\"下一页 ➡️\", disabled=st.session_state.prompt_page >= total_pages - 1, key=\"next_page\"):\n st.session_state.prompt_page += 1\n st.rerun()\n\n # 对话历史与导出\n st.divider()\n st.header(\"📜 对话管理\")\n \n if st.button(\"🗑️ 开始新对话\", use_container_width=True, key=\"new_conversation\"):\n st.session_state.manager = None\n st.rerun()\n\n if st.session_state.manager and st.session_state.manager.get_history():\n md_content = MarkdownExporter._generate_markdown(\n messages=st.session_state.manager.get_history(),\n api_config=st.session_state.api_config,\n prompt_config=st.session_state.current_prompt_config\n )\n st.download_button(\n label=\"📥 下载对话 (Markdown)\",\n data=md_content,\n file_name=f\"conversation_{st.session_state.current_prompt_mode_name}_{datetime.now().strftime('%Y%m%d')}.md\",\n mime=\"text/markdown\",\n use_container_width=True,\n key=\"download_conversation\"\n )\n\n# --- 3. 主聊天界面 ---\n\nst.title(f\"对话模式: {st.session_state.current_prompt_mode_name}\")\n\n# 初始化对话管理器实例\nif st.session_state.manager is None:\n if not st.session_state.api_config.get(\"api_key\"):\n st.warning(\"欢迎使用!请在左侧侧边栏的\\\"通用API配置\\\"中输入您的API Key以开始对话。\")\n st.stop()\n \n st.session_state.manager = ConversationManager(\n api_config=st.session_state.api_config,\n prompt_config=st.session_state.current_prompt_config,\n prompt_mode_name=st.session_state.current_prompt_mode_name\n )\n st.session_state.manager.initialize()\n\n# 显示历史消息\nfor message in st.session_state.manager.get_history():\n if message[\"role\"] != \"system\":\n with st.chat_message(message[\"role\"]):\n st.markdown(message[\"content\"])\n\n# 检查是否有待发送的Prompt\nif hasattr(st.session_state, 'pending_prompt') and st.session_state.pending_prompt:\n prompt = st.session_state.pending_prompt\n st.session_state.pending_prompt = None # 清除待发送状态\n \n # 显示用户消息\n with st.chat_message(\"user\"):\n st.markdown(prompt)\n \n # 获取并显示助手回复\n with st.chat_message(\"assistant\"):\n response_stream = st.session_state.manager.chat_stream(prompt)\n st.write_stream(response_stream)\n \n st.rerun()\n\n# 正常的聊天输入\nif prompt := st.chat_input(\"请输入您的问题...\"):\n with st.chat_message(\"user\"):\n st.markdown(prompt)\n\n with st.chat_message(\"assistant\"):\n response_stream = st.session_state.manager.chat_stream(prompt)\n st.write_stream(response_stream)\n\n st.rerun()\n"}, "167c7d4246d1128cd01469dee9eda9eb9f5fd6a4": {"t": 1785758428.714967, "n": 13968, "h": "df1bd10ccc5d5b2c", "c": "# app.py (修复重复代码版本)\n\nimport streamlit as st\nimport json\nimport os\nfrom datetime import datetime\n\n# 导入重构后的核心模块\nfrom conversation.manager import ConversationManager\nfrom user_configs import prompt_manager\nfrom user_configs.api_config_manager import APIConfigManager\nfrom utils.markdown_export import MarkdownExporter\n\n# --- 0. 页面基础配置 ---\nst.set_page_config(\n page_title=\"🚀 Deepseek Pro\",\n page_icon=\"🚀\",\n layout=\"wide\"\n)\n\n# --- 1. 初始化 & 状态管理 ---\n\ndef initialize_app():\n \"\"\"初始化应用状态\"\"\"\n if \"app_initialized\" in st.session_state:\n return\n\n # 初始化API配置管理器\n api_config_manager = APIConfigManager()\n \n # 步骤1: 确保默认提示模式存在\n prompt_manager.initialize_default_prompts()\n \n # 步骤2: 初始化会话状态\n st.session_state.manager = None\n st.session_state.api_config_manager = api_config_manager\n \n # 加载保存的API配置\n st.session_state.api_config = api_config_manager.load_config()\n \n # 初始化Prompt库相关状态\n st.session_state.prompt_page = 0\n st.session_state.editing_prompt_id = None\n \n # 动态加载可用的提示模式\n available_modes = prompt_manager.get_available_modes()\n st.session_state.available_modes = available_modes\n \n # 设置默认选中的模式\n st.session_state.current_prompt_mode_name = available_modes[0] if available_modes else \"新模式\"\n\n # 加载默认模式的配置\n st.session_state.current_prompt_config = prompt_manager.load_prompt_mode(st.session_state.current_prompt_mode_name)\n\n # 标记为已初始化\n st.session_state.app_initialized = True\n\n# 每次脚本重新运行时都调用初始化函数\ninitialize_app()\n\n# --- 2. 侧边栏 (控制中心) ---\n\nwith st.sidebar:\n st.title(\"🚀 Deepseek Plus\")\n st.caption(\"一个用于增强Deepseek功能的Prompt工具\")\n\n # API配置\n with st.expander(\"🔑 通用API配置\", expanded=False):\n # API Key输入 - 添加唯一的key\n api_key = st.text_input(\n \"API Key\", \n value=st.session_state.api_config.get('api_key', ''), \n type=\"password\", \n help=\"在此输入您的API密钥\",\n key=\"api_key_input\" # 添加唯一key\n )\n st.session_state.api_config['api_key'] = api_key\n \n # Base URL输入 - 添加唯一的key\n st.session_state.api_config['base_url'] = st.text_input(\n \"API Base URL\", \n value=st.session_state.api_config['base_url'], \n help=\"例如: https://api.deepseek.com\",\n key=\"base_url_input\" # 添加唯一key\n )\n \n # 模型选择\n model_options = [\"deepseek-chat\", \"deepseek-reasoner\"]\n current_model = st.session_state.api_config.get('model_name', 'deepseek-chat')\n if current_model not in model_options:\n current_model = model_options[0]\n \n st.session_state.api_config['model_name'] = st.selectbox(\n \"模型选择\",\n options=model_options,\n index=model_options.index(current_model),\n help=\"选择使用的模型\",\n key=\"model_select\" # 添加唯一key\n )\n \n # 温度设置\n st.session_state.api_config['temperature'] = st.slider(\n \"温度 (Temperature)\", \n 0.0, 2.0, \n st.session_state.api_config.get('temperature', 1.0),\n key=\"temperature_slider\" # 添加唯一key\n )\n \n # 最大Tokens设置\n st.session_state.api_config['max_tokens'] = st.slider(\n \"最大Tokens\", \n 256, 8192, \n st.session_state.api_config.get('max_tokens', 4096),\n key=\"max_tokens_slider\" # 添加唯一key\n )\n \n # 保存配置按钮\n if st.button(\"💾 保存API配置\", use_container_width=True, key=\"save_api_config\"):\n st.session_state.api_config_manager.save_config(st.session_state.api_config)\n st.toast(\"API配置已保存!\", icon=\"✅\")\n\n # 提示词模式管理\n with st.expander(\"🧠 提示词模式管理\", expanded=True):\n \n selected_mode = st.selectbox(\n \"选择或编辑模式\",\n options=st.session_state.available_modes,\n index=st.session_state.available_modes.index(st.session_state.current_prompt_mode_name) if st.session_state.current_prompt_mode_name in st.session_state.available_modes else 0,\n help=\"选择一个已保存的模式进行编辑或对话。\",\n key=\"mode_select\" # 添加唯一key\n )\n \n if selected_mode != st.session_state.current_prompt_mode_name:\n st.session_state.current_prompt_mode_name = selected_mode\n st.session_state.current_prompt_config = prompt_manager.load_prompt_mode(selected_mode)\n st.rerun()\n\n st.session_state.current_prompt_config['cognitive'] = st.text_area(\n \"认知架构 (Cognitive)\", \n value=st.session_state.current_prompt_config.get('cognitive', ''), \n height=150,\n key=\"cognitive_textarea\" # 添加唯一key\n )\n st.session_state.current_prompt_config['meta'] = st.text_area(\n \"元提示 (Meta)\", \n value=st.session_state.current_prompt_config.get('meta', ''), \n height=150,\n key=\"meta_textarea\" # 添加唯一key\n )\n st.session_state.current_prompt_config['system'] = st.text_area(\n \"系统提示 (System)\", \n value=st.session_state.current_prompt_config.get('system', ''), \n height=150,\n key=\"system_textarea\" # 添加唯一key\n )\n \n col1, col2 = st.columns(2)\n with col1:\n if st.button(\"💾 更新当前模式\", use_container_width=True, key=\"update_mode\"):\n prompt_manager.save_prompt_mode(st.session_state.current_prompt_mode_name, st.session_state.current_prompt_config)\n st.toast(f\"模式 '{st.session_state.current_prompt_mode_name}' 已更新!\", icon=\"✅\")\n \n with col2:\n new_mode_name = st.text_input(\n \"新模式名称...\", \n label_visibility=\"collapsed\", \n placeholder=\"输入新模式名称...\",\n key=\"new_mode_name\" # 添加唯一key\n )\n if st.button(\"✚ 另存为新模式\", use_container_width=True, key=\"save_as_new\") and new_mode_name:\n if f\"{new_mode_name}.json\" in os.listdir(\"user_configs\"):\n st.warning(f\"模式 '{new_mode_name}' 已存在。\")\n else:\n prompt_manager.save_prompt_mode(new_mode_name, st.session_state.current_prompt_config)\n st.session_state.available_modes = prompt_manager.get_available_modes()\n st.session_state.current_prompt_mode_name = new_mode_name\n st.toast(f\"新模式 '{new_mode_name}' 已创建!\", icon=\"🎉\")\n st.rerun()\n\n # 任务提示库管理\n with st.expander(\"📚 任务提示库管理\", expanded=False):\n # 获取Prompt字典\n prompt_dict = prompt_manager.get_prompt_dictionary()\n \n # 新建/编辑Prompt表单\n st.write(\"### 📝 新建/编辑 Prompt\")\n \n # 如果正在编辑,加载编辑的内容\n if st.session_state.editing_prompt_id:\n editing_prompt = next((p for p in prompt_dict if p['id'] == st.session_state.editing_prompt_id), None)\n if editing_prompt:\n default_title = editing_prompt['title']\n default_content = editing_prompt['content']\n else:\n st.session_state.editing_prompt_id = None\n default_title = \"\"\n default_content = \"\"\n else:\n default_title = \"\"\n default_content = \"\"\n \n prompt_title = st.text_input(\n \"标题\", \n value=default_title, \n placeholder=\"输入Prompt标题...\",\n key=\"prompt_title_input\" # 添加唯一key\n )\n prompt_content = st.text_area(\n \"内容\", \n value=default_content, \n placeholder=\"输入Prompt内容...\", \n height=100,\n key=\"prompt_content_textarea\" # 添加唯一key\n )\n \n col1, col2, col3 = st.columns(3)\n with col1:\n if st.session_state.editing_prompt_id:\n if st.button(\"💾 更新\", use_container_width=True, key=\"update_prompt\"):\n if prompt_title and prompt_content:\n prompt_manager.update_prompt_entry(\n st.session_state.editing_prompt_id, \n prompt_title, \n prompt_content\n )\n st.session_state.editing_prompt_id = None\n st.toast(\"Prompt已更新!\", icon=\"✅\")\n st.rerun()\n else:\n if st.button(\"➕ 添加\", use_container_width=True, key=\"add_prompt\"):\n if prompt_title and prompt_content:\n prompt_manager.add_prompt_entry(prompt_title, prompt_content)\n st.toast(\"Prompt已添加!\", icon=\"✅\")\n st.rerun()\n \n with col2:\n if st.session_state.editing_prompt_id:\n if st.button(\"❌ 取消编辑\", use_container_width=True, key=\"cancel_edit\"):\n st.session_state.editing_prompt_id = None\n st.rerun()\n \n st.divider()\n \n # 显示Prompt列表\n st.write(\"### 📋 Prompt列表\")\n \n # 分页计算\n items_per_page = 10\n total_items = len(prompt_dict)\n total_pages = max(1, (total_items + items_per_page - 1) // items_per_page)\n \n # 确保当前页有效\n if st.session_state.prompt_page >= total_pages:\n st.session_state.prompt_page = max(0, total_pages - 1)\n \n # 获取当前页的项目\n start_idx = st.session_state.prompt_page * items_per_page\n end_idx = min(start_idx + items_per_page, total_items)\n current_page_prompts = prompt_dict[start_idx:end_idx]\n \n # 显示当前页的Prompt\n if current_page_prompts:\n for prompt in current_page_prompts:\n with st.container():\n col1, col2, col3, col4 = st.columns([5, 2, 1, 1])\n with col1:\n if st.button(\n f\"💬 {prompt['title']}\", \n key=f\"use_prompt_{prompt['id']}\", \n use_container_width=True,\n help=\"点击使用此Prompt\"\n ):\n # 将Prompt内容设置为待发送\n st.session_state.pending_prompt = prompt['content']\n st.rerun()\n \n with col2:\n st.caption(f\"更新: {prompt.get('updated', prompt['created'])[:10]}\")\n \n with col3:\n if st.button(\"✏️\", key=f\"edit_{prompt['id']}\", help=\"编辑\"):\n st.session_state.editing_prompt_id = prompt['id']\n st.rerun()\n \n with col4:\n if st.button(\"🗑️\", key=f\"delete_{prompt['id']}\", help=\"删除\"):\n prompt_manager.delete_prompt_entry(prompt['id'])\n st.toast(\"Prompt已删除!\", icon=\"🗑️\")\n st.rerun()\n else:\n st.info(\"暂无Prompt,请添加新的Prompt\")\n \n # 分页控制\n if total_pages > 1:\n col1, col2, col3 = st.columns([2, 3, 2])\n with col1:\n if st.button(\"⬅️ 上一页\", disabled=st.session_state.prompt_page == 0, key=\"prev_page\"):\n st.session_state.prompt_page -= 1\n st.rerun()\n with col2:\n st.write(f\"第 {st.session_state.prompt_page + 1} / {total_pages} 页\")\n with col3:\n if st.button(\"下一页 ➡️\", disabled=st.session_state.prompt_page >= total_pages - 1, key=\"next_page\"):\n st.session_state.prompt_page += 1\n st.rerun()\n\n # 对话历史与导出\n st.divider()\n st.header(\"📜 对话管理\")\n \n if st.button(\"🗑️ 开始新对话\", use_container_width=True, key=\"new_conversation\"):\n st.session_state.manager = None\n st.rerun()\n\n if st.session_state.manager and st.session_state.manager.get_history():\n md_content = MarkdownExporter._generate_markdown(\n messages=st.session_state.manager.get_history(),\n api_config=st.session_state.api_config,\n prompt_config=st.session_state.current_prompt_config\n )\n st.download_button(\n label=\"📥 下载对话 (Markdown)\",\n data=md_content,\n file_name=f\"conversation_{st.session_state.current_prompt_mode_name}_{datetime.now().strftime('%Y%m%d')}.md\",\n mime=\"text/markdown\",\n use_container_width=True,\n key=\"download_conversation\"\n )\n\n# --- 3. 主聊天界面 ---\n\nst.title(f\"对话模式: {st.session_state.current_prompt_mode_name}\")\n\n# 初始化对话管理器实例\nif st.session_state.manager is None:\n if not st.session_state.api_config.get(\"api_key\"):\n st.warning(\"欢迎使用!请在左侧侧边栏的\\\"通用API配置\\\"中输入您的API Key以开始对话。\")\n st.stop()\n \n st.session_state.manager = ConversationManager(\n api_config=st.session_state.api_config,\n prompt_config=st.session_state.current_prompt_config,\n prompt_mode_name=st.session_state.current_prompt_mode_name\n )\n st.session_state.manager.initialize()\n\n# 显示历史消息\nfor message in st.session_state.manager.get_history():\n if message[\"role\"] != \"system\":\n with st.chat_message(message[\"role\"]):\n st.markdown(message[\"content\"])\n\n# 检查是否有待发送的Prompt\nif hasattr(st.session_state, 'pending_prompt') and st.session_state.pending_prompt:\n prompt = st.session_state.pending_prompt\n st.session_state.pending_prompt = None # 清除待发送状态\n \n # 显示用户消息\n with st.chat_message(\"user\"):\n st.markdown(prompt)\n \n # 获取并显示助手回复\n with st.chat_message(\"assistant\"):\n response_stream = st.session_state.manager.chat_stream(prompt)\n st.write_stream(response_stream)\n \n st.rerun()\n\n# 正常的聊天输入\nif prompt := st.chat_input(\"请输入您的问题...\"):\n with st.chat_message(\"user\"):\n st.markdown(prompt)\n\n with st.chat_message(\"assistant\"):\n response_stream = st.session_state.manager.chat_stream(prompt)\n st.write_stream(response_stream)\n\n st.rerun()\n"}}}}