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