Skip to main content

bamboo_engine/runtime/
runner.rs

1//! Agent loop runner implementation.
2//!
3//! This module provides the core agent execution loop that orchestrates LLM interactions,
4//! tool execution, and event streaming for conversational AI agents.
5
6use 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
54/// Result type for agent loop operations.
55pub 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;