К основному содержанию
скилл Claude Code CX Codex Cursor GitHub Copilot

prompt-caching — скилл для Claude Code: кэширование запросов и ответов

Скилл для оптимизации работы с LLM через кэширование промптов, ответов и предварительно загруженных документов. Снижает задержку и стоимость при повторных запросах с одинаковым контекстом.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add sickn33/agentic-awesome-skills --skill prompt-caching -a claude-code
Открыть на GitHub

Что делает prompt-caching

Скилл предлагает три стратегии кэширования. Prompt caching использует встроенное кэширование Anthropic для повторяющихся префиксов системного промпта и контекста — кэшируется один раз, потом читается дешевле. Response caching сохраняет полные ответы LLM в Redis или Upstash, работает на точном совпадении запроса или семантической близости. Cache Augmented Generation (CAG) кэширует документы прямо в промпте вместо поиска через RAG — подходит для стабильного корпуса, который влезает в контекст.

Внутри примеры на TypeScript для всех трёх подходов: инициализация клиента Anthropic с cache_control, хэширование промптов через crypto.sha256, работа с Redis или бессерверным хранилищем @upstash/redis. В документе разобраны острые углы: кэш-промах может замедлить ответ больше, чем отсутствие кэширования, если коэффициент попадания ниже 50%. Требует базового понимания кэширования, хэш-функций и работы с API LLM.

Какие задачи решает

  • Снизить задержку при повторных запросах к Claude с одинаковым контекстом
  • Кэшировать большие статические документы в промпте вместо RAG-поиска
  • Оптимизировать стоимость API при повторяющихся вызовах с одинаковым системным промптом
  • Выбрать между точным кэшем ответов, семантическим поиском и кэшем в промпте

Примеры запросов агенту

  • Добавь скилл prompt-caching, чтобы кэшировать мой системный промпт в Claude API
  • Используй CAG для кэширования документации в контексте вместо поиска
  • Настрой response caching с Redis для одинаковых запросов пользователей

Как установить prompt-caching

1Через Skills CLI (Vercel)

npx skills add sickn33/agentic-awesome-skills --skill prompt-caching -a claude-code

2Вручную: положить файлы

~/.claude/skills/prompt-caching/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/prompt-caching/

Из того же набора80

Весь набор →
docker-expert sickn33 Скилл для ИИ-агента, который разбирает Dockerfile, multi-stage сборки и безопасность контейнеров. Пригодится, когда нужно навести порядок в образах и Compose. Claude Code CX Codex Cursor +1 27 200установок typescript-expert sickn33 Скилл для работы с TypeScript и JavaScript: разбирает типы, ускоряет проверку и помогает с миграциями. Пригодится, когда проект на TS растёт и компилятор начинает тормозить. Claude Code CX Codex Cursor +1 12 600установок browser-automation sickn33 Скилл помогает проверять браузерные сценарии по состоянию интерфейса и результату операции. Подходит для UI-тестов, диагностики таймингов и разрешённого сбора данных. Claude Code CX Codex Cursor +1 6 700установок nextjs-supabase-auth sickn33 Скилл настраивает Supabase Auth в Next.js App Router: клиенты, middleware, OAuth callback и Server Actions. Пригодится для защиты маршрутов и работы с сессиями. Claude Code CX Codex Cursor +1 6 500установок 3d-web-experience sickn33 Помогает создавать и отлаживать 3D-сцены, конфигураторы товаров и портфолио для веба. Разбирает выбор стека, загрузку моделей и производительность. Claude Code CX Codex Cursor +1 5 200установок prisma-expert sickn33 Скилл помогает разбирать схемы Prisma, миграции и запросы. Пригодится, когда нужно найти причину ошибки или проверить изменения перед деплоем. Claude Code CX Codex Cursor +1 4 200установок playwright-skill sickn33 Скилл для написания и запуска тестов браузера через Playwright: проверка вёрстки на разных экранах, скриншоты, тесты логина и заполнения форм. Код выполняется локально через Node. Claude Code CX Codex Cursor +1 3 900установок game-development sickn33 Координирует структуру игры: задаёт базовые принципы архитектуры и перенаправляет агента к подскиллам для веба, ПК, мобильных платформ или VR. Claude Code CX Codex Cursor +1 3 800установок

Похожие

okx-agentic-wallet okx Скилл подключает агента к кошелькам OKX Onchain OS: балансы, переводы, свопы, бриджи, лимитные ордера и вызовы контрактов через CLI onchainos. Claude Code CX Codex Cursor +1 17 400установок wp-wpcli-and-ops WordPress Скилл для операций с WordPress через wp: переносит домены, выгружает базу, ставит плагины, разбирается с cron. Пригодится, когда агенту нужно что-то сделать на живом сайте, а не в файлах темы. Claude Code CX Codex Cursor +1 5 400установок managed-deep-agents langchain-ai Скилл помогает спроектировать, протестировать и развернуть Managed Deep Agent в LangSmith прямо из консоли. Полезен, когда нужно упаковать логику агента в файловую структуру и подготовить деплой. Claude Code CX Codex Cursor +1 9 100установок tavily-dynamic-search tavily-ai Скилл для поиска в интернете через Tavily с изоляцией контекста. Сохраняет тяжёлые ответы на диск и отбирает факты локально, чтобы не засорять окно модели. Claude Code CX Codex Cursor +1 13 400установок autoresearch Yeachan-Heo Ведёт одну миссию по кругу: правка, прогон эвалюатора, запись результата в JSON и markdown-лог. Пригодится, когда нужен долгий перебор гипотез с историей, а не одна попытка. Claude Code CX Codex Cursor +1 575установок modlens liustack Скилл для моделей без зрения: отдаёт картинку в CLI и возвращает JSON с распознанным текстом, областями вёрстки и смысловыми пометками. Claude Code CX Codex Cursor +1 896установок setup-matt-pocock-skills Matt Pocock Скилл настраивает репозиторий для инженерных скиллов Matt Pocock: задаёт трекер задач, метки триажа и расположение доменной документации. Запустите его перед первым использованием остальных скиллов. Claude Code 1 052 851установок to-tickets Matt Pocock Разбивает план, спецификацию или переписку на небольшие сквозные задачи и отмечает, какие из них блокируют остальные. Пригодится, когда нужно согласовать порядок работы до публикации задач в трекере. Claude Code 711 230установок

Вопросы о prompt-caching

Как установить prompt-caching в Claude Code?

Запусти npx skills add sickn33/agentic-awesome-skills --skill prompt-caching -a claude-code, затем найди файл конфигурации в ~/.claude/skills/prompt-caching/SKILL.md.

Что делает prompt-caching?

Реализует три метода кэширования для LLM: встроенное кэширование Anthropic (экономит токены на повтор контекста), кэширование ответов в Redis, и CAG (загрузка документов прямо в промпт вместо поиска).

Когда CAG лучше RAG?

CAG выигрывает, если корпус меньше 100К токенов, документы редко меняются, и критична минимальная задержка. Если документов много и они часто обновляются — используй RAG.

Исходный текст

SKILL.md · MIT
---
name: prompt-caching
description: Caching strategies for LLM prompts including Anthropic prompt
  caching, response caching, and CAG (Cache Augmented Generation)
risk: critical
source: vibeship-spawner-skills (Apache 2.0)
date_added: 2026-02-27
---

# 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.

© sickn33 · MIT · sickn33/agentic-awesome-skills

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой