1use crate::RunCollectTextError;
2use crate::builder::AgentDefinition;
3use crate::input::SessionInput;
4use crate::session::AgentSession;
5use std::sync::Arc;
6use std::sync::atomic::AtomicU64;
7use std::sync::atomic::Ordering;
8
9pub struct AgentManager {
10 definition: Arc<AgentDefinition>,
11 next_session_id: AtomicU64,
12}
13
14impl AgentManager {
15 pub(crate) fn new(definition: AgentDefinition) -> Self {
16 Self {
17 definition: Arc::new(definition),
18 next_session_id: AtomicU64::new(1),
19 }
20 }
21
22 pub fn create_session(&self) -> AgentSession {
23 let session_id = self.next_session_id.fetch_add(1, Ordering::SeqCst);
24 AgentSession::new(session_id, Arc::clone(&self.definition), Vec::new())
25 }
26
27 pub async fn ask_once(&self, text: impl Into<String>) -> Result<String, RunCollectTextError> {
28 let session = self.create_session();
29 session
30 .run_collect_text(SessionInput::from_user_text(text))
31 .await
32 }
33}