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::openai;
use crate::{FinishReason, GenerationConfig, Role, Usage};

use super::common::empty_extensions;

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

pub(crate) fn finish_from_openai(reason: Option<&str>) -> Option<FinishReason> {
    match reason {
        Some("stop") => Some(FinishReason::Stop),
        Some("length") => Some(FinishReason::Length),
        Some("tool_calls") | Some("function_call") => Some(FinishReason::ToolCall),
        Some("content_filter") => Some(FinishReason::ContentFilter),
        Some(_) => Some(FinishReason::Unknown),
        None => None,
    }
}

pub(crate) fn openai_usage_to_universal(usage: Option<&openai::OpenAiUsage>) -> Option<Usage> {
    usage.map(|usage| Usage {
        input_tokens: usage.input_tokens.or(usage.prompt_tokens),
        output_tokens: usage.output_tokens.or(usage.completion_tokens),
        total_tokens: usage.total_tokens,
    })
}

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