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