add context window monitor

Writes the current context window to logs/current_context_window (uses a symlink to a session ID).

This PR was unfortunately generated by a different LLM and did a ton of superficial reformating, it's actually a fairly small and benign change, but I don't want to roll back everything. Hope that's ok.
This commit is contained in:
Jochen
2025-11-27 21:00:02 +11:00
parent 93dc4acf86
commit 52f78653b4
89 changed files with 4040 additions and 2576 deletions

View File

@@ -10,13 +10,19 @@ use serde_json::json;
fn test_ephemeral_cache_control_serialization() {
let cache_control = CacheControl::ephemeral();
let json = serde_json::to_value(&cache_control).unwrap();
println!("Ephemeral cache_control JSON: {}", serde_json::to_string(&json).unwrap());
assert_eq!(json, json!({
"type": "ephemeral"
}));
println!(
"Ephemeral cache_control JSON: {}",
serde_json::to_string(&json).unwrap()
);
assert_eq!(
json,
json!({
"type": "ephemeral"
})
);
// Verify no ttl field is present
assert!(!json.as_object().unwrap().contains_key("ttl"));
}
@@ -25,26 +31,38 @@ fn test_ephemeral_cache_control_serialization() {
fn test_five_minute_cache_control_serialization() {
let cache_control = CacheControl::five_minute();
let json = serde_json::to_value(&cache_control).unwrap();
println!("5-minute cache_control JSON: {}", serde_json::to_string(&json).unwrap());
assert_eq!(json, json!({
"type": "ephemeral",
"ttl": "5m"
}));
println!(
"5-minute cache_control JSON: {}",
serde_json::to_string(&json).unwrap()
);
assert_eq!(
json,
json!({
"type": "ephemeral",
"ttl": "5m"
})
);
}
#[test]
fn test_one_hour_cache_control_serialization() {
let cache_control = CacheControl::one_hour();
let json = serde_json::to_value(&cache_control).unwrap();
println!("1-hour cache_control JSON: {}", serde_json::to_string(&json).unwrap());
assert_eq!(json, json!({
"type": "ephemeral",
"ttl": "1h"
}));
println!(
"1-hour cache_control JSON: {}",
serde_json::to_string(&json).unwrap()
);
assert_eq!(
json,
json!({
"type": "ephemeral",
"ttl": "1h"
})
);
}
#[test]
@@ -54,11 +72,16 @@ fn test_message_with_ephemeral_cache_control() {
"System prompt".to_string(),
CacheControl::ephemeral(),
);
let json = serde_json::to_value(&msg).unwrap();
println!("Message with ephemeral cache_control: {}", serde_json::to_string(&json).unwrap());
let cache_control = json.get("cache_control").expect("cache_control field should exist");
println!(
"Message with ephemeral cache_control: {}",
serde_json::to_string(&json).unwrap()
);
let cache_control = json
.get("cache_control")
.expect("cache_control field should exist");
assert_eq!(cache_control.get("type").unwrap(), "ephemeral");
assert!(!cache_control.as_object().unwrap().contains_key("ttl"));
}
@@ -70,11 +93,16 @@ fn test_message_with_five_minute_cache_control() {
"System prompt".to_string(),
CacheControl::five_minute(),
);
let json = serde_json::to_value(&msg).unwrap();
println!("Message with 5-minute cache_control: {}", serde_json::to_string(&json).unwrap());
let cache_control = json.get("cache_control").expect("cache_control field should exist");
println!(
"Message with 5-minute cache_control: {}",
serde_json::to_string(&json).unwrap()
);
let cache_control = json
.get("cache_control")
.expect("cache_control field should exist");
assert_eq!(cache_control.get("type").unwrap(), "ephemeral");
assert_eq!(cache_control.get("ttl").unwrap(), "5m");
}
@@ -86,11 +114,16 @@ fn test_message_with_one_hour_cache_control() {
"System prompt".to_string(),
CacheControl::one_hour(),
);
let json = serde_json::to_value(&msg).unwrap();
println!("Message with 1-hour cache_control: {}", serde_json::to_string(&json).unwrap());
let cache_control = json.get("cache_control").expect("cache_control field should exist");
println!(
"Message with 1-hour cache_control: {}",
serde_json::to_string(&json).unwrap()
);
let cache_control = json
.get("cache_control")
.expect("cache_control field should exist");
assert_eq!(cache_control.get("type").unwrap(), "ephemeral");
assert_eq!(cache_control.get("ttl").unwrap(), "1h");
}
@@ -98,10 +131,13 @@ fn test_message_with_one_hour_cache_control() {
#[test]
fn test_message_without_cache_control() {
let msg = Message::new(MessageRole::User, "Hello".to_string());
let json = serde_json::to_value(&msg).unwrap();
println!("Message without cache_control: {}", serde_json::to_string(&json).unwrap());
println!(
"Message without cache_control: {}",
serde_json::to_string(&json).unwrap()
);
// cache_control field should not be present when not set
assert!(!json.as_object().unwrap().contains_key("cache_control"));
}
@@ -110,9 +146,9 @@ fn test_message_without_cache_control() {
fn test_cache_control_json_format_ephemeral() {
let cache_control = CacheControl::ephemeral();
let json_str = serde_json::to_string(&cache_control).unwrap();
println!("Ephemeral JSON string: {}", json_str);
// Verify exact JSON format
assert_eq!(json_str, r#"{"type":"ephemeral"}"#);
}
@@ -121,9 +157,9 @@ fn test_cache_control_json_format_ephemeral() {
fn test_cache_control_json_format_five_minute() {
let cache_control = CacheControl::five_minute();
let json_str = serde_json::to_string(&cache_control).unwrap();
println!("5-minute JSON string: {}", json_str);
// Verify exact JSON format
assert_eq!(json_str, r#"{"type":"ephemeral","ttl":"5m"}"#);
}
@@ -132,9 +168,9 @@ fn test_cache_control_json_format_five_minute() {
fn test_cache_control_json_format_one_hour() {
let cache_control = CacheControl::one_hour();
let json_str = serde_json::to_string(&cache_control).unwrap();
println!("1-hour JSON string: {}", json_str);
// Verify exact JSON format
assert_eq!(json_str, r#"{"type":"ephemeral","ttl":"1h"}"#);
}
@@ -143,7 +179,7 @@ fn test_cache_control_json_format_one_hour() {
fn test_deserialization_ephemeral() {
let json_str = r#"{"type":"ephemeral"}"#;
let cache_control: CacheControl = serde_json::from_str(json_str).unwrap();
assert_eq!(cache_control.ttl, None);
}
@@ -151,7 +187,7 @@ fn test_deserialization_ephemeral() {
fn test_deserialization_five_minute() {
let json_str = r#"{"type":"ephemeral","ttl":"5m"}"#;
let cache_control: CacheControl = serde_json::from_str(json_str).unwrap();
assert_eq!(cache_control.ttl, Some("5m".to_string()));
}
@@ -159,6 +195,6 @@ fn test_deserialization_five_minute() {
fn test_deserialization_one_hour() {
let json_str = r#"{"type":"ephemeral","ttl":"1h"}"#;
let cache_control: CacheControl = serde_json::from_str(json_str).unwrap();
assert_eq!(cache_control.ttl, Some("1h".to_string()));
}