codetether_agent/agent/execution/
run.rs1use super::messages::{collect_tool_calls, response_text};
13use crate::agent::{Agent, AgentResponse};
14use crate::provider::{ContentPart, Message, Role};
15use crate::session::Session;
16use anyhow::{Result, bail};
17
18impl Agent {
19 pub async fn execute(&self, session: &mut Session, prompt: &str) -> Result<AgentResponse> {
30 session.add_message(Message {
31 role: Role::User,
32 content: vec![ContentPart::Text {
33 text: prompt.to_string(),
34 }],
35 });
36 let max_steps = self.info.max_steps.unwrap_or(100);
37 for _step in 1..=max_steps {
38 let response = self
39 .provider
40 .complete(self.build_completion_request(session))
41 .await?;
42 session.add_message(response.message.clone());
43 let tool_calls = collect_tool_calls(&response.message);
44 if tool_calls.is_empty() {
45 return Ok(AgentResponse {
46 text: response_text(&response.message),
47 tool_uses: session.tool_uses.clone(),
48 usage: session.usage.clone(),
49 });
50 }
51 self.execute_tool_calls(session, tool_calls).await;
52 }
53 bail!("Exceeded maximum steps ({max_steps})");
54 }
55}