gproxy-protocol 4.1.11

GPROXY v4 connection modelling, operation declarations, vendor wire types and pairwise conversion
Documentation
use super::super::ResponsesUsageFacts;
use crate::{
    transform::TransformError,
    wire::{
        claude::{generate_content as c, stream as s},
        openai::responses as r,
    },
};

#[derive(Default)]
pub(super) struct ClaudeProgress {
    output: i64,
    thinking: Option<i64>,
    thinking_at: Option<i64>,
}

impl ClaudeProgress {
    pub fn start(&mut self, v: &c::Usage) -> Result<(), TransformError> {
        self.observe(
            v.output_tokens,
            v.output_tokens_details
                .as_ref()
                .and_then(Option::as_ref)
                .map(|v| v.thinking_tokens),
            v.output_tokens_details.is_some(),
        )
    }
    pub fn delta(&mut self, v: &s::MessageDeltaUsage) -> Result<(), TransformError> {
        self.observe(
            v.output_tokens,
            v.output_tokens_details
                .as_ref()
                .and_then(Option::as_ref)
                .map(|v| v.thinking_tokens),
            v.output_tokens_details.is_some(),
        )
    }
    fn observe(
        &mut self,
        output: i64,
        thinking: Option<i64>,
        present: bool,
    ) -> Result<(), TransformError> {
        self.output = output;
        if let Some(n) = thinking {
            self.thinking = Some(n);
            self.thinking_at = Some(output);
        } else if present {
            self.thinking_at = None;
        }
        Ok(())
    }
    pub fn finalize(
        &self,
        v: &mut c::Usage,
        _facts: ResponsesUsageFacts,
    ) -> Result<(), TransformError> {
        if self.thinking_at != Some(v.output_tokens) {
            v.output_tokens_details = None;
        }
        Ok(())
    }
}

pub(super) fn claude_tier(tier: Option<r::ServiceTier>) -> Option<Option<c::ResponseServiceTier>> {
    match tier {
        Some(r::ServiceTier::Default) => Some(Some(c::ResponseServiceTier::Standard)),
        Some(r::ServiceTier::Priority) => Some(Some(c::ResponseServiceTier::Priority)),
        _ => None,
    }
}