Initial commit

This commit is contained in:
Zhongwei Li
2025-11-30 08:23:50 +08:00
commit 5135e7aaf4
24 changed files with 4973 additions and 0 deletions

View File

@@ -0,0 +1,119 @@
// Cloudflare Workers with workers-ai-provider
// AI SDK Core - Cloudflare Workers AI integration
import { Hono } from 'hono';
import { generateText, streamText } from 'ai';
import { createWorkersAI } from 'workers-ai-provider';
// Environment interface for Workers AI binding
interface Env {
AI: Ai;
}
const app = new Hono<{ Bindings: Env }>();
// Example 1: Basic text generation
app.post('/chat', async (c) => {
// IMPORTANT: Create provider inside handler to avoid startup overhead
const workersai = createWorkersAI({ binding: c.env.AI });
const { message } = await c.req.json();
const result = await generateText({
model: workersai('@cf/meta/llama-3.1-8b-instruct'),
prompt: message,
maxOutputTokens: 500,
});
return c.json({ response: result.text });
});
// Example 2: Streaming response
app.post('/chat/stream', async (c) => {
const workersai = createWorkersAI({ binding: c.env.AI });
const { message } = await c.req.json();
const stream = streamText({
model: workersai('@cf/meta/llama-3.1-8b-instruct'),
prompt: message,
});
// Return stream to client
return stream.toDataStreamResponse();
});
// Example 3: Structured output
app.post('/extract', async (c) => {
const workersai = createWorkersAI({ binding: c.env.AI });
const { generateObject } = await import('ai');
const { z } = await import('zod');
const { text } = await c.req.json();
const result = await generateObject({
model: workersai('@cf/meta/llama-3.1-8b-instruct'),
schema: z.object({
summary: z.string(),
keyPoints: z.array(z.string()),
}),
prompt: `Extract key information from: ${text}`,
});
return c.json(result.object);
});
// Example 4: Health check
app.get('/health', (c) => {
return c.json({ status: 'ok', ai: 'ready' });
});
export default app;
/*
* wrangler.jsonc configuration:
*
* {
* "name": "ai-sdk-worker",
* "compatibility_date": "2025-10-21",
* "main": "src/index.ts",
* "ai": {
* "binding": "AI"
* }
* }
*/
/*
* IMPORTANT NOTES:
*
* 1. Startup Optimization:
* - Move `createWorkersAI` inside handlers (not top-level)
* - Avoid importing complex Zod schemas at top level
* - Monitor startup time (must be <400ms)
*
* 2. Available Models:
* - @cf/meta/llama-3.1-8b-instruct (recommended)
* - @cf/meta/llama-3.1-70b-instruct
* - @cf/mistral/mistral-7b-instruct-v0.1
* - See: https://developers.cloudflare.com/workers-ai/models/
*
* 3. When to use workers-ai-provider:
* - Multi-provider scenarios (OpenAI + Workers AI)
* - Using AI SDK UI hooks
* - Need consistent API across providers
*
* 4. When to use native binding:
* - Cloudflare-only deployment
* - Maximum performance
* - See: cloudflare-workers-ai skill
*
* 5. Testing:
* npx wrangler dev
* curl -X POST http://localhost:8787/chat \
* -H "Content-Type: application/json" \
* -d '{"message": "Hello!"}'
*
* 6. Deployment:
* npx wrangler deploy
*/