Skip to content
J·BJon BishopIndependent growth marketer

Artificial intelligence · llms.txt file breakdown

Vercel AI SDK llms.txt

A very large file that contains extensive AI SDK documentation content, not just a short list of links.

The actual file

Source Markdown

The saved llms.txt text, displayed as source. The file belongs to its publisher; the live endpoint may change.

Open saved text ↗

Showing the first 18000 characters. Load the complete file to read the remainder.

# AI SDK documentation

> The TypeScript toolkit for building AI applications and agents.

## When to use AI SDK

- Category: Developer tools
- Audience: JavaScript and TypeScript developers
Common use cases:

- Generate text and structured data
- Build agents and chat interfaces
- Integrate language model providers

## Documentation

---
title: Building Agents
description: Complete guide to creating agents with the ToolLoopAgent.
url: "https://ai-sdk.dev/docs/agents/building-agents"
docs_index: /llms.txt
---

> For an index of all documentation, see [/llms.txt](/llms.txt).

The ToolLoopAgent provides a structured way to encapsulate LLM configuration, tools, and behavior into reusable components. It handles the agent loop for you, allowing the LLM to call tools multiple times in sequence to accomplish complex tasks. Define agents once and use them across your application.

## Why Use the ToolLoopAgent Class?

When building AI applications, you often need to:

- **Reuse configurations** - Same model settings, tools, and prompts across different parts of your application
- **Maintain consistency** - Ensure the same behavior and capabilities throughout your codebase
- **Simplify API routes** - Reduce boilerplate in your endpoints
- **Type safety** - Get full TypeScript support for your agent's tools and outputs

The ToolLoopAgent class provides a single place to define your agent's behavior.

## Creating an Agent

Define an agent by instantiating the ToolLoopAgent class with your desired configuration:

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

const myAgent = new ToolLoopAgent({
  model: "anthropic/claude-sonnet-5.5",
  instructions: 'You are a helpful assistant.',
  tools: {
    // Your tools here
  },
});
```

## Configuration Options

The ToolLoopAgent accepts all the same settings as `generateText` and `streamText`. Configure:

### Model and System Instructions

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

const agent = new ToolLoopAgent({
  model: "anthropic/claude-sonnet-5.5",
  instructions: 'You are an expert software engineer.',
});
```

### Tools

Provide tools that the agent can use to accomplish tasks:

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

const codeAgent = new ToolLoopAgent({
  model: "anthropic/claude-sonnet-5.5",
  tools: {
    runCode: tool({
      description: 'Execute Python code',
      inputSchema: z.object({
        code: z.string(),
      }),
      execute: async ({ code }) => {
        // Execute code and return result
        return { output: 'Code executed successfully' };
      },
    }),
  },
});
```

### Context and Agent State

Use `runtimeContext` as the agent's shared runtime state. It flows through the
agent loop and is available in `prepareStep`, lifecycle callbacks, and final
results. If a tool needs server-side values such as credentials, scoped
permissions, or default settings, pass them through `toolsContext` and declare
them with the tool's `contextSchema`.

Set `runtimeContext` and `toolsContext` in the `ToolLoopAgent` constructor.

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

const agent = new ToolLoopAgent({
  model: "anthropic/claude-sonnet-5.5",
  tools: {
    searchTickets: tool({
      description: 'Search support tickets',
      inputSchema: z.object({
        query: z.string(),
      }),
      contextSchema: z.object({
        apiKey: z.string(),
        accountId: z.string(),
      }),
      execute: async ({ query }, { context }) =>
        searchTickets(query, context.accountId, context.apiKey),
    }),
  },
  runtimeContext: {
    requestId: 'req_abc',
    escalated: false,
  },
  toolsContext: {
    searchTickets: {
      apiKey: process.env.SUPPORT_API_KEY!,
      accountId: 'acct_123',
    },
  },
  prepareStep: async ({ runtimeContext }) => {
    if (runtimeContext.escalated) {
      return { temperature: 0.1 };
    }

    return {};
  },
});

const result = await agent.generate({
  prompt: 'Find open billing tickets for this account.',
});
```

For context that changes with each invocation, use `callOptionsSchema` and
`prepareCall`. See [Configuring Call Options](/docs/agents/configuring-call-options).

Model call settings returned from `prepareStep`, such as `temperature`, apply
only to the current step. Later steps use the agent's top-level setting unless
they return another override.

