Execute the agent loop for a prompt with session context Takes the conversation history, user prompt, and optional session ID. When session_id is provided, context providers can use it for session-specific context.
(
&self,
history: &[Message],
prompt: &str,
session_id: Option<&str>,
event_tx: Option<mpsc::Sender<AgentEvent>>,
cancel_token: Option<&tokio_util::sync
| 47 | /// Takes the conversation history, user prompt, and optional session ID. |
| 48 | /// When session_id is provided, context providers can use it for session-specific context. |
| 49 | pub async fn execute_with_session( |
| 50 | &self, |
| 51 | history: &[Message], |
| 52 | prompt: &str, |
| 53 | session_id: Option<&str>, |
| 54 | event_tx: Option<mpsc::Sender<AgentEvent>>, |
| 55 | cancel_token: Option<&tokio_util::sync::CancellationToken>, |
| 56 | ) -> Result<AgentResult> { |
| 57 | let default_token = tokio_util::sync::CancellationToken::new(); |
| 58 | let token = cancel_token.unwrap_or(&default_token); |
| 59 | tracing::info!( |
| 60 | a3s.session.id = session_id.unwrap_or("none"), |
| 61 | a3s.agent.max_turns = self.config.max_tool_rounds, |
| 62 | "a3s.agent.execute started" |
| 63 | ); |
| 64 | |
| 65 | let route = self.resolve_execution_route(prompt).await; |
| 66 | let mut effective_prompt = route.effective_prompt.clone(); |
| 67 | let mut auto_tool_calls_count = 0; |
| 68 | if !route.use_planning { |
| 69 | if let Some(outcome) = self |
| 70 | .maybe_apply_auto_delegation(&effective_prompt, session_id, &event_tx) |
| 71 | .await? |
| 72 | { |
| 73 | effective_prompt = outcome.prompt; |
| 74 | auto_tool_calls_count = outcome.tool_calls_count; |
| 75 | } |
| 76 | } |
| 77 | |
| 78 | let mut result = if route.use_planning { |
| 79 | self.execute_with_planning( |
| 80 | history, |
| 81 | &effective_prompt, |
| 82 | session_id, |
| 83 | event_tx, |
| 84 | route.pre_analysis, |
| 85 | ) |
| 86 | .await |
| 87 | } else { |
| 88 | self.execute_loop( |
| 89 | history, |
| 90 | &effective_prompt, |
| 91 | route.style, |
| 92 | session_id, |
| 93 | event_tx, |
| 94 | token, |
| 95 | true, |
| 96 | ) |
| 97 | .await |
| 98 | }; |
| 99 | if let Ok(result) = &mut result { |
| 100 | result.tool_calls_count += auto_tool_calls_count; |
| 101 | } |
| 102 | |
| 103 | self.record_execution_result(session_id, &result).await; |
| 104 | result |
| 105 | } |
| 106 |