va-ai-api-bridge 0.1.7

Protocol translation primitives for AI API request and response shapes.
Documentation
use crate::schema::anthropic::AnthropicMessagesResponse;
use crate::translator::{anthropic, common};
use crate::{ApiBridgeError, Result, Role, UniversalEvent};

pub(super) fn decode(raw: serde_json::Value) -> Result<Vec<UniversalEvent>> {
    let response: AnthropicMessagesResponse = serde_json::from_value(raw)
        .map_err(|error| ApiBridgeError::invalid_response(error.to_string()))?;
    let usage = anthropic::anthropic_usage_to_universal(response.usage.as_ref());
    let mut events = vec![
        UniversalEvent::ResponseStart {
            id: response.id.clone(),
            model: response.model.clone(),
            extensions: common::empty_extensions(),
        },
        UniversalEvent::MessageStart {
            id: response
                .id
                .clone()
                .unwrap_or_else(|| "anthropic_message".to_string()),
            role: response
                .role
                .as_deref()
                .and_then(common::role_from_wire)
                .unwrap_or(Role::Assistant),
            extensions: common::empty_extensions(),
        },
    ];

    for (index, block) in response
        .content
        .iter()
        .map(anthropic::anthropic_block_to_block)
        .enumerate()
    {
        common::push_block_events(&mut events, index, block);
    }
    events.push(UniversalEvent::MessageDone {
        finish_reason: anthropic::finish_from_anthropic(response.stop_reason.as_deref()),
        usage: usage.clone(),
        extensions: common::empty_extensions(),
    });
    events.push(UniversalEvent::ResponseDone {
        usage,
        extensions: common::empty_extensions(),
    });
    Ok(events)
}