Tool 参数预截断 — 对标 DeepAgents TruncateArgsSettings。
这是一个 轻量级的 pre-summarization 优化,在完整压缩之前运行。
当 token 使用量超过配置阈值时,自动截断保留窗口之外的旧消息中
write_file、edit_file、execute 等工具调用的大参数字段。
工作原理
- 检测触发条件(token 数 / 消息数 / fraction)
- 计算保留窗口——最近的 N 条消息不动
- 在保留窗口之前的 assistant 消息中,扫描 tool_calls
- 对匹配工具名的 tool_call arguments 中超长字符串值进行截断
截断规则
- 只处理
argumentsmap 中值为字符串且超过max_length的字段 - 截断为:前 20 字符 +
truncation_text(默认"...(argument truncated)") - 仅修改历史消息的 副本,不影响原始数据
配置
通过 State.config 传入:
:truncate_args_trigger—{:tokens, n}|{:messages, n}|{:fraction, f}|nil(禁用):truncate_args_keep—{:messages, n}|{:fraction, f}(默认{:messages, 20}):truncate_args_max_length— 单个参数最大字符数(默认 2000):truncate_args_text— 截断后缀文本:truncate_args_tools— 要截断的工具名列表(默认["write_file", "edit_file", "execute"])
Summary
Types
@type keep() :: {:messages, pos_integer()} | {:fraction, float()}
保留策略。
@type trigger() :: {:tokens, pos_integer()} | {:messages, pos_integer()} | {:fraction, float()} | nil
截断触发配置。nil 表示禁用。
@type truncate_opts() :: %{ trigger: trigger(), keep: keep(), max_length: pos_integer(), truncation_text: String.t(), target_tools: MapSet.t(String.t()) }
截断配置。
Functions
@spec truncate(CMDC.Agent.State.t()) :: {CMDC.Agent.State.t(), boolean()}
对 State 中的消息执行参数截断。
返回更新后的 State(消息可能被修改),以及是否有实际修改。
{state, true}— 至少一条消息被截断{state, false}— 无需截断或未达到阈值
@spec truncate_config(CMDC.Agent.State.t()) :: truncate_opts()
读取截断配置。从 state.config 中获取,缺省使用默认值。
@spec truncate_tool_call(map(), pos_integer(), String.t()) :: {map(), boolean()}
截断单个 tool_call 的大参数。
返回 {new_tool_call, modified?}。