gproxy_channel_api/
routes.rs1use crate::protocol::{
8 ContentGenerationKind as Cg, Operation, OperationKey, OperationKind, Provider,
9};
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
16pub enum RoutingDecision {
17 Passthrough,
18 TransformTo(OperationKey),
19 Local,
20 Unsupported,
21}
22
23pub type RouteList = Vec<(OperationKey, RoutingDecision)>;
25
26fn key(operation: Operation, kind: OperationKind) -> OperationKey {
27 OperationKey::try_new(operation, kind).expect("channel route must use a consistent operation")
28}
29
30pub fn pass(operation: Operation, kind: OperationKind) -> (OperationKey, RoutingDecision) {
32 (key(operation, kind), RoutingDecision::Passthrough)
33}
34
35pub fn xform(
37 operation: Operation,
38 kind: OperationKind,
39 d_op: Operation,
40 d_kind: OperationKind,
41) -> (OperationKey, RoutingDecision) {
42 (
43 key(operation, kind),
44 RoutingDecision::TransformTo(key(d_op, d_kind)),
45 )
46}
47
48pub fn unsupported(operation: Operation, kind: OperationKind) -> (OperationKey, RoutingDecision) {
50 (key(operation, kind), RoutingDecision::Unsupported)
51}
52
53pub fn local(operation: Operation, kind: OperationKind) -> (OperationKey, RoutingDecision) {
55 (key(operation, kind), RoutingDecision::Local)
56}
57
58pub fn responses_ws_to(d_kind: OperationKind) -> RouteList {
61 use Operation::{GenerateContent, StreamGenerateContent};
62
63 vec![
64 xform(
65 GenerateContent,
66 cg(Cg::OpenAiResponsesWebSocket),
67 StreamGenerateContent,
68 d_kind,
69 ),
70 xform(
71 StreamGenerateContent,
72 cg(Cg::OpenAiResponsesWebSocket),
73 StreamGenerateContent,
74 d_kind,
75 ),
76 ]
77}
78
79pub fn cg(k: Cg) -> OperationKind {
81 OperationKind::ContentGeneration(k)
82}
83
84pub fn pv(p: Provider) -> OperationKind {
85 OperationKind::Provider(p)
86}