Skip to main content

bamboo_engine/runtime/managers/adapters/
tool.rs

1use std::sync::Arc;
2
3use crate::metrics::MetricsCollector;
4use async_trait::async_trait;
5use bamboo_agent_core::tools::{ToolCall, ToolExecutor, ToolSchema};
6use bamboo_agent_core::{AgentError, AgentEvent, Session};
7use bamboo_infrastructure::LLMProvider;
8use tokio::sync::mpsc;
9
10use crate::runtime::config::AgentLoopConfig;
11use crate::runtime::managers::tool::{ToolManager, ToolRoundResult};
12use crate::runtime::task_context::TaskLoopContext;
13
14/// Default tool manager that delegates to existing runner functions.
15pub struct DefaultToolManager {
16    tools: Arc<dyn ToolExecutor>,
17    llm: Arc<dyn LLMProvider>,
18}
19
20impl DefaultToolManager {
21    pub fn new(tools: Arc<dyn ToolExecutor>, llm: Arc<dyn LLMProvider>) -> Self {
22        Self { tools, llm }
23    }
24}
25
26#[async_trait]
27impl ToolManager for DefaultToolManager {
28    fn resolve_tool_schemas(&self, config: &AgentLoopConfig, session: &Session) -> Vec<ToolSchema> {
29        crate::runtime::runner::session_setup::tool_schemas::resolve_available_tool_schemas_for_session(
30            config,
31            self.tools.as_ref(),
32            session,
33        )
34    }
35
36    #[allow(clippy::too_many_arguments)]
37    async fn execute_tool_calls(
38        &self,
39        tool_calls: &[ToolCall],
40        event_tx: &mpsc::Sender<AgentEvent>,
41        metrics_collector: Option<&MetricsCollector>,
42        session_id: &str,
43        round_id: &str,
44        round: usize,
45        session: &mut Session,
46        config: &AgentLoopConfig,
47        task_context: &mut Option<TaskLoopContext>,
48        tool_schemas: &[ToolSchema],
49    ) -> Result<ToolRoundResult, AgentError> {
50        let frame = crate::runtime::runner::round_frame::RoundFrame {
51            session_id,
52            round_id,
53            turn: round,
54            debug_enabled: false,
55            event_tx,
56            metrics_collector,
57            config,
58            llm: &self.llm,
59            tools: &self.tools,
60        };
61
62        let result = crate::runtime::runner::tool_execution::execute_round_tool_calls(
63            tool_calls,
64            &frame,
65            session,
66            task_context,
67            config
68                .summarization_model_name
69                .as_deref()
70                .or(config.background_model_name.as_deref()),
71            config
72                .summarization_model_provider
73                .as_ref()
74                .or(config.background_model_provider.as_ref()),
75            tool_schemas,
76        )
77        .await?;
78
79        Ok(ToolRoundResult {
80            awaiting_clarification: result.awaiting_clarification,
81            should_break: false,
82            tool_calls_count: tool_calls.len(),
83        })
84    }
85}