use io_harness::provider::{CompletionRequest, CompletionResponse, Fallback, Provider};
use io_harness::{run, Error, OpenRouter, Store, TaskContract, Verification};
struct Down;
impl Provider for Down {
async fn complete(
&self,
_request: CompletionRequest,
) -> io_harness::Result<CompletionResponse> {
Err(Error::provider_status(503, None, "service unavailable"))
}
fn name(&self) -> &str {
"down-fixture"
}
}
#[tokio::main]
async fn main() -> io_harness::Result<()> {
let root = std::env::temp_dir().join("io-harness-fallback-live");
std::fs::remove_dir_all(&root).ok();
let src = root.join("src");
std::fs::create_dir_all(&src)?;
std::fs::write(src.join("a.rs"), "pub fn a() -> u32 { 0 }\n")?;
let contract = TaskContract::workspace(
"Edit src/a.rs so a() == 7.",
&root,
Verification::WorkspaceTestPasses {
files: vec!["src/a.rs".into()],
test_src: "#[test] fn t() { assert_eq!(a(), 7); }".into(),
},
)
.with_max_steps(6)
.with_token_budget(200_000);
let provider = Fallback::new(Down, OpenRouter::from_env()?);
let store = Store::open(root.join("runs.db"))?;
println!("provider: {}", provider.name());
let result = run(&contract, &provider, &store).await?;
println!("outcome: {:?}", result.outcome);
println!("run provider label: {:?}", store.provider(result.run_id)?);
println!("\nwhich provider served each step:");
for e in store.context_events(result.run_id)? {
if e.kind == "served" {
println!(" step {}: {}", e.step, e.detail.unwrap_or_default());
}
}
println!(
"\nfinal file:\n{}",
std::fs::read_to_string(src.join("a.rs"))?
);
Ok(())
}