va-ai-api-bridge 0.1.7

Protocol translation primitives for AI API request and response shapes.
Documentation
pub(crate) mod content;
mod reasoning;
mod tools;

pub(crate) use content::*;
pub(crate) use reasoning::*;
pub(crate) use tools::*;

use crate::schema::anthropic;
use crate::{FinishReason, GenerationConfig, Role, Usage};

use super::common::empty_extensions;

pub(crate) fn role_to_anthropic(role: Role) -> &'static str {
    match role {
        Role::Developer | Role::System | Role::User | Role::Tool => "user",
        Role::Assistant => "assistant",
    }
}

pub(crate) fn finish_from_anthropic(reason: Option<&str>) -> Option<FinishReason> {
    match reason {
        Some("end_turn") | Some("stop_sequence") => Some(FinishReason::Stop),
        Some("max_tokens") => Some(FinishReason::Length),
        Some("tool_use") => Some(FinishReason::ToolCall),
        Some(_) => Some(FinishReason::Unknown),
        None => None,
    }
}

pub(crate) fn anthropic_usage_to_universal(
    usage: Option<&anthropic::AnthropicUsage>,
) -> Option<Usage> {
    usage.map(|usage| {
        let input_tokens = usage.input_tokens.map(|tokens| {
            tokens
                + usage.cache_creation_input_tokens.unwrap_or(0)
                + usage.cache_read_input_tokens.unwrap_or(0)
        });
        Usage {
            input_tokens,
            output_tokens: usage.output_tokens,
            total_tokens: input_tokens
                .zip(usage.output_tokens)
                .map(|(input, output)| input + output),
        }
    })
}

pub(crate) fn generation_from_anthropic(
    temperature: Option<f64>,
    top_p: Option<f64>,
    max_output_tokens: Option<u64>,
) -> GenerationConfig {
    GenerationConfig {
        temperature,
        top_p,
        max_output_tokens,
        extensions: empty_extensions(),
    }
}