gproxy-protocol 4.1.14

GPROXY v4 connection modelling, operation declarations, vendor wire types and pairwise conversion
Documentation
use crate::{
    transform::{Report, TransformError},
    wire::{claude::generate_content as cg, openai::chat},
};

pub(super) fn claude(
    input: &cg::GenerateContentRequestBody,
    report: &mut Report,
) -> Result<(), TransformError> {
    for (present, field) in [
        (input.container.is_some(), "container"),
        (input.context_management.is_some(), "context_management"),
        (
            input.fallback_credit_token.is_some(),
            "fallback_credit_token",
        ),
        (input.fallbacks.is_some(), "fallbacks"),
        (input.inference_geo.is_some(), "inference_geo"),
        (input.mcp_servers.is_some(), "mcp_servers"),
        (input.speed.is_some(), "speed"),
        (
            input
                .output_config
                .as_ref()
                .is_some_and(|config| config.task_budget.is_some()),
            "output_config.task_budget",
        ),
    ] {
        if present {
            report.omitted(field, "field has no target representation");
        }
    }
    if input.diagnostics.is_some() {
        report.omitted("diagnostics", "Chat has no equivalent advisory field");
    }

    Ok(())
}

pub(super) fn chat(
    input: &chat::GenerateContentRequestBody,
    report: &mut Report,
) -> Result<(), TransformError> {
    for (present, field) in [
        (input.temperature.flatten().is_some(), "temperature"),
        (input.top_p.flatten().is_some(), "top_p"),
        (
            input.audio.as_ref().and_then(Option::as_ref).is_some(),
            "audio",
        ),
        (input.web_search_options.is_some(), "web_search_options"),
        (
            input
                .frequency_penalty
                .flatten()
                .is_some_and(|value| value != 0.0),
            "frequency_penalty",
        ),
        (
            input
                .presence_penalty
                .flatten()
                .is_some_and(|value| value != 0.0),
            "presence_penalty",
        ),
        (
            input
                .logit_bias
                .as_ref()
                .and_then(Option::as_ref)
                .is_some_and(|value| !value.is_empty()),
            "logit_bias",
        ),
        (input.logprobs.flatten() == Some(true), "logprobs"),
        (
            input.top_logprobs.flatten().is_some_and(|value| value != 0),
            "top_logprobs",
        ),
        (
            input.moderation.as_ref().and_then(Option::as_ref).is_some(),
            "moderation",
        ),
        (
            input.prediction.as_ref().and_then(Option::as_ref).is_some(),
            "prediction",
        ),
        (input.seed.flatten().is_some(), "seed"),
        (input.store.flatten() == Some(true), "store"),
        (input.verbosity.flatten().is_some(), "verbosity"),
    ] {
        if present {
            report.omitted(field, "field has no target representation");
        }
    }
    if let Some(modalities) = input.modalities.as_ref().and_then(Option::as_ref)
        && (modalities.is_empty()
            || modalities
                .iter()
                .any(|mode| !matches!(mode, chat::Modality::Text)))
    {
        report.omitted("modalities", "field has no target representation");
    }
    for (present, field) in [
        (
            input.metadata.as_ref().and_then(Option::as_ref).is_some(),
            "metadata",
        ),
        (
            input
                .prompt_cache_key
                .as_ref()
                .and_then(Option::as_ref)
                .is_some(),
            "prompt_cache_key",
        ),
        (
            input.prompt_cache_retention.flatten().is_some(),
            "prompt_cache_retention",
        ),
        (
            input
                .safety_identifier
                .as_ref()
                .and_then(Option::as_ref)
                .is_some(),
            "safety_identifier",
        ),
        (
            input
                .stream_options
                .as_ref()
                .and_then(Option::as_ref)
                .is_some(),
            "stream_options",
        ),
    ] {
        if present {
            report.omitted(field,"Claude has no equivalent advisory or delivery-option field; host must retain delivery options");
        }
    }
    Ok(())
}