fix(claude-code): defensive coding improvements for model switching (#7131)

Signed-off-by: Adrian Cole <adrian@tetrate.io>
This commit is contained in:
Adrian Cole
2026-02-11 07:15:45 +08:00
committed by GitHub
parent 01d425bf14
commit dc50b7b375
2 changed files with 16 additions and 6 deletions
+15 -3
View File
@@ -63,7 +63,9 @@ impl CliProcess {
"request_id": request_id,
"request": {"subtype": "set_model", "model": model}
});
let mut req_str = serde_json::to_string(&req).unwrap();
let mut req_str = serde_json::to_string(&req).map_err(|e| {
ProviderError::RequestFailed(format!("Failed to serialize set_model request: {e}"))
})?;
req_str.push('\n');
self.stdin
.write_all(req_str.as_bytes())
@@ -89,6 +91,14 @@ impl CliProcess {
}
if let Ok(parsed) = serde_json::from_str::<Value>(trimmed) {
if parsed.get("type").and_then(|t| t.as_str()) == Some("control_response") {
// Skip responses that don't match our request_id
if parsed
.pointer("/response/request_id")
.and_then(|id| id.as_str())
!= Some(request_id.as_str())
{
continue;
}
let success =
parsed.pointer("/response/subtype").and_then(|s| s.as_str())
== Some("success");
@@ -639,7 +649,9 @@ impl Provider for ClaudeCodeProvider {
"request_id": "model_list",
"request": {"subtype": "initialize"}
});
let mut request_str = serde_json::to_string(&request).unwrap();
let mut request_str = serde_json::to_string(&request).map_err(|e| {
ProviderError::RequestFailed(format!("Failed to serialize initialize request: {e}"))
})?;
request_str.push('\n');
stdin.write_all(request_str.as_bytes()).await.map_err(|e| {
ProviderError::RequestFailed(format!("Failed to write initialize request: {e}"))
@@ -670,7 +682,7 @@ impl Provider for ClaudeCodeProvider {
}
}
let _ = child.start_kill();
let _ = child.kill().await;
Ok(parse_models_from_lines(&lines))
}
+1 -3
View File
@@ -275,8 +275,6 @@ impl ProviderTester {
}
async fn test_model_switch(&self, session_id: &str) -> Result<()> {
// The process is already running with the default model from test_basic_response.
// Switch to model_switch_name and call complete_with_model to exercise send_set_model.
let default = &self.provider.get_model_config().model_name;
let alt = self
.model_switch_name
@@ -297,7 +295,7 @@ impl ProviderTester {
.await?;
assert!(
matches!(response.content[0], MessageContent::Text(_)),
matches!(response.content.first(), Some(MessageContent::Text(_))),
"Expected text response after model switch"
);
println!(