gproxy-transform 3.0.0-alpha.0

GPROXY v3 pairwise protocol transforms
Documentation
use gproxy_protocol::openai;

use super::SseFrame;
use crate::TransformError;

#[derive(Default)]
pub(super) struct ResponsesCollector {
    pub(super) response: Option<Box<openai::ResponseObject>>,
}

impl ResponsesCollector {
    pub(super) fn frame(&mut self, frame: SseFrame) -> Result<(), TransformError> {
        let event: openai::ResponseStreamEvent = serde_json::from_str(&frame.data)?;
        match event {
            openai::ResponseStreamEvent::Known(event) => match *event {
                openai::KnownResponseStreamEvent::ResponseCompleted(event)
                | openai::KnownResponseStreamEvent::ResponseIncomplete(event)
                | openai::KnownResponseStreamEvent::ResponseFailed(event) => {
                    self.response = Some(event.response);
                }
                openai::KnownResponseStreamEvent::ResponseCreated(_)
                | openai::KnownResponseStreamEvent::ResponseInProgress(_)
                | openai::KnownResponseStreamEvent::ResponseQueued(_)
                | openai::KnownResponseStreamEvent::ResponseInjectCreated(_)
                | openai::KnownResponseStreamEvent::ResponseInjectFailed(_)
                | openai::KnownResponseStreamEvent::ResponseSteerAccepted(_)
                | openai::KnownResponseStreamEvent::ResponseSteerPending(_)
                | openai::KnownResponseStreamEvent::ResponseSteerFailed(_)
                | openai::KnownResponseStreamEvent::ResponseOutputItemAdded(_)
                | openai::KnownResponseStreamEvent::ResponseOutputItemDone(_)
                | openai::KnownResponseStreamEvent::ResponseContentPartAdded(_)
                | openai::KnownResponseStreamEvent::ResponseContentPartDone(_)
                | openai::KnownResponseStreamEvent::ResponseOutputTextDelta(_)
                | openai::KnownResponseStreamEvent::ResponseOutputTextDone(_)
                | openai::KnownResponseStreamEvent::ResponseOutputTextAnnotationAdded(_)
                | openai::KnownResponseStreamEvent::ResponseFunctionCallArgumentsDelta(_)
                | openai::KnownResponseStreamEvent::ResponseFunctionCallArgumentsDone(_)
                | openai::KnownResponseStreamEvent::ResponseCustomToolCallInputDelta(_)
                | openai::KnownResponseStreamEvent::ResponseCustomToolCallInputDone(_)
                | openai::KnownResponseStreamEvent::ResponseRefusalDelta(_)
                | openai::KnownResponseStreamEvent::ResponseRefusalDone(_)
                | openai::KnownResponseStreamEvent::ResponseReasoningSummaryPartAdded(_)
                | openai::KnownResponseStreamEvent::ResponseReasoningSummaryPartDone(_)
                | openai::KnownResponseStreamEvent::ResponseReasoningSummaryTextDelta(_)
                | openai::KnownResponseStreamEvent::ResponseReasoningSummaryTextDone(_)
                | openai::KnownResponseStreamEvent::ResponseReasoningTextDelta(_)
                | openai::KnownResponseStreamEvent::ResponseReasoningTextDone(_)
                | openai::KnownResponseStreamEvent::ResponseAudioDelta(_)
                | openai::KnownResponseStreamEvent::ResponseAudioDone(_)
                | openai::KnownResponseStreamEvent::ResponseAudioTranscriptDelta(_)
                | openai::KnownResponseStreamEvent::ResponseAudioTranscriptDone(_)
                | openai::KnownResponseStreamEvent::ResponseImageGenerationCallCompleted(_)
                | openai::KnownResponseStreamEvent::ResponseImageGenerationCallGenerating(_)
                | openai::KnownResponseStreamEvent::ResponseImageGenerationCallInProgress(_)
                | openai::KnownResponseStreamEvent::ResponseImageGenerationCallPartialImage(_)
                | openai::KnownResponseStreamEvent::ResponseFileSearchCallInProgress(_)
                | openai::KnownResponseStreamEvent::ResponseFileSearchCallSearching(_)
                | openai::KnownResponseStreamEvent::ResponseFileSearchCallCompleted(_)
                | openai::KnownResponseStreamEvent::ResponseWebSearchCallInProgress(_)
                | openai::KnownResponseStreamEvent::ResponseWebSearchCallSearching(_)
                | openai::KnownResponseStreamEvent::ResponseWebSearchCallCompleted(_)
                | openai::KnownResponseStreamEvent::ResponseCodeInterpreterCallInProgress(_)
                | openai::KnownResponseStreamEvent::ResponseCodeInterpreterCallInterpreting(_)
                | openai::KnownResponseStreamEvent::ResponseCodeInterpreterCallCompleted(_)
                | openai::KnownResponseStreamEvent::ResponseCodeInterpreterCallCodeDelta(_)
                | openai::KnownResponseStreamEvent::ResponseCodeInterpreterCallCodeDone(_)
                | openai::KnownResponseStreamEvent::ResponseMcpCallArgumentsDelta(_)
                | openai::KnownResponseStreamEvent::ResponseMcpCallArgumentsDone(_)
                | openai::KnownResponseStreamEvent::ResponseMcpCallInProgress(_)
                | openai::KnownResponseStreamEvent::ResponseMcpCallCompleted(_)
                | openai::KnownResponseStreamEvent::ResponseMcpCallFailed(_)
                | openai::KnownResponseStreamEvent::ResponseMcpListToolsInProgress(_)
                | openai::KnownResponseStreamEvent::ResponseMcpListToolsCompleted(_)
                | openai::KnownResponseStreamEvent::ResponseMcpListToolsFailed(_)
                | openai::KnownResponseStreamEvent::Error(_) => {}
                #[cfg(not(feature = "exhaustive"))]
                _ => {
                    return Err(crate::TransformError::unsupported(
                        "protocol enum",
                        "unrecognized external variant",
                    ));
                }
            },
            openai::ResponseStreamEvent::Unknown(_) => {}
            #[cfg(not(feature = "exhaustive"))]
            _ => {
                return Err(crate::TransformError::unsupported(
                    "protocol enum",
                    "unrecognized external variant",
                ));
            }
        }
        Ok(())
    }

    pub(super) fn finish(self) -> Result<openai::ResponseObject, TransformError> {
        self.response
            .map(|response| *response)
            .ok_or(TransformError::IncompleteStream)
    }
}