use std::path::Path;
use async_trait::async_trait;
use oxi_agent::{AgentConfig, AgentEvent, ForkResult, SubagentRunner};
use crate::Oxi;
#[derive(Clone)]
pub struct SdkSubagentRunner {
oxi: Oxi,
}
impl std::fmt::Debug for SdkSubagentRunner {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("SdkSubagentRunner")
.field("oxi", &"<Oxi>")
.finish()
}
}
impl SdkSubagentRunner {
pub fn new(oxi: Oxi) -> Self {
Self { oxi }
}
}
#[async_trait]
impl SubagentRunner for SdkSubagentRunner {
async fn run_isolated(
&self,
_agent_name: &str,
task: &str,
system_prompt: Option<&str>,
model: Option<&str>,
_tools: &[String],
cwd: &Path,
_depth: u8,
) -> anyhow::Result<ForkResult> {
let mut config = AgentConfig::default();
if let Some(m) = model {
config.model_id = m.to_string();
}
if let Some(sp) = system_prompt {
config.system_prompt = Some(sp.to_string());
}
config.workspace_dir = Some(cwd.to_path_buf());
let agent = self.oxi.agent(config).build()?;
let prompt = task.to_string();
let (response, events) = agent.run(prompt).await?;
let (mut input_tokens, mut output_tokens, mut turns) = (0usize, 0usize, 0u32);
for event in &events {
match event {
AgentEvent::Usage {
input_tokens: i,
output_tokens: o,
} => {
input_tokens = *i;
output_tokens = *o;
}
AgentEvent::TurnStart { .. } => turns += 1,
_ => {}
}
}
Ok(ForkResult {
text: response.content,
input_tokens,
output_tokens,
turns,
model: model.map(|m| m.to_string()),
error: None,
})
}
}