
prompt-caching
Caching strategies for LLM prompts including Anthropic prompt caching, response caching, and CAG (Cache Augmented Generation)
- Installs
- 868
- Last 24h
- —
- Trending rank
- —
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/sickn33/agentic-awesome-skills --skill prompt-caching- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads prompt-caching automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Prompt Caching
Caching strategies for LLM prompts including Anthropic prompt caching, response caching, and CAG (Cache Augmented Generation)
Capabilities
- prompt-cache
- response-cache
- kv-cache
- cag-patterns
- cache-invalidation
Prerequisites
- Knowledge: Caching fundamentals, LLM API usage, Hash functions
- Skills_recommended: context-window-management
Scope
- Does_not_cover: CDN caching, Database query caching, Static asset caching
- Boundaries: Focus is LLM-specific caching, Covers prompt and response caching
Ecosystem
Primary_tools
- Anthropic Prompt Caching - Native prompt caching in Claude API
- Redis - In-memory cache for responses (ioredis on servers; @upstash/redis over HTTP on serverless, see
upstash-redis) - OpenAI Caching - Automatic caching in OpenAI API
Patterns
Anthropic Prompt Caching
Use Claude's native prompt caching for repeated prefixes
When to use: Using Claude API with stable system prompts or context
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic();
// Cache the stable parts of your prompt async function queryWithCaching(userQuery: string) { const response = await client.messages.create({ model: "claude-sonnet-4-20250514", max_tokens: 1024, system: [ { type: "text", text: LONG_SYSTEM_PROMPT, // Your detailed instructions cache_control: { type: "ephemeral" } // Cache this! }, { type: "text", text: KNOWLEDGE_BASE, // Large static context cache_control: { type: "ephemeral" } } ], messages: [ { role: "user", content: userQuery } // Dynamic part ] });
// Check cache usage
console.log(`Cache read: ${response.usage.cache_read_input_tokens}`);
console.log(`Cache write: ${response.usage.cache_creation_input_tokens}`);
return response;
}
// Measure actual cache-read/write costs and latency for the selected model/provider.
Response Caching
Cache full LLM responses for identical or similar queries
When to use: Same queries asked repeatedly
import { createHash } from 'crypto'; import Redis from 'ioredis';
const redis = new Redis(process.env.REDIS_URL); // Serverless/edge alternative without a persistent connection: // import { Redis } from '@upstash/redis'; const redis = Redis.fromEnv(); // then use redis.set(key, value, { ex: ttl })
class ResponseCache { private ttl = 3600; // 1 hour default
// Exact match caching
async getCached(prompt: string): Promise<string | null> {
const key = this.hashPrompt(prompt);
return await redis.get(`response:${key}`);
}
async setCached(prompt: string, response: string): Promise<void> {
const key = this.hashPrompt(prompt);
await redis.set(`response:${key}`, response, 'EX', this.ttl);
}
private hashPrompt(prompt: string): string {
return createHash('sha256').update(prompt).digest('hex');
}
// Semantic similarity caching
async getSemanticallySimilar(
prompt: string,
threshold: number = 0.95
): Promise<string | null> {
const embedding = await embed(prompt);
const similar = await this.vectorCache.search(embedding, 1);
if (similar.length && similar[0].similarity > threshold) {
return await redis.get(`response:${similar[0].id}`);
}
return null;
}
// Temperature-aware caching
async getCachedWithParams(
prompt: string,
params: { temperature: number; model: string }
): Promise<string | null> {
// Only cache low-temperature responses
if (params.temperature > 0.5) return null;
const key = this.hashPrompt(
`${prompt}|${params.model}|${params.temperature}`
);
return await redis.get(`response:${key}`);
}
}
Cache Augmented Generation (CAG)
Pre-cache documents in prompt instead of RAG retrieval
When to use: Document corpus is stable and fits in context
// CAG: Pre-compute document context, cache in prompt // Better than RAG when: // - Documents are stable // - Total fits in context window // - Latency is critical
class CAGSystem { private cachedContext: string | null = null; private lastUpdate: number = 0;
async buildCachedContext(documents: Document[]): Promise<void> {
// Pre-process and format documents
const formatted = documents.map(d =>
`## ${d.title}\n${d.content}`
).join('\n\n');
// Store with timestamp
this.cachedContext = formatted;
this.lastUpdate = Date.now();
}
async query(userQuery: string): Promise<string> {
// Use cached context directly in prompt
const response = await client.messages.create({
model: "claude-sonnet-4-20250514",
max_tokens: 1024,
system: [
{
type: "text",
text: "You are a helpful assistant with access to the following documentation.",
cache_control: { type: "ephemeral" }
},
{
type: "text",
text: this.cachedContext ?? "", // verify initialized context before querying
cache_control: { type: "ephemeral" }
}
],
messages: [{ role: "user", content: userQuery }]
});
return response.content.filter(block => block.type === "text").map(block => block.text).join("\n");
}
// Periodic refresh
async refreshIfNeeded(documents: Document[]): Promise<void> {
const stale = Date.now() - this.lastUpdate > 3600000; // 1 hour
if (stale) {
await this.buildCachedContext(documents);
}
}
}
// CAG vs RAG decision matrix: // | Factor | CAG Better | RAG Better | // |------------------|------------|------------| // | Corpus size | < 100K tokens | > 100K tokens | // | Update frequency | Low | High | // | Latency needs | Critical | Flexible | // | Query specificity| General | Specific |
Sharp Edges
Cache miss causes latency spike with additional overhead
Severity: HIGH
Situation: Slow response when cache miss, slower than no caching
Symptoms:
- Slow responses on cache miss
- Cache hit rate below 50%
- Higher latency than uncached
Why this breaks: Cache check adds latency. Cache write adds more latency. Miss + overhead > no caching.
Recommended fix:
// Optimize for cache misses, not just hits
class OptimizedCache { async queryWithCache(prompt: string): Promise<string> { const cacheKey = this.hash(prompt);
// Non-blocking cache check
const cachedPromise = this.cache.get(cacheKey);
// Defer paid provider call until bounded cache lookup misses.
// Race: use cache if available before LLM returns
const cached = await Promise.race([
cachedPromise,
sleep(50).then(() => null) // also catch cache errors per availability policy // 50ms cache timeout
]);
if (cached) {
// Cancel LLM request if possible
return cached;
}
// Cache miss: continue with LLM
const response = await this.queryLLM(prompt);
// Async cache write (don't block response)
this.cache.set(cacheKey, response).catch(console.error);
return response;
}
}
// Alternative: Probabilistic caching // Only cache if query matches known high-frequency patterns class SelectiveCache { private patterns: Map<string, number> = new Map();
shouldCache(prompt: string): boolean {
const pattern = this.extractPattern(prompt);
const frequency = this.patterns.get(pattern) || 0;
// Only cache high-frequency patterns
return frequency > 10;
}
recordQuery(prompt: string): void {
const pattern = this.extractPattern(prompt);
this.patterns.set(pattern, (this.patterns.get(pattern) || 0) + 1);
}
}
Cached responses become incorrect over time
Severity: HIGH
Situation: Users get outdated or wrong information from cache
Symptoms:
- Users report wrong information
- Answers don't match current data
- Complaints about outdated responses
Why this breaks: Source data changed. No cache invalidation. Long TTLs for dynamic data.
Recommended fix:
// Implement proper cache invalidation
class InvalidatingCache { // Version-based invalidation private cacheVersion = 1;
getCacheKey(prompt: string): string {
return `v${this.cacheVersion}:${this.hash(prompt)}`;
}
invalidateAll(): void {
this.cacheVersion++;
// Old keys automatically become orphaned
}
// Content-hash invalidation
async setWithContentHash(
key: string,
response: string,
sourceContent: string
): Promise<void> {
const contentHash = this.hash(sourceContent);
await this.cache.set(key, {
response,
contentHash,
timestamp: Date.now()
});
}
async getIfValid(
key: string,
currentSourceContent: string
): Promise<string | null> {
const cached = await this.cache.get(key);
if (!cached) return null;
// Check if source content changed
const currentHash = this.hash(currentSourceContent);
if (cached.contentHash !== currentHash) {
await this.cache.delete(key);
return null;
}
return cached.response;
}
// Event-based invalidation
onSourceUpdate(sourceId: string): void {
// Invalidate all caches that used this source
this.invalidateByTag(`source:${sourceId}`);
}
}
Prompt caching doesn't work due to prefix changes
Severity: MEDIUM
Situation: Cache misses despite similar prompts
Symptoms:
- Cache hit rate lower than expected
- Cache creation tokens high, read low
- Similar prompts not hitting cache
Why this breaks: Anthropic caching requires exact prefix match. Timestamps or dynamic content in prefix. Different message order.
Recommended fix:
// Structure prompts for optimal caching
class CacheOptimizedPrompts {
// WRONG: Dynamic content in cached prefix
buildPromptBad(query: string): SystemMessage[] {
return [
{
type: "text",
text: You are helpful. Current time: ${new Date()}, // BREAKS CACHE!
cache_control: { type: "ephemeral" }
}
];
}
// RIGHT: Static prefix, dynamic at end
buildPromptGood(query: string): SystemMessage[] {
return [
{
type: "text",
text: STATIC_SYSTEM_PROMPT, // Never changes
cache_control: { type: "ephemeral" }
},
{
type: "text",
text: STATIC_KNOWLEDGE_BASE, // Rarely changes
cache_control: { type: "ephemeral" }
}
// Dynamic content goes in messages, NOT system
];
}
// Prefix ordering matters
buildWithConsistentOrder(components: string[]): SystemMessage[] {
// Sort components for consistent ordering
const sorted = [...components]; // preserve semantic order; make construction deterministic
return sorted.map((c, i) => ({
type: "text",
text: c,
cache_control: i === sorted.length - 1
? { type: "ephemeral" }
: undefined // Only cache the full prefix
}));
}
}
Validation Checks
Caching High Temperature Responses
Severity: WARNING
Message: Caching with high temperature. Responses are non-deterministic.
Fix action: Define task-specific freshness/reuse policy; temperature is not a determinism or safety guarantee
Cache Without TTL
Severity: WARNING
Message: Cache without TTL. May serve stale data indefinitely.
Fix action: Set appropriate TTL based on data freshness requirements
Dynamic Content in Cached Prefix
Severity: WARNING
Message: Dynamic content in cached prefix. Will cause cache misses.
Fix action: Move dynamic content outside of cache_control blocks
No Cache Metrics
Severity: INFO
Message: Cache without hit/miss tracking. Can't measure effectiveness.
Fix action: Add cache hit/miss metrics and logging
Collaboration
Delegation Triggers
- context window|token -> context-window-management (Need context optimization)
- rag|retrieval -> rag-implementation (Need retrieval system)
- memory -> conversation-memory (Need memory persistence)
High-Performance LLM System
Skills: prompt-caching, context-window-management, rag-implementation
Workflow:
1. Analyze query patterns
2. Implement prompt caching for stable prefixes
3. Add response caching for frequent queries
4. Consider CAG for stable document sets
5. Monitor and optimize hit rates
Related Skills
Works well with: context-window-management, rag-implementation, conversation-memory
When to Use
- User mentions or implies: prompt caching
- User mentions or implies: cache prompt
- User mentions or implies: response cache
- User mentions or implies: cag
- User mentions or implies: cache augmented
Limitations
- Use this skill only when the task clearly matches the scope described above.
- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.
All cache classes are sketches with adapters/helpers/types omitted. Cache keys must include tenant/user authorization scope, model/version, full instructions, tool/schema versions, generation parameters and source versions; hashing a prompt does not anonymize cached sensitive content. Separate exact response caching from provider prefix/KV caching, which still generates a fresh answer and has provider-specific minimum tokens, TTL and pricing. Semantic similarity is not answer equivalence; do not reuse across permissions or safety-sensitive contexts without validation. Treat cached documents as untrusted source data, not authoritative system instructions. Persist version/invalidation state across workers/restarts, serialize Redis objects explicitly and apply retention/deletion policies. The100K-token and0.5-temperature thresholds are illustrative, not universal.
FAQ
What does the prompt-caching skill do?
Caching strategies for LLM prompts including Anthropic prompt caching, response caching, and CAG (Cache Augmented Generation)
How do I install prompt-caching?
Run npx skills add https://github.com/sickn33/agentic-awesome-skills --skill prompt-caching in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/prompt-caching/ (personal) or .claude/skills/prompt-caching/ (project).
Which AI agents can use prompt-caching?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is prompt-caching safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains prompt-caching?
It is published by sickn33 in sickn33/agentic-awesome-skills. It has 868 recorded installs.
More from sickn33/agentic-awesome-skills
docker-expert
sickn33/agentic-awesome-skills
You are an advanced Docker containerization expert with comprehensive, practical knowledge of container optimization, security hardening, multi-stage builds, orchestration patterns, and production deployment strategies based on current industry best practices.
nodejs-best-practices
sickn33/agentic-awesome-skills
Node.js development principles and decision-making. Framework selection, async patterns, security, and architecture. Teaches thinking, not copying.
typescript-expert
sickn33/agentic-awesome-skills
TypeScript and JavaScript expert with deep knowledge of type-level programming, performance optimization, monorepo management, migration strategies, and modern tooling.
clean-code
sickn33/agentic-awesome-skills
This skill embodies the principles of "Clean Code" by Robert C. Martin (Uncle Bob). Use it to transform "code that works" into "code that is clean."
api-security-best-practices
sickn33/agentic-awesome-skills
Implement secure API design patterns including authentication, authorization, input validation, rate limiting, and protection against common API vulnerabilities
nextjs-best-practices
sickn33/agentic-awesome-skills
Next.js App Router principles. Server Components, data fetching, routing patterns.
Popular ai & agents skills
google-agents-cli-publish
google/agents-cli
This skill should be used when the user wants to "publish an agent", "publish my ADK agent", "register an agent with Gemini", "publish to Gemini" (formerly Gemini Enterprise), or needs guidance on the agents-cli publish gemini command. Also use when the user wants to "manage agents in Agent Registry", "list/update/delete registered agents", or "register an MCP server". Covers ADK vs A2A registration modes, programmatic and interactive usage, flag reference, auto-detection from deployment metadata, Agent Registry fleet management, and troubleshooting. Part of the agents-cli skills suite. Do NOT use for deployment (use google-agents-cli-deploy).
google-agents-cli-eval
google/agents-cli
This skill should be used when the user wants to "run an evaluation", "evaluate my agent", "evaluate my ADK agent", "write an eval dataset", "analyze eval failures", "compare eval results", "optimize agent", or needs guidance on the Gemini platform eval methodology and the Quality Flywheel. Covers eval metrics, dataset schema, LLM-as-judge scoring, and common failure causes. Applies to any agents-cli project, whatever framework the agent is written in. Do NOT use for agent API code patterns (ADK: use google-agents-cli-adk-code), deployment (use google-agents-cli-deploy), or project scaffolding (use google-agents-cli-scaffold).
skill-creator
anthropics/skills
Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.
codex-pet
prime-skills/runcomfy-agent-skills
Codex Pet generator on RunComfy. Build a Codex-compatible Codex Pet spritesheet.webp + pet.json from a single reference image, drop it into ${CODEXHOME:-$HOME/.codex}/pets/ / and Codex picks it up as a custom Codex Pet next to the 8 built-ins. This skill produces the exact Codex Pet atlas Codex expects (1536x1872 PNG/WebP, 8 cols x 9 rows, 192x208 cells, 9 animation states — idle, running-right, running-left, waving, jumping, failed, waiting, running, review). Calls OpenAI GPT Image 2 edit ONCE via the local RunComfy CLI as runcomfy run openai/gpt-image-2/edit to produce a canonical Codex Pet pose, then assembles all 9 animation rows programmatically with ImageMagick micro-transforms — no Codex Pro, no $imagegen, no OPENAIAPIKEY required, only RUNCOMFYTOKEN. Triggers on "codex pet", "create codex pet", "make codex pet", "hatch codex pet", "/hatch image", "desktop pet codex", "codex pets", "spritesheet.webp", or any explicit ask to build a custom pet for OpenAI Codex.
full-output-enforcement
leonxlnx/taste-skill
Overrides default LLM truncation behavior. Enforces complete code generation, bans placeholder patterns, and handles token-limit splits cleanly. Apply to any task requiring exhaustive, unabridged output.
executing-plans
obra/superpowers
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available