From 7e24e57af41fd13f690c00c37a468131041cd581 Mon Sep 17 00:00:00 2001 From: oudecheng <13802883547@139.com> Date: Fri, 3 Jul 2026 16:32:24 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20persistent=5Fsessio?= =?UTF-8?q?n=5Fid=20=E5=89=8D=E7=BC=80=E9=87=8D=E5=A4=8D=E7=B4=AF=E7=A7=AF?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gateway/execution.rs | 6 +++--- src/storage/mod.rs | 13 ++++++++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/gateway/execution.rs b/src/gateway/execution.rs index 4964a46..b812470 100644 --- a/src/gateway/execution.rs +++ b/src/gateway/execution.rs @@ -6,7 +6,7 @@ use crate::agent::{AgentError, AgentProcessResult, EmittedMessageHandler, Persis use crate::bus::message::ToolMessageState; use crate::bus::{ChatMessage, MediaItem, OutboundMessage, SYSTEM_CONTEXT_SCHEDULED_PROMPT}; use crate::config::LLMProviderConfig; -use crate::storage::ConversationRepository; +use crate::storage::{persistent_session_id, ConversationRepository}; use tokio::sync::Mutex; use super::compaction::schedule_background_history_compaction; @@ -252,7 +252,7 @@ impl AgentExecutionService { // 构建系统提示词上下文 let system_prompt_context = SystemPromptContext { - session_id: Some(format!("{}:{}", request.channel_name, request.chat_id)), + session_id: Some(persistent_session_id(request.channel_name, request.chat_id)), chat_id: request.chat_id.to_string(), user_message_count, }; @@ -356,7 +356,7 @@ impl AgentExecutionService { // 构建系统提示词上下文 let system_prompt_context = SystemPromptContext { - session_id: Some(format!("{}:{}", request.channel_name, request.chat_id)), + session_id: Some(persistent_session_id(request.channel_name, request.chat_id)), chat_id: request.chat_id.to_string(), user_message_count, }; diff --git a/src/storage/mod.rs b/src/storage/mod.rs index dc2f198..6a5d0f2 100644 --- a/src/storage/mod.rs +++ b/src/storage/mod.rs @@ -1601,6 +1601,13 @@ impl SessionStore { } pub fn persistent_session_id(channel_name: &str, chat_id: &str) -> String { + // 幂等:循环去除已存在的 "{channel_name}:" 前缀,防止前缀累积 + let prefix = format!("{}:", channel_name); + let mut chat_id = chat_id; + while chat_id.starts_with(&prefix) { + chat_id = &chat_id[prefix.len()..]; + } + if channel_name == "cli" || channel_name == "websocket" { chat_id.to_string() } else { @@ -2288,8 +2295,12 @@ mod tests { #[test] fn test_persistent_session_id_for_cli_and_channel() { assert_eq!(persistent_session_id("cli", "abc"), "abc"); - assert_eq!(persistent_session_id("websocket", "websocket:abc"), "websocket:abc"); + // 幂等:已带前缀的 chat_id 会被清理,不会累积前缀 + assert_eq!(persistent_session_id("websocket", "websocket:abc"), "abc"); + assert_eq!(persistent_session_id("websocket", "websocket:websocket:abc"), "abc"); assert_eq!(persistent_session_id(TEST_CHANNEL, "abc"), "test-channel:abc"); + // 其他通道也幂等 + assert_eq!(persistent_session_id(TEST_CHANNEL, "test-channel:abc"), "test-channel:abc"); } #[test]