前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
返回 AI 情报前线
All News · 全部资讯9321
  • Claude Code 技能加载竟消耗 20 万 token
  • 60行代码构建本地脱敏代理,保护API密钥不外泄
  • 金融SaaS单API密钥设计:结构化输出与幂等性实践
  • 如何在应用中使用 Amazon Q 嵌入式聊天定制品牌化界面
  • AI API成本削减97.5%实战:绕过中间商反而更贵
  • 14款MCP服务器上下文窗口消耗实测
  • Bedrock多Agent文档分类方案实战
  • Jumio实时特征存储架构:亚100ms欺诈检测
  • failproof AI将编码Agent策略执行从700ms压至0.7ms
  • Claude Code周限额明日大幅下调三分之一
  • MCP Gateway: 统一多MCP服务器的架构方案
  • 实测:选对模型把我AI API账单削减90%
  • Agentic AI延迟问题:算力堆叠不是答案
  • NoWreck:验证AI代码修改是否属实的工具
  • AI Agent成为新型攻击面:自我复制威胁研究
  • 多模型API退出测试:成本账本才是选型关键
  • 为什么不能只用Claude做所有事
  • Axonius多租户AI Agent隔离方案实践
  • 用LiteLLM将Claude Code路由到DeepSeek节省成本
  • Claude Code支持AGENTS.md跨工具标准配置
  • Coding Agent 账单省 50-70%:利用 sticky routing 保住 Prompt Cache 命中
  • AI Agent 为何还在用 while(true) 循环——工程陷阱深度剖析
  • SEO Agent 选 MCP 还是 REST?一份实用决策框架
  • SGLang深度解析:如何高效服务DeepSeek-V4-Pro
  • FlakeFixer: 用Agent自动分析Flaky Test
  • AI编码Agent记忆系统设计的四个教训:删除不是过期
  • 盲人开发者为视障群体打造AI描述应用ScribeMe
  • AI代码审查员的验证悖论:声称完成≠真正完成
  • LLM API多租户安全清单:tenants-safety essential
  • AI Agent不应持有你的钥匙:权限最小化原则
  • Claude 多智能体系统上演自复制恶意软件攻防战
  • MCP Server 开发避坑指南:工具描述比 TypeScript 更难
  • 生产级 Solana Agent 交易生命周期深度解析
  • 5分钟让AI助手读懂你的代码库
  • 用Python构建AI简历筛选器
  • Agent上下文满了该丢什么:长对话记忆管理实战
  • Warp推出Factories:一站式AI软件开发工厂基础设施
  • AI Agent试点到生产:成本暴涨700倍的教训
  • Cursor发布Origin功能:AI编程上下文管理
  • TryHackMe 提示词注入 CTF 实战攻略
  • 面向 Agent 的运维队列:失败自动转Ticket
  • 四个静默失败的 CI 检查:它们都是绿的,但什么都没做
  • AI 编码工具会读取 .env:本地 DLP 代理 Anonmyz 在prompt边界截流
  • Google 开源 SAM:零配置的 AI Agent P2P 发现与调用网络
  • Cursor Skills完全指南:格式规范与跨Agent迁移实测
  • OpenAI Codex Skills规范详解:目录结构与官方文档未记载的细节
  • 用Gitea自建Claude Code内部插件市场,团队Skill统一分发
  • Claude Skills规范深度解读:从格式到团队协作
  • 2026年LLM应用架构实战:摆脱if/else链式判断
  • Anthropic CEO:AI天然趋向集中,开源只是转移权力
  • 微软 Copilot 隐藏参数漏洞可被利用窃取密码
  • 已加载 51 / 9321
8.0
热点
AI SCORE
编程提效2026-08-19 00:19

Coding Agent 账单省 50-70%:利用 sticky routing 保住 Prompt Cache 命中

dev.to · AI#Prompt Cache#Coding Agent#成本优化
Editor brief · 编辑速览

