1use std::sync::Arc;
2
3use async_trait::async_trait;
4
5use super::TextAgent;
6use crate::error::AgentError;
7use crate::state::State;
8
9pub struct FallbackTextAgent {
12 name: String,
13 candidates: Vec<Arc<dyn TextAgent>>,
14}
15
16impl FallbackTextAgent {
17 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}