Skip to main content

rs_adk/text/
fallback.rs

1use std::sync::Arc;
2
3use async_trait::async_trait;
4
5use super::TextAgent;
6use crate::error::AgentError;
7use crate::state::State;
8
9/// Tries each child agent in sequence. Returns the first successful result.
10/// If all fail, returns the last error.
11pub struct FallbackTextAgent {
12    name: String,
13    candidates: Vec<Arc<dyn TextAgent>>,
14}
15
16impl FallbackTextAgent {
17    /// Create a new fallback agent that tries candidates in order.
18    pub fn new(name: impl Into<String>, candidates: Vec<Arc<dyn TextAgent>>) -> Self {
19        Self {
20            name: name.into(),
21            candidates,
22        }
23    }
24}
25
26#[async_trait]
27impl TextAgent for FallbackTextAgent {
28    fn name(&self) -> &str {
29        &self.name
30    }
31
32    async fn run(&self, state: &State) -> Result<String, AgentError> {
33        let mut last_err = AgentError::Other("No candidates in fallback".into());
34
35        for candidate in &self.candidates {
36            match candidate.run(state).await {
37                Ok(result) => return Ok(result),
38                Err(e) => last_err = e,
39            }
40        }
41
42        Err(last_err)
43    }
44}