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.