litellm-rs 0.6.0

A high-performance AI Gateway written in Rust, providing OpenAI-compatible APIs with intelligent routing, load balancing, and enterprise features
Documentation
use super::*;
use crate::core::models::openai::requests::ChatCompletionRequest;

#[test]
fn providers_that_ignore_max_completion_tokens_use_max_tokens_only() {
    let mut request = ChatCompletionRequest {
        model: "model".to_string(),
        ..Default::default()
    };
    request.max_completion_tokens = Some(10);

    for provider in ["ai21", "ollama", "sagemaker", "snowflake"] {
        assert_eq!(
            provider_effective_max_output_tokens(provider, "model", &request),
            None,
            "{provider} must not reserve against ignored max_completion_tokens"
        );
    }

    request.max_tokens = Some(100);
    for provider in ["ai21", "ollama", "sagemaker", "snowflake"] {
        assert_eq!(
            provider_effective_max_output_tokens(provider, "model", &request),
            Some(100),
            "{provider} should reserve against max_tokens"
        );
    }
}

#[test]
fn issue_760_alias_providers_reserve_max_completion_tokens() {
    let mut request = ChatCompletionRequest {
        model: "model".to_string(),
        ..Default::default()
    };
    request.max_completion_tokens = Some(10);

    for provider in [
        "zai",
        "together",
        "together_ai",
        "fireworks",
        "fireworks_ai",
        "aiml_api",
        "aiml",
    ] {
        assert_eq!(
            provider_effective_max_output_tokens(provider, "model", &request),
            Some(10),
            "{provider} should reserve against max_completion_tokens"
        );
    }
}

#[test]
fn anthropic_without_max_tokens_reserves_adapter_default_output_cap() {
    let mut request = ChatCompletionRequest {
        model: "claude-sonnet-4-20250514".to_string(),
        ..Default::default()
    };
    request.max_completion_tokens = Some(100_000);

    assert_eq!(
        provider_effective_max_output_tokens("anthropic", &request.model, &request),
        Some(4096),
        "Anthropic sends max_tokens default 4096 when max_tokens is omitted"
    );

    request.max_tokens = Some(512);
    assert_eq!(
        provider_effective_max_output_tokens("anthropic", &request.model, &request),
        Some(512),
        "explicit max_tokens is the effective Anthropic output cap"
    );
}