switchyard_libsy/algorithms/
noop.rs1use std::sync::Arc;
7
8use switchyard_protocol::{ModelId, Request};
9
10use super::util::fixed_reply;
11use crate::core::algorithm::{Algorithm, Driver};
12use crate::{Result, RoutingOutcome};
13
14pub struct Noop {}
16
17#[async_trait::async_trait]
18impl Algorithm for Noop {
19 fn name(&self) -> &str {
20 "noop"
21 }
22
23 async fn route(self: Arc<Self>, _driver: Driver, request: Request) -> Result<RoutingOutcome> {
24 let model_id = request
25 .model_id()
26 .unwrap_or_else(|| ModelId::from("switchyard/noop"));
27 tracing::info!(target = %model_id, "noop returned its synthetic response");
28 Ok(fixed_reply(model_id, request, "switchyard-noop", "OK"))
29 }
30}
31
32#[cfg(test)]
33mod tests {
34 use switchyard_protocol::{LlmRequest, LlmResponse, Message, Role};
35
36 use super::*;
37 use crate::core::testing::{echo, test_drive};
38
39 #[tokio::test]
40 async fn test_noop_algo() -> Result<()> {
41 const TEST_MODEL: &str = "test_noop_algo";
42 let request = Request {
43 llm_request: LlmRequest {
44 model: Some(TEST_MODEL.to_string()),
45 messages: vec![Message::text(Role::User, "hi")],
46 ..LlmRequest::default()
47 },
48 raw_request: None,
49 metadata: None,
50 };
51
52 let a: Arc<dyn Algorithm> = Arc::new(Noop {});
55 let (selected_model, response) = test_drive(a, request, echo()).await?;
56 assert_eq!(selected_model, TEST_MODEL);
57 assert_eq!(response.selected_model(), Some(TEST_MODEL));
58 Ok(())
59 }
60
61 #[tokio::test]
62 async fn test_noop_algo_streams_when_requested() -> Result<()> {
63 let request = Request {
64 llm_request: LlmRequest {
65 model: Some("streaming-noop".to_string()),
66 messages: vec![Message::text(Role::User, "hi")],
67 stream: true,
68 ..LlmRequest::default()
69 },
70 raw_request: None,
71 metadata: None,
72 };
73
74 let algorithm: Arc<dyn Algorithm> = Arc::new(Noop {});
75 let (_, response) = test_drive(algorithm, request, echo()).await?;
76
77 assert!(matches!(response.llm_response, LlmResponse::Stream(_)));
78 Ok(())
79 }
80}