优化: F-15上下文基础(is_active正面白名单+push token仅active计入 零行为变化)

This commit is contained in:
2026-06-17 00:14:38 +08:00
parent afcdf5e17d
commit 8a142c212c
2 changed files with 104 additions and 3 deletions

View File

@@ -76,9 +76,14 @@ impl ChatMessage {
Self { role: MessageRole::Tool, content: content.into(), tool_call_id: Some(call_id.into()), tool_calls: None, model: None, status: None }
}
/// 是否处于 active 态status 为 None 或 "active")。truncated 返回 false。
/// 是否处于 active 态status 为 None 或 "active")。其余状态一律 false。
///
/// 正面白名单F-15 §3.2):仅认 None / "active",新状态
/// 如阶段2 引入的 "archived_segment" / "compressed")自动落入不 active 分支,
/// 无需每加一个状态就来这里改。当前取值 None/Some("active")/Some("truncated")
/// 行为与旧反面排除完全等价None=true / "active"=true / "truncated"=false
pub fn is_active(&self) -> bool {
!matches!(self.status.as_deref(), Some("truncated"))
matches!(self.status.as_deref(), None | Some("active"))
}
}
@@ -233,3 +238,40 @@ pub trait LlmProvider: Send + Sync {
self.name().to_string()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn is_active_whitelist() {
// F-15 §3.2 正面白名单:仅 None / "active" 为 true其余一律 false。
// 零行为变化None / "active" / "truncated" 与旧反面排除完全等价;
// "archived_segment" / "compressed"阶段2 引入,当前代码未赋值)由白名单
// matches! 只认 None/active 自动落入 false面向未来验证。
// None构造默认值向前兼容老 JSON
let m = ChatMessage::user("hi");
assert!(m.is_active(), "None 应 active");
// "active"
let mut m = ChatMessage::user("hi");
m.status = Some("active".to_string());
assert!(m.is_active(), "Some(active) 应 active");
// "truncated" — 当前取值与旧实现等价false
let mut m = ChatMessage::user("hi");
m.status = Some("truncated".to_string());
assert!(!m.is_active(), "truncated 应不 active");
// "archived_segment" — 阶段2 待引入,白名单自动隔离
let mut m = ChatMessage::user("hi");
m.status = Some("archived_segment".to_string());
assert!(!m.is_active(), "archived_segment 应不 active白名单隔离");
// "compressed" — 阶段2 待引入,白名单自动隔离
let mut m = ChatMessage::user("hi");
m.status = Some("compressed".to_string());
assert!(!m.is_active(), "compressed 应不 active白名单隔离");
}
}