use crate::config::Effort;
use brazen::{CanonicalRequest, Content, Message, Tool};
pub(in crate::prompt) const DEFAULT_MAX_TOKENS: u32 = 4096;
pub(super) fn build_request(
model_id: &str,
system: &str,
messages: Vec<Message>,
tools: Vec<Tool>,
max_output_tokens: Option<u32>,
effort: Option<Effort>,
priority: Option<bool>,
) -> CanonicalRequest {
CanonicalRequest {
model: model_id.to_string(),
system: Some(vec![Content::Text(system.to_string())]),
messages,
tools,
max_tokens: Some(max_output_tokens.unwrap_or(DEFAULT_MAX_TOKENS)),
reasoning: effort.map(Into::into),
service_tier: priority
.unwrap_or(false)
.then_some(brazen::ServiceTier::Priority),
..CanonicalRequest::default()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn build_request_is_a_typed_canonical_request() {
let tool = brazen::Tool::Custom {
name: "bash".into(),
description: None,
input_schema: serde_json::json!({"type": "object"}),
strict: None,
};
let req = build_request(
"claude-sonnet-5",
"sys",
vec![],
vec![tool.clone()],
None,
None,
None,
);
assert_eq!(req.model, "claude-sonnet-5");
assert_eq!(req.max_tokens, Some(4096));
assert_eq!(req.system, Some(vec![Content::Text("sys".into())]));
assert_eq!(req.tools, vec![tool]);
assert_eq!(req.stream, None);
assert!(req.extra.is_empty());
assert_eq!(req.reasoning, None);
assert_eq!(req.service_tier, None);
}
#[test]
fn the_role_effort_rides_the_reasoning_knob() {
let req = build_request("m", "sys", vec![], vec![], None, Some(Effort::High), None);
assert_eq!(req.reasoning, Some(brazen::ReasoningEffort::High));
}
#[test]
fn the_role_priority_rides_the_service_tier_knob() {
let req = build_request("m", "sys", vec![], vec![], None, None, Some(true));
assert_eq!(req.service_tier, Some(brazen::ServiceTier::Priority));
}
#[test]
fn an_explicit_false_priority_is_the_same_absence_as_none() {
let unchecked = build_request("m", "sys", vec![], vec![], None, None, Some(false));
let absent = build_request("m", "sys", vec![], vec![], None, None, None);
assert_eq!(unchecked.service_tier, None);
assert_eq!(unchecked, absent);
}
#[test]
fn the_role_output_cap_rides_max_tokens_and_absent_takes_the_default() {
let stated = build_request("m", "sys", vec![], vec![], Some(32000), None, None);
assert_eq!(stated.max_tokens, Some(32000));
let absent = build_request("m", "sys", vec![], vec![], None, None, None);
assert_eq!(absent.max_tokens, Some(DEFAULT_MAX_TOKENS));
}
}