gproxy-transform 2.4.2

Pairwise request/response/stream transforms between the OpenAI, Anthropic Claude, and Google Gemini APIs
Documentation
use crate::protocol::{claude, gemini, openai};

use super::reasoning::openai_reasoning_effort_to_claude_output;
use super::response_format::{
    gemini_generation_to_claude_output_format, openai_response_format_to_claude,
};
use super::thinking::gemini_thinking_to_claude_output_effort;
use crate::transform::count_tokens::common::scalar::i32_to_u64;

pub(in crate::transform::count_tokens) fn gemini_generation_to_claude_output_config(
    generation_config: Option<&gemini::GenerationConfig>,
) -> Option<claude::OutputConfig> {
    let config = generation_config?;
    let effort = config
        .thinking_config
        .as_ref()
        .and_then(gemini_thinking_to_claude_output_effort);
    let format = gemini_generation_to_claude_output_format(Some(config));
    let task_budget = config.max_output_tokens.map(|total| {
        crate::protocol::wire!(claude::TokenTaskBudget {
            total: i32_to_u64(total),
            type_: claude::TaskBudgetType::Known(claude::TaskBudgetTypeKnown::Tokens),
            remaining: None,
            extra: Default::default(),
        })
    });

    if effort.is_none() && format.is_none() && task_budget.is_none() {
        return None;
    }

    Some(crate::protocol::wire!(claude::OutputConfig {
        effort,
        format,
        task_budget,
        extra: Default::default(),
    }))
}

pub(in crate::transform::count_tokens) fn openai_generation_to_claude_output_config(
    reasoning: Option<&openai::ReasoningConfig>,
    text: Option<&openai::TextConfig>,
) -> Option<claude::OutputConfig> {
    let effort = reasoning
        .and_then(|reasoning| reasoning.effort.as_ref())
        .map(openai_reasoning_effort_to_claude_output);
    let format = text
        .and_then(|text| text.format.as_ref())
        .and_then(openai_response_format_to_claude);

    if effort.is_none() && format.is_none() {
        return None;
    }

    Some(crate::protocol::wire!(claude::OutputConfig {
        effort,
        format,
        task_budget: None,
        extra: Default::default(),
    }))
}