use anyhow::{Result, bail};
pub const MAX_STREAM_TEXT_BYTES: usize = 64 * 1024 * 1024;
pub const MAX_STREAM_TOOL_ARGS_BYTES: usize = 16 * 1024 * 1024;
pub const MAX_STREAM_SNAPSHOT_BYTES: usize = 256 * 1024;
pub fn snapshot_for_send(text: &str) -> String {
if text.len() > MAX_STREAM_SNAPSHOT_BYTES {
let mut t = crate::util::truncate_bytes_safe(text, MAX_STREAM_SNAPSHOT_BYTES).to_string();
t.push_str(" …[truncated]");
t
} else {
text.to_string()
}
}
pub fn ensure_text_room(current_len: usize, delta_len: usize) -> Result<()> {
if current_len.saturating_add(delta_len) > MAX_STREAM_TEXT_BYTES {
bail!(
"assistant text stream exceeded {} MiB cap (runaway provider?); aborting turn",
MAX_STREAM_TEXT_BYTES / (1024 * 1024),
);
}
Ok(())
}
pub fn ensure_tool_args_room(current_len: usize, delta_len: usize, tool_id: &str) -> Result<()> {
if current_len.saturating_add(delta_len) > MAX_STREAM_TOOL_ARGS_BYTES {
bail!(
"tool-call arguments exceeded {} MiB cap on tool id={} (runaway provider?); aborting turn",
MAX_STREAM_TOOL_ARGS_BYTES / (1024 * 1024),
tool_id,
);
}
Ok(())
}