gproxy-protocol 4.1.14

GPROXY v4 connection modelling, operation declarations, vendor wire types and pairwise conversion
Documentation
use crate::{
    transform::TransformError,
    wire::openai::{chat as c, responses::generate as r},
};

pub(super) fn to_responses(
    input: &c::GenerateContentRequestBody,
    out: &mut r::GenerateContentRequestBody,
) -> Result<(), TransformError> {
    out.prompt_cache_retention = input.prompt_cache_retention.map(|v| {
        v.map(|v| match v {
            c::PromptCacheRetention::InMemory => r::PromptCacheRetention::InMemory,
            c::PromptCacheRetention::TwentyFourHours => r::PromptCacheRetention::TwentyFourHours,
        })
    });
    out.prompt_cache_options = input.prompt_cache_options.as_ref().map(|value| {
        let mut target = r::PromptCacheOptions::builder().build();
        target.mode = value.mode.map(|v| match v {
            c::PromptCacheOptionMode::Implicit => r::PromptCachingMode::Implicit,
            c::PromptCacheOptionMode::Explicit => r::PromptCachingMode::Explicit,
        });
        target.ttl = value.ttl.map(|v| match v {
            c::PromptCacheTtl::ThirtyMinutes => r::PromptCacheTtl::ThirtyMinutes,
        });
        target
    });
    out.moderation = input.moderation.as_ref().map(|value| {
        value.as_ref().map(|value| {
            let mut target = r::ResponseModeration::builder(value.model.clone()).build();
            target.policy = value.policy.as_ref().map(|value| {
                value.as_ref().map(|value| {
                    let mut policy = r::ModerationPolicy::builder().build();
                    policy.input = value.input.as_ref().map(|v| {
                        v.as_ref().map(|v| {
                            r::ModerationPolicyMode::builder(match v.mode {
                                c::ModerationModeType::Score => r::ModerationMode::Score,
                                c::ModerationModeType::Block => r::ModerationMode::Block,
                            })
                            .build()
                        })
                    });
                    policy.output = value.output.as_ref().map(|v| {
                        v.as_ref().map(|v| {
                            r::ModerationPolicyMode::builder(match v.mode {
                                c::ModerationModeType::Score => r::ModerationMode::Score,
                                c::ModerationModeType::Block => r::ModerationMode::Block,
                            })
                            .build()
                        })
                    });
                    policy
                })
            });
            target
        })
    });
    Ok(())
}

pub(super) fn to_chat(
    input: &r::GenerateContentRequestBody,
    out: &mut c::GenerateContentRequestBody,
) -> Result<(), TransformError> {
    if input.prompt_cache_options.as_ref().and_then(|v| v.ttl)
        == Some(r::PromptCacheTtl::TwelveHours)
    {
        return Err(TransformError::unsupported(
            "prompt_cache_options.ttl",
            "Chat Completions has no request-wide 12h cache lifetime",
        ));
    }
    out.prompt_cache_retention = input.prompt_cache_retention.map(|v| {
        v.map(|v| match v {
            r::PromptCacheRetention::InMemory => c::PromptCacheRetention::InMemory,
            r::PromptCacheRetention::TwentyFourHours => c::PromptCacheRetention::TwentyFourHours,
        })
    });
    out.prompt_cache_options = input.prompt_cache_options.as_ref().map(|value| {
        let mut target = c::PromptCacheOptions::builder().build();
        target.mode = value.mode.map(|v| match v {
            r::PromptCachingMode::Implicit => c::PromptCacheOptionMode::Implicit,
            r::PromptCachingMode::Explicit => c::PromptCacheOptionMode::Explicit,
        });
        target.ttl = value.ttl.map(|v| match v {
            r::PromptCacheTtl::ThirtyMinutes => c::PromptCacheTtl::ThirtyMinutes,
            r::PromptCacheTtl::TwelveHours => unreachable!("checked above"),
        });
        target
    });
    out.moderation = input.moderation.as_ref().map(|value| {
        value.as_ref().map(|value| {
            let mut target = c::Moderation::builder(value.model.clone()).build();
            target.policy = value.policy.as_ref().map(|value| {
                value.as_ref().map(|value| {
                    let mut policy = c::ModerationPolicy::builder().build();
                    policy.input = value.input.as_ref().map(|v| {
                        v.as_ref().map(|v| {
                            c::ModerationMode::builder(match v.mode {
                                r::ModerationMode::Score => c::ModerationModeType::Score,
                                r::ModerationMode::Block => c::ModerationModeType::Block,
                            })
                            .build()
                        })
                    });
                    policy.output = value.output.as_ref().map(|v| {
                        v.as_ref().map(|v| {
                            c::ModerationMode::builder(match v.mode {
                                r::ModerationMode::Score => c::ModerationModeType::Score,
                                r::ModerationMode::Block => c::ModerationModeType::Block,
                            })
                            .build()
                        })
                    });
                    policy
                })
            });
            target
        })
    });
    Ok(())
}