惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
Jina AI
Jina AI
大猫的无限游戏
大猫的无限游戏
Martin Fowler
Martin Fowler
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
C
Cybersecurity and Infrastructure Security Agency CISA
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
S
Securelist
S
Security Affairs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
LINUX DO - 热门话题
博客园 - 三生石上(FineUI控件)
T
Threatpost
T
The Blog of Author Tim Ferriss
C
CERT Recently Published Vulnerability Notes
IT之家
IT之家
P
Palo Alto Networks Blog
Microsoft Azure Blog
Microsoft Azure Blog
Spread Privacy
Spread Privacy
Cyberwarzone
Cyberwarzone
腾讯CDC
L
LangChain Blog
Know Your Adversary
Know Your Adversary
C
CXSECURITY Database RSS Feed - CXSecurity.com
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
I
Intezer
T
Tor Project blog
AWS News Blog
AWS News Blog
T
Tenable Blog
NISL@THU
NISL@THU
Security Latest
Security Latest
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
H
Hackread – Cybersecurity News, Data Breaches, AI and More
人人都是产品经理
人人都是产品经理
MongoDB | Blog
MongoDB | Blog
MyScale Blog
MyScale Blog
D
DataBreaches.Net
Microsoft Security Blog
Microsoft Security Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
量子位
美团技术团队
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
罗磊的独立博客
The GitHub Blog
The GitHub Blog
阮一峰的网络日志
阮一峰的网络日志
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Stack Overflow Blog
Stack Overflow Blog

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
5 Anthropic Prompt Caching Patterns That Cut My API Bill 70%
RAXXO Studios · 2026-06-01 · via DEV Community
  • System-prompt caching alone cut repeat-call costs by half

  • Tool definitions cache separately, perfect for agent loops

  • Conversation history caching pays off after turn three

  • 1-hour TTL beats the default 5 minutes for batch jobs

My Anthropic API bill dropped 70 percent last month and I did not change a single model. I changed where the cache breakpoints went. Here are the five patterns I now use on every Claude integration I ship.

Pattern 1: Cache The System Prompt First

The system prompt is the cheapest win and most people skip it. My agents run with a 4,000 token system prompt that explains the role, the output format, the safety rules, and a few examples. That prompt never changes inside a session. Before caching, I paid full input price for those 4,000 tokens on every single call. With an agent that loops 30 times to finish a task, that is 120,000 tokens of pure repetition.

The fix is one parameter. I add a cache_control block with type: "ephemeral" to the last content item in the system prompt array. The first call writes the cache and costs slightly more (cache writes carry a small premium). Every call after that reads the cache at roughly one tenth the input price.

Here is the rule I follow: the cached block has to be at least 1,024 tokens for Claude Sonnet, or it gets ignored silently. My 4,000 token prompt clears that easily. If your system prompt is short, this pattern does nothing, so do not bother adding the breakpoint to a 200 token instruction.

The order matters more than people expect. The cache works as a prefix. Everything before the breakpoint gets stored. Everything after it is read fresh. So I put the stable stuff (role, rules, examples) up top and the volatile stuff (user query, current date) down below the breakpoint. Reorder this wrong and your cache hit rate collapses because the prefix changes on every call.

One real number from my logs: a document-classification job that runs 2,000 times a day. The system prompt is 3,800 tokens. Caching it saved me around 6.8 million billed input tokens daily. That is the single largest line item I cut. If you only do one thing from this article, cache the system prompt. It took me four minutes to add and the savings showed up in the next billing window.

I covered the broader setup in Claude Blueprint, which walks through how I structure these calls from the start.

Pattern 2: Cache Tool Definitions Separately

Tool definitions are the second forgotten cost. If you run Claude as an agent with function calling, your tool schemas can be huge. I have one agent with 14 tools and the JSON schemas alone come to 9,200 tokens. Those definitions sit at the very front of the request, before the system prompt, before anything else. They are also completely static across a session.

You can place a cache_control breakpoint right after the last tool definition. Now the tool block and the system prompt both get cached, but as two separate prefixes if you want. In practice I set one breakpoint after tools and a second one after the system prompt. Anthropic lets you set up to four breakpoints per request, so use them.

Why split into two instead of one big block? Flexibility. Sometimes I swap the system prompt for an A/B test but keep the same tools. With separate breakpoints, the tool cache survives the system-prompt change. Only the part that actually changed gets re-billed at full price. The tool prefix keeps reading from cache.

The math here is brutal in your favor for agent loops. A single agent task might fire 20 to 40 model calls as it reasons, calls a tool, reads the result, reasons again. Every one of those calls resends the full tool definitions. With 9,200 tokens of tools and 30 calls, that is 276,000 tokens you would pay full price for. Cached, it is one write and 29 cheap reads.

I measured a customer-support agent over a week. It handled 1,400 sessions. Average 18 model calls per session. Tool definitions cached saved me an estimated 215 million billed input tokens that week. The cache write overhead across all those sessions was tiny by comparison because each session writes once.

The trap: if you generate tool schemas dynamically and the JSON key order shifts between calls, the prefix breaks. I now serialize tools with sorted keys so the bytes are identical every time. That one habit fixed a mysterious cache miss rate I chased for two days.

Pattern 3: Cache Conversation History As It Grows

This is the pattern that needs the most care and pays off the most in long chats. In a multi-turn conversation, the history grows every turn. Turn one sends 500 tokens. Turn ten might send 8,000 tokens of accumulated back-and-forth. Without caching, you pay full price for the entire growing history on every turn.

