synapse/routing/
classify.rs1use crate::routing::request::ChatRequest;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub enum Lane {
7 Standard,
8 NativeVertex,
9}
10
11pub 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}