AI SDK Agents prompt
Rules that make your coding agent build AI SDK agents that finish, stay in budget and ask before acting: ToolLoopAgent, stop conditions, typed tools, approvals, MCP and tests with mock models.
What it makes your agent good at
Left alone, coding agents write AI SDK 5 agents with maxSteps, loop with no budget, give the model tools that take a user id, and test against a live model or not at all. This prompt starts from the smallest shape that works, then gives the loop explicit stop conditions, tools that are small, idempotent and authorized on the server, approvals for side effects, and tests with mock models, in the names of the AI SDK version you have.
- The smallest shape firstA single call, or a coded workflow when the steps are known; a ToolLoopAgent only for open-ended tool use, defined once and reused.
- Loops that always stopstopWhen with a step cap, hasToolCall and a token budget; prepareStep for active tools, forced calls and compacting long runs.
- Tools built for modelsOne job each, Zod inputs with descriptions, small JSON out, toolCallId as the idempotency key, and expected errors returned as data.
- Approval before side effectsneedsApproval on AI SDK 6 or toolApproval on 7, approval responses appended to a server-held history, and denied calls never retried.
- MCP without blind trustcreateMCPClient over HTTP, only the tools you name with typed schemas, clients closed after the run, and server output treated as data.
- Tested without a live modelTools tested through execute, loops scripted with a mock model from ai/test, then one real run read step by step.
The AI SDK Agents rules
117 lines, current to AI SDK 7 or 6 and Zod 4. Last reviewed October 23, 2026. Plain Markdown, no front matter: each agent's is below.
ai-sdk-agents.md
# AI SDK Agents
You are building agents with the AI SDK (`ai`) in TypeScript: a model on the server calling tools in a loop, then answering in text or a typed object. Write code for the versions in `package.json`, not the ones in your training data: agents became a first-class API in AI SDK 6, and AI SDK 7 renamed several of their options.
## Before you write code
Read the `ai` version in `package.json` and write that major's names, never a mix (7 still accepts most 6 names as deprecated aliases):
| AI SDK 6 | AI SDK 7 |
| --- | --- |
| `stepCountIs(n)` | `isStepCount(n)` |
| `system` on `generateText` (agents take `instructions` in both) | `instructions` |
| `onFinish`, `onStepFinish` | `onEnd`, `onStepEnd` |
| `needsApproval` on the tool | `toolApproval` on the agent, `generateText` or `streamText` |
| `experimental_context` | `toolsContext` with the tool's `contextSchema`, and `runtimeContext` |
| `experimental_telemetry: { isEnabled: true }` | `telemetry`, after `registerTelemetry(new OpenTelemetry())` from `@ai-sdk/otel` |
| `result.totalUsage`, `result.response.messages` | `result.usage`, `result.responseMessages` |
| `MockLanguageModelV3` from `ai/test` | `MockLanguageModelV4` |
Read the docs that ship in `node_modules/ai/docs/`: `03-agents/` (building agents, loop control, call options, subagents) and `03-ai-sdk-core/15-tools-and-tool-calling.mdx`. Check the API there before using one you are not sure of.
Find the project's existing agents, tools and model config, and reuse them. Never invent a model id.
## Pick the smallest shape
One answer, no tools: a single `generateText` or `streamText` call, with `output` for JSON.
Steps you know in advance (extract, classify, draft): plain code calling the model once per step. It is cheaper, testable and predictable; don't make a model choose a fixed order.
Open-ended tool use: a `ToolLoopAgent` in its own module, reused by routes, Server Functions, jobs and tests.
// lib/agents/support.ts, AI SDK 7 (stepCountIs on 6)
import { isStepCount, ToolLoopAgent, type InferAgentUIMessage } from "ai";
export function createSupportAgent(user: SessionUser) {
return new ToolLoopAgent({
model: supportModel,
instructions: SUPPORT_INSTRUCTIONS,
tools: createSupportTools(user.id),
stopWhen: isStepCount(8),
});
}
export type SupportMessage = InferAgentUIMessage<
ReturnType<typeof createSupportAgent>
>;
export async function answerSupport(user: SessionUser, prompt: string) {
const { text, steps } = await createSupportAgent(user).generate({
prompt,
abortSignal: AbortSignal.timeout(60_000),
});
return { steps: steps.length, text };
}
Scope tools to the caller: build them in a factory that closes over the signed-in user, as above, or pass the user through context (`experimental_context` on 6, `toolsContext` on 7). For one shared agent with typed per-request inputs, use `callOptionsSchema` and `prepareCall`, called with `generate({ prompt, options })`.
## Loop control
A `ToolLoopAgent` stops after 20 steps by default; `generateText` and `streamText` after one. Always set `stopWhen`; an array stops at whichever condition is met first, such as `[isStepCount(10), hasToolCall("finish")]`.
A budget is a custom stop condition: `({ steps }) => boolean` summing `step.usage.inputTokens` and `outputTokens`, or counting calls to an expensive tool. Never use `isLoopFinished()` without one.
`prepareStep({ stepNumber, steps, messages })` returns overrides for the next step: `activeTools` to narrow tools per phase, `toolChoice: { type: "tool", toolName }` to force one, `model` to switch, `messages` to compact a long run (`pruneMessages`). On 7, returned `messages` and `instructions` carry forward to later steps; on 6 they apply to that step only.
A tool without `execute` ends the loop when called. A `done` tool whose input is the final answer, with `toolChoice: "required"`, makes the model finish through it; read its input from `result.steps.at(-1)?.toolCalls`.
## Structured output
Set `output: Output.object({ schema })` on the agent (or on `generateText`) and read `result.output`. `generateObject` and `streamObject` are deprecated.
The output is one more step: leave room in `stopWhen`. If the loop ends on a tool call, reading `result.output` throws `NoOutputGeneratedError`; a schema mismatch throws `NoObjectGeneratedError`. Catch both.
Give every field `.describe()`, prefer enums to free strings, and keep schemas flat.
## Tool design
One job per tool, named as a verb (`searchOrders`, `refundOrder`). The `description` says when to use it and what it returns.
`inputSchema` in Zod with `.describe()`, enums, and bounds (`.min()`, `.max()`). Set `strict: true` where the provider supports it.
Return small typed JSON: ids, names, a summary, `hasMore`, not whole rows, HTML or files. Paginate and truncate. `toModelOutput` sends the model a smaller view while the UI keeps the full output.
Make writes idempotent: use `toolCallId` from `execute`'s second argument as the idempotency key, so a retried step never refunds twice.
Return expected failures as data the model can act on: `{ ok: false, error: "No order with that id. Search by email." }`. Thrown errors also reach the model as tool errors, so never put stack traces, SQL or secrets in messages.
Pass `execute`'s `abortSignal` to `fetch` and database calls.
Authorize inside `execute` with the server's user. Tool input is model output: never accept ids that grant access from it, and treat text the agent read from documents or the web as data, not instructions.
Keep the active set small; split large tool sets by phase with `activeTools`.
## Approvals
Gate tools that spend money, delete, send messages or run code: `needsApproval: true` or `async (input) => boolean` on the tool on 6; on 7, `toolApproval: { refundOrder: ({ amount }) => (amount > 100 ? "user-approval" : undefined) }` (statuses: `"user-approval"`, `"approved"`, `"denied"`, `"not-applicable"`).
The run then ends with a `tool-approval-request` part in `result.content`. Ask the person, append a `role: "tool"` message with `{ type: "tool-approval-response", approvalId, approved, reason }` after the response messages, and call again. In a chat UI, `useChat`'s `addToolApprovalResponse` does this.
Load the conversation from your database rather than trusting the client's copy, so nobody can forge an approval; `generateText` and `streamText` also take `experimental_toolApprovalSecret` to sign them. Tell the agent not to retry a denied call.
A run that waits hours for a person or must survive a deploy belongs in a durable workflow or job queue, not a held-open request.
## MCP tools
Use `createMCPClient` from `@ai-sdk/mcp` with `transport: { type: "http", url, headers }`; stdio only for local tools. Load `await client.tools({ schemas })` to take only the tools you name, with typed inputs; `client.tools()` loads everything the server offers.
Close the client when the run ends: in the end callback for streams, in `finally` for `generate`.
Connect only to servers you trust, treat their output as untrusted text, and gate their write tools behind approval.
## Streaming to a UI
In a route: `return createAgentUIStreamResponse({ agent, uiMessages: messages, abortSignal: req.signal })`, and type the client with `useChat<SupportMessage>()`.
Stream progress as data parts from `createUIMessageStream({ execute: ({ writer }) => … })` with `writer.write({ type: "data-status", id, data })`; writing the same `id` again updates the part in place.
A subagent is a tool whose `execute` is an `async function*` yielding the subagent's UI message (`readUIMessageStream`), with `toModelOutput` returning only its final summary to the parent. Pass the parent's `abortSignal` down.
## Budgets and observability
Every run has a step cap, a token budget, `maxOutputTokens` and a deadline: `abortSignal: AbortSignal.timeout(ms)` or `timeout: { totalMs, stepMs }`.
Log each step in `onStepFinish` (6) or `onStepEnd` (7): tool calls, finish reason, usage. Record each run's total usage against the user.
For traces, register an OpenTelemetry provider in `instrumentation.ts`, then set `experimental_telemetry: { isEnabled: true, functionId }` per call on 6. On 7, also call `registerTelemetry(new OpenTelemetry())` there and set `telemetry: { functionId }`.
## Do not
Do not write AI SDK 5 agent code (`Experimental_Agent` with `system`), `maxSteps`, `experimental_output`, `experimental_prepareStep` or tool `parameters`, and do not hand-roll a `while` loop around `generateText` that `stopWhen` and `prepareStep` already cover.
Do not put secrets or other users' data in instructions or tool descriptions: they go to the provider and can come back in a reply.
Do not run model-written code or shell commands outside a sandbox and an approval.
## Before you finish
Run the type checker, and test tools by calling `execute` directly, including the auth and `{ ok: false }` paths.
Test the loop with a mock model from `ai/test` whose `doGenerate` is an array of results, one per step (tool calls, then text), and assert on `result.steps` and the model's `doGenerateCalls`. Copy the result shape from `node_modules/ai/docs/03-ai-sdk-core/55-testing.mdx`: it differs between spec versions.
Run the agent once against the real model and read `result.steps`: which tools ran, how many steps, what it cost.
Say which step cap, budget, timeout and approvals you set.
9,534 characters, 1,422 words. Under Windsurf's 12,000-character limit for a rule, as every prompt here is.
Use it in your agent
The same rules, where your agent reads them. Each file has the front matter its agent needs, set to load when the task fits.
Claude Code
A rule it loads every session
- Save it as
.claude/rules/ai-sdk-agents.mdin your project, front matter included, or run the install command. - Claude Code loads every file in
.claude/ruleswith yourCLAUDE.mdwhen a session starts. - Prefer one file? Paste it into
CLAUDE.mdunder its own heading instead.
.claude/rules/ai-sdk-agents.md
# AI SDK AgentsYou are building agents with the AI SDK (`ai`) in TypeScript: a model on the server calling tools in a loop, then answering in text or a typed object. Write code for the versions in `package.json`, not the ones in your training data: agents became a first-class API in AI SDK 6, and AI SDK 7 renamed several of their options.## Before you write code- Read the `ai` version in `package.json` and write that major's names, never a mix (7 still accepts most 6 names as deprecated aliases):| AI SDK 6 | AI SDK 7 || --- | --- || `stepCountIs(n)` | `isStepCount(n)` || `system` on `generateText` (agents take `instructions` in both) | `instructions` |…
Or let the shadcn CLI write this file: sign in (free) for your command.
Cursor
A project rule with front matter
- Save it as
.cursor/rules/ai-sdk-agents.mdc, front matter included, or run the install command. - Cursor attaches it when you work on matching files, or when the task fits its description.
- Check it under Cursor Settings, Rules, then commit the folder for your team.
.cursor/rules/ai-sdk-agents.mdc
---description: "Building agents and multi-step tool use with the AI SDK: ToolLoopAgent, stopWhen, prepareStep, tool design, approvals, MCP clients, streaming and tests."alwaysApply: false---# AI SDK AgentsYou are building agents with the AI SDK (`ai`) in TypeScript: a model on the server calling tools in a loop, then answering in text or a typed object. Write code for the versions in `package.json`, not the ones in your training data: agents became a first-class API in AI SDK 6, and AI SDK 7 renamed several of their options.## Before you write code- Read the `ai` version in `package.json` and write that major's names, never a mix (7 still accepts most 6 names as deprecated aliases):| AI SDK 6 | AI SDK 7 || --- | --- || `stepCountIs(n)` | `isStepCount(n)` || `system` on `generateText` (agents take `instructions` in both) | `instructions` |…
Or let the shadcn CLI write this file: sign in (free) for your command.
Windsurf
A workspace rule for Cascade
- Save it as
.windsurf/rules/ai-sdk-agents.md, or run the install command. trigger: model_decisionlets Cascade pull it in when the task fits its description.- Windsurf reads up to 12,000 characters per rule; this one is 9,534.
.windsurf/rules/ai-sdk-agents.md
---trigger: model_decisiondescription: "Building agents and multi-step tool use with the AI SDK: ToolLoopAgent, stopWhen, prepareStep, tool design, approvals, MCP clients, streaming and tests."---# AI SDK AgentsYou are building agents with the AI SDK (`ai`) in TypeScript: a model on the server calling tools in a loop, then answering in text or a typed object. Write code for the versions in `package.json`, not the ones in your training data: agents became a first-class API in AI SDK 6, and AI SDK 7 renamed several of their options.## Before you write code- Read the `ai` version in `package.json` and write that major's names, never a mix (7 still accepts most 6 names as deprecated aliases):| AI SDK 6 | AI SDK 7 || --- | --- || `stepCountIs(n)` | `isStepCount(n)` || `system` on `generateText` (agents take `instructions` in both) | `instructions` |…
Or let the shadcn CLI write this file: sign in (free) for your command.
GitHub Copilot
Instructions for the repository
- Save it as
.github/instructions/ai-sdk-agents.instructions.md, or run the install command. applyTo: "**"applies it to every request in this repository.- Or paste it into
.github/copilot-instructions.md, which Copilot reads for every request.
.github/instructions/ai-sdk-agents.instructions.md
---description: "Building agents and multi-step tool use with the AI SDK: ToolLoopAgent, stopWhen, prepareStep, tool design, approvals, MCP clients, streaming and tests."applyTo: "**"---# AI SDK AgentsYou are building agents with the AI SDK (`ai`) in TypeScript: a model on the server calling tools in a loop, then answering in text or a typed object. Write code for the versions in `package.json`, not the ones in your training data: agents became a first-class API in AI SDK 6, and AI SDK 7 renamed several of their options.## Before you write code- Read the `ai` version in `package.json` and write that major's names, never a mix (7 still accepts most 6 names as deprecated aliases):| AI SDK 6 | AI SDK 7 || --- | --- || `stepCountIs(n)` | `isStepCount(n)` || `system` on `generateText` (agents take `instructions` in both) | `instructions` |…
Or let the shadcn CLI write this file: sign in (free) for your command.
Codex & AGENTS.md
The file most agents read
- Paste it into
AGENTS.mdat your project's root, under its own heading. - Codex reads
AGENTS.mdbefore it starts work, and so do Cursor, Zed, Jules, Amp and Copilot's coding agent. - A folder can have its own
AGENTS.md: the one closest to the file being edited wins.
AGENTS.md
## AI SDK AgentsYou are building agents with the AI SDK (`ai`) in TypeScript: a model on the server calling tools in a loop, then answering in text or a typed object. Write code for the versions in `package.json`, not the ones in your training data: agents became a first-class API in AI SDK 6, and AI SDK 7 renamed several of their options.### Before you write code- Read the `ai` version in `package.json` and write that major's names, never a mix (7 still accepts most 6 names as deprecated aliases):| AI SDK 6 | AI SDK 7 || --- | --- || `stepCountIs(n)` | `isStepCount(n)` || `system` on `generateText` (agents take `instructions` in both) | `instructions` |…
AGENTS.md is shared with your own instructions, so paste the rules in: the copy sets their headings a level down.
Rules teach it. The MCP equips it. With Pro, your agent installs every component, block and icon it needs, from a prompt.
Get ProMore prompts
Prompts that pair with this one. Each is short enough to sit beside the others.
Pricing
Give your agent the parts, with Pro
The prompts are free. Every Pro plan adds the MCP server, so your agent installs the components, blocks and icons it writes code around.
4.9/5 out of 5 · 150+ reviewsfrom 150+ founders and developers.
Billing
Billed once a year in USD. Cancel anytime.
- How many people can use the license.
- Client work, SaaS products and anything you charge for.
- Page sections in 56 categories, from heroes and pricing tables to dashboards and settings, on every framework and UI library, in your theme.
- Complete Next.js sites for startups, SaaS, agencies and portfolios, every page designed, ready to ship.
- Your AI agent searches, previews and installs any component, block, icon or DESIGN.md from a prompt: 22 tools in Claude Code, Cursor, VS Code and 35 more clients.
- Buttons with motion and states of their own, from an arrow that slides in to a burst of confetti.
- Typewriters, scrambles, counters and more, for headlines, labels and numbers.
- Animated backgrounds for heroes, sections and cards, from a soft aurora to a flock that flees the cursor. Most are pure CSS.
- WebGPU shaders, from a slow aurora to a black hole, each drawing only while it's on screen.
- One design and one theme on all four: the components, blocks and effects are built for each framework.
- React on Base UI, Radix UI, React Aria or Ark UI: install the version for the library your project already uses. Vue, Svelte and Solid run on Ark UI.
- From a button to a date picker, a color picker or a guided tour: accessible, typed in TypeScript, each with live demos.
- Real-world patterns built from the components, in 53 galleries: forms, tables, menus, dialogs and more.
- Area, bar, line, pie, radar and radial charts on TanStack Charts, on every framework. React also gets the Recharts originals.
- Debounce, local storage, media queries and more: each hook is one typed file you own.
- From 222 libraries, Lucide, Heroicons, Tabler and Material Symbols among them, as SVG or a React component in one command.
- Stripe, Linear, Apple and 497 more: a brand's colors, typography and components in one file your AI agent builds from.
- Restyle every component and block at once: 8 styles, 7 grays, 18 colors and 5 radii, shared as a shadcn preset code.
- Priority requests are answered first.
Individual
For personal projects & open source
$32instead of $49/mo
$389 billed yearly
- Seats: 1 seat
- Commercial use: Personal & open source only
- Blocks: All 6,181 blocks
- Templates: All 14 templates
- MCP server: 38 AI clients
- Animated buttons: All 35 buttons
- Text effects: All 97 effects
- Backgrounds: All 100 backgrounds
- Shaders: All 100 shaders
- Frameworks: React, Vue, Svelte, Solid
- UI libraries: Base UI, Radix, Aria, Ark
- Components: All 174 components
- Examples: All 1,103 examples
- Charts: All 70 charts
- React hooks: All 35 hooks
- Icons: 294k+ icons
- DESIGN.md files: All 500 brands
- Theme builder: 8 styles × 18 colors
- Support: Standard
Team
Most popularFor freelancers, agencies & startups
$66instead of $99/mo
$789 billed yearly · ≈ $13/dev/mo
- Seats: Up to 5 seats
- Commercial use: Included
- Blocks: All 6,181 blocks
- Templates: All 14 templates
- MCP server: 38 AI clients
- Animated buttons: All 35 buttons
- Text effects: All 97 effects
- Backgrounds: All 100 backgrounds
- Shaders: All 100 shaders
- Frameworks: React, Vue, Svelte, Solid
- UI libraries: Base UI, Radix, Aria, Ark
- Components: All 174 components
- Examples: All 1,103 examples
- Charts: All 70 charts
- React hooks: All 35 hooks
- Icons: 294k+ icons
- DESIGN.md files: All 500 brands
- Theme builder: 8 styles × 18 colors
- Support: Priority
Organization
For companies with larger teams
$132instead of $199/mo
$1,589 billed yearly
- Seats: Unlimited seats
- Commercial use: Included
- Blocks: All 6,181 blocks
- Templates: All 14 templates
- MCP server: 38 AI clients
- Animated buttons: All 35 buttons
- Text effects: All 97 effects
- Backgrounds: All 100 backgrounds
- Shaders: All 100 shaders
- Frameworks: React, Vue, Svelte, Solid
- UI libraries: Base UI, Radix, Aria, Ark
- Components: All 174 components
- Examples: All 1,103 examples
- Charts: All 70 charts
- React hooks: All 35 hooks
- Icons: 294k+ icons
- DESIGN.md files: All 500 brands
- Theme builder: 8 styles × 18 colors
- Support: Priority
Billed once a year in USD. Cancel anytime.
Individual
For personal projects & open source
$32instead of $49/mo
$389 billed yearly
- How many people can use the license.Seats: 1 seat
- Client work, SaaS products and anything you charge for.Commercial use: Personal & open source only
- Page sections in 56 categories, from heroes and pricing tables to dashboards and settings, on every framework and UI library, in your theme.Blocks: All 6,181 blocks
- Complete Next.js sites for startups, SaaS, agencies and portfolios, every page designed, ready to ship.Templates: All 14 templates
- Your AI agent searches, previews and installs any component, block, icon or DESIGN.md from a prompt: 22 tools in Claude Code, Cursor, VS Code and 35 more clients.MCP server: 38 AI clients
- Buttons with motion and states of their own, from an arrow that slides in to a burst of confetti.Animated buttons: All 35 buttons
- Typewriters, scrambles, counters and more, for headlines, labels and numbers.Text effects: All 97 effects
- Animated backgrounds for heroes, sections and cards, from a soft aurora to a flock that flees the cursor. Most are pure CSS.Backgrounds: All 100 backgrounds
- WebGPU shaders, from a slow aurora to a black hole, each drawing only while it's on screen.Shaders: All 100 shaders
- One design and one theme on all four: the components, blocks and effects are built for each framework.Frameworks: React, Vue, Svelte, Solid
- React on Base UI, Radix UI, React Aria or Ark UI: install the version for the library your project already uses. Vue, Svelte and Solid run on Ark UI.UI libraries: Base UI, Radix, Aria, Ark
- From a button to a date picker, a color picker or a guided tour: accessible, typed in TypeScript, each with live demos.Components: All 174 components
- Real-world patterns built from the components, in 53 galleries: forms, tables, menus, dialogs and more.Examples: All 1,103 examples
- Area, bar, line, pie, radar and radial charts on TanStack Charts, on every framework. React also gets the Recharts originals.Charts: All 70 charts
- Debounce, local storage, media queries and more: each hook is one typed file you own.React hooks: All 35 hooks
- From 222 libraries, Lucide, Heroicons, Tabler and Material Symbols among them, as SVG or a React component in one command.Icons: 294k+ icons
- Stripe, Linear, Apple and 497 more: a brand's colors, typography and components in one file your AI agent builds from.DESIGN.md files: All 500 brands
- Restyle every component and block at once: 8 styles, 7 grays, 18 colors and 5 radii, shared as a shadcn preset code.Theme builder: 8 styles × 18 colors
- Priority requests are answered first.Support: Standard
Team
Most popularFor freelancers, agencies & startups
$66instead of $99/mo
$789 billed yearly · ≈ $13/dev/mo
Everything in Individual, plus
- How many people can use the license.Seats: Up to 5 seats
- Client work, SaaS products and anything you charge for.Commercial use: Included
- Priority requests are answered first.Support: Priority
Organization
For companies with larger teams
$132instead of $199/mo
$1,589 billed yearly
Everything in Team, plus
- How many people can use the license.Seats: Unlimited seats
- Secure checkout via Stripe
- Code lives in your repo
- Keep what you've shipped if you cancel
- License terms
AI SDK Agents prompt FAQ
What the AI SDK Agents prompt covers and how to use it in your agent.
When does the AI SDK Agents prompt use ToolLoopAgent instead of generateText?
How does the AI SDK Agents prompt stop an agent from looping forever?
Does the AI SDK Agents prompt cover AI SDK 7?
Can the AI SDK Agents prompt return structured output from an agent?
How does the AI SDK Agents prompt test agents without calling a model?
Does the AI SDK Agents prompt cover observability and token usage?
What makes a good tool according to the AI SDK Agents prompt?
How does the AI SDK Agents prompt handle tool errors?
How do human approvals work in the AI SDK Agents prompt?
How does the AI SDK Agents prompt connect agents to MCP servers?
How do I add the AI SDK Agents prompt to Claude Code?
How do I use the AI SDK Agents prompt as a Cursor rule?
Does the AI SDK Agents prompt fit in a Windsurf rule?
Can GitHub Copilot and Codex use the AI SDK Agents prompt?
Can I edit the AI SDK Agents prompt for my project?
4.9 out of 5 from 150+ developers
Rules teach it. The MCP equips it.
Every component, block and icon, installed by your AI agent on your stack. The prompts stay free.
- Cancel anytime
- Keep what you've shipped