Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/ahijln_opendeekthing.json
T

1 line
31 KiB
JSON
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.
{"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"}}}}