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