use crate::agents::{
error::AgentError, run_context::ResumeContext, session::SessionState, types::AgentResponse,
};
use async_trait::async_trait;
use std::fmt::Debug;
#[derive(Debug, Clone)]
pub struct AgentRunResult {
pub final_response: AgentResponse,
pub iterations: u32,
pub completion_reason: String,
pub combined_text: Option<String>,
}
#[derive(Debug)]
pub enum AgentRunOutcome {
Complete(Box<AgentRunResult>),
NeedsInput {
question: String,
resume_context: ResumeContext,
},
}
impl AgentRunOutcome {
pub fn complete(result: AgentRunResult) -> Self {
Self::Complete(Box::new(result))
}
}
#[async_trait]
pub trait AgentRunner: Send + Sync + Debug {
fn id(&self) -> &str;
async fn run(
&self,
input: &str,
session: &mut SessionState,
) -> Result<AgentRunOutcome, AgentError>;
async fn resume(
&self,
user_answer: &str,
ctx: ResumeContext,
session: &mut SessionState,
) -> Result<AgentRunOutcome, AgentError>;
}