The trick is a moving breakpoint. After each assistant response, I move the cache_control marker to the latest stable point in the message list. The whole conversation up to that point becomes the cached prefix. The next user turn appends after the breakpoint and reads everything before it from cache.

There is real subtlety here. The cache is a prefix match. So the messages before the breakpoint have to be byte-identical to the previous call. If you trim, summarize, or reorder history mid-conversation, you invalidate the cache from that point forward and pay full price to rebuild it. I learned to never edit history in place. I only append.

My rule: place the breakpoint on the second-to-last message, not the last. That keeps a stable boundary while the newest exchange stays uncached and cheap to write next round. By turn three, the cache is reliably paying for itself. Before turn three the write overhead can slightly exceed the read savings, so for very short interactions I skip history caching entirely.

A concrete result: a coding assistant I run averages 11 turns per session, and history reaches about 14,000 tokens by the end. Caching the growing prefix cut the per-session input billing by roughly 60 percent compared to resending everything fresh. Across 600 sessions a month that was a serious chunk of the bill.

If you want the deeper context on running Claude as a long-lived agent, see Claude Agent SDK in Production. It goes through the message-management side in more detail. The short version: append-only history plus a moving breakpoint is the combination that works.

Pattern 4: Use The 1-Hour TTL For Batch And Bursty Work

The default cache lifetime is five minutes. Every cache read resets that clock, so an active conversation keeps the cache warm on its own. The problem is bursty or scheduled work. If your job pauses for seven minutes between batches, the cache expires and you pay the write premium again on the next batch.

Anthropic offers a one-hour TTL. You opt into it per cache block by setting the TTL on the cache_control object. The write costs a bit more than the five-minute write, but the cache survives gaps up to an hour with no reads at all.

I use the one-hour TTL on three kinds of work. First, scheduled batch jobs that run every few minutes against the same system prompt. The five-minute cache kept dying in the gaps; the one-hour cache stays alive across the whole batch window. Second, user sessions with long think-time, like a research tool where someone reads a 2,000 word answer for ten minutes before replying. The five-minute cache was always cold by their next message. Third, multi-stage pipelines where stage one finishes, a separate process does work for several minutes, then stage two reuses the same cached context.

The decision is simple arithmetic in your head. If your average gap between calls is under five minutes, the default is free and fine. If your gap is regularly between five minutes and an hour, the one-hour TTL almost always wins despite the higher write cost, because you avoid repeated full-price rebuilds. If your gap is over an hour, no caching strategy helps and you should accept the fresh cost.

One detail that bit me: the TTL applies to the specific breakpoint. So if I have a one-hour system prompt cache and a five-minute history cache, they expire independently. I had a job where the history cache died but the system cache lived, and the partial cache hit confused my cost dashboard until I aligned both to one hour.

For scheduling the social side of all this around batch windows, I run posts through Buffer so the publishing cadence does not collide with my heavy API runs.

Pattern 5: Structure The Whole Prompt For Cache Friendliness

The last pattern is not a single trick. It is a layout discipline that makes the other four work together. Order your request from most stable to least stable, top to bottom. Tools first (rarely change), then system prompt (stable per session), then conversation history (grows but append-only), then the current user input (always new). Place breakpoints at the boundaries between these layers.

This ordering matters because the cache only matches a contiguous prefix from the start. The moment one byte changes, everything after it is uncached. So you want the volatile content as far down as possible and the stable content as far up as possible. I think of it like a stack: heavy, unchanging stuff on the bottom, light, changing stuff on top.

Two things ruin cache hits even with perfect ordering. Timestamps and random IDs injected into the stable layers. I once put the current date into my system prompt, thinking it harmless. It changed the prefix at midnight every day and silently halved my hit rate. Now any time-sensitive value lives below the lowest breakpoint, in the user turn where it belongs.

The second ruiner is non-deterministic serialization. JSON libraries do not always emit keys in the same order. Floating point formatting can differ. I normalize everything that goes into a cached block: sorted keys, fixed number formatting, no trailing whitespace differences. After I enforced this, my cache hit rate went from a frustrating 71 percent to a steady 96 percent on the same workload.

Measure your hit rate. The API response returns cache_creation_input_tokens and cache_read_input_tokens. I log both on every call and compute the read ratio nightly. When that ratio drops, something in my stable layers changed and I go hunting. This monitoring is what turned caching from a one-time setup into a thing I trust. Background: Claude Blueprint goes through how I wire this logging into the rest of the stack.

If your image pipeline also hits an API, the same prefix logic applies; I use Magnific for upscaling and keep its static config out of the per-image payload for the same reason.

Bottom Line

Caching is the highest-return change I have made to my Claude bill, and it touched zero of my actual logic. The five patterns stack: cache the system prompt, cache tool definitions on their own breakpoint, cache conversation history with a moving append-only marker, reach for the one-hour TTL when your calls are bursty, and lay out every request from stable to volatile so the prefix holds.

The combined effect on my workload was a 70 percent drop in billed input tokens. Most of that came from the system prompt and tool definition patterns, because agent loops repeat those on every single call. The history and TTL patterns cleaned up the rest.

Start with the system prompt this week. It is one parameter and four minutes of work. Then add tool caching if you run agents. Watch your cache_read_input_tokens climb, and let the number tell you whether the boundaries are placed right. If you want the full picture of how I structure Claude work end to end, Claude Blueprint is where I keep the running notes.

This article contains affiliate links. If you sign up through them, I may earn a small commission at no extra cost to you. (Ad)