bamboo_engine/runtime/
runner.rs1use std::sync::Arc;
7
8use tokio::sync::mpsc;
9use tokio_util::sync::CancellationToken;
10
11use bamboo_agent_core::tools::ToolExecutor;
12use bamboo_agent_core::TokenUsage;
13use bamboo_agent_core::{AgentError, AgentEvent, Session};
14use bamboo_infrastructure::LLMProvider;
15
16use crate::runtime::config::AgentLoopConfig;
17
18pub mod image_fallback;
19mod logging;
20mod loop_execution;
21mod metrics_lifecycle;
22pub(crate) mod prompt_context;
23pub(crate) mod round_frame;
24pub(crate) mod round_lifecycle;
25pub(crate) mod round_prelude;
26pub(crate) mod session_finalize;
27pub(crate) mod session_setup;
28pub(crate) mod state_bridge;
29mod task_lifecycle;
30pub(crate) mod tool_execution;
31mod workspace_context;
32
33pub use bamboo_agent_core::PromptSnapshot;
34pub use loop_execution::run_agent_loop_with_config;
35
36pub fn read_prompt_snapshot(session: &Session) -> Option<PromptSnapshot> {
37 session_setup::read_prompt_snapshot(session)
38}
39
40pub fn refresh_prompt_snapshot(session: &mut Session) {
41 session_setup::refresh_prompt_snapshot(session)
42}
43
44pub(super) fn to_event_token_usage(prompt_tokens: u64, completion_tokens: u64) -> TokenUsage {
45 let mut usage = TokenUsage {
46 prompt_tokens,
47 completion_tokens,
48 total_tokens: 0,
49 };
50 usage.recompute_total();
51 usage
52}
53
54pub type Result<T> = std::result::Result<T, AgentError>;
56
57pub async fn run_agent_loop(
58 session: &mut Session,
59 initial_message: String,
60 event_tx: mpsc::Sender<AgentEvent>,
61 llm: Arc<dyn LLMProvider>,
62 tools: Arc<dyn ToolExecutor>,
63 cancel_token: CancellationToken,
64 max_rounds: usize,
65) -> Result<()> {
66 run_agent_loop_with_config(
67 session,
68 initial_message,
69 event_tx,
70 llm,
71 tools,
72 cancel_token,
73 AgentLoopConfig {
74 max_rounds,
75 skip_initial_user_message: false,
76 ..Default::default()
77 },
78 )
79 .await
80}
81
82#[cfg(test)]
83mod tests;