use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::BoxFuture;
use crate::agents::error::AgentError;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ElicitationRequest {
pub request_id: String,
pub message: String,
pub response_schema: Value,
pub required: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub enum ElicitationResult {
Provided {
request_id: String,
value: Value,
},
Cancelled {
request_id: String,
},
}
pub trait OnElicitation: Send + Sync {
fn elicit(
&self,
request: ElicitationRequest,
) -> BoxFuture<'_, Result<ElicitationResult, AgentError>>;
}
#[derive(Debug, Default)]
pub struct CancelAllElicitations;
impl OnElicitation for CancelAllElicitations {
fn elicit(
&self,
request: ElicitationRequest,
) -> BoxFuture<'_, Result<ElicitationResult, AgentError>> {
Box::pin(async move {
Ok(ElicitationResult::Cancelled {
request_id: request.request_id,
})
})
}
}