减少图片工具参数归一的冗余 JSON 拷贝

normalize_legacy_image_model_args 改为按需返回 Cow

未命中归一时复用原始参数视图,避免多一次深拷贝
This commit is contained in:
2026-09-21 19:21:23 +08:00
parent 98bfa5efd0
commit 4cbbcecaa2
@@ -1,3 +1,4 @@
use std::borrow::Cow;
use std::fmt::{Display, Formatter};
use platform_editor_agent::agent::asset::ImageId;
@@ -230,12 +231,12 @@ fn parse_internal<T: DeserializeOwned>(
/// 平台层图片工具只接受 `gemini-3.1-flash-image-preview` 与 `gpt-image-2.5`,但历史会话
/// 里仍可能保存着 `gpt-image-2` 的工具调用参数。这里在进入强类型校验前做一次别名归一,
/// 既让旧调用继续可用,也把计价统一到当前业务模型档位。
fn normalize_legacy_image_model_args(value: &Value) -> Value {
fn normalize_legacy_image_model_args(value: &Value) -> Cow<'_, Value> {
let Some(model) = value.get("model").and_then(Value::as_str) else {
return value.clone();
return Cow::Borrowed(value);
};
if !matches!(model.trim(), GPT_IMAGE_2_MODEL | GPT_IMAGE_2_C_MODEL) {
return value.clone();
return Cow::Borrowed(value);
}
let mut normalized = value.clone();
if let Some(fields) = normalized.as_object_mut() {
@@ -244,7 +245,7 @@ fn normalize_legacy_image_model_args(value: &Value) -> Value {
Value::String(GPT_IMAGE_2_5_BUSINESS_NAME.to_string()),
);
}
normalized
Cow::Owned(normalized)
}
/// 图片类工具的 `validate_args` 入口:先归一历史模型别名,再走强类型反序列化。
@@ -252,7 +253,8 @@ fn parse_invalid_image_args<T: DeserializeOwned>(
tool_name: &str,
value: &Value,
) -> Result<T, EditorAgentToolError> {
parse_invalid_args(tool_name, &normalize_legacy_image_model_args(value))
let normalized = normalize_legacy_image_model_args(value);
parse_invalid_args(tool_name, &normalized)
}
/// 图片类工具的 `pricing` 入口:即使调用方直接传入原始 args,也要先归一历史模型别名。
@@ -260,7 +262,8 @@ fn parse_internal_image_args<T: DeserializeOwned>(
label: &str,
value: &Value,
) -> Result<T, EditorAgentToolError> {
parse_internal(label, &normalize_legacy_image_model_args(value))
let normalized = normalize_legacy_image_model_args(value);
parse_internal(label, &normalized)
}
/// SFX V2 的显式 `duration: null` 表示自动时长,必须原样保留,不能被通用的