use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type")]
pub enum ThinkingConfig {
#[serde(rename = "disabled")]
Disabled,
#[serde(rename = "enabled")]
Enabled {
#[serde(rename = "budget_tokens")]
budget_tokens: i32,
},
}
impl ThinkingConfig {
pub fn enabled(budget_tokens: i32) -> Self {
Self::Enabled { budget_tokens }
}
pub fn disabled() -> Self {
Self::Disabled
}
}
impl Default for ThinkingConfig {
fn default() -> Self {
Self::disabled()
}
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::{json, to_value};
#[test]
fn thinking_config_enabled_serialization() {
let config = ThinkingConfig::enabled(2048);
let json = to_value(&config).unwrap();
assert_eq!(
json,
json!({
"type": "enabled",
"budget_tokens": 2048
})
);
}
#[test]
fn thinking_config_disabled_serialization() {
let config = ThinkingConfig::disabled();
let json = to_value(&config).unwrap();
assert_eq!(
json,
json!({
"type": "disabled"
})
);
}
#[test]
fn thinking_config_enabled_deserialization() {
let json = json!({
"type": "enabled",
"budget_tokens": 2048
});
let config: ThinkingConfig = serde_json::from_value(json).unwrap();
match config {
ThinkingConfig::Enabled { budget_tokens } => {
assert_eq!(budget_tokens, 2048);
}
_ => panic!("Expected Enabled variant"),
}
}
#[test]
fn thinking_config_disabled_deserialization() {
let json = json!({
"type": "disabled"
});
let config: ThinkingConfig = serde_json::from_value(json).unwrap();
match config {
ThinkingConfig::Disabled => {}
_ => panic!("Expected Disabled variant"),
}
}
}