Install
openclaw skills install tool-result-size-controller自动判断工具结果大小,超阈值时gzip压缩落盘并返回文件元数据,保护对话上下文窗口免受大数据干扰
openclaw skills install tool-result-size-controller大结果自动落盘,保护上下文窗口 参考Claude Code的maxResultSizeChars机制
原生OpenClaw工具返回大结果时:
根因:缺乏Claude Code的maxResultSizeChars保护机制
from tool_result_size_controller import maybe_spill, ToolResultWrapper
# 方式1:便捷函数
result = maybe_spill(large_data, tool_name="search_results", threshold=10000)
# 如果结果>10000字符,自动写入磁盘,返回文件路径
# 方式2:装饰器
@ToolResultWrapper("my_tool", threshold=5000)
def my_tool_func(*args, **kwargs):
return large_result
小结果(≤阈值):直接返回原数据
{"key": "value"} # 直接返回
大结果(>阈值):返回元数据
{
"spilled": true,
"file_path": "/path/to/result-20260403-a1b2c3d4.json.gz",
"size_chars": 15000,
"size_bytes": 4500,
"content_hash": "a1b2c3d4",
"preview": "前500字符预览..."
}
| 参数 | 默认值 | 说明 |
|---|---|---|
DEFAULT_THRESHOLD | 10000 | 字符阈值,超过则落盘 |
MAX_AGE_DAYS | 7 | 结果文件保留天数 |
RESULTS_DIR | tmp/tool-results/ | 落盘目录 |
from tool_result_size_controller import (
maybe_spill,
load_spilled_result,
cleanup_old_results
)
# 1. 包装结果(自动判断是否落盘)
result = maybe_spill(large_data, "my_tool", threshold=8000)
# 2. 读取落盘结果
if result.get("spilled"):
data = load_spilled_result(result["file_path"])
# 3. 清理过期文件(cron定期执行)
deleted = cleanup_old_results(max_age_days=7)
在SKILL.md中声明:
whenToUse: |
工具返回大结果可能超过10000字符时
使用本技能自动落盘,保护上下文窗口
permissions:
- file:write (tmp/tool-results目录)
- file:read (读取落盘结果)
logs/tool-size.log)[2026-04-03 15:20:00] search_results: spilled=15000_chars >> tmp/tool-results/...
[2026-04-03 15:20:01] small_query: direct_return (500_chars)
[2026-04-03 15:20:02] cleanup: deleted 3 old files
memory/learnings/claude-code-architecture-2026-04-03.mdskills/agent-concurrency-controller/skills/safe-file-editor/