Skip to main content

bamboo_engine/runtime/managers/adapters/
prompt.rs

1use std::sync::Arc;
2
3use bamboo_agent_core::tools::ToolExecutor;
4use bamboo_agent_core::Role;
5use bamboo_agent_core::Session;
6use bamboo_tools::exposure::activated_discoverable_tools;
7
8use crate::runtime::config::AgentLoopConfig;
9use crate::runtime::managers::prompt::{PromptAssemblyOutput, PromptManager};
10
11/// Default prompt manager that delegates to existing runner functions.
12pub struct DefaultPromptManager {
13    tools: Arc<dyn ToolExecutor>,
14}
15
16impl DefaultPromptManager {
17    pub fn new(tools: Arc<dyn bamboo_agent_core::tools::ToolExecutor>) -> Self {
18        Self { tools }
19    }
20}
21
22#[async_trait::async_trait]
23impl PromptManager for DefaultPromptManager {
24    async fn assemble_prompt(
25        &self,
26        session: &mut Session,
27        config: &AgentLoopConfig,
28    ) -> PromptAssemblyOutput {
29        let base_prompt =
30            crate::runtime::runner::session_setup::prompt_setup::resolve_base_prompt_for_language(
31                config, session,
32            );
33
34        let tool_schemas =
35            crate::runtime::runner::session_setup::tool_schemas::resolve_available_tool_schemas_for_session(
36                config,
37                self.tools.as_ref(),
38                session,
39            );
40
41        let activated = activated_discoverable_tools(session);
42        let tool_guide_context =
43            crate::runtime::runner::session_setup::prompt_setup::build_tool_guide_context(
44                config,
45                &tool_schemas,
46                base_prompt,
47                &session.id,
48                &activated,
49            );
50
51        let skill_context = session
52            .metadata
53            .get("skill.context")
54            .cloned()
55            .unwrap_or_default();
56
57        let _report =
58            crate::runtime::runner::session_setup::prompt_setup::apply_system_prompt_contexts(
59                session,
60                config,
61                &skill_context,
62                &tool_guide_context,
63            );
64
65        let effective_system_prompt = session
66            .messages
67            .iter()
68            .find_map(|m| {
69                if matches!(m.role, Role::System) {
70                    Some(m.content.clone())
71                } else {
72                    None
73                }
74            })
75            .unwrap_or_default();
76
77        PromptAssemblyOutput {
78            effective_system_prompt,
79            skill_context,
80            tool_guide_context,
81        }
82    }
83
84    async fn refresh_external_memory(&self, session: &mut Session, config: &AgentLoopConfig) {
85        crate::runtime::runner::prompt_context::inject_external_memory_into_system_message(
86            session,
87            config.prompt_memory_flags,
88            None,
89        )
90        .await;
91    }
92
93    fn refresh_task_list(&self, session: &mut Session) {
94        crate::runtime::runner::prompt_context::inject_task_list_into_system_message(session);
95    }
96}