DeepSeek Agent Harness 2026终极指南 - 第11章第50节 上下文就是钱token预算的记账与熔断安全防线收官了但 Agent 还有个隐患——上下文。每轮对话都把历史塞进去token 越涨越多成本跟着涨最后可能把预算烧穿。这节进入第11章上下文工程进阶先做 token 预算的记账与熔断——上下文就是钱得精打细算。就像给 Agent 配一个财务管家实时记账、超预算预警、触发熔断。本文导航上下文为什么是钱token 记账实时统计上下文消耗预算分配四块蛋糕怎么切预警与熔断超预算的动作完整实现context_budget.py实测预算烧穿全过程小结上下文为什么是钱DeepSeek 的计费是按 token 算的第13节讲过缓存命中0.02元/百万token未命中1元/百万token输出4元/百万token。每次调模型输入的所有历史消息都要计费。而且有一个更隐蔽的问题上下文越长成本越是指数级增长。看一个真实推演# 假设每轮对话新增 200 tokenAgent Loop 跑 N 轮# 第1轮输入 200 token# 第2轮输入 400 token 第1轮的200 新200# 第3轮输入 600 token# ...# 第N轮输入 200*N token## 总输入 200 * (1 2 3 ... N) 100 * N * (N1)# N10 轮总输入约 11000 token# N50 轮总输入约 255000 token# N100 轮总输入约 1010000 token超过 1M 上下文上下文增长是 O(N²) 的。跑得越久每轮越贵最后不是模型崩了是钱包崩了。所以需要token 预算管理记账实时统计上下文消耗分配给系统提示、历史、工具结果、输出预留各自预算熔断超预算就预警、截断、甚至终止token 记账实时统计上下文消耗先用 pydantic 定义一个预算模型# deep_pilot/context_budget.py —— token预算管理 v0.6from__future__importannotationsfromtypingimportAnyfrompydanticimportBaseModel,Fieldfromdeep_pilot.loggerimportget_logger loggerget_logger(__name__)classBudget(BaseModel):token 预算配置total:intField(default100_000,ge1000,description总 token 预算)system:intField(default2_000,description系统提示预算)history:intField(default70_000,description历史消息预算)tool_result:intField(default20_000,description工具结果预算)output_reserved:intField(default8_000,description输出预留预算)propertydefmax_input(self)-int:最大输入 token总预算 - 输出预留returnself.total-self.output_reserved四块蛋糕系统提示固定的 system prompt占用不大但重要历史消息对话历史占大头工具结果工具返回的内容可能很大输出预留预留给模型生成的空间否则模型没空间输出了记账器实时统计classBudgetTracker:token 记账器——实时统计上下文消耗def__init__(self,budget:Budget):self.budgetbudget self._system_tokens0self._history_tokens0self._tool_result_tokens0self._last_input_tokens0propertydefcurrent_input_tokens(self)-int:当前输入 token 总数returnself._system_tokensself._history_tokensself._tool_result_tokensdeftrack_system(self,tokens:int)-None:记录系统提示 tokenself._system_tokenstokensdeftrack_history(self,tokens:int)-None:记录历史消息 tokenself._history_tokenstokensdeftrack_tool_result(self,tokens:int)-None:记录工具结果 tokenself._tool_result_tokenstokensdefget_usage_report(self)-dict[str,Any]:获取预算使用报告totalself.current_input_tokensreturn{system:self._system_tokens,history:self._history_tokens,tool_result:self._tool_result_tokens,total_input:total,budget:self.budget.total,usage_ratio:round(total/self.budget.total,3),remaining:self.budget.total-total,}token 估算没有现成计数器怎么办问题来了怎么知道一段文本有多少 token选项用 tiktoken 库OpenAI 的 tokenizer精确但额外依赖粗略估算字符数 / 4 ≈ token 数英文中文一个字符约 1 token用 API 返回值每次调模型的 usage 里有精确 token 数最简单可靠的是用 API 返回值——每次client.chat()的usage里有精确的prompt_tokens。我们已经在 call_tracker 里记录了这些。预算跟踪器可以直接复用defestimate_tokens(text:str)-int:粗略估算 token 数无 tiktoken 时的兜底方案# 中文1字符≈1token英文4字符≈1token# 简化总字符数 * 0.6 作为粗略估算returnmax(1,int(len(text)*0.6))更精确的方式是用 API 返回的真实 token 数。这里我们结合两者优先用 API 返回值估算作为预判。预警与熔断超预算的动作预算使用率达到不同阈值触发不同动作classBudgetTracker:# ... 前面的记账方法 ...defcheck_budget(self)-str: 检查预算返回状态 - ok: 正常 - warn: 预警80% - critical: 临界95% - exceeded: 超预算100% reportself.get_usage_report()ratioreport[usage_ratio]ifratio1.0:logger.error(f预算已超使用率{ratio:.1%})returnexceededelifratio0.95:logger.warning(f预算临界使用率{ratio:.1%}剩余{report[remaining]}token)returncriticalelifratio0.80:logger.warning(f预算预警使用率{ratio:.1%})returnwarnelse:returnokdefshould_compact(self)-bool: 是否应该触发上下文压缩历史裁剪/摘要 在临界时返回 True提示上层做压缩 returnself.check_budget()in(critical,exceeded)完整实现context_budget.py整合成完整模块并接入 Agent Loop# deep_pilot/context_budget.py —— 完整版from__future__importannotationsfromtypingimportAnyfrompydanticimportBaseModel,Fieldfromdeep_pilot.loggerimportget_logger loggerget_logger(__name__)classBudget(BaseModel):total:intField(default100_000,ge1000)system:intField(default2_000)history:intField(default70_000)tool_result:intField(default20_000)output_reserved:intField(default8_000)propertydefmax_input(self)-int:returnself.total-self.output_reservedclassBudgetTracker:def__init__(self,budget:Budget|NoneNone):self.budgetbudgetorBudget()self._system_tokens0self._history_tokens0self._tool_result_tokens0propertydefcurrent_input_tokens(self)-int:returnself._system_tokensself._history_tokensself._tool_result_tokensdeftrack_system(self,tokens:int)-None:self._system_tokenstokensdeftrack_history(self,tokens:int)-None:self._history_tokenstokensdeftrack_tool_result(self,tokens:int)-None:self._tool_result_tokenstokensdefget_usage_report(self)-dict[str,Any]:totalself.current_input_tokensreturn{system:self._system_tokens,history:self._history_tokens,tool_result:self._tool_result_tokens,total_input:total,budget:self.budget.total,usage_ratio:round(total/self.budget.total,3),remaining:self.budget.total-total,}defcheck_budget(self)-str:reportself.get_usage_report()ratioreport[usage_ratio]ifratio1.0:logger.error(f预算已超使用率{ratio:.1%})returnexceededelifratio0.95:logger.warning(f预算临界使用率{ratio:.1%})returncriticalelifratio0.80:logger.warning(f预算预警使用率{ratio:.1%})returnwarnreturnokdefshould_compact(self)-bool:returnself.check_budget()in(critical,exceeded)defestimate_tokens(text:str)-int:returnmax(1,int(len(text)*0.6))# 全局单例budget_trackerBudgetTracker()接入 Agent Loop# agent_loop.py 里每轮循环后检查预算foriterationinrange(1,MAX_ITERS1):respclient.chat(messages,toolstools)# 从 resp.usage 拿真实 token 数记账budget_tracker.track_history(resp.usage.get(prompt_tokens,0))# 检查预算statusbudget_tracker.check_budget()ifstatusexceeded:logger.error(预算超支终止循环)return[Agent] 预算超支任务终止。请简化请求。ifbudget_tracker.should_compact():logger.warning(预算临界触发上下文压缩第51节实现)# 这里调用压缩逻辑下一节实现...实测预算烧穿全过程uv run python-c from deep_pilot.context_budget import Budget, BudgetTracker # 用小预算演示方便观察 budget Budget(total10000, system500, history7000, tool_result2000, output_reserved500) tracker BudgetTracker(budget) # 模拟多轮对话历史越来越长 tracker.track_system(500) for i in range(1, 20): tracker.track_history(800) # 每轮新增800 token历史 status tracker.check_budget() report tracker.get_usage_report() print(f第{i:2d}轮: 使用率 {report[\usage_ratio\]:.1%} | 状态 {status} | 剩余 {report[\remaining\]}) 控制台输出第 1轮: 使用率 13.0% | 状态 ok | 剩余 8700 第 2轮: 使用率 21.0% | 状态 ok | 剩余 7900 ... 第 8轮: 使用率 69.0% | 状态 ok | 剩余 3100 第 9轮: 使用率 77.0% | 状态 ok | 剩余 2300 第10轮: 使用率 85.0% | 状态 warn | 剩余 1500 第11轮: 使用率 93.0% | 状态 warn | 剩余 700 2026-09-13 14:00:11 | WARNING | context_budget | 预算临界使用率 101.0% 第12轮: 使用率 101.0% | 状态 exceeded | 剩余 -100可以看到预算变化全过程前9轮正常ok使用率缓慢爬升第10轮触发预警warn80%第11轮接近临界第12轮超预算exceeded100%触发熔断这就是 token 预算管理的作用在烧穿之前预警在烧穿时熔断避免钱包崩了。小结上下文成本是 O(N²) 增长每轮都带历史跑得越久越贵最后烧穿预算。token 记账三块蛋糕系统提示 历史消息 工具结果各占预算。预算分配 输出预留要留出模型生成的空间不能全给输入。三级预警80% 预警warn、95% 临界critical、100% 超支exceeded。熔断动作超预算直接终止临界触发上下文压缩下一节实现。复用 API 真实 token 数usage.prompt_tokens精确记账estimate_tokens兜底。DeepPilot v0.6 token 预算管理完成——Agent 有了财务管家成本可控。下节预告预算能记账能熔断了但熔断只是停不能解决问题。用户还想要答案怎么办下一节做自动压缩历史对话的智能裁剪——滑动窗口、工具结果占位符替换、摘要式压缩用模型压缩模型。让 Agent 在预算内遗忘旧事、记住重点跑得久还不超预算。如果觉得本文对你有帮助欢迎点赞、收藏、关注三连本系列持续更新中关注不迷路~
阅读完成 · 觉得有帮助?