switchyard_libsy/algorithms/
noop.rs1use std::sync::Arc;
7
8use switchyard_protocol::{
9 AggLlmResponse, ContentBlock, LlmResponse, Request, Response, ResponseOutput, Role, StopReason,
10};
11
12use crate::Result;
13use crate::core::algorithm::{Algorithm, Driver};
14use switchyard_protocol::Decision;
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 create_run_task(
26 self: Arc<Self>,
27 driver: Driver,
28 request: Request,
29 ) -> Result<Response> {
30 let model = request
31 .requested_model()
32 .unwrap_or("switchyard/noop")
33 .to_string();
34 let decision: Decision = Decision::new(
35 model.clone(),
36 Some("noop returned its synthetic response".to_string()),
37 true,
38 );
39 driver.info(decision.clone()).await?;
40
41 let llm_response = LlmResponse::Agg(AggLlmResponse {
42 id: Some("switchyard-noop".to_string()),
43 model: Some(model),
44 outputs: vec![ResponseOutput {
45 role: Role::Assistant,
46 content: vec![ContentBlock::Text {
47 text: "OK".to_string(),
48 }],
49 stop_reason: Some(StopReason::EndTurn),
50 }],
51 ..Default::default()
52 });
53 let response = Response {
54 llm_response,
55 metadata: request.metadata.clone(),
56 };
57 Ok(response)
58 }
59}
60
61#[cfg(test)]
62mod tests {
63 use switchyard_protocol::{LlmRequest, Message, Role};
64
65 use super::*;
66 use crate::core::testing::{echo, test_drive};
67
68 #[tokio::test]
69 async fn test_noop_algo() -> Result<()> {
70 const TEST_MODEL: &str = "test_noop_algo";
71 let request = Request {
72 llm_request: LlmRequest {
73 model: Some(TEST_MODEL.to_string()),
74 messages: vec![Message::text(Role::User, "hi")],
75 ..LlmRequest::default()
76 },
77 raw_request: None,
78 metadata: None,
79 };
80
81 let a: Arc<dyn Algorithm> = Arc::new(Noop {});
84 let (decisions, response) = test_drive(a, request, echo()).await?;
85 let Some(decision) = decisions.first() else {
86 panic!("Expected exactly one Decision");
87 };
88 assert_eq!(decision.selected_model_id(), TEST_MODEL);
89 assert!(decision.is_answer_call());
90 assert_eq!(response.selected_model(), Some(TEST_MODEL));
91 Ok(())
92 }
93}