diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/tool/arguments.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/tool/arguments.rs index 0fb89c724..7d05a2772 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/tool/arguments.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/tool/arguments.rs @@ -5,21 +5,14 @@ use serde_json::Value; -use super::error::ToolPageRejection; -use crate::agent::runtime_state::truncate_agent_runtime_text; - -/// 字段给了非字符串值时,回显进诊断的那个值最多保留多少字符。 -/// -/// 类型错只需要让模型看出「传进来的是什么」,不必把整个对象或数组原样带进工具结果与 -/// 诊断 sidecar;`got` 会同时出现在 `to_user_msg` 和序列化后的 `error` 里。 -const NOT_TEXT_GOT_MAX_CHARS: usize = 120; +use super::error::{bounded_echo, ToolPageRejection}; /// 把「本该是字符串、实际给了别的类型」的值压成有界回显,供各工具的 `*NotText` 变体拼文案。 /// /// 走共享 [`ToolTextField::not_text`] 的字段自动走这里;像抠图 `backgroundMode`、美术准备 /// `mode`、生成图片 `kind` 这类在解析里内联判类型的字段,也要用同一份口径。 pub(crate) fn not_text_repr(value: &Value) -> String { - truncate_agent_runtime_text(&value.to_string(), NOT_TEXT_GOT_MAX_CHARS) + bounded_echo(&value.to_string()) } /// 一个会被边界校验的文本字段。 diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/tool/error.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/tool/error.rs index ca8e95977..8355e1812 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/tool/error.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/tool/error.rs @@ -6,6 +6,17 @@ use serde_json::Value; +/// 不受信回显(字段名、工具名、给错类型的值)在错误文案与诊断里允许保留的字符数。 +/// +/// 这些都是模型或客户端给的原文:错误只需要让对方看出「传了什么」,不必把整份原文 +/// 带进工具结果与诊断 sidecar。 +pub(crate) const BOUNDED_ECHO_MAX_CHARS: usize = 120; + +/// 把不受信文本压成有界回显;JSON 值用 [`crate::agent::tool::arguments::not_text_repr`] 包一层。 +pub(crate) fn bounded_echo(text: &str) -> String { + crate::agent::runtime_state::truncate_agent_runtime_text(text, BOUNDED_ECHO_MAX_CHARS) +} + /// `sourceLocalAssetId` 不在当前项目 manifest 时的完整指引:模型要知道下一步做什么, /// 只报「不属于已登记资源」会让它原地重试。 /// @@ -52,7 +63,7 @@ impl ToolArgumentsRejection { .find(|field| !allowed.contains(&field.as_str())) { Some(field) => Err(Self::UnknownField { - field: field.to_string(), + field: bounded_echo(field), }), None => Ok(()), }