Skip to main content

synapse/routing/
classify.rs

1//! Pure lane detection: standard vs native-Vertex.
2
3use crate::routing::request::ChatRequest;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub enum Lane {
7    Standard,
8    NativeVertex,
9}
10
11/// Classify by inspecting the request for native-Vertex triggers.
12/// Pure and allocation-free; safe to call on the hot path.
13pub fn classify(req: &ChatRequest) -> Lane {
14    let v = match &req.vertex {
15        Some(v) => v,
16        None => return Lane::Standard,
17    };
18    let triggers_native = v.cached_content.is_some()
19        || v.response_schema.is_some()
20        || v.media_uris
21            .as_ref()
22            .is_some_and(|uris| uris.iter().any(|u| u.starts_with("gs://")));
23    if triggers_native {
24        Lane::NativeVertex
25    } else {
26        Lane::Standard
27    }
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33    use crate::routing::request::{ChatRequest, VertexExt};
34
35    fn base() -> ChatRequest {
36        serde_json::from_value(serde_json::json!({
37            "model": "m", "messages": [{"role": "user", "content": "hi"}]
38        }))
39        .unwrap()
40    }
41
42    #[test]
43    fn no_vertex_block_is_standard() {
44        assert_eq!(classify(&base()), Lane::Standard);
45    }
46
47    #[test]
48    fn cached_content_is_native() {
49        let req = ChatRequest {
50            vertex: Some(VertexExt {
51                cached_content: Some("cachedContents/x".into()),
52                ..Default::default()
53            }),
54            ..base()
55        };
56        assert_eq!(classify(&req), Lane::NativeVertex);
57    }
58
59    #[test]
60    fn response_schema_is_native() {
61        let req = ChatRequest {
62            vertex: Some(VertexExt {
63                response_schema: Some(serde_json::json!({"type": "object"})),
64                ..Default::default()
65            }),
66            ..base()
67        };
68        assert_eq!(classify(&req), Lane::NativeVertex);
69    }
70
71    #[test]
72    fn gs_media_uri_is_native_but_https_is_not() {
73        let gs = ChatRequest {
74            vertex: Some(VertexExt {
75                media_uris: Some(vec!["gs://b/v.mp4".into()]),
76                ..Default::default()
77            }),
78            ..base()
79        };
80        assert_eq!(classify(&gs), Lane::NativeVertex);
81        let https = ChatRequest {
82            vertex: Some(VertexExt {
83                media_uris: Some(vec!["https://x/v.mp4".into()]),
84                ..Default::default()
85            }),
86            ..base()
87        };
88        assert_eq!(classify(&https), Lane::Standard);
89    }
90}