大结果自动落盘,保护上下文窗口 参考Claude Code的maxResultSizeChars机制
原生OpenClaw工具返回大结果时:
根因:缺乏Claude Code的 maxResultSizeChars 保护机制
python
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
小结果(≤阈值):直接返回原数据
python
{"key": "value"} # 直接返回
大结果(>阈值):返回元数据
json
{
"spilled": true,
"file_path": "/path/to/result-20260403-a1b2c3d4.json.gz",
"size_chars": 15000,
"size_bytes": 4500,
"content_hash": "a1b2c3d4",
"preview": "前500字符预览..."
}
参数默认值说明DEFAULT_THRESHOLD10000字符阈值,超过则落盘MAX_AGE_DAYS7结果文件保留天数RESULTS_DIR``tmp/tool-results/落盘目录
python
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中声明:
yaml
whenToUse: |
工具返回大结果可能超过10000字符时
使用本技能自动落盘,保护上下文窗口
permissions:
- file:write (tmp/tool-results目录)
- file:read (读取落盘结果)
logs/tool-size.log)#text
[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
默认使用:大多数返回不确定大小数据的工具
阈值调整:
定期清理:cron任务每日清理过期结果
预览友好:始终返回前500字符预览,便于快速判断
memory/learnings/claude-code-architecture-2026-04-03.mdskills/agent-concurrency-controller/skills/safe-file-editor/