CMDC.Agent.Compactor.ArgTruncator (cmdc v0.4.0)

Copy Markdown View Source

Tool 参数预截断 — 对标 DeepAgents TruncateArgsSettings

这是一个 轻量级的 pre-summarization 优化,在完整压缩之前运行。 当 token 使用量超过配置阈值时,自动截断保留窗口之外的旧消息中 write_fileedit_fileexecute 等工具调用的大参数字段。

工作原理

  1. 检测触发条件(token 数 / 消息数 / fraction)
  2. 计算保留窗口——最近的 N 条消息不动
  3. 在保留窗口之前的 assistant 消息中,扫描 tool_calls
  4. 对匹配工具名的 tool_call arguments 中超长字符串值进行截断

截断规则

  • 只处理 arguments map 中值为字符串且超过 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

保留策略。

截断触发配置。nil 表示禁用。

截断配置。

Functions

对 State 中的消息执行参数截断。

读取截断配置。从 state.config 中获取,缺省使用默认值。

截断单个 tool_call 的大参数。

Types

keep()

@type keep() :: {:messages, pos_integer()} | {:fraction, float()}

保留策略。

trigger()

@type trigger() ::
  {:tokens, pos_integer()}
  | {:messages, pos_integer()}
  | {:fraction, float()}
  | nil

截断触发配置。nil 表示禁用。

truncate_opts()

@type truncate_opts() :: %{
  trigger: trigger(),
  keep: keep(),
  max_length: pos_integer(),
  truncation_text: String.t(),
  target_tools: MapSet.t(String.t())
}

截断配置。

Functions

truncate(state)

@spec truncate(CMDC.Agent.State.t()) :: {CMDC.Agent.State.t(), boolean()}

对 State 中的消息执行参数截断。

返回更新后的 State(消息可能被修改),以及是否有实际修改。

  • {state, true} — 至少一条消息被截断
  • {state, false} — 无需截断或未达到阈值

truncate_config(state)

@spec truncate_config(CMDC.Agent.State.t()) :: truncate_opts()

读取截断配置。从 state.config 中获取,缺省使用默认值。

truncate_tool_call(tool_call, max_length, truncation_text)

@spec truncate_tool_call(map(), pos_integer(), String.t()) :: {map(), boolean()}

截断单个 tool_call 的大参数。

返回 {new_tool_call, modified?}