use claude_agent_sdk::{ClaudeAgentOptions, ContentBlock, Message, PermissionMode, query};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
println!("=== Example 17: Fallback Model Configuration ===\n");
let options = ClaudeAgentOptions::builder()
.model("claude-sonnet-4-5-20250929")
.fallback_model("claude-sonnet-4-20250514")
.permission_mode(PermissionMode::BypassPermissions)
.max_turns(3)
.build();
println!("Configured with:");
println!(" Primary model: claude-sonnet-4-5-20250929");
println!(" Fallback model: claude-sonnet-4-20250514\n");
println!("Asking Claude a simple question...\n");
let messages = query(
"What is the capital of France? Please answer in one sentence.",
Some(options),
)
.await?;
let mut found_text = false;
for message in &messages {
match message {
Message::Assistant(msg) => {
if let Some(ref model) = msg.message.model {
println!("Model used: {}", model);
}
for block in &msg.message.content {
if let ContentBlock::Text(text) = block {
println!("Claude: {}", text.text);
found_text = true;
}
}
},
Message::Result(result) => {
println!("\n=== Result ===");
println!("Duration: {}ms", result.duration_ms);
println!("Turns: {}", result.num_turns);
println!("Error: {}", result.is_error);
if let Some(cost) = result.total_cost_usd {
println!("Cost: ${:.4}", cost);
}
},
_ => {},
}
}
if !found_text {
println!("✗ No text response received");
} else {
println!("\n✓ Successfully received response");
println!("\nNote: The fallback model is used automatically if the primary model");
println!("is unavailable or encounters an error. Check the 'Model used' field");
println!("above to see which model actually handled the request.");
}
Ok(())
}