1.功能扩充(ai_partner_5):加载指定的会话信息,高亮显示当前正在使用的会话。
(1).加载指定会话信息
python
def load_session(session_name):
try:
if os.path.exists(f"sessions/{session_name}.json"):
# 读取会话数据
with open(f"sessions/{session_name}.json", "r", encoding="utf-8") as f:
session_data = json.load(f)
st.session_state.messages = session_data["messages"]
st.session_state.nick_name = session_data["nick_name"]
st.session_state.nature = session_data["nature"]
st.session_state.current_session = session_name
except Exception:
st.error("加载会话失败!")
(2)实现了"当前选中项高亮"的功能
python
# 三元运算符: 如果条件为真, 则返回第一个表达式的值; 否则, 返回第二个表达式的值 --> 语法: 值1 if 条件 else 值2
if st.button(session, width="stretch", icon="📄", key=f"load_{session}", type="primary" if session == st.session_state.current_session else "secondary"):
load_session(session)
st.rerun()
- 这是一个 Python 三元运算符(行内条件表达式)。
- 它拿当前遍历到的会话(session)和系统记录的"当前会话名"(st.session_state.current_session)作比较
- 如果相等 (说明这是你正在聊的那个窗口):按钮类型设为
"primary"。在 Streamlit 中,这通常意味着实心、高亮颜色(如蓝色或红色),表示"激活状态"。 - 如果不等 (说明这是别的旧窗口):按钮类型设为
"secondary"。这通常是空心或灰色的按钮,表示"普通状态"。
2.功能扩充(ai_partner_6):删除指定会话
python
# 删除会话信息函数
def delete_session(session_name):
try:
if os.path.exists(f"sessions/{session_name}.json"):
os.remove(f"sessions/{session_name}.json") # 删除文件
# 如果删除的是当前会话, 则需要更新消息列表
if session_name == st.session_state.current_session:
st.session_state.messages = []
st.session_state.current_session = generate_session_name()
except Exception:
st.error("删除会话失败!")
with col2:
if st.button("", width="stretch", icon="❌️", key=f"delete_{session}"):
delete_session(session)
st.rerun()
3.功能扩充(ai_partner_6):会话列表降序排序(最新会话显示在最上面)
python
# 加载所有的会话列表信息
def load_sessions():
session_list = []
# 加载sessions目录下的文件
if os.path.exists("sessions"):
file_list = os.listdir("sessions")
for filename in file_list:
if filename.endswith(".json"):
session_list.append(filename[:-5])
session_list.sort(reverse=True) # 排序, 降序排列
return session_list