For the full model, including sensitive context filtering and where each context
value is available, see [Runtime and Tool
Context](/docs/ai-sdk-core/runtime-and-tool-context).

### Tools That Use Experimental Sandboxes

Pass `experimental_sandbox` when an agent tool needs a command or code execution
environment. The experimental sandbox is a per-call value, so provide it to
`generate()`, `stream()`, or the agent UI stream helper that invokes the agent.

```ts {13,19-23,31}
const agent = new ToolLoopAgent({
  model: "anthropic/claude-sonnet-5.5",
  instructions: 'You are a coding assistant. Use the shell tool when needed.',
  tools: {
    shell: tool({
      description: 'Execute shell commands in the experimental sandbox.',
      inputSchema: z.object({
        command: z.string(),
        workingDirectory: z.string().optional(),
      }),
      execute: async (
        { command, workingDirectory },
        { abortSignal, experimental_sandbox },
      ) => {
        if (!experimental_sandbox) {
          throw new Error('Experimental sandbox is not available');
        }

        return experimental_sandbox.run({
          command,
          workingDirectory,
          abortSignal,
        });
      },
    }),
  },
});

const result = await agent.generate({
  prompt: `Run the tests.\n\nSandbox:\n${experimental_sandbox.description}`,
  experimental_sandbox,
});
```

