Skip to content
Built with

Resource clients ​

SDK Reference

This page covers the clients for resources the SDK manages. They are KV, object storage, AI, ISR and logging.

On this pageLook up the KV and storage clients · Call Workers AI · Use ISR and structured logging

KV ​

Imported from "void/kv".

kv ​

A typed, JSON-aware client for the inferred KV binding.

ts
import { kv } from 'void/kv';

await kv.put('settings', { theme: 'dark' });
const settings = await kv.get<{ theme: string }>('settings');

Key exports: kv, createKV(namespace), KVClient, KVMap, PutOptions, ListOptions.

kv.map(prefix) creates a typed view. Every key in it is stored under prefix:.

Storage ​

Imported from "void/storage".

storage ​

The default R2 bucket proxy for the inferred STORAGE binding.

ts
import { storage } from 'void/storage';

await storage.put('avatars/alice.png', file);
const object = await storage.get('avatars/alice.png');

Key exports: storage, createStorage(bucket).

AI ​

Imported from "void/ai".

ai ​

A typed AI client for Cloudflare AI models and native provider requests through AI Gateway.

ts
import { ai } from 'void/ai';

const result = await ai.run('@cf/meta/llama-3.3-70b-instruct-fp8-fast', {
  messages: [{ role: 'user', content: 'Summarize this release note.' }],
});

const response = await ai.provider('openai').fetch('/chat/completions', {
  body: {
    model: 'gpt-4o',
    messages: [{ role: 'user', content: 'Summarize this release note.' }],
  },
});

Key exports: ai, VoidAi, provider request types. See AI for provider setup and streaming examples.

AI methods return promises. When a usage limit is hit, they reject with UsageLimit from void/limits. SDK routes and Pages actions turn uncaught limits into a structured HTTP 429. See usage limits for optional instanceof UsageLimit handling.

Provider keys ​

The default secret names for ai.provider(). Use apiKeyEnv to pick another name. Store each key with void secret put, never in code.

Provider prefixEnv var
openaiOPENAI_API_KEY
anthropicANTHROPIC_API_KEY
google-ai-studioGOOGLE_API_KEY
deepseekDEEPSEEK_API_KEY
groqGROQ_API_KEY
mistralMISTRAL_API_KEY
grokGROK_API_KEY
openrouterOPENROUTER_API_KEY
perplexityPERPLEXITY_API_KEY
cohereCOHERE_API_KEY
cerebrasCEREBRAS_API_KEY
huggingfaceHUGGINGFACE_API_KEY
replicateREPLICATE_API_KEY
basetenBASETEN_API_KEY
cartesiaCARTESIA_API_KEY
deepgramDEEPGRAM_API_KEY
elevenlabsELEVENLABS_API_KEY
falFAL_API_KEY
ideogramIDEOGRAM_API_KEY
parallelPARALLEL_API_KEY

ISR ​

Imported from "void/isr".

revalidate(options) ​

Revalidates ISR-cached pages on demand. In local dev it does nothing, because there is no edge ISR cache.

ts
import { revalidate } from 'void/isr';

await revalidate({ paths: ['/', '/blog/hello'] });
await revalidate({ all: true });

Signature:

ts
function revalidate(options: { paths?: string[]; all?: boolean }): Promise<void>;

Logging ​

Imported from "void/log".

logger ​

A structured logger. It writes one JSON line per call, so you can filter deployed logs by message and fields.

ts
import { logger } from 'void/log';

logger.info('checkout completed', { orderId, userId });
logger.error('webhook failed', { provider: 'stripe', attempt: 3 });

Methods: logger.error(message, fields?), logger.warn(message, fields?), logger.info(message, fields?).

Next steps ​

implemented.stream AI