diff --git a/crates/aether-ai/formats/src/formats/id.rs b/crates/aether-ai/formats/src/formats/id.rs index fc83ffdc4..23a300152 100644 --- a/crates/aether-ai/formats/src/formats/id.rs +++ b/crates/aether-ai/formats/src/formats/id.rs @@ -170,7 +170,11 @@ pub fn api_format_permission_covers(allowed_value: &str, requested_api_format: & !allowed_value.is_empty() && !requested_api_format.is_empty() && (allowed_value == requested_api_format - || allowed_value == "openai:responses" && requested_api_format == "openai:search") + || allowed_value == "openai:responses" + && matches!( + requested_api_format.as_str(), + "openai:responses:compact" | "openai:search" + )) } pub fn intersect_api_format_allowed_lists(left: &[String], right: &[String]) -> Vec { @@ -269,11 +273,15 @@ mod tests { } #[test] - fn responses_permission_covers_only_its_search_companion() { + fn responses_permission_covers_its_companion_endpoints() { assert!(api_format_permission_covers( "OPENAI:RESPONSES", "openai:search" )); + assert!(api_format_permission_covers( + "OPENAI:RESPONSES", + "openai:responses:compact" + )); assert!(api_format_permission_covers( "openai:search", "openai:search" @@ -282,6 +290,10 @@ mod tests { "openai:search", "openai:responses" )); + assert!(!api_format_permission_covers( + "openai:responses:compact", + "openai:responses" + )); assert!(!api_format_permission_covers( "openai:responses", "openai:chat" @@ -290,6 +302,13 @@ mod tests { api_format_permission_storage_aliases("openai:search"), vec!["openai:search".to_string(), "openai:responses".to_string()] ); + assert_eq!( + api_format_permission_storage_aliases("openai:responses:compact"), + vec![ + "openai:responses:compact".to_string(), + "openai:responses".to_string(), + ] + ); assert_eq!( api_format_permission_storage_aliases("openai:responses"), vec!["openai:responses".to_string()] @@ -357,6 +376,13 @@ mod tests { ), vec!["openai:search".to_string()] ); + assert_eq!( + intersect_api_format_allowed_lists( + &["openai:responses".to_string()], + &["openai:responses:compact".to_string()], + ), + vec!["openai:responses:compact".to_string()] + ); assert!(intersect_api_format_allowed_lists( &["openai:search".to_string()], &["openai:chat".to_string()], diff --git a/crates/aether-data/contracts/src/repository/auth.rs b/crates/aether-data/contracts/src/repository/auth.rs index f3b7039b4..899e2c4fe 100644 --- a/crates/aether-data/contracts/src/repository/auth.rs +++ b/crates/aether-data/contracts/src/repository/auth.rs @@ -827,7 +827,7 @@ mod tests { }; #[test] - fn api_format_policy_intersection_preserves_search_companion_scope() { + fn api_format_policy_intersection_preserves_companion_scope() { assert_eq!( aether_ai_formats::intersect_api_format_allowed_lists( &["openai:search".to_string()], @@ -842,6 +842,20 @@ mod tests { ), vec!["openai:search".to_string()] ); + assert_eq!( + aether_ai_formats::intersect_api_format_allowed_lists( + &["openai:responses".to_string()], + &["openai:responses:compact".to_string()], + ), + vec!["openai:responses:compact".to_string()] + ); + assert_eq!( + aether_ai_formats::intersect_api_format_allowed_lists( + &["openai:responses:compact".to_string()], + &["openai:responses".to_string()], + ), + vec!["openai:responses:compact".to_string()] + ); assert!(aether_ai_formats::intersect_api_format_allowed_lists( &["openai:search".to_string()], &["openai:chat".to_string()],