litellm-rs 0.8.2

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

use super::{FRAGMENT_SEPARATOR, push_fragment, push_json_value};

pub(in crate::server::guardrails) fn payload(request: &ChatCompletionRequest) -> String {
    let mut fragments = Vec::new();
    fragments.extend(request.stop.iter().flatten().cloned());
    fragments.extend(request.modalities.iter().flatten().cloned());
    fragments.extend(request.reasoning_effort.iter().cloned());
    fragments.extend(request.service_tier.iter().cloned());
    fragments.extend(
        request
            .logit_bias
            .iter()
            .flat_map(|bias| bias.keys().cloned()),
    );
    if let Some(audio) = request.audio.as_ref() {
        fragments.push(audio.voice.clone());
        fragments.push(audio.format.clone());
    }
    if let Some(format) = request.response_format.as_ref() {
        fragments.push(format.format_type.clone());
        fragments.extend(format.response_type.iter().cloned());
        if let Some(schema) = format.json_schema.as_ref() {
            push_json_value(&mut fragments, schema);
        }
    }
    for value in [
        request.prediction.as_ref(),
        request.safety_settings.as_ref(),
        request.cache_control.as_ref(),
    ]
    .into_iter()
    .flatten()
    {
        push_json_value(&mut fragments, value);
    }
    for (key, value) in &request.extra_body {
        push_fragment(&mut fragments, key);
        push_json_value(&mut fragments, value);
    }
    for message in &request.messages {
        fragments.extend(message.tool_call_id.iter().cloned());
        for call in message.tool_calls.iter().flatten() {
            fragments.push(call.id.clone());
            fragments.push(call.tool_type.clone());
        }
    }
    if let Some(choice) = request.tool_choice.as_ref() {
        match choice {
            ToolChoice::None(value) | ToolChoice::Auto(value) | ToolChoice::Required(value) => {
                fragments.push(value.clone());
            }
            ToolChoice::Specific(value) => {
                fragments.push(value.tool_type.clone());
                fragments.push(value.function.name.clone());
            }
        }
    }
    fragments.join(FRAGMENT_SEPARATOR)
}