runtime-cache — скилл для Codex: что делает и как установить
Скилл подсказывает, как использовать Vercel Runtime Cache для серверного кэширования по регионам и тегам. Пригодится для стратегий за пределами кэша фреймворка.
npx skills add openai/plugins --skill runtime-cache -a codexЧто делает runtime-cache
runtime-cache помогает проектировать кэширование через Vercel Runtime Cache. Он описывает региональное key-value-хранилище для Vercel Functions, Routing Middleware и Builds, изолированное по проекту и окружению деплоя. Данные живут между деплоями, пока не сработает TTL или очистка по тегу; при заполнении применяется вытеснение LRU.
В материалах разобраны getCache из @vercel/functions, операции чтения, записи и удаления, пространства имён, хеширование ключей и теги. Отдельно показана разница между expireTag, который очищает Runtime Cache, и invalidateByTag с очисткой CDN, Runtime Cache и Data Cache. Есть примеры для Next.js 16+, CLI-команд Vercel и CDN-тегов.
Перед работой проверьте доступ к @vercel/functions и лимиты кэша: размер элемента до 2 MB, до 64 тегов у записи Runtime Cache и до 256 bytes на тег. Ставить стоит тем, кто настраивает кэширование в Vercel и хочет явно управлять инвалидированием; для обычного кэша уровня фреймворка скилл может быть лишним.
Какие задачи решает
- спроектировать кэш по регионам для серверных функций
- сохранить данные с TTL и тегами
- очистить Runtime Cache по одному или нескольким тегам
- развести Runtime Cache, CDN и Data Cache
- настроить кэширование в Next.js 16+
Примеры запросов агенту
- Покажи, как сохранить результат запроса в Runtime Cache через `getCache` с TTL и тегом.
- Сравни `cache.expireTag` и `invalidateByTag` для очистки данных в моём проекте.
- Настрой для Next.js 16+ удалённый кэш через `use cache: remote` и добавь тег.
Как установить runtime-cache
1Через Skills CLI (Vercel)
npx skills add openai/plugins --skill runtime-cache -a codex2Вручную: положить файлы
.agents/skills/runtime-cache/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add openai/plugins --skill runtime-cache -a claude-code2Вручную: положить файлы
~/.claude/skills/runtime-cache/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/runtime-cache/
Вручную: положить файлы
.cursor/skills/runtime-cache/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install openai/plugins runtime-cache2Вручную: положить файлы
.github/skills/runtime-cache/SKILL.mdКомандой платформы
gemini skills install https://github.com/openai/plugins --path plugins/vercel/skills/runtime-cacheВручную: положить файлы
.devin/skills/runtime-cache/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Claude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
Из того же набора199
Весь набор →Похожие
Вопросы о runtime-cache
Как установить runtime-cache в Codex?
Выполните npx skills add openai/plugins --skill runtime-cache. Файл скилла появится по пути .agents/skills/runtime-cache/SKILL.md.
Что делает runtime-cache?
Скилл объясняет работу Vercel Runtime Cache: запись и чтение данных, TTL, теги, пространства имён и очистку кэша. Он также показывает интеграцию с Next.js 16+ и CLI Vercel.
Чем `expireTag` отличается от `invalidateByTag`?
cache.expireTag() очищает только Runtime Cache. invalidateByTag() очищает CDN, Runtime Cache и Data Cache.
Исходный текст
SKILL.md · Apache-2.0
---
name: runtime-cache
description: Vercel Runtime Cache API guidance — ephemeral per-region key-value cache with tag-based invalidation. Shared across Functions, Routing Middleware, and Builds. Use when implementing caching strategies beyond framework-level caching.
metadata:
priority: 6
docs:
- "https://nextjs.org/docs/app/building-your-application/caching"
sitemap: "https://nextjs.org/sitemap.xml"
pathPatterns:
- 'lib/cache/**'
- 'src/lib/cache/**'
- 'lib/cache.*'
- 'src/lib/cache.*'
bashPatterns:
- '\bnpm\s+(install|i|add)\s+[^\n]*@vercel/functions\b'
- '\bpnpm\s+(install|i|add)\s+[^\n]*@vercel/functions\b'
- '\bbun\s+(install|i|add)\s+[^\n]*@vercel/functions\b'
- '\byarn\s+add\s+[^\n]*@vercel/functions\b'
---
# Vercel Runtime Cache API
You are an expert in the Vercel Runtime Cache — an ephemeral caching layer for serverless compute.
## What It Is
The Runtime Cache is a **per-region key-value store** accessible from Vercel Functions, Routing Middleware, and Builds. It supports **tag-based invalidation** for granular cache control.
- **Regional**: Each Vercel region has its own isolated cache
- **Isolated**: Scoped per project AND per deployment environment (`preview` vs `production`)
- **Persistent across deployments**: Cached data survives new deploys; invalidation via TTL or `expireTag`
- **Ephemeral**: Fixed storage limit per project; LRU eviction when full
- **Framework-agnostic**: Works with any framework via `@vercel/functions`
## Key APIs
All APIs from `@vercel/functions`:
### Basic Cache Operations
```ts
import { getCache } from '@vercel/functions';
const cache = getCache();
// Store data with TTL and tags
await cache.set('user:123', userData, {
ttl: 3600, // seconds
tags: ['users', 'user:123'], // for bulk invalidation
name: 'user-profile', // human-readable label for observability
});
// Retrieve cached data (returns value or undefined)
const data = await cache.get('user:123');
// Delete a specific key
await cache.delete('user:123');
// Expire all entries with a tag (propagates globally within 300ms)
await cache.expireTag('users');
await cache.expireTag(['users', 'user:123']); // multiple tags
```
### Cache Options
```ts
const cache = getCache({
namespace: 'api', // prefix for keys
namespaceSeparator: ':', // separator (default)
keyHashFunction: (key) => sha256(key), // custom key hashing
});
```
### Full Example (Framework-Agnostic)
```ts
import { getCache } from '@vercel/functions';
export default {
async fetch(request: Request) {
const cache = getCache();
const cached = await cache.get('blog-posts');
if (cached) {
return Response.json(cached);
}
const posts = await fetch('https://api.example.com/posts').then(r => r.json());
await cache.set('blog-posts', posts, {
ttl: 3600,
tags: ['blog'],
});
return Response.json(posts);
},
};
```
### Tag Expiration from Server Action
```ts
'use server';
import { getCache } from '@vercel/functions';
export async function invalidateBlog() {
await getCache().expireTag('blog');
}
```
## CDN Cache Purging Functions
These purge across **all three cache layers** (CDN + Runtime Cache + Data Cache):
```ts
import { invalidateByTag, dangerouslyDeleteByTag } from '@vercel/functions';
// Stale-while-revalidate: serves stale, revalidates in background
await invalidateByTag('blog-posts');
// Hard delete: next request blocks while fetching from origin (cache stampede risk)
await dangerouslyDeleteByTag('blog-posts', {
revalidationDeadlineSeconds: 3600,
});
```
**Important distinction**:
- `cache.expireTag()` — operates on Runtime Cache only
- `invalidateByTag()` / `dangerouslyDeleteByTag()` — purges CDN + Runtime + Data caches
## Next.js Integration
### Next.js 16+ (`use cache: remote`)
```ts
// next.config.ts
const nextConfig: NextConfig = { cacheComponents: true };
```
```ts
import { cacheLife, cacheTag } from 'next/cache';
async function getData() {
'use cache: remote' // stores in Vercel Runtime Cache
cacheTag('example-tag')
cacheLife({ expire: 3600 })
return fetch('https://api.example.com/data').then(r => r.json());
}
```
- `'use cache'` (no `: remote`) — in-memory only, ephemeral per instance
- `'use cache: remote'` — stores in Vercel Runtime Cache
### Next.js 16 Invalidation APIs
| Function | Context | Behavior |
|----------|---------|----------|
| `updateTag(tag)` | Server Actions only | Immediate expiration, read-your-own-writes |
| `revalidateTag(tag, 'max')` | Server Actions + Route Handlers | Stale-while-revalidate (recommended) |
| `revalidateTag(tag, { expire: 0 })` | Route Handlers (webhooks) | Immediate expiration from external triggers |
**Important**: Single-argument `revalidateTag(tag)` is deprecated in Next.js 16. Always pass a `cacheLife` profile as the second argument.
### Runtime Cache vs ISR Isolation
- Runtime Cache tags do **NOT** apply to ISR pages
- `cache.expireTag` does **NOT** invalidate ISR cache
- Next.js `revalidatePath` / `revalidateTag` does **NOT** invalidate Runtime Cache
- To manage both, use same tag and purge via `invalidateByTag` (hits all cache layers)
## CLI Cache Commands
```bash
# Purge all cached data
vercel cache purge # CDN + Data cache
vercel cache purge --type cdn # CDN only
vercel cache purge --type data # Data cache only
vercel cache purge --yes # skip confirmation
# Invalidate by tag (stale-while-revalidate)
vercel cache invalidate --tag blog-posts,user-profiles
# Hard delete by tag (blocks until revalidated)
vercel cache dangerously-delete --tag blog-posts
vercel cache dangerously-delete --tag blog-posts --revalidation-deadline-seconds 3600
# Image invalidation
vercel cache invalidate --srcimg /images/hero.jpg
```
Note: `--tag` and `--srcimg` cannot be used together.
## CDN Cache Tags
Add tags to CDN cached responses for later invalidation:
```ts
import { addCacheTag } from '@vercel/functions';
// Via helper
addCacheTag('product-123');
// Via response header
return Response.json(product, {
headers: {
'Vercel-CDN-Cache-Control': 'public, max-age=86400',
'Vercel-Cache-Tag': 'product-123,products',
},
});
```
## Limits
| Property | Limit |
|----------|-------|
| Item size | 2 MB |
| Tags per Runtime Cache item | 64 |
| Tags per CDN item | 128 |
| Max tag length | 256 bytes |
| Tags per bulk REST API call | 16 |
Tags are **case-sensitive** and **cannot contain commas**.
## Observability
Monitor hit rates, invalidation patterns, and storage usage in the Vercel Dashboard under **Observability → Runtime Cache**. The CDN dashboard (March 5, 2026) provides a unified view of global traffic distribution, cache performance metrics, a redesigned purging interface, and **project-level routing** — update response headers or rewrite to external APIs without triggering a new deployment. Project-level routes are available on all plans and take effect instantly.
## When to Use
- Caching API responses or computed data across functions in a region
- Tag-based invalidation when content changes (CMS webhook → expire tag)
- Reducing database load for frequently accessed data
- Cross-function data sharing within a region
## When NOT to Use
- Framework-level page caching → use Next.js Cache Components (`'use cache'`)
- Persistent storage → use a database (Neon, Upstash)
- CDN-level full response caching → use `Cache-Control` / `Vercel-CDN-Cache-Control` headers
- Cross-region shared state → use a database
- User-specific data that differs per request
## References
- 📖 docs: https://vercel.com/docs/runtime-cache
- 📖 changelog: https://vercel.com/changelog/introducing-the-runtime-cache-api
- 📖 CLI cache: https://vercel.com/docs/cli/cache
- 📖 CDN cache purging: https://vercel.com/docs/cdn-cache/purge
© Vercel Labs · Apache-2.0 · openai/plugins