Chapter 04 · Cloudflare Deploy
Subchapter 4.269
references/workers-ai/README.mdMarkdown6 KBView on GitHub
Expert guidance for Cloudflare Workers AI - serverless GPU-powered AI inference at the edge.
Workers AI provides:
Architecture: Inference runs on Cloudflare’s GPU network. Models load on first request (cold start 1-3s), subsequent requests are faster.
interface Env {
AI: Ai;
}
export default {
async fetch(request: Request, env: Env) {
const response = await env.AI.run('@cf/meta/llama-3.1-8b-instruct', {
messages: [{ role: 'user', content: 'What is Cloudflare?' }]
});
return Response.json(response);
}
};# Setup - add binding to wrangler.jsonc
wrangler dev --remote # Must use --remote for AI
wrangler deployQuality Priority:
@cf/meta/llama-3.1-70b-instruct (expensive, ~2000 neurons)@cf/meta/llama-3.1-8b-instruct (good quality, ~200 neurons)@cf/mistral/mistral-7b-instruct-v0.1 (~50 neurons)Function Calling:
@cf/meta/llama-3.1-8b-instruct or @cf/meta/llama-3.1-70b-instruct (native tool support)Code Generation:
@cf/deepseek-ai/deepseek-coder-6.7b-instruct (specialized for code)English text:
@cf/baai/bge-large-en-v1.5 (1024 dims, highest quality)@cf/baai/bge-base-en-v1.5 (768 dims, good quality)@cf/baai/bge-small-en-v1.5 (384 dims, lower quality but fast)Multilingual:
@hf/sentence-transformers/paraphrase-multilingual-minilm-l12-v2@cf/stabilityai/stable-diffusion-xl-base-1.0 (~10,000 neurons)@cf/lykon/dreamshaper-8-lcm (optimized for faces)@cf/openai/whisper@cf/meta/m2m100-1.2b (100 languages)@cf/microsoft/resnet-50When: Building Workers/Pages with TypeScript
Why: Zero external dependencies, best performance, native types
await env.AI.run(model, input);When: External services, non-Workers environments, testing
Why: Standard HTTP, works anywhere
curl https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/ai/run/@cf/meta/llama-3.1-8b-instruct \
-H "Authorization: Bearer <API_TOKEN>" \
-d '{"messages":[{"role":"user","content":"Hello"}]}'When: Using Vercel AI SDK features (streaming UI, tool calling abstractions)
Why: Unified interface across providers
import { openai } from '@ai-sdk/openai';
const model = openai('model-name', {
baseURL: 'https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/ai/v1',
headers: { Authorization: 'Bearer <API_TOKEN>' }
});| Limit | Free Tier | Paid Plans |
|---|---|---|
| Neurons/day | 10,000 | Pay per use |
| Rate limit | Varies by model | Higher (contact support) |
| Context window | Model dependent (2K-8K) | Same |
| Streaming | ✅ Supported | ✅ Supported |
| Function calling | ✅ Supported (select models) | ✅ Supported |
Pricing: Free 10K neurons/day, then pay per neuron consumed (varies by model)
// Streaming text generation
const stream = await env.AI.run(model, { messages, stream: true });
for await (const chunk of stream) {
console.log(chunk.response);
}
// Embeddings for RAG
const { data } = await env.AI.run('@cf/baai/bge-base-en-v1.5', {
text: ['Query text', 'Document 1', 'Document 2']
});
// Function calling
const response = await env.AI.run('@cf/meta/llama-3.1-8b-instruct', {
messages: [{ role: 'user', content: 'What is the weather?' }],
tools: [{
type: 'function',
function: { name: 'getWeather', parameters: { ... } }
}]
});# Always use --remote for AI (local doesn't have models)
wrangler dev --remote
# Deploy to production
wrangler deploy
# View model catalog
# https://developers.cloudflare.com/workers-ai/models/Start here: Quick Start above → configuration.md (setup)
Common tasks: