# Workers AI Patterns

## RAG (Retrieval-Augmented Generation)

```typescript
// 1. Embed query
const embedding = await env.AI.run("@cf/baai/bge-base-en-v1.5", { text: query });

// 2. Search vectors
const results = await env.VECTORIZE.query(embedding.data[0], {
  topK: 5,
  returnMetadata: true,
});

// 3. Build context
const context = results.matches.map(m => m.metadata?.text).join("\n\n");

// 4. Generate with context
const response = await env.AI.run("@cf/meta/llama-3.1-8b-instruct", {
  messages: [
    { role: "system", content: `Answer based on:\n\n${context}` },
    { role: "user", content: query },
  ],
});
```

## Streaming (SSE)

```typescript
const stream = await env.AI.run("@cf/meta/llama-3.1-8b-instruct", {
  messages,
  stream: true,
});

const { readable, writable } = new TransformStream();
const writer = writable.getWriter();

(async () => {
  for await (const chunk of stream) {
    await writer.write(new TextEncoder().encode(`data: ${JSON.stringify(chunk)}\n\n`));
  }
  await writer.write(new TextEncoder().encode("data: [DONE]\n\n"));
  await writer.close();
})();

return new Response(readable, {
  headers: { "Content-Type": "text/event-stream" },
});
```

## Error Handling & Retry

```typescript
async function runWithRetry(env, model, input, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      return await env.AI.run(model, input);
    } catch (error) {
      if (error.message?.includes("7505") && attempt < maxRetries - 1) {
        await new Promise(r => setTimeout(r, Math.pow(2, attempt) * 1000));
        continue;
      }
      throw error;
    }
  }
}
```

## Model Fallback

```typescript
try {
  return await env.AI.run("@cf/meta/llama-3.1-70b-instruct", { messages });
} catch {
  return await env.AI.run("@cf/meta/llama-3.1-8b-instruct", { messages });
}
```

## Prompt Patterns

```typescript
// System prompts
const PROMPTS = {
  json: "Respond with valid JSON only.",
  concise: "Keep responses brief.",
  cot: "Think step by step before answering.",
};

// Few-shot
messages: [
  { role: "system", content: "Extract as JSON" },
  { role: "user", content: "John bought 3 apples for $5" },
  { role: "assistant", content: '{"name":"John","item":"apples","qty":3}' },
  { role: "user", content: actualInput },
];
```

## Parallel Execution

```typescript
const [sentiment, summary, embedding] = await Promise.all([
  env.AI.run("@cf/mistral/mistral-7b-instruct-v0.1", { messages: sentimentPrompt }),
  env.AI.run("@cf/meta/llama-3.1-8b-instruct", { messages: summaryPrompt }),
  env.AI.run("@cf/baai/bge-base-en-v1.5", { text }),
]);
```

## Cost Optimization

| Task     | Model                                  | Neurons |
| -------- | -------------------------------------- | ------- |
| Classify | `@cf/mistral/mistral-7b-instruct-v0.1` | ~50     |
| Chat     | `@cf/meta/llama-3.1-8b-instruct`       | ~200    |
| Complex  | `@cf/meta/llama-3.1-70b-instruct`      | ~2000   |
| Embed    | `@cf/baai/bge-base-en-v1.5`            | ~10     |

```typescript
// Batch embeddings
const response = await env.AI.run("@cf/baai/bge-base-en-v1.5", {
  text: textsArray, // Process multiple at once
});
```
