defaultInstructionsMiddleware()
defaultInstructionsMiddleware applies default instructions to language model
calls that do not already contain a system message. This is useful for
configuring reusable model behavior while allowing call-level instructions to
take precedence.
Import
import { defaultInstructionsMiddleware } from "ai"API Signature
function defaultInstructionsMiddleware(options: { instructions: Instructions;}): LanguageModelMiddleware;Parameters
instructions:
string | SystemModelMessage | Array<SystemModelMessage>
Returns
Returns a LanguageModelMiddleware that:
- Prepends the configured instructions to calls without a system message.
- Preserves instruction-level
providerOptions. - Leaves calls containing any system message unchanged, so call-level instructions take precedence.
- Applies to both non-streaming and streaming language model calls.
Usage Example
import { defaultInstructionsMiddleware, generateText, wrapLanguageModel,} from 'ai';
const model = wrapLanguageModel({ model: "xai/grok-4.5", middleware: defaultInstructionsMiddleware({ instructions: 'You are a concise technical assistant.', }),});
const defaultResult = await generateText({ model, prompt: 'Explain HTTP caching.',});
const overriddenResult = await generateText({ model, instructions: 'Explain concepts for a complete beginner.', prompt: 'Explain HTTP caching.',});You can attach provider options to default instructions by using a
SystemModelMessage:
const model = wrapLanguageModel({ model: "xai/grok-4.5", middleware: defaultInstructionsMiddleware({ instructions: { role: 'system', content: 'You are a concise technical assistant.', providerOptions: { anthropic: { cacheControl: { type: 'ephemeral' }, }, }, }, }),});This middleware provides defaults, not enforced instructions. Any system
message in the normalized prompt suppresses the defaults. Only use
allowSystemInMessages with trusted message histories, because an untrusted
system message could override the configured defaults.