use std::sync::Arc;
use std::time::Duration;
use tinyagents::SubAgent;
use tinyagents::error::TinyAgentsError;
use tinyagents::harness::limits::RunLimits;
use tinyagents::harness::providers::MockModel;
use tinyagents::harness::runtime::{AgentHarness, RunPolicy};
use tinyagents::harness::testkit::SlowModel;
fn capped_child_harness<M>(model: M, timeout_ms: u64) -> AgentHarness<()>
where
M: tinyagents::harness::model::ChatModel<()> + 'static,
{
let mut harness: AgentHarness<()> = AgentHarness::new();
harness.register_model("model", Arc::new(model));
harness.with_policy(RunPolicy {
limits: RunLimits::default().with_max_wall_clock_ms(Some(timeout_ms)),
..RunPolicy::default()
});
harness
}
#[tokio::test]
async fn subagent_invoke_times_out_on_slow_model() {
let child = capped_child_harness(SlowModel::new(Duration::from_millis(200), "eventually"), 20);
let subagent = SubAgent::new(
"slow_worker",
"a worker backed by a slow model",
Arc::new(child),
);
let err = subagent
.invoke(&(), (), 0, "go")
.await
.expect_err("a 200ms model call under a 20ms cap must time out");
assert!(matches!(err, TinyAgentsError::Timeout(_)), "got {err:?}");
}
#[tokio::test]
async fn fast_subagent_invoke_succeeds_under_same_cap() {
let child = capped_child_harness(MockModel::constant("quick"), 20);
let subagent = SubAgent::new(
"fast_worker",
"a worker backed by a fast model",
Arc::new(child),
);
let run = subagent
.invoke(&(), (), 0, "go")
.await
.expect("a fast model call completes within the cap");
assert_eq!(run.text(), Some("quick".to_string()));
}