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:
@@ -20,18 +20,24 @@ fn test_no_wrong_serialization_format() {
|
||||
CacheControl::ephemeral(),
|
||||
);
|
||||
let json = serde_json::to_string(&msg).unwrap();
|
||||
|
||||
|
||||
println!("Ephemeral message JSON: {}", json);
|
||||
|
||||
|
||||
// Should NOT contain the wrong format
|
||||
assert!(!json.contains("system.0.cache_control"),
|
||||
"JSON should not contain 'system.0.cache_control' path");
|
||||
assert!(!json.contains("cache_control.ephemeral"),
|
||||
"JSON should not contain 'cache_control.ephemeral' path");
|
||||
|
||||
assert!(
|
||||
!json.contains("system.0.cache_control"),
|
||||
"JSON should not contain 'system.0.cache_control' path"
|
||||
);
|
||||
assert!(
|
||||
!json.contains("cache_control.ephemeral"),
|
||||
"JSON should not contain 'cache_control.ephemeral' path"
|
||||
);
|
||||
|
||||
// Should contain the correct format
|
||||
assert!(json.contains(r#""cache_control":{"type":"ephemeral"}"#),
|
||||
"JSON should contain correct cache_control format");
|
||||
assert!(
|
||||
json.contains(r#""cache_control":{"type":"ephemeral"}"#),
|
||||
"JSON should contain correct cache_control format"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -42,20 +48,28 @@ fn test_five_minute_no_wrong_format() {
|
||||
CacheControl::five_minute(),
|
||||
);
|
||||
let json = serde_json::to_string(&msg).unwrap();
|
||||
|
||||
|
||||
println!("5-minute message JSON: {}", json);
|
||||
|
||||
|
||||
// Should NOT contain the wrong format
|
||||
assert!(!json.contains("system.0.cache_control"),
|
||||
"JSON should not contain 'system.0.cache_control' path");
|
||||
assert!(!json.contains("cache_control.ephemeral.ttl"),
|
||||
"JSON should not contain 'cache_control.ephemeral.ttl' path");
|
||||
|
||||
assert!(
|
||||
!json.contains("system.0.cache_control"),
|
||||
"JSON should not contain 'system.0.cache_control' path"
|
||||
);
|
||||
assert!(
|
||||
!json.contains("cache_control.ephemeral.ttl"),
|
||||
"JSON should not contain 'cache_control.ephemeral.ttl' path"
|
||||
);
|
||||
|
||||
// Should contain the correct format with ttl as a direct field
|
||||
assert!(json.contains(r#""type":"ephemeral""#),
|
||||
"JSON should contain type field");
|
||||
assert!(json.contains(r#""ttl":"5m""#),
|
||||
"JSON should contain ttl field with value 5m");
|
||||
assert!(
|
||||
json.contains(r#""type":"ephemeral""#),
|
||||
"JSON should contain type field"
|
||||
);
|
||||
assert!(
|
||||
json.contains(r#""ttl":"5m""#),
|
||||
"JSON should contain ttl field with value 5m"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -66,44 +80,59 @@ fn test_one_hour_no_wrong_format() {
|
||||
CacheControl::one_hour(),
|
||||
);
|
||||
let json = serde_json::to_string(&msg).unwrap();
|
||||
|
||||
|
||||
println!("1-hour message JSON: {}", json);
|
||||
|
||||
|
||||
// Should NOT contain the wrong format
|
||||
assert!(!json.contains("system.0.cache_control"),
|
||||
"JSON should not contain 'system.0.cache_control' path");
|
||||
assert!(!json.contains("cache_control.ephemeral.ttl"),
|
||||
"JSON should not contain 'cache_control.ephemeral.ttl' path");
|
||||
|
||||
assert!(
|
||||
!json.contains("system.0.cache_control"),
|
||||
"JSON should not contain 'system.0.cache_control' path"
|
||||
);
|
||||
assert!(
|
||||
!json.contains("cache_control.ephemeral.ttl"),
|
||||
"JSON should not contain 'cache_control.ephemeral.ttl' path"
|
||||
);
|
||||
|
||||
// Should contain the correct format with ttl as a direct field
|
||||
assert!(json.contains(r#""type":"ephemeral""#),
|
||||
"JSON should contain type field");
|
||||
assert!(json.contains(r#""ttl":"1h""#),
|
||||
"JSON should contain ttl field with value 1h");
|
||||
assert!(
|
||||
json.contains(r#""type":"ephemeral""#),
|
||||
"JSON should contain type field"
|
||||
);
|
||||
assert!(
|
||||
json.contains(r#""ttl":"1h""#),
|
||||
"JSON should contain ttl field with value 1h"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cache_control_structure_is_flat() {
|
||||
// Verify that the cache_control object has a flat structure
|
||||
// with 'type' and optional 'ttl' at the same level
|
||||
|
||||
|
||||
let cache_control = CacheControl::five_minute();
|
||||
let json_value = serde_json::to_value(&cache_control).unwrap();
|
||||
|
||||
println!("Cache control as JSON value: {}", serde_json::to_string_pretty(&json_value).unwrap());
|
||||
|
||||
|
||||
println!(
|
||||
"Cache control as JSON value: {}",
|
||||
serde_json::to_string_pretty(&json_value).unwrap()
|
||||
);
|
||||
|
||||
let obj = json_value.as_object().expect("Should be an object");
|
||||
|
||||
|
||||
// Should have exactly 2 keys at the top level
|
||||
assert_eq!(obj.len(), 2, "Cache control should have exactly 2 top-level fields");
|
||||
|
||||
assert_eq!(
|
||||
obj.len(),
|
||||
2,
|
||||
"Cache control should have exactly 2 top-level fields"
|
||||
);
|
||||
|
||||
// Both 'type' and 'ttl' should be at the same level
|
||||
assert!(obj.contains_key("type"), "Should have 'type' field");
|
||||
assert!(obj.contains_key("ttl"), "Should have 'ttl' field");
|
||||
|
||||
|
||||
// 'type' should be a string, not an object
|
||||
assert!(obj["type"].is_string(), "'type' should be a string value");
|
||||
|
||||
|
||||
// 'ttl' should be a string, not nested
|
||||
assert!(obj["ttl"].is_string(), "'ttl' should be a string value");
|
||||
}
|
||||
@@ -112,20 +141,30 @@ fn test_cache_control_structure_is_flat() {
|
||||
fn test_ephemeral_cache_control_structure() {
|
||||
let cache_control = CacheControl::ephemeral();
|
||||
let json_value = serde_json::to_value(&cache_control).unwrap();
|
||||
|
||||
println!("Ephemeral cache control as JSON value: {}", serde_json::to_string_pretty(&json_value).unwrap());
|
||||
|
||||
|
||||
println!(
|
||||
"Ephemeral cache control as JSON value: {}",
|
||||
serde_json::to_string_pretty(&json_value).unwrap()
|
||||
);
|
||||
|
||||
let obj = json_value.as_object().expect("Should be an object");
|
||||
|
||||
|
||||
// Should have exactly 1 key (only 'type', no 'ttl')
|
||||
assert_eq!(obj.len(), 1, "Ephemeral cache control should have exactly 1 top-level field");
|
||||
|
||||
assert_eq!(
|
||||
obj.len(),
|
||||
1,
|
||||
"Ephemeral cache control should have exactly 1 top-level field"
|
||||
);
|
||||
|
||||
// Should have 'type' field
|
||||
assert!(obj.contains_key("type"), "Should have 'type' field");
|
||||
|
||||
|
||||
// Should NOT have 'ttl' field
|
||||
assert!(!obj.contains_key("ttl"), "Ephemeral should not have 'ttl' field");
|
||||
|
||||
assert!(
|
||||
!obj.contains_key("ttl"),
|
||||
"Ephemeral should not have 'ttl' field"
|
||||
);
|
||||
|
||||
// 'type' should be a string with value "ephemeral"
|
||||
assert_eq!(obj["type"].as_str().unwrap(), "ephemeral");
|
||||
}
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user