Skip to main content

Overview

Message fragments represent conversation messages (user or assistant) with support for hidden system reminders. They integrate with the Vercel AI SDK’s UIMessage format.

Message Types

user()

User messages with optional system reminders

assistant()

Assistant response messages

assistantText()

Convenience builder for text-only assistant messages

reminder()

Hidden instructions attached to user messages

user()

Create a user message fragment with optional system reminders.
function user(
  content: string | UIMessage,
  ...reminders: UserReminder[]
): MessageFragment

Basic Usage

import { user } from '@deepagents/context';

// Simple user message
const msg1 = user('What is our total revenue for Q4?');

// With reminder
const msg2 = user(
  'Deploy this feature to production',
  reminder('Ask for confirmation before destructive actions')
);

Using UIMessage

import { user } from '@deepagents/context';
import type { UIMessage } from 'ai';

const message: UIMessage = {
  id: 'msg-1',
  role: 'user',
  parts: [
    { type: 'text', text: 'Analyze this data' },
    { type: 'file', name: 'data.csv', data: '...' },
  ],
};

const msg = user(message);

assistant()

Create an assistant message fragment.
function assistant(message: UIMessage): MessageFragment

Usage

import { assistant } from '@deepagents/context';
import type { UIMessage } from 'ai';

const message: UIMessage = {
  id: 'resp-1',
  role: 'assistant',
  parts: [
    { type: 'text', text: 'The total revenue for Q4 is $1.2M' },
  ],
};

const msg = assistant(message);

assistantText()

Convenience builder for text-only assistant messages.
function assistantText(
  content: string,
  options?: { id?: string }
): MessageFragment

Usage

import { assistantText } from '@deepagents/context';

// Auto-generated ID
const msg1 = assistantText('Query executed successfully');

// Custom ID
const msg2 = assistantText('Analysis complete', { id: 'resp-42' });

reminder()

Build reminder payloads for user messages.
function reminder(
  text: string | ((content: string) => string),
  options?: { asPart?: boolean }
): UserReminder

Reminder Modes

Reminders are injected as tagged text within the message:
import { user, reminder } from '@deepagents/context';

const msg = user(
  'Ship this feature',
  reminder('Confirm before deploying to production')
);

// The reminder is appended as:
// "Ship this feature<system-reminder>Confirm before deploying...</system-reminder>"
Inline reminders use <system-reminder> tags and are tracked with offset metadata.

Reminder Metadata

Reminders are tracked with metadata for precise location information:
interface UserReminderMetadata {
  id: string;         // Unique reminder ID
  text: string;       // Reminder text
  partIndex: number;  // Which message part contains the reminder
  start: number;      // UTF-16 offset (inclusive)
  end: number;        // UTF-16 offset (exclusive)
  mode: 'inline' | 'part';  // How the reminder is embedded
}

Accessing Reminder Metadata

import { user, reminder } from '@deepagents/context';

const msg = user(
  'Show me the revenue',
  reminder('Use fiscal year, not calendar year')
);

// The message codec provides access to the UIMessage
const uiMessage = msg.codec?.decode();

// Reminder metadata is stored in message.metadata.reminders
const reminders = uiMessage?.metadata?.reminders as UserReminderMetadata[];
console.log(reminders);
// [
//   {
//     id: 'abc123',
//     text: 'Use fiscal year, not calendar year',
//     partIndex: 0,
//     start: 19,
//     end: 89,
//     mode: 'inline'
//   }
// ]

Stripping Reminders

Remove reminder content from messages for display or storage:
import {
  user,
  reminder,
  stripReminders,
  stripTextByRanges,
  getReminderRanges,
} from '@deepagents/context';

const msg = user(
  'Deploy the app',
  reminder('Ask for confirmation')
);

const uiMessage = msg.codec?.decode();
if (!uiMessage) throw new Error('No message');

// Strip all reminders from the message
const cleaned = stripReminders(uiMessage);
console.log(cleaned.parts[0].text);
// "Deploy the app"

// Or strip specific part ranges
const ranges = getReminderRanges(uiMessage.metadata);
const partText = uiMessage.parts[0].type === 'text' 
  ? uiMessage.parts[0].text 
  : '';
const visible = stripTextByRanges(partText, ranges.filter(r => r.partIndex === 0));

Reminder Utility Functions

Extract reminder ranges from message metadata:
function getReminderRanges(
  metadata: Record<string, unknown> | undefined
): ReminderRange[]

type ReminderRange = {
  partIndex: number;
  start: number;
  end: number;
};
Remove text at specified ranges:
function stripTextByRanges(
  text: string,
  ranges: Array<{ start: number; end: number }>
): string
Remove all reminders from a message:
function stripReminders(message: UIMessage): UIMessage
  • Inline reminders are removed from text parts
  • Part reminders are removed as whole parts
  • metadata.reminders is removed

Message Fragment Type

Message fragments have a specific type signature:
interface MessageFragment extends ContextFragment {
  type: 'message';      // Always 'message'
  persist: true;        // Always persisted
  codec: FragmentCodec; // Encodes/decodes to UIMessage
}

Type Guards

import { isMessageFragment, user } from '@deepagents/context';

const msg = user('Hello');

if (isMessageFragment(msg)) {
  console.log('This is a message fragment');
  const uiMessage = msg.codec.decode();
  console.log(uiMessage.role); // 'user'
}

Use Cases

Add hidden instructions to guide AI behavior:
import { user, reminder } from '@deepagents/context';

const msg = user(
  'Analyze customer churn',
  reminder('Focus on high-value customers (LTV > $10k)'),
  reminder('Compare with industry benchmarks')
);

Best Practices

Default inline mode works well for brief instructions:
// Good: Short reminder
user('Ship it', reminder('Ask for confirmation'))

// Avoid: Long reminders
user('Ship it', reminder('Very long multi-paragraph reminder...'))
Use part mode for longer, structured reminders:
user(
  'Analyze data',
  reminder(`
    Guidelines:
    1. Check data quality first
    2. Remove outliers
    3. Report confidence intervals
  `, { asPart: true })
)
Use function reminders to adapt to content:
reminder((content) => {
  if (content.includes('production')) {
    return 'Production operation - extra caution required';
  }
  return 'Standard operation';
})
Always strip reminders before showing messages to users:
const msg = user('Hello', reminder('Secret instruction'));
const uiMessage = msg.codec.decode();
const displayMessage = stripReminders(uiMessage);
// Now safe to show to user

Integration with Context

Messages can be used alongside other fragments:
import {
  XmlRenderer,
  user,
  assistant,
  reminder,
  term,
  hint,
} from '@deepagents/context';

const fragments = [
  // Domain knowledge
  term('MRR', 'Monthly Recurring Revenue'),
  hint('Always exclude test accounts'),
  
  // Conversation
  user(
    'What is our MRR?',
    reminder('Use fiscal calendar')
  ),
  assistantText('MRR for this month is $125,000'),
];

// Note: Messages are typically handled separately from domain fragments
// during context resolution, but they can be rendered together

Next Steps

Stream Persistence

Learn about durable stream storage

Domain Knowledge

Add business logic and domain knowledge

User Context

Capture user-specific context

API Reference

Complete API documentation

Build docs developers (and LLMs) love