use super::{
GuardianLimits, GuardianStreamContext, GuardianStreamInvocation, GuardianStreamLimits,
};
use crate::{
capability::Upstream,
transform::{TransformError, guardian::GuardianPreparedRequest, identity::IdentityFlow},
};
pub async fn review_sse<U: Upstream>(
upstream: &U,
target: &U::Target,
request: GuardianPreparedRequest,
context: GuardianStreamContext,
flow: &mut IdentityFlow,
limits: GuardianLimits,
stream_limits: GuardianStreamLimits,
) -> Result<GuardianStreamInvocation, TransformError> {
let context = source_context(&request, context)?;
super::review(upstream, target, request, limits)
.await?
.into_stream(context, flow, stream_limits)
}
pub async fn classify_sse<U: Upstream>(
upstream: &U,
target: &U::Target,
request: GuardianPreparedRequest,
context: GuardianStreamContext,
flow: &mut IdentityFlow,
limits: GuardianLimits,
stream_limits: GuardianStreamLimits,
) -> Result<GuardianStreamInvocation, TransformError> {
let context = source_context(&request, context)?;
super::classify(upstream, target, request, limits)
.await?
.into_stream(context, flow, stream_limits)
}
fn source_context(
request: &GuardianPreparedRequest,
context: GuardianStreamContext,
) -> Result<GuardianStreamContext, TransformError> {
let source = request.response_request()?;
Ok(match context {
GuardianStreamContext::Responses => GuardianStreamContext::Responses,
GuardianStreamContext::Chat(mut context) => {
context.request = source;
GuardianStreamContext::Chat(context)
}
GuardianStreamContext::Claude(mut context) => {
context.request = source;
GuardianStreamContext::Claude(context)
}
GuardianStreamContext::Gemini(mut context) => {
context.request = source;
GuardianStreamContext::Gemini(context)
}
})
}