fix: take ExecToolCallOutput by value to avoid clone() (#2197)

Since the output could be a large string, it seemed like a win to avoid
the `clone()` in the common case.
This commit is contained in:
Michael Bolin
2025-08-12 08:59:35 -07:00
committed by GitHub
parent 320f150c68
commit 596a9d6a96

View File

@@ -1981,7 +1981,7 @@ async fn handle_container_exec_with_params(
let ExecToolCallOutput { exit_code, .. } = &output; let ExecToolCallOutput { exit_code, .. } = &output;
let is_success = *exit_code == 0; let is_success = *exit_code == 0;
let content = format_exec_output(&output); let content = format_exec_output(output);
ResponseInputItem::FunctionCallOutput { ResponseInputItem::FunctionCallOutput {
call_id: call_id.clone(), call_id: call_id.clone(),
output: FunctionCallOutputPayload { output: FunctionCallOutputPayload {
@@ -2113,7 +2113,7 @@ async fn handle_sandbox_error(
let ExecToolCallOutput { exit_code, .. } = &retry_output; let ExecToolCallOutput { exit_code, .. } = &retry_output;
let is_success = *exit_code == 0; let is_success = *exit_code == 0;
let content = format_exec_output(&retry_output); let content = format_exec_output(retry_output);
ResponseInputItem::FunctionCallOutput { ResponseInputItem::FunctionCallOutput {
call_id: call_id.clone(), call_id: call_id.clone(),
@@ -2146,7 +2146,7 @@ async fn handle_sandbox_error(
} }
/// Exec output is a pre-serialized JSON payload /// Exec output is a pre-serialized JSON payload
fn format_exec_output(exec_output: &ExecToolCallOutput) -> String { fn format_exec_output(exec_output: ExecToolCallOutput) -> String {
let ExecToolCallOutput { let ExecToolCallOutput {
exit_code, exit_code,
stdout, stdout,
@@ -2169,10 +2169,10 @@ fn format_exec_output(exec_output: &ExecToolCallOutput) -> String {
// round to 1 decimal place // round to 1 decimal place
let duration_seconds = ((duration.as_secs_f32()) * 10.0).round() / 10.0; let duration_seconds = ((duration.as_secs_f32()) * 10.0).round() / 10.0;
let is_success = *exit_code == 0; let is_success = exit_code == 0;
let output = if is_success { stdout } else { stderr }; let output = if is_success { stdout } else { stderr };
let mut formatted_output = output.text.clone(); let mut formatted_output = output.text;
if let Some(truncated_after_lines) = output.truncated_after_lines { if let Some(truncated_after_lines) = output.truncated_after_lines {
formatted_output.push_str(&format!( formatted_output.push_str(&format!(
"\n\n[Output truncated after {truncated_after_lines} lines: too many lines or bytes.]", "\n\n[Output truncated after {truncated_after_lines} lines: too many lines or bytes.]",
@@ -2182,7 +2182,7 @@ fn format_exec_output(exec_output: &ExecToolCallOutput) -> String {
let payload = ExecOutput { let payload = ExecOutput {
output: &formatted_output, output: &formatted_output,
metadata: ExecMetadata { metadata: ExecMetadata {
exit_code: *exit_code, exit_code,
duration_seconds, duration_seconds,
}, },
}; };