1. search_reports 场景下 Tokens 为什么烧得这么快
如果你正在用 Trae Agent 或者类似的 AI 编码助手跑调研类任务,大概率遇到过这种情况:一个「帮我调研下前端构建工具」的请求发出去,模型开始疯狂调用 WebSearch、SearchCodebase,一轮接一轮,最后要么请求被中断,要么账单数字让你心跳加速。search_reports 就是 Trae Agent 里用来记录「这次任务到底搜了什么、搜到了什么、哪些被采纳了」的结构化日志集合,本质是一份 JSON 或 Markdown 格式的搜索轨迹文件。它能帮你做三件事:去重(避免同一个 query 反复搜)、溯源(知道模型引用了哪条结果)、导出(把过程整理成报告)。
但很多人只把它当成一个「事后查看」的工具,忽略了它其实可以在请求发出前就参与 Tokens 预算控制。真正让 Tokens 消耗失控的,往往不是模型本身多贵,而是无效搜索循环:同一个关键词被搜了五遍、搜索结果没被采纳却反复注入上下文、多轮对话里历史 search_reports 全量塞进 prompt。这篇文章面向使用统一 Key/API 通道的开发者,给出一套可复制的 settings.json / config.toml 配置骨架,把 search_reports 从「日志」变成「节流阀」,在 search_reports 流程里把无效 Tokens 开销压下来。
适合谁看:已经在用 Trae Agent 或类似 Agent 框架做调研、排错、技术选型的开发者;通过统一 API 通道调用模型的团队;以及被「模型循环,请求已被中断」折磨过的人。下面所有配置都可以直接抄,改几个路径就能跑。
2. 前置准备:统一 Key/API 通道与 search_reports 的关系
在动手改配置之前,先把调用链路理清楚。search_reports 的 Tokens 消耗发生在两个地方:一是搜索工具本身的调用(WebSearch/SearchCodebase 的请求与返回),二是搜索结果被注入模型上下文后占用的 prompt tokens。前者靠去重和缓存控制,后者靠上下文裁剪和报告摘要控制。
如果你用的是统一 Key/API 通道,比如通过 TaoToken 这类聚合入口调用不同模型,那么 Tokens 计费口径是统一的,search_reports 里的 token 消耗字段就能直接对应到账单。这一点很关键:只有计费口径统一,你才能用 search_reports 的数据反推哪一步在烧钱。
先拿到 API Key。访问 https://taotoken.net/api-keys 创建,注意这个页面不要加 UTM 参数,直接访问即可。创建后你会得到一个 sk- 开头的 Key,后面配置里会用到。
模型选择上,调研类任务建议用长上下文模型,但不要一上来就上最贵的。你可以先在 https://taotoken.net/models 里对比一下各模型的上下文窗口和单价,再决定 search_reports 摘要用哪个模型生成。如果是长期跑编码和 Agent 任务,可以考虑 Coding Plan,入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite ,它更适合高频调用场景。
接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,配置格式、base_url、鉴权方式都在里面,建议先扫一遍再改配置文件。
3. 可复制的 settings.json / config.toml 配置骨架
下面给两套骨架,一套是 Trae Agent 风格的 settings.json,一套是通用 Agent 框架的 config.toml。核心思路一致:给 search_reports 加去重、加缓存、加摘要、加预算上限。
3.1 settings.json 骨架(Trae Agent 风格)
{ "agent": { "name": "search_reports_optimized", "max_iterations": 12, "token_budget": { "total": 120000, "search_reports_share": 0.35, "per_search_max": 4000 } }, "search_reports": { "enabled": true, "dedup": true, "dedup_window": 8, "cache_ttl_seconds": 1800, "export_format": "markdown", "export_path": "./reports/search_results.md", "summary": { "enabled": true, "model": "gpt-4o-mini", "max_summary_tokens": 600, "keep_raw": false }, "context_injection": { "mode": "summary_only", "max_reports_in_context": 3, "truncate_result_chars": 800 } }, "tools": { "web_search": { "max_results": 5, "timeout_ms": 8000, "retry": 1 }, "search_codebase": { "max_files": 20, "max_snippet_chars": 400 } }, "api": { "base_url": "https://taotoken.net/api", "api_key_env": "TAOTOKEN_API_KEY", "timeout_ms": 60000 } }几个参数值得单独说。dedup_window: 8表示最近 8 次搜索内做去重比对,超过窗口的旧 query 不再参与比对,避免长任务里比对本身消耗算力。context_injection.mode: "summary_only"是最省 token 的模式,只把 search_reports 的摘要注入上下文,原始结果留在磁盘上,需要时再按需读取。truncate_result_chars: 800控制单条搜索结果注入时的字符上限,防止一条长网页把上下文撑爆。
3.2 config.toml 骨架(通用 Agent 框架)
[agent] name = "search_reports_optimized" max_iterations = 12 [agent.token_budget] total = 120000 search_reports_share = 0.35 per_search_max = 4000 [search_reports] enabled = true dedup = true dedup_window = 8 cache_ttl_seconds = 1800 export_format = "markdown" export_path = "./reports/search_results.md" [search_reports.summary] enabled = true model = "gpt-4o-mini" max_summary_tokens = 600 keep_raw = false [search_reports.context_injection] mode = "summary_only" max_reports_in_context = 3 truncate_result_chars = 800 [tools.web_search] max_results = 5 timeout_ms = 8000 retry = 1 [tools.search_codebase] max_files = 20 max_snippet_chars = 400 [api] base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" timeout_ms = 60000两套配置的语义完全对应,选你框架支持的那套。注意api_key_env用的是环境变量名,不要把 Key 明文写进配置文件,这是基本安全习惯。
3.3 环境变量与启动命令
export TAOTOKEN_API_KEY="sk-你的key" export SEARCH_REPORTS_DIR="./reports"启动 Agent 时指定配置文件:
trae-cli run "调研 2026 前端构建工具对比" \ --config ./settings.json \ --trajectory-file ./my_research.json跑完后my_research.json里的 search_reports 字段就是完整搜索轨迹,./reports/search_results.md是导出的可读报告。
4. 验证请求与成功结果
配置改完不能只看「没报错」,要验证三件事:去重是否生效、摘要是否生成、上下文注入是否被裁剪。
4.1 验证去重
连续发两个语义相同的 query,观察 search_reports 里是否只记录一次实际搜索、第二次标记为reused。
trae-cli tool:run --tool search_reports \ --arguments '{"action":"list"}'预期输出里能看到类似:
{ "reports": [ { "query": "React 18 新特性", "status": "hit", "dedup": false, "tokens": 1820 }, { "query": "React 18 有哪些新特性", "status": "reused", "dedup": true, "tokens": 0 } ] }第二条tokens: 0且dedup: true,说明去重生效,没有重复消耗。
4.2 验证摘要生成
trae-cli tool:run --tool search_reports \ --arguments '{"action":"export","format":"markdown","output":"./reports/search_results.md"}'打开导出的 Markdown,应该看到每条搜索记录下有「摘要」小节,且摘要长度受max_summary_tokens约束。如果摘要为空,检查summary.enabled是否为 true,以及摘要模型是否在统一通道里可用。
4.3 验证上下文注入裁剪
在对话里追问同一话题,观察模型回复是否基于摘要而非原始结果。一个简单的判断方法:原始结果里有 10 条链接,但模型只引用了摘要里提到的 3 条,说明summary_only模式生效。
4.4 验证 Tokens 下降
对比优化前后的 search_reports 总 tokens。实测下来,一个中等复杂度的调研任务,开启去重和摘要后,search_reports 相关 tokens 通常能降 40% 到 60%。具体数字取决于任务里重复搜索的比例。
5. 本篇常见错排查
5.1 配置不生效,search_reports 还是全量注入
先确认配置文件路径是否被正确加载。很多框架默认读~/.config/agent/settings.json,你传了--config但框架没识别,就会回退到默认配置。检查启动日志里有没有loaded config from ...这一行。
另一个常见原因是context_injection.mode拼写错误,比如写成summary-only或SummaryOnly,框架解析失败后静默回退到full。建议用 JSON Schema 校验一遍配置文件。
5.2 去重太激进,该搜的没搜
dedup_window设得太大会导致语义相近但实际不同的 query 被误判为重复。比如「React 18 新特性」和「React 18 性能优化」在窗口内可能被合并。解决办法是把dedup_window降到 4 到 6,或者在 query 里加区分词。
5.3 摘要模型调用失败
摘要模型走的是统一 API 通道,如果base_url或api_key_env配错,摘要会静默失败,search_reports 里summary字段为空。先用 curl 验证通道连通性:
curl -s https://taotoken.net/api/v1/models \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" | head -c 500能返回模型列表说明通道正常。如果返回 401,检查 Key 是否过期;返回 404,检查 base_url 是否多了或少了路径段。
5.4 导出报告里 token 字段为 0
部分框架的 search_reports 只在搜索实际发生时记录 tokens,复用和缓存命中时记 0。这是预期行为,不是 bug。如果你想统计「节省了多少」,需要自己加一个saved_tokens字段,在去重命中时累加原 query 的历史消耗。
5.5 模型循环仍然发生
search_reports 去重能降低循环概率,但不能完全消除。如果模型在摘要层面反复追问同一个问题,需要在 Agent 层加max_iterations硬上限,配合token_budget.total熔断。两个一起用,基本能兜住。
6. 把 search_reports 接进你的日常流程
配置骨架给完了,最后说几个实操习惯。第一,把 search_reports 的导出路径固定到项目里的./reports/目录,每次任务结束自动生成 Markdown,PR 里直接贴,省得手动整理。第二,摘要模型不要用最贵的,调研摘要用轻量模型足够,把预算留给最终报告生成。第三,定期用action: list看一眼历史 search_reports,如果发现某类 query 反复出现,说明你的 prompt 里缺少前置约束,应该在系统提示里明确「先查 search_reports 再决定是否新搜」。
如果你还没配好统一 Key,先去 https://taotoken.net/api-keys 创建,再对照 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 把 base_url 和鉴权接上。模型对话调试可以用 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 里的对话入口快速验证摘要模型是否可用。长期跑 Agent 任务的话,Coding Plan 的入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite ,按需选。
配置这东西,抄一遍跑通,再根据自己的任务类型微调两三个参数,基本就稳了。search_reports 从「事后日志」变成「事前节流」,省下来的 tokens 是实打实的。