fix: 修复 persistent_session_id 前缀重复累积问题

This commit is contained in:
oudecheng 2026-07-03 16:32:24 +08:00
parent a78f5c5512
commit 7e24e57af4
2 changed files with 15 additions and 4 deletions

View File

@ -6,7 +6,7 @@ use crate::agent::{AgentError, AgentProcessResult, EmittedMessageHandler, Persis
use crate::bus::message::ToolMessageState; use crate::bus::message::ToolMessageState;
use crate::bus::{ChatMessage, MediaItem, OutboundMessage, SYSTEM_CONTEXT_SCHEDULED_PROMPT}; use crate::bus::{ChatMessage, MediaItem, OutboundMessage, SYSTEM_CONTEXT_SCHEDULED_PROMPT};
use crate::config::LLMProviderConfig; use crate::config::LLMProviderConfig;
use crate::storage::ConversationRepository; use crate::storage::{persistent_session_id, ConversationRepository};
use tokio::sync::Mutex; use tokio::sync::Mutex;
use super::compaction::schedule_background_history_compaction; use super::compaction::schedule_background_history_compaction;
@ -252,7 +252,7 @@ impl AgentExecutionService {
// 构建系统提示词上下文 // 构建系统提示词上下文
let system_prompt_context = SystemPromptContext { 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(), chat_id: request.chat_id.to_string(),
user_message_count, user_message_count,
}; };
@ -356,7 +356,7 @@ impl AgentExecutionService {
// 构建系统提示词上下文 // 构建系统提示词上下文
let system_prompt_context = SystemPromptContext { 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(), chat_id: request.chat_id.to_string(),
user_message_count, user_message_count,
}; };

View File

@ -1601,6 +1601,13 @@ impl SessionStore {
} }
pub fn persistent_session_id(channel_name: &str, chat_id: &str) -> String { 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" { if channel_name == "cli" || channel_name == "websocket" {
chat_id.to_string() chat_id.to_string()
} else { } else {
@ -2288,8 +2295,12 @@ mod tests {
#[test] #[test]
fn test_persistent_session_id_for_cli_and_channel() { fn test_persistent_session_id_for_cli_and_channel() {
assert_eq!(persistent_session_id("cli", "abc"), "abc"); 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, "abc"), "test-channel:abc");
// 其他通道也幂等
assert_eq!(persistent_session_id(TEST_CHANNEL, "test-channel:abc"), "test-channel:abc");
} }
#[test] #[test]