Skip to main content

cookie_agent_models/adapters/
compaction.rs

1//! Provider-specific native compaction request options.
2
3use oven_sdk::CompactionRequest;
4use oven_sdk_azure::{AzureOpenAiCompactionOptions, AzureOpenAiCompactionRequestExt as _};
5use oven_sdk_openai::{OpenAiResponsesCompactionOptions, OpenAiResponsesCompactionRequestExt as _};
6
7/// Attach provider-native compaction instructions for adapters that support them.
8/// Adapters without a native option leave the request untouched.
9#[must_use]
10pub fn with_native_compaction_instructions(
11    request: CompactionRequest,
12    adapter_id: &str,
13    instructions: Option<String>,
14) -> CompactionRequest {
15    match adapter_id {
16        "oven.openai.responses" => {
17            request.with_openai_responses_compaction_options(OpenAiResponsesCompactionOptions {
18                instructions,
19                ..OpenAiResponsesCompactionOptions::default()
20            })
21        }
22        "oven.azure.openai.responses" => {
23            request.with_azure_openai_compaction_options(AzureOpenAiCompactionOptions {
24                instructions,
25                ..AzureOpenAiCompactionOptions::default()
26            })
27        }
28        _ => request,
29    }
30}
31
32#[cfg(test)]
33mod tests {
34    use oven_sdk::{CompactionRequest, Request};
35
36    use super::with_native_compaction_instructions;
37
38    fn request() -> CompactionRequest {
39        CompactionRequest::new(Request::new(Vec::new()))
40    }
41
42    #[test]
43    fn openai_responses_carries_native_instructions() {
44        let compaction = with_native_compaction_instructions(
45            request(),
46            "oven.openai.responses",
47            Some("focus".to_owned()),
48        );
49        assert_eq!(
50            compaction.request.provider_options["openai"]["compaction"]["instructions"],
51            serde_json::json!("focus")
52        );
53    }
54
55    #[test]
56    fn azure_openai_responses_carries_native_instructions() {
57        let compaction = with_native_compaction_instructions(
58            request(),
59            "oven.azure.openai.responses",
60            Some("focus".to_owned()),
61        );
62        assert_eq!(
63            compaction.request.provider_options["azure_openai"]["compaction"]["instructions"],
64            serde_json::json!("focus")
65        );
66    }
67
68    #[test]
69    fn adapters_without_a_native_option_leave_the_request_untouched() {
70        let compaction = with_native_compaction_instructions(
71            request(),
72            "oven.anthropic.messages",
73            Some("focus".to_owned()),
74        );
75        assert!(compaction.request.provider_options.is_empty());
76    }
77}