use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum Mode {
#[default]
Strict,
Lenient,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum Think {
#[default]
Split,
Keep,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Limits {
pub wire_bytes: usize,
pub event_bytes: usize,
pub tool_calls: usize,
}
impl Default for Limits {
fn default() -> Self {
Self {
wire_bytes: 64 * 1024 * 1024,
event_bytes: 256 * 1024,
tool_calls: 64,
}
}
}
impl Limits {
pub fn wire_bytes(mut self, bytes: usize) -> Self {
self.wire_bytes = bytes;
self
}
pub fn event_bytes(mut self, bytes: usize) -> Self {
self.event_bytes = bytes;
self
}
pub fn tool_calls(mut self, calls: usize) -> Self {
self.tool_calls = calls;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn strict_is_the_default_and_limits_match_the_documented_defaults() {
assert_eq!(Mode::default(), Mode::Strict);
assert_eq!(Think::default(), Think::Split);
let limits = Limits::default();
assert_eq!(
(limits.wire_bytes, limits.event_bytes, limits.tool_calls),
(67_108_864, 262_144, 64)
);
assert_eq!(Limits::default().tool_calls(1).tool_calls, 1);
}
}