Skip to main content

switchyard_libsy/algorithms/
noop.rs

1// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2// SPDX-License-Identifier: Apache-2.0
3
4//! Test-only algorithm that returns a hard-coded response without calling a backend.
5
6use 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
14/// Test helper that returns a hard-coded response without routing or model I/O.
15pub 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        // `Noop` synthesizes its own response and never offloads a call, so `echo` is
53        // never reached.
54        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}