Skip to main content

bamboo_engine/runtime/
agent.rs

1//! Stable public API for the agent runtime.
2//!
3//! [`Agent`] wraps an [`AgentRuntime`] with method-based access and serves as
4//! the primary entry point for SDK consumers.
5
6use std::sync::Arc;
7
8use bamboo_agent_core::Session;
9
10use crate::runtime::{AgentRuntime, AgentRuntimeBuilder, ExecuteRequest};
11
12// ---------------------------------------------------------------------------
13// Agent — stable public object
14// ---------------------------------------------------------------------------
15
16/// Stable public entry point for agent execution.
17///
18/// Wraps an [`AgentRuntime`] and provides:
19/// - [`Agent::execute()`] — run the agent loop on a session
20/// - [`Agent::storage()`] — access the shared storage backend
21///
22/// Clone is cheap (inner is `Arc`).
23#[derive(Clone)]
24pub struct Agent {
25    runtime: Arc<AgentRuntime>,
26}
27
28impl Agent {
29    /// Wrap an existing [`AgentRuntime`] in an `Agent`.
30    pub fn from_runtime(runtime: Arc<AgentRuntime>) -> Self {
31        Agent { runtime }
32    }
33
34    /// Return a new builder.
35    pub fn builder() -> AgentBuilder {
36        AgentBuilder::new()
37    }
38
39    /// Execute the agent loop with the given request.
40    pub async fn execute(
41        &self,
42        session: &mut Session,
43        req: ExecuteRequest,
44    ) -> crate::runtime::runner::Result<()> {
45        self.runtime.execute(session, req).await
46    }
47
48    /// Access the shared storage backend.
49    pub fn storage(&self) -> &Arc<dyn bamboo_agent_core::storage::Storage> {
50        &self.runtime.storage
51    }
52}
53
54// ---------------------------------------------------------------------------
55// AgentBuilder
56// ---------------------------------------------------------------------------
57
58/// Builder for [`Agent`].
59///
60/// Delegates to [`AgentRuntimeBuilder`] internally.
61pub struct AgentBuilder {
62    inner: AgentRuntimeBuilder,
63}
64
65impl AgentBuilder {
66    pub fn new() -> Self {
67        Self {
68            inner: AgentRuntimeBuilder::new(),
69        }
70    }
71
72    pub fn storage(mut self, v: Arc<dyn bamboo_agent_core::storage::Storage>) -> Self {
73        self.inner = self.inner.storage(v);
74        self
75    }
76
77    pub fn attachment_reader(
78        mut self,
79        v: Arc<dyn bamboo_agent_core::storage::AttachmentReader>,
80    ) -> Self {
81        self.inner = self.inner.attachment_reader(v);
82        self
83    }
84
85    pub fn skill_manager(mut self, v: Arc<crate::skills::SkillManager>) -> Self {
86        self.inner = self.inner.skill_manager(v);
87        self
88    }
89
90    pub fn metrics_collector(mut self, v: crate::metrics::MetricsCollector) -> Self {
91        self.inner = self.inner.metrics_collector(v);
92        self
93    }
94
95    pub fn config(mut self, v: Arc<tokio::sync::RwLock<bamboo_infrastructure::Config>>) -> Self {
96        self.inner = self.inner.config(v);
97        self
98    }
99
100    pub fn provider(mut self, v: Arc<dyn bamboo_infrastructure::LLMProvider>) -> Self {
101        self.inner = self.inner.provider(v);
102        self
103    }
104
105    pub fn default_tools(mut self, v: Arc<dyn bamboo_agent_core::tools::ToolExecutor>) -> Self {
106        self.inner = self.inner.default_tools(v);
107        self
108    }
109
110    pub fn build(self) -> Result<Agent, &'static str> {
111        let runtime = self.inner.build()?;
112        Ok(Agent {
113            runtime: Arc::new(runtime),
114        })
115    }
116}
117
118impl Default for AgentBuilder {
119    fn default() -> Self {
120        Self::new()
121    }
122}