The experimental sandbox description is not added to the model prompt automatically. Include
it in the prompt or instructions when the model needs to know environment
details. Passing an experimental sandbox does not sandbox the tool itself; the tool must
explicitly delegate operations to the experimental sandbox. See the
[Experimental Sandbox section in Tool Calling](/docs/ai-sdk-core/tools-and-tool-calling#experimental-sandbox)
for more details.

You can also require approval before a tool executes. Configure approval on the
`ToolLoopAgent` with `toolApproval`:

```ts
const agent = new ToolLoopAgent({
  model: "anthropic/claude-sonnet-5.5",
  tools: {
    runCode: tool({
      description: 'Execute Python code',
      inputSchema: z.object({
        code: z.string(),
      }),
      execute: async ({ code }) => ({ output: code }),
    }),
  },
  toolApproval: {
    runCode: 'user-approval',
  },
});
```

For manual approvals, automatic approvals and denials, dynamic policy functions,
and `useChat` integration, see [Tool
Approvals](/docs/agents/tool-approvals).

### Loop Control

By default, agents run for 20 steps (`stopWhen: isStepCount(20)`). In each step, the model either generates text or calls a tool. If it generates text, the agent completes. If it calls a tool, the AI SDK executes that tool.

You can configure `stopWhen` differently to allow more steps. After each tool execution, the agent triggers a new generation where the model can call another tool or generate text:

```ts
import { ToolLoopAgent, isStepCount } from 'ai';

const agent = new ToolLoopAgent({
  model: "anthropic/claude-sonnet-5.5",
  stopWhen: isStepCount(50), // Increase default from 20 to 50.
});
```

Each step represents one generation (which results in either text or a tool call). The loop continues until:

- A finish reasoning other than tool-calls is returned, or
- A tool that is invoked does not have an execute function, or
- A tool call needs approval, or
- A stop condition is met

You can combine multiple conditions:

```ts
import { ToolLoopAgent, isStepCount } from 'ai';

const agent = new ToolLoopAgent({
  model: "anthropic/claude-sonnet-5.5",
  stopWhen: [
    isStepCount(20), // Maximum 20 steps
    yourCustomCondition(), // Custom logic for when to stop
  ],
});
```

Learn more about [loop control and stop conditions](/docs/agents/loop-control).

### Tool Choice

Control how the agent uses tools:

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

const agent = new ToolLoopAgent({
  model: "anthropic/claude-sonnet-5.5",
  tools: {
    // your tools here
  },
  toolChoice: 'required', // Force tool use
  // or toolChoice: 'none' to disable tools
  // or toolChoice: 'auto' (default) to let the model decide
});
```

You can also force the use of a specific tool:

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

const agent = new ToolLoopAgent({
  model: "anthropic/claude-sonnet-5.5",
  tools: {
    weather: weatherTool,
    cityAttractions: attractionsTool,
  },
  toolChoice: {
    type: 'tool',
    toolName: 'weather', // Force the weather tool to be used
  },
});
```

### Structured Output

Define structured output schemas:

```ts
import { ToolLoopAgent, Output } from 'ai';
import { z } from 'zod';

const analysisAgent = new ToolLoopAgent({
  model: "anthropic/claude-sonnet-5.5",
  output: Output.object({
    schema: z.object({
      sentiment: z.enum(['positive', 'neutral', 'negative']),
      summary: z.string(),
      keyPoints: z.array(z.string()),
    }),
  }),
});

const { output } = await analysisAgent.generate({
  prompt: 'Analyze customer feedback from the last quarter',
});
```

## Define Agent Behavior with System Instructions

System instructions define your agent's behavior, personality, and constraints. They set the context for all interactions and guide how the agent responds to user queries and uses tools.

### Basic System Instructions

Set the agent's role and expertise:

```ts
const agent = new ToolLoopAgent({
  model: "anthropic/claude-sonnet-5.5",
  instructions:
    'You are an expert data analyst. You provide clear insights from complex data.',
});
```

### Detailed Behavioral Instructions

Provide specific guidelines for agent behavior:

```ts
const codeReviewAgent = new ToolLoopAgent({
  model: "anthropic/claude-sonnet-5.5",
  instructions: `You are a senior software engineer conducting code reviews.

  Your approach:
  - Focus on security vulnerabilities first
  - Identify performance bottlenecks
  - Suggest improvements for readability and maintainability
  - Be constructive and educational in your feedback
  - Always explain why something is an issue and how to fix it`,
});
```

### Constrain Agent Behavior

Set boundaries and ensure consistent behavior:

```ts
const customerSupportAgent = new ToolLoopAgent({
  model: "anthropic/claude-sonnet-5.5",
  instructions: `You are a customer support specialist for an e-commerce platform.

  Rules:
  - Never make promises about refunds without checking the policy
  - Always be empathetic and professional
  - If you don't know something, say so and offer to escalate
  - Keep responses concise and actionable
  - Never share internal company information`,
  tools: {
    checkOrderStatus,
    lookupPolicy,
    createTicket,
  },
});
```

### Tool Usage Instructions

Guide how the agent should use available tools:

```ts
const researchAgent = new ToolLoopAgent({
  model: "anthropic/claude-sonnet-5.5",
  instructions: `You are a research assistant with access to search and document tools.

  When researching:
  1. Always start with a broad search to understand the topic
  2. Use document analysis for detailed information
  3. Cross-reference multiple sources before drawing conclusions
  4. Cite your sources when presenting information
  5. If information conflicts, present both viewpoints`,
  tools: {
    webSearch,
    analyzeDocument,
    extractQuotes,
  },
});
```

### Format and Style Instructions

Control the output format and communication style:

```ts
const technicalWriterAgent = new ToolLoopAgent({
  model: "anthropic/claude-sonnet-5.5",
  instructions: `You are a technical documentation writer.

  Writing style:
  - Use clear, simple language
  - Avoid jargon unless necessary
  - Structure information with headers and bullet points
  - Include code examples where relevant
  - Write in second person ("you" instead of "the user")

  Always format responses in Markdown.`,
});
```

## Using an Agent

Once defined, you can use your agent in three ways:

### Generate Text

Use `generate()` for one-time text generation:

```ts
const result = await myAgent.generate({
  prompt: 'What is the weather like?',
});

console.log(result.text);
```

### Stream Text

Use `stream()` for streaming responses:

```ts
const result = await myAgent.stream({
  prompt: 'Tell me a story',
});

for await (const chunk of result.textStream) {
  console.log(chunk);
}
```

### Respond to UI Messages

Use `createAgentUIStreamResponse()` to create API responses for client applications:

```ts
// In your API route (e.g., app/api/chat/route.ts)
import { createAgentUIStreamResponse } from 'ai';

export async function POST(request: Request) {
  const { messages } = await request.json();

  return createAgentUIStreamResponse({
    agent: myAgent,
    uiMessages: messages,
  });
}
```

### Lifecycle Callbacks

Agents provide lifecycle callbacks that let you hook into different phases of the agent execution.
These are useful for logging, observability, debugging, and custom telemetry.

```ts
const result = await myAgent.generate({
  prompt: 'Research and summarize the latest AI trends',

  onStart({ modelId }) {
    console.log('Agent started', { modelId });
  },

  onStepStart({ stepNumber, modelId }) {
    console.log(`Step ${stepNumber} starting`, { modelId });
  },

  onToolExecutionStart({ toolCall }) {
    console.log(`Tool call starting: ${toolCall.toolName}`);
  },

  onToolExecutionEnd({ toolCall, toolExecutionMs, toolOutput }) {
    console.log(
      `Tool call finished: ${toolCall.toolName} (${toolExecutionMs}ms)`,
      {
        success: toolOutput.type === 'tool-result',
      },
    );
  },

  onStepEnd({ stepNumber, usage, performance, finishReason, toolCalls }) {
    console.log(`Step ${stepNumber} completed:`, {
      inputTokens: usage.inputTokens,
      outputTokens: usage.outputTokens,
      outputTokensPerSecond: performance.effectiveOutputTokensPerSecond,
      stepTimeMs: performance.stepTimeMs,
      finishReason,
      toolsUsed: toolCalls?.map(tc => tc.toolName),
    });
  },

  onEnd({ usage, steps }) {
    console.log('Agent finished:', {
      totalSteps: steps.length,
      totalTokens: usage.totalTokens,
    });
  },
});
```

The available lifecycle callbacks are:

- **`onStart`**: Called once when the agent operation begins, before any LLM calls. Receives model info, messages, settings, and `runtimeContext`.
- **`onStepStart`**: Called before each step (LLM call). Receives the step number, model, messages being sent, tools, and prior steps.
- **`onToolExecutionStart`**: Called right before a tool's `execute` function runs. Receives the tool call object, messages, and `toolContext`.
- **`onToolExecutionEnd`**: Called right after a tool's `execute` function completes or errors. Receives the tool call, `toolExecutionMs`, and a `toolOutput` discriminated union (`type: 'tool-result'` with `output`, or `type: 'tool-error'` with `error`).
- **`onStepEnd`**: Called after each step finishes. Receives step results including usage, performance, finish reason, and tool calls.
- **`onEnd`**: Called when all steps are finished and the response is complete. Receives all step results, total usage, and `runtimeContext`.

For the full event data reference, see [Lifecycle Callbacks](/docs/ai-sdk-core/lifecycle-callbacks). `ToolLoopAgent` uses the same generation lifecycle event types for `onStart`, `onStepStart`, `onToolExecutionStart`, `onToolExecutionEnd`, `onStepEnd`, and `onEnd`.

#### Constructor vs. Method Callbacks

All lifecycle callbacks can be defined in the constructor for agent-wide tracking, in the `generate()`/`stream()` call for per-call tracking, or both. When both are provided, both are called (constructor first, then the method callback):

```ts
const agent = new ToolLoopAgent({
  model: "anthropic/claude-sonnet-5.5",
  onStepEnd: async ({ stepNumber, usage }) => {
    // Agent-wide logging
    console.log(`Agent step ${stepNumber}:`, usage.totalTokens);
  },
});

// Method-level callback runs after constructor callback
const result = await agent.generate({
  prompt: 'Hello',
  onStepEnd: async ({ stepNumber, usage }) => {
    // Per-call tracking (e.g., for billing)
    await trackUsage(stepNumber, usage);
  },
});
```

## End-to-end Type Safety

You can infer types for your agent's `UIMessage`s:

```ts
import { ToolLoopAgent, InferAgentUIMessage } from 'ai';

const myAgent = new ToolLoopAgent({
  // ... configuration
});

// Infer the UIMessage type for UI components or persistence
export type MyAgentUIMessage = InferAgentUIMessage<typeof myAgent>;
```

Use this type in your client components with `useChat`:

```tsx title="components/chat.tsx"
'use client';

import { useChat } from '@ai-sdk/react';
import type { MyAgentUIMessage } from '@/agent/my-agent';

export function Chat() {
  const { messages } = useChat<MyAgentUIMessage>();
  // Full type safety for your messages and tools
}
```

## Next Steps

Now that you understand building agents, you can:

- Explore [workflow patterns](/docs/agents/workflows) for structured patterns using core functions
- Learn about [loop control](/docs/agents/loop-control) for advanced execution control
- See [manual loop examples](/cookbook/node/manual-agent-loop) for custom workflow implementations

---

For a semantic overview of all documentation, see [/sitemap.md](/sitemap.md)

For an index of all available documentation, see [/llms.txt](/llms.txt)

For agent-facing discovery, including API and MCP surfaces, see [/agents.md](/agents.md)

---
title: Configuring Call Options
description: Pass type-safe runtime inputs to dynamically configure agent behavior.
url: "https://ai-sdk.dev/docs/agents/configuring-call-opt

Measured from the saved file

Links and embedded code

UTF-8 text size
4.7 MB4891507 bytes
Token count
1147747o200k_base encoding
Markdown links
58751757 distinct URLs
Fenced code blocks
4272134042 lines in the file

Size measures the captured UTF-8 text, not compressed transfer size. Tokens are counted with a named tokenizer; other models can count differently. Neither measure establishes context compatibility or answer quality.

Project H1
AI SDK documentation

Opening blockquote

The TypeScript toolkit for building AI applications and agents.

Context architecture

How the content is divided

2273 H2 sections organize 5875 parsed Markdown links. 1079 links point to .md or .markdown paths; 1578 link occurrences use another hostname. Linked destinations have not been recursively validated.

H2 sectionLinksUTF-8 bytesTokens
When to use AI SDKLine 5020642
DocumentationLine 151550121
Why Use the ToolLoopAgent Class?Line 28049199
Creating an AgentLine 39030781
Configuration OptionsLine 55376401841
Define Agent Behavior with System InstructionsLine 33102768606
Using an AgentLine 431143011034
End-to-end Type SafetyLine 5630656157
Next StepsLine 59271015223
Why Use Call Options?Line 6190579107
How It WorksLine 630029668
Basic ExampleLine 6380995244
Modifying Agent SettingsLine 67702631648
Advanced PatternsLine 78901957487
Using with createAgentUIStreamResponseLine 8670444108
Next StepsLine 88961182273
Show 64 more sections
H2 sectionLinksUTF-8 bytesTokens
Stop ConditionsLine 920142361022
Prepare StepLine 1048071041669
Access Step InformationLine 12960728170
Forced Tool CallingLine 132201776403
Manual Loop ControlLine 136551886428
Three ApproachesLine 14293628114
Provider-Defined ToolsLine 143921708390
Memory ProvidersLine 1475974271792
Custom ToolLine 167851939420
Agent State and ContextLine 17160607135
ToolLoopAgent ClassLine 173101527351
Why Use the ToolLoopAgent?Line 17810487101
HarnessAgent ClassLine 17912540126
Terminal UILine 18041483121
Structured WorkflowsLine 1822147185
Next StepsLine 1833101716409
What you can enforceLine 186702092433
InstallLine 1891030986
How it worksLine 19030465107
Quick startLine 19120738192
Writing the Rego policyLine 193902619668
Loading the policyLine 201301166304
Bring in external data and integrationsLine 205021196273
Roll out safely with shadow modeLine 206701647390
Send decisions to your observability platformLine 210711131264
Capability scoping at the model boundaryLine 21320886211
Scoping a discovered tool surfaceLine 215201082254
Allow-all when no policy is configuredLine 21790889227
Transitive enforcement: composite toolsLine 220011478348
Example applicationLine 22263892224
API referenceLine 223701256308
RelatedLine 225781028249
How It WorksLine 2283033083
When to Use SubagentsLine 22910598100
Why Use Subagents?Line 230201352261
Basic Subagent Without StreamingLine 233012363543
Streaming Subagent ProgressLine 240411890422
Controlling What the Model SeesLine 245502213504
Rendering Subagents in the UI (with useChat)Line 251902536506
CaveatsLine 260542189477
InstallationLine 2663012139
Running an AgentLine 26710834221
Connecting to a Remote AgentLine 27070555128
SandboxLine 27280826177
Display OptionsLine 275701161278
Tool ApprovalsLine 27880518131
CompatibilityLine 28090501102
ControlsLine 2820020569
Next StepsLine 282971287310
StatusesLine 28620751170
Require Approval for a ToolLine 28840543148
Decide Based on Tool InputLine 290801029244
Use One Policy for All ToolsLine 294101160295
Configure Approval per RequestLine 29800814210
Handle Manual ApprovalsLine 301001405327
Use with `useChat`Line 305502602521
Security ConsiderationsLine 313102839600
Related APIsLine 318791364330
Why Durable Agents?Line 32130710146
When to Use WorkflowAgent vs ToolLoopAgentLine 322411198205
InstallationLine 3239026171
Creating a WorkflowAgentLine 32470884227
Using the Agent in a WorkflowLine 328703335749
Resumable Streaming with WorkflowChatTransportLine 339623097746

2193 additional H2 sections are present in the source Markdown. This table previews the first 80 sections.

Link counts exclude parsed fenced and inline code and resolve relative destinations against the final endpoint. Section sizes cover the text below each H2 until the next H2.

Embedded material

Code, installation and API examples

Fenced blocks
4272 closed
Declared languages
ts (2364), tsx (826), bash (426), typescript (277), unlabeled (208), javascript (56), json (22), sh (22), txt (15), js (13), dotenv (11), jsx (10), diff (8), svelte (6), markdown (2), vue (1), sql (1), makefile (1), text (1), yaml (1), css (1)
Package-install commands
311 detected in fenced or inline code
Authentication examples
287 fenced lines match API-key, Authorization, Bearer, OAuth or access-token patterns
HTTP request examples
4 fenced lines match request-method patterns
Authentication links
53 links have authentication-related labels

Embedded example text and links to further documentation are counted separately. A code block does not establish that a sample runs or that an authentication flow succeeds.

Detected installation lines

Source line 1484 · bash

pnpm add @letta-ai/vercel-ai-sdk-provider

Source line 1537 · bash

pnpm add @mem0/vercel-ai-provider

Source line 1575 · bash

pnpm add @supermemory/tools

Source line 1601 · bash

pnpm add @vectorize-io/hindsight-ai-sdk @vectorize-io/hindsight-client

Source line 1632 · bash

pnpm add @mongodb-developer/vercel-ai-memory

Source line 1894 · sh

pnpm add @ai-sdk/policy-opa

Source line 1896 · sh

pnpm add @open-policy-agent/opa-wasm   # in-process WASM evaluation

Source line 1897 · sh

pnpm add @open-policy-agent/opa        # HTTP client to a running OPA server
Inspect detected API and authentication lines

Source line 118 · ts

        apiKey: z.string(),

Source line 122 · ts

        searchTickets(query, context.accountId, context.apiKey),

Source line 131 · ts

      apiKey: process.env.SUPPORT_API_KEY!,

Source line 1547 · ts

  apiKey: process.env.OPENAI_API_KEY,

Source line 4069 · diff

-   experimental_context: { tenantId: 'tenant_123', apiKey: 'sk-...' },

Source line 117220 · bash

curl -X POST http://localhost:8080

Source line 117364 · bash

curl -X POST http://localhost:8080

Source line 117498 · bash

curl -X POST http://localhost:8080

Source line 117782 · bash

curl -X POST http://localhost:8080

Publisher prioritization

The Optional section

No H2 section named “Optional” was detected in this file.

The community proposal uses Optional by convention for secondary links that can be skipped for a shorter context. This label does not establish that everything outside it is critical, or that the material inside it is deprecated.

Machine-readable routes

MCP references and configuration text

MCP-related text was detected in the captured file. 91 links have MCP-related labels or paths. 1 fenced lines match mcpServers, mcp_servers or an mcp add command.

Configuration-shaped text

  "mcpServers": {

These are text and link observations. No MCP server connection, authentication or tool call was tested.

Index and bundle

llms-full.txt companion

Verified text companion

Text companion verified

https://ai-sdk.dev/llms-full.txt ↗
Discovery
Conventional sibling path checked
HTTP response
200 · text/markdown; charset=utf-8
Text size
Whole-file size not established by the bounded response
Token count
Not measured for the whole file
Retrieval scope
Bounded prefix inspected; the whole body was not downloaded

A verified text response establishes a companion at the checked URL. It does not prove the bundle contains all product documentation, that generation is automated, or that it fits an assistant’s context window.

Change evidence

What can be said about freshness

This capture establishes a baseline. Update frequency cannot be determined from one observation.

Linked release and migration material

56 links have release, changelog, deprecation or migration terms in their labels or paths. These provide places to investigate product changes separately.

File changes can reveal documentation edits or navigation changes. They do not by themselves measure product release velocity, accuracy, agent adoption or AI visibility.

Capture identity and measurement method
Requested endpoint
https://ai-sdk.dev/llms.txt
Final endpoint
https://ai-sdk.dev/llms.txt
HTTP status
200
Content type
text/markdown; charset=utf-8
Text retrieval
Direct HTTP text capture after Firecrawl retrieval failed
Tokenizer
tiktoken 0.14.0 · o200k_base
SHA-256 of saved UTF-8 text
4fc3bb841b4625b4711d3769a29911ddaf28a42132078619f7c9956285da4770

Counts use a deterministic parser, not a spec-compliance grade. Unusual Markdown and indented code can fall outside its recognized patterns. See the llms.txt proposal and tokenizer implementation.

Related tools and resources

Prefer to write? Send Jon a message.