home / skills / bjornmelin / dev-skills / ai-sdk-core

ai-sdk-core skill

/skills/ai-sdk-core

npx playbooks add skill bjornmelin/dev-skills --skill ai-sdk-core

Review the files below or copy the command above to add this skill to your agents.

Files (11)
SKILL.md
5.4 KB
---
name: ai-sdk-core
description: |
  Expert guidance for AI SDK Core: text generation, structured data, tool calling (tool/dynamicTool), MCP integration (createMCPClient, Experimental_StdioMCPTransport), embeddings/reranking, provider setup, middleware, telemetry, and error handling. Use when building with generateText/streamText, generateObject/streamObject, tools (needsApproval, strict, inputExamples, activeTools, toolChoice, experimental_context), embeddings (embed/embedMany/rerank), or MCP tools/resources/prompts/elicitation.
---

# AI SDK Core

Use AI SDK Core to generate text/structured output, call tools, and connect to MCP servers with consistent APIs across providers.

## Quick Start

```bash
pnpm add ai @ai-sdk/openai zod@^4.3.5
```

```ts
import { generateText } from 'ai';

const { text } = await generateText({
  model: 'openai/gpt-4o',
  prompt: 'Explain quantum computing in one paragraph.',
});
```

## Function Selection

| Need | Function | Streaming |
|------|----------|-----------|
| Text response | `generateText` | No |
| Streaming text | `streamText` | Yes |
| Structured JSON | `generateObject` | No |
| Streaming JSON | `streamObject` | Yes |
| Embeddings | `embed` / `embedMany` | No |
| Rerank | `rerank` | No |

## Core Patterns

### Generate Text

```ts
import { generateText } from 'ai';

const { text, usage } = await generateText({
  model: 'anthropic/claude-sonnet-4.5',
  system: 'You are a helpful assistant.',
  prompt: 'What is the capital of France?',
});
```

### Stream Text

```ts
import { streamText } from 'ai';

const result = streamText({
  model: 'openai/gpt-4o',
  prompt: 'Write a short story.',
});

for await (const chunk of result.textStream) {
  process.stdout.write(chunk);
}
```

### Generate Structured Data

```ts
import { generateObject } from 'ai';
import { z } from 'zod';

const { object } = await generateObject({
  model: 'openai/gpt-4o',
  schema: z.object({
    recipe: z.object({
      name: z.string(),
      ingredients: z.array(z.object({ name: z.string(), amount: z.string() })),
      steps: z.array(z.string()),
    }),
  }),
  prompt: 'Generate a recipe for chocolate chip cookies.',
});
```

### Tool Calling (Typed)

```ts
import { generateText, tool } from 'ai';
import { z } from 'zod';

const { text, toolCalls } = await generateText({
  model: 'openai/gpt-4o',
  tools: {
    weather: tool({
      description: 'Get weather for a location',
      inputSchema: z.object({ location: z.string() }),
      execute: async ({ location }) => ({ temperature: 72, condition: 'sunny' }),
    }),
  },
  prompt: 'What is the weather in San Francisco?',
});
```

### Dynamic Tools (Runtime Schemas)

```ts
import { dynamicTool } from 'ai';
import { z } from 'zod';

const customTool = dynamicTool({
  description: 'Execute a custom function',
  inputSchema: z.object({}),
  execute: async input => ({ ok: true, input }),
});
```

### Multi-Step Tool Execution

```ts
import { generateText, stepCountIs } from 'ai';

const { steps } = await generateText({
  model: 'openai/gpt-4o',
  tools: { search, analyze, summarize },
  stopWhen: stepCountIs(5),
  prompt: 'Research and summarize AI developments.',
});
```

## Tooling Checklist

- Use `tool()` for typed inputs and `dynamicTool()` for unknown schemas.
- Use `needsApproval` for sensitive actions (tool-approval-request/response flow).
- Use `stopWhen` with `stepCountIs`/`hasToolCall` for multi-step loops.
- Use `prepareStep` for per-step controls (model swap, toolChoice, activeTools, prompt compression).
- Use `experimental_context` when tools need app-specific context.
- Use `inputExamples` and `strict` to improve tool call reliability.

## MCP Integration (Model Context Protocol)

- Use `createMCPClient()` to load MCP tools, resources, and prompts.
- Prefer HTTP transport for production; use `Experimental_StdioMCPTransport` only for local Node.js servers.
- Close MCP clients after use (try/finally or `onFinish`).

See `references/mcp-integration.md` for transports, schema definition, outputSchema typing, and elicitation.

## Reference Files

| Reference | When to Use |
|-----------|-------------|
| `references/text-generation.md` | generateText/streamText callbacks, streaming, response handling |
| `references/structured-data.md` | generateObject/streamObject, Output API, Zod patterns |
| `references/tool-calling.md` | tool/dynamicTool, approval flow, repair, activeTools, hooks |
| `references/dynamic-tools.md` | dynamicTool patterns, MCP + dynamic tools, large tool sets |
| `references/embeddings-rag.md` | embed/embedMany, rerank, chunking |
| `references/providers.md` | OpenAI/Anthropic/Google setup, registry, AI Gateway |
| `references/middleware.md` | wrapLanguageModel, built-in/custom middleware |
| `references/mcp-integration.md` | MCP client, transports, tools/resources/prompts/elicitation |
| `references/production.md` | Telemetry, error handling, testing, cost control |
| `references/migration.md` | v6 upgrade notes |

## Error Handling

```ts
import { generateText, AI_APICallError } from 'ai';

try {
  await generateText({ model: 'openai/gpt-4o', prompt: 'Hello' });
} catch (error) {
  if (error instanceof AI_APICallError) {
    console.error('API Error:', error.message);
  }
}
```

## Provider Setup

```ts
import { openai } from '@ai-sdk/openai';

const { text } = await generateText({
  model: openai('gpt-4o'),
  prompt: 'Hello!',
});
```

## Version Guidance

- Use AI SDK v6+ with matching provider packages.
- Pin major versions in `package.json` to avoid breaking changes.