orchestral-cli 0.3.1

A runtime for reliable, interactive AI agents.
Documentation
use super::*;

#[test]
fn inline_budget_uses_the_declared_model_window_and_output_reserve() {
    let mut config = OrchestralConfig::default();
    config.agent.max_context_tokens = 12_288;
    config.agent.reserved_output_tokens = 4_096;
    assert_eq!(model_inline_output_limit(&config, None).get(), 2_048);
    assert_eq!(model_inline_output_limit(&config, Some(8_192)).get(), 1_024);
    assert_eq!(
        model_inline_output_limit(&config, Some(32_768)).get(),
        2_048
    );
    assert_eq!(config.tools.max_output_bytes, 1024 * 1024);
    config.tools.max_inline_output_bytes = std::num::NonZeroU64::new(768);
    assert_eq!(model_inline_output_limit(&config, Some(8_192)).get(), 768);
}

#[test]
fn inline_budget_config_is_optional_and_rejects_zero() {
    use orchestral_core::config::ToolsConfig;
    let implicit: ToolsConfig = serde_json::from_value(serde_json::json!({})).unwrap();
    assert_eq!(implicit.max_inline_output_bytes, None);
    let explicit: ToolsConfig = serde_json::from_value(serde_json::json!({
        "max_inline_output_bytes": 512,
    }))
    .unwrap();
    assert_eq!(explicit.max_inline_output_bytes.unwrap().get(), 512);
    assert!(serde_json::from_value::<ToolsConfig>(serde_json::json!({
        "max_inline_output_bytes": 0,
    }))
    .is_err());
}