多 Provider 负载均衡会把同一会话的请求路由到不同账号/节点,导致缓存命中率极低;通过会话 sticky routing 可将缓存命中率从"随机"提升到 80-95%。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

TL;DR — 如今按 token 计价已成行业默认,coding agent 账单里最大的开销往往不是"更聪明的模型",而是以全价反复购买的重复内容。现代提供商(Anthropic、DeepSeek、OpenAI)对重复输入前缀的缓存命中只收取 10-20% 的费用。制胜之道不是让 prompt 变得更小——而是确保你的多轮会话永远不会离开缓存已经热起来的那个上游节点。在我们 150 req/s 的长会话压测中,使用 sticky routing 将会话固定后,缓存命中率从"靠运气"提升到了 80-95%,账单费用降低了 50-70%(自测,非第三方审计)。

问题:你的路由器正是缓存变冷的原因

这里有个反直觉的地方。如果你运行一个 coding agent(Claude Code、Cursor、OpenClaw——任何具有长多轮上下文的工具),并且配置了多个 API key 或提供商以保证韧性,你的网关很可能在每一轮都在杀死你的缓存。

Prompt 缓存是按上游节点隔离的——按账号、按物理节点。当你的负载均衡器把请求 #1 轮询到账号 A、#2 到账号 B、#3 又回到 A 时,对每个账号来说每一轮看起来都像是一个全新的会话。什么都命中不了。所有内容都按全价计费,包括前面轮次中已经计算过的 90% 的 token。

更糟的是:经典的网关调度算法——平滑加权轮询、贪婪配额平衡——的设计目标恰好是均匀分散流量。缓存局部性想要的恰恰相反:流量应该被固定。在长会话中,"公平"和"便宜"是互相排斥的。

洞察:缓存经济学胜过 token 压缩

"让 agent 更便宜"这个领域有两条主流路径,它们基于对上游计费方式的不同假设:

本地压缩(如 OpenProxy 的 RTK):假设上游是无状态的,所有内容都按全价计费,所以缩小 payload——重新编码表格、注入简短输出指令、裁剪工具 schema。声称能节省 20-40%。

缓存亲和性保护(VMR):假设上游是有状态的——即长会话成本的 90% 是由 prompt 缓存决定的。所以什么都不动,保持字节前缀完全一致将会话固定在一个节点上,让重复前缀持续命中折扣层。

冲突是结构性的:每一次压缩"优化"都会破坏缓存。动态重编码、注入指令、schema 裁剪——每一种改动都会从 token 0 开始使前缀哈希失效。在一个 30 轮的会话中,压缩 30% 的 token 不足以补偿 29 轮累积上下文重新按全价计费的损失。机制层面的结论:在启用缓存的 2026 年,压缩反而可能让你花更多钱。

(公平地说:OpenProxy 是一个真正更广泛意义上的工具——为 ChatGPT/Codex/Gemini 提供 OAuth 订阅池聚合、真正的 Web UI、对冲和融合调度、MCP/多模态扩展。上述批评仅针对长会话中的 RTK 压缩,不针对整个项目。)

修复:两层会话粘性路由

VMR 的 sticky registry(internal/sticky/sticky.go)是一个内存中的映射表,从会话指纹映射到上一次为其提供服务的节点。指纹是 system prompt + 第一条用户消息的哈希值——特意不采用客户端会话 ID,因为客户端(尤其是 agent 框架)在重启时会重新生成 ID,而缓存前缀是由内容决定的。

路由有两层,按优先级从高到低:

Sticky Pin——如果指纹在 registry 中且节点健康,强制将请求发送回该节点。这优先于所有配额调度。即使该账号的配额用完了,我们仍会保持会话粘性并承担超出配额的部分,因为中途切换会话会使缓存归零,而数十轮的重计算成本比短暂的超出配额要高出一个数量级。

New-session spread——只有没有粘性绑定的会话才参与调度。优先级排序后平分的情况下,按配额余量贪婪分配。值得注意的是,我们没有使用 SWRR:它需要一个持久化的累加器,而分散流量本身就是在破坏缓存局部性。一个新会话会一次性选择一个节点;第一层会把它固定在那里。

两个值得借鉴的工程细节:

TTL 是分层的。全局 sticky_ttl 默认 10m(对 Anthropic/OpenAI 的内存缓存足够),由内存驱逐兜底硬性上限 24h,防止 registry 无限增长。像 DeepSeek 这样使用磁盘缓存的提供商会将缓存保留数小时到数天——按节点覆盖(sticky_ttl: 2h)以匹配缓存生命周期。

过期清理是机会性的,不是 ticker goroutine——由事件触发并节流,避免在每次调用时都执行带全局锁的遍历。

models:
  coding:
    capabilities: [text, tools]
    max_context_tokens: 256000
    endpoints:
      - protocol: openai
        provider: deepseek
        models: [deepseek-v4-flash]
        sticky_ttl: 2h   # disk cache lives hours-to-days; match it
      - protocol: anthropic
        provider: anthropic
        models: [claude-sonnet-5]
        # sticky_ttl: 10m (default)

客户端指向 http://localhost:8080/v1(或者对于 Anthropic 协议用 /v1/messages),模型名称是你的虚拟模型。同一个会话、同一节点、每一轮。

同一会话修复前 → 修复后的追踪(示意性的微观数字,在合理范围内):

before  req#0127  endpoint=deepseek-01   cache_hit=0    input=185K  cost=$0.41
before  req#0128  endpoint=anthropic-02  cache_hit=0    input=199K  cost=$1.86
before  req#0129  endpoint=deepseek-01   cache_hit=0    input=213K  cost=$0.47

after   req#0127  endpoint=deepseek-01   cache_hit=182K  input=185K  cost=$0.03
after   req#0128  endpoint=deepseek-01   cache_hit=195K  input=199K  cost=$0.04
after   req#0129  endpoint=deepseek-01   cache_hit=208K  input=213K  cost=$0.04

将会话固定后,累积的上下文就不再按全价重新购买了。

我们接受的权衡

无法实现全局配额最优调度。理论上可能存在一个既保留缓存又在会话之间随机分配配额的完美调度器,但需要持久化状态和预测能力。对于个人开发者而言,复杂度与 bug 的比值不值得。会话本地锁 + 会话间贪婪是务实的最优解。

无法实现对冲。同时向两个提供商发送相同请求并取更快的结果会增加延迟保险,但会使全价消耗翻倍并破坏缓存。对个人使用来说预期价值为负。

TTL 粒度较粗。10m 对超长会话来说偏保守;我们提供按节点覆盖而非自适应 TTL。已知的后续工作。

你的配置的 3 步检查清单

先检查你的缓存命中率。看账单/状态输出中的 cache_read 与 fresh。长会话缓存命中率低于 ~50% 意味着你的配置在漏钱——先解决这个问题再做其他优化。

停止在多个 key 之间分散会话。如果你的工具支持会话亲和性,开启它。如果不支持,手动为一个长会话分配一个 key,让故障转移只处理真正的宕机。

保持 system prompt 字节稳定。动态注入(时间戳、随机变量)会使每条请求的前缀失效。而且如果你使用"压缩"代理,要知道它是在用缓存命中换取更短的 payload——在长会话中通常是一笔坏交易。

零数据库、纯自托管、一个静态二进制文件(~15MB,Go)。如果这听起来像是你想要的工具,VMR 开源于 https://github.com/bigfatsea/vmr。

数据声明:50-70% 这个数字来自我们自己的长会话压测和项目记录,非第三方审计。实际节省取决于提供商的缓存定价——DeepSeek 级磁盘缓存能带来最大的收益。

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
Claude Code支持AGENTS.md跨工具标准配置
下一篇
AI Agent 为何还在用 while(true) 循环——工程陷阱深度剖析