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_lifecycle;
24pub(crate) mod round_prelude;
25pub(crate) mod session_finalize;
26pub(crate) mod session_setup;
27pub(super) mod state_bridge;
28mod task_lifecycle;
29pub(crate) mod tool_execution;
30mod workspace_context;
31
32pub use bamboo_agent_core::PromptSnapshot;
33pub use loop_execution::run_agent_loop_with_config;
34
35pub fn read_prompt_snapshot(session: &Session) -> Option<PromptSnapshot> {
36 session_setup::read_prompt_snapshot(session)
37}
38
39pub fn refresh_prompt_snapshot(session: &mut Session) {
40 session_setup::refresh_prompt_snapshot(session)
41}
42
43pub(super) fn to_event_token_usage(prompt_tokens: u64, completion_tokens: u64) -> TokenUsage {
44 let mut usage = TokenUsage {
45 prompt_tokens,
46 completion_tokens,
47 total_tokens: 0,
48 };
49 usage.recompute_total();
50 usage
51}
52
53pub type Result<T> = std::result::Result<T, AgentError>;
55
56#[allow(dead_code)]
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;