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;
6
7use crate::runtime::config::AgentLoopConfig;
8use crate::runtime::managers::prompt::{PromptAssemblyOutput, PromptManager};
9
10pub 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}