bamboo_engine/runtime/managers/adapters/
tool.rs1use 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
14pub 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}