use super::types::{ExecuteBestModelRequest, ExecuteChatRequest, LlmRoute};
impl Default for ExecuteChatRequest {
fn default() -> Self {
Self {
messages: Vec::new(),
model: None,
platform: None,
route: None,
execution_preference: None,
max_output_tokens: None,
correlation_id: None,
tools: None,
tool_choice: None,
temperature: None,
response_format: None,
}
}
}
impl Default for ExecuteBestModelRequest {
fn default() -> Self {
Self {
messages: Vec::new(),
route: None,
execution_preference: None,
correlation_id: None,
}
}
}
pub trait WithRoute: Sized {
fn public(self) -> Self;
fn private(self) -> Self;
fn auto(self) -> Self;
}
impl WithRoute for ExecuteChatRequest {
fn public(mut self) -> Self {
self.route = Some(LlmRoute::Public);
self
}
fn private(mut self) -> Self {
self.route = Some(LlmRoute::Private);
self
}
fn auto(mut self) -> Self {
self.route = Some(LlmRoute::Auto);
self
}
}
impl WithRoute for ExecuteBestModelRequest {
fn public(mut self) -> Self {
self.route = Some(LlmRoute::Public);
self
}
fn private(mut self) -> Self {
self.route = Some(LlmRoute::Private);
self
}
fn auto(mut self) -> Self {
self.route = Some(LlmRoute::Auto);
self
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::llm::{ChatMessage, StreamChatRequest};
fn msg() -> Vec<ChatMessage> {
vec![ChatMessage {
role: "user".into(),
content: "hi".into(),
}]
}
#[test]
fn execute_chat_request_public_shortcut_sets_route() {
let req = ExecuteChatRequest {
messages: msg(),
..Default::default()
}
.public();
assert_eq!(req.route, Some(LlmRoute::Public));
}
#[test]
fn execute_chat_request_private_shortcut_sets_route() {
let req = ExecuteChatRequest {
messages: msg(),
..Default::default()
}
.private();
assert_eq!(req.route, Some(LlmRoute::Private));
}
#[test]
fn execute_chat_request_auto_shortcut_sets_route() {
let req = ExecuteChatRequest {
messages: msg(),
..Default::default()
}
.auto();
assert_eq!(req.route, Some(LlmRoute::Auto));
}
#[test]
fn shortcut_serializes_route_as_wire_field_route_mode() {
let req = ExecuteChatRequest {
messages: msg(),
..Default::default()
}
.private();
let json = serde_json::to_string(&req).expect("serialize");
assert!(
json.contains("\"route_mode\":\"private\""),
"wire field MUST be `route_mode`, got: {}",
json
);
assert!(
!json.contains("\"route\":"),
"`route` is the Rust field name; the wire form must use route_mode"
);
}
#[test]
fn shortcuts_are_chainable_and_last_wins() {
let req = ExecuteChatRequest {
messages: msg(),
..Default::default()
}
.public()
.auto()
.private();
assert_eq!(req.route, Some(LlmRoute::Private));
}
#[test]
fn execute_best_model_request_shortcuts() {
let public_req = ExecuteBestModelRequest {
messages: msg(),
..Default::default()
}
.public();
assert_eq!(public_req.route, Some(LlmRoute::Public));
let private_req = ExecuteBestModelRequest {
messages: msg(),
..Default::default()
}
.private();
assert_eq!(private_req.route, Some(LlmRoute::Private));
let auto_req = ExecuteBestModelRequest {
messages: msg(),
..Default::default()
}
.auto();
assert_eq!(auto_req.route, Some(LlmRoute::Auto));
}
#[test]
fn shortcut_works_on_stream_chat_request_alias() {
let req: StreamChatRequest = ExecuteChatRequest {
messages: msg(),
..Default::default()
}
.private();
assert_eq!(req.route, Some(LlmRoute::Private));
}
}