#[cfg(feature = "openai")]
#[tokio::test]
async fn live_openai_parent_composes_child_subagent() {
use std::sync::Arc;
use tinyagents::harness::context::{RunConfig, RunContext};
use tinyagents::harness::message::Message;
use tinyagents::harness::providers::openai::OpenAiModel;
use tinyagents::harness::runtime::AgentHarness;
use tinyagents::harness::testkit::{EventRecorder, Trajectory};
use tinyagents::{SubAgent, SubAgentTool};
let _ = dotenvy::dotenv();
if std::env::var("OPENAI_API_KEY").is_err() {
eprintln!("skipping live_openai_parent_composes_child_subagent: OPENAI_API_KEY is not set");
return;
}
let mut child: AgentHarness<()> = AgentHarness::new();
child
.register_model(
"openai",
Arc::new(OpenAiModel::from_env().expect("OPENAI_API_KEY present")),
)
.set_default_model("openai");
let subagent = Arc::new(
SubAgent::new(
"math_expert",
"Computes precise arithmetic answers. Pass the arithmetic question as `input`.",
Arc::new(child),
)
.with_system_prompt(
"You are a meticulous arithmetic engine. Reply with only the numeric answer.",
),
);
let tool = Arc::new(SubAgentTool::new(subagent));
let mut parent: AgentHarness<()> = AgentHarness::new();
parent.register_tool(tool);
parent
.register_model(
"openai",
Arc::new(OpenAiModel::from_env().expect("OPENAI_API_KEY present")),
)
.set_default_model("openai");
let recorder = EventRecorder::new();
let ctx = RunContext::new(RunConfig::new("live-parent-run"), ()).with_events(recorder.sink());
let run = parent
.invoke_in_context(
&(),
ctx,
vec![Message::user(
"Use the math_expert tool to compute 17 * 23, then state the result in a short \
sentence.",
)],
)
.await
.expect("live parent run succeeds");
let final_text = run.text().unwrap_or_default();
assert!(
!final_text.trim().is_empty(),
"parent should produce a non-empty composed answer"
);
assert!(
run.model_calls >= 1,
"parent should make at least one model call"
);
let traj = Trajectory::from_events(recorder.events());
traj.assert_completed();
if traj.tool_was_called("math_expert") {
assert!(
run.tool_calls >= 1,
"a recorded sub-agent tool call should be reflected in run.tool_calls"
);
}
}