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