use crate::protocol::{
ContentGenerationKind as Cg, Operation, OperationKey, OperationKind, Provider,
};
use gproxy_transform::routing::RoutingDecision;
pub type RouteList = Vec<(OperationKey, RoutingDecision)>;
fn key(operation: Operation, kind: OperationKind) -> OperationKey {
OperationKey { operation, kind }
}
pub fn pass(operation: Operation, kind: OperationKind) -> (OperationKey, RoutingDecision) {
(key(operation, kind), RoutingDecision::Passthrough)
}
pub fn xform(
operation: Operation,
kind: OperationKind,
d_op: Operation,
d_kind: OperationKind,
) -> (OperationKey, RoutingDecision) {
(
key(operation, kind),
RoutingDecision::TransformTo(key(d_op, d_kind)),
)
}
pub fn unsupported(operation: Operation, kind: OperationKind) -> (OperationKey, RoutingDecision) {
(key(operation, kind), RoutingDecision::Unsupported)
}
pub fn local(operation: Operation, kind: OperationKind) -> (OperationKey, RoutingDecision) {
(key(operation, kind), RoutingDecision::Local)
}
pub fn responses_ws_to(d_kind: OperationKind) -> RouteList {
use Operation::{GenerateContent, StreamGenerateContent};
vec![
xform(
GenerateContent,
cg(Cg::OpenAiResponsesWebSocket),
StreamGenerateContent,
d_kind,
),
xform(
StreamGenerateContent,
cg(Cg::OpenAiResponsesWebSocket),
StreamGenerateContent,
d_kind,
),
]
}
pub fn cg(k: Cg) -> OperationKind {
OperationKind::ContentGeneration(k)
}
pub fn pv(p: Provider) -> OperationKind {
OperationKind::Provider(p)
}