hank9999 commited on
Commit ·
c2bdb0a
1
Parent(s): f0d4864
feat: 恢复上下文解析
Browse files
src/kiro/model/events/base.rs
CHANGED
|
@@ -70,7 +70,7 @@ pub enum Event {
|
|
| 70 |
/// 计费
|
| 71 |
Metering(()),
|
| 72 |
/// 上下文使用率
|
| 73 |
-
ContextUsage(
|
| 74 |
/// 未知事件 (保留原始帧数据)
|
| 75 |
Unknown {},
|
| 76 |
/// 服务端错误
|
|
@@ -120,7 +120,8 @@ impl Event {
|
|
| 120 |
Ok(Self::Metering(()))
|
| 121 |
}
|
| 122 |
EventType::ContextUsage => {
|
| 123 |
-
|
|
|
|
| 124 |
}
|
| 125 |
EventType::Unknown => Ok(Self::Unknown {}),
|
| 126 |
}
|
|
|
|
| 70 |
/// 计费
|
| 71 |
Metering(()),
|
| 72 |
/// 上下文使用率
|
| 73 |
+
ContextUsage(super::ContextUsageEvent),
|
| 74 |
/// 未知事件 (保留原始帧数据)
|
| 75 |
Unknown {},
|
| 76 |
/// 服务端错误
|
|
|
|
| 120 |
Ok(Self::Metering(()))
|
| 121 |
}
|
| 122 |
EventType::ContextUsage => {
|
| 123 |
+
let payload = super::ContextUsageEvent::from_frame(&frame)?;
|
| 124 |
+
Ok(Self::ContextUsage(payload))
|
| 125 |
}
|
| 126 |
EventType::Unknown => Ok(Self::Unknown {}),
|
| 127 |
}
|
src/kiro/model/events/context_usage.rs
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
//! 上下文使用率事件
|
| 2 |
+
//!
|
| 3 |
+
//! 处理 contextUsageEvent 类型的事件
|
| 4 |
+
|
| 5 |
+
use serde::Deserialize;
|
| 6 |
+
|
| 7 |
+
use crate::kiro::parser::error::ParseResult;
|
| 8 |
+
use crate::kiro::parser::frame::Frame;
|
| 9 |
+
|
| 10 |
+
use super::base::EventPayload;
|
| 11 |
+
|
| 12 |
+
/// 上下文使用率事件
|
| 13 |
+
///
|
| 14 |
+
/// 包含当前上下文窗口的使用百分比
|
| 15 |
+
#[derive(Debug, Clone, Deserialize)]
|
| 16 |
+
#[serde(rename_all = "camelCase")]
|
| 17 |
+
pub struct ContextUsageEvent {
|
| 18 |
+
/// 上下文使用百分比 (0-100)
|
| 19 |
+
#[serde(default)]
|
| 20 |
+
pub context_usage_percentage: f64,
|
| 21 |
+
}
|
| 22 |
+
|
| 23 |
+
impl EventPayload for ContextUsageEvent {
|
| 24 |
+
fn from_frame(frame: &Frame) -> ParseResult<Self> {
|
| 25 |
+
frame.payload_as_json()
|
| 26 |
+
}
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
impl ContextUsageEvent {
|
| 30 |
+
/// 获取格式化的百分比字符串
|
| 31 |
+
pub fn formatted_percentage(&self) -> String {
|
| 32 |
+
format!("{:.2}%", self.context_usage_percentage)
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
/// 判断上下文使用是否超过阈值
|
| 36 |
+
///
|
| 37 |
+
/// # Arguments
|
| 38 |
+
/// * `threshold` - 阈值百分比 (0-100)
|
| 39 |
+
pub fn exceeds_threshold(&self, threshold: f64) -> bool {
|
| 40 |
+
self.context_usage_percentage > threshold
|
| 41 |
+
}
|
| 42 |
+
|
| 43 |
+
/// 判断上下文是否接近满 (超过 80%)
|
| 44 |
+
pub fn is_near_full(&self) -> bool {
|
| 45 |
+
self.exceeds_threshold(80.0)
|
| 46 |
+
}
|
| 47 |
+
|
| 48 |
+
/// 判断上下文是否已满 (超过 95%)
|
| 49 |
+
pub fn is_full(&self) -> bool {
|
| 50 |
+
self.exceeds_threshold(95.0)
|
| 51 |
+
}
|
| 52 |
+
}
|
| 53 |
+
|
| 54 |
+
impl std::fmt::Display for ContextUsageEvent {
|
| 55 |
+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
| 56 |
+
write!(f, "{}", self.formatted_percentage())
|
| 57 |
+
}
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
#[cfg(test)]
|
| 61 |
+
mod tests {
|
| 62 |
+
use super::*;
|
| 63 |
+
|
| 64 |
+
#[test]
|
| 65 |
+
fn test_formatted_percentage() {
|
| 66 |
+
let event = ContextUsageEvent {
|
| 67 |
+
context_usage_percentage: 50.123,
|
| 68 |
+
};
|
| 69 |
+
assert_eq!(event.formatted_percentage(), "50.12%");
|
| 70 |
+
}
|
| 71 |
+
|
| 72 |
+
#[test]
|
| 73 |
+
fn test_threshold() {
|
| 74 |
+
let event = ContextUsageEvent {
|
| 75 |
+
context_usage_percentage: 85.0,
|
| 76 |
+
};
|
| 77 |
+
assert!(event.exceeds_threshold(80.0));
|
| 78 |
+
assert!(!event.exceeds_threshold(90.0));
|
| 79 |
+
assert!(event.is_near_full());
|
| 80 |
+
assert!(!event.is_full());
|
| 81 |
+
}
|
| 82 |
+
|
| 83 |
+
#[test]
|
| 84 |
+
fn test_full() {
|
| 85 |
+
let event = ContextUsageEvent {
|
| 86 |
+
context_usage_percentage: 98.0,
|
| 87 |
+
};
|
| 88 |
+
assert!(event.is_full());
|
| 89 |
+
}
|
| 90 |
+
}
|
src/kiro/model/events/mod.rs
CHANGED
|
@@ -4,8 +4,10 @@
|
|
| 4 |
|
| 5 |
mod assistant;
|
| 6 |
mod base;
|
|
|
|
| 7 |
mod tool_use;
|
| 8 |
|
| 9 |
pub use assistant::AssistantResponseEvent;
|
| 10 |
pub use base::Event;
|
|
|
|
| 11 |
pub use tool_use::ToolUseEvent;
|
|
|
|
| 4 |
|
| 5 |
mod assistant;
|
| 6 |
mod base;
|
| 7 |
+
mod context_usage;
|
| 8 |
mod tool_use;
|
| 9 |
|
| 10 |
pub use assistant::AssistantResponseEvent;
|
| 11 |
pub use base::Event;
|
| 12 |
+
pub use context_usage::ContextUsageEvent;
|
| 13 |
pub use tool_use::ToolUseEvent;
|