mastra-ai/mastra · error · Error
Received input message with wrong resourceId. Input ${messag
Error message
Received input message with wrong resourceId. Input ${message.resourceId}, expected ${context.memoryInfo.resourceId} What it means
Error thrown by inputToMastraDBMessage when an input message's resourceId does not match the resourceId of the active memory context. This guards against attaching messages owned by one user/resource to another resource's thread. Memory-sourced messages are exempt (e.g. observational-memory continuation messages may carry a system resourceId).
Source
Thrown at packages/core/src/agent/message-list/conversion/input-converter.ts:58
message.threadId &&
context.memoryInfo &&
message.threadId !== context.memoryInfo.threadId
) {
throw new Error(
`Received input message with wrong threadId. Input ${message.threadId}, expected ${context.memoryInfo.threadId}`,
);
}
// Validate resourceId matches (except for memory messages, which can carry a
// system resourceId — e.g. observational-memory continuation messages)
if (
messageSource !== `memory` &&
`resourceId` in message &&
message.resourceId &&
context.memoryInfo?.resourceId &&
message.resourceId !== context.memoryInfo.resourceId
) {
throw new Error(
`Received input message with wrong resourceId. Input ${message.resourceId}, expected ${context.memoryInfo.resourceId}`,
);
}
if (TypeDetector.isMastraMessageV1(message)) {
return stampMessageParts(mastraMessageV1ToMastraDBMessage(message, messageSource, context), messageSource);
}
if (TypeDetector.isMastraDBMessage(message)) {
return stampMessageParts(hydrateMastraDBMessageFields(message, context, messageSource), messageSource);
}
if (TypeDetector.isAIV4CoreMessage(message)) {
return stampMessageParts(AIV4Adapter.fromCoreMessage(message, context, messageSource), messageSource);
}
if (TypeDetector.isAIV4UIMessage(message)) {
return stampMessageParts(
AIV4Adapter.fromUIMessage(message as UIMessageV4 | UIMessageWithMetadata, context, messageSource),
messageSource,
);View on GitHub (pinned to 75dd419e61)
Solutions
- Strip resourceId from input messages and let the agent stamp the current resource's id.
- Ensure the messages you pass were fetched for the same resourceId the agent call uses in memory options.
- Migrate stored messages if you changed your resourceId convention (update their resourceId field to the new key).
- Verify per-user data fetching so one tenant's messages never reach another tenant's agent call.
Example fix
// before
await agent.generate(otherUsersMessages, { memory: { thread, resource: 'user-123' } });
// after
const mine = await memory.getMessages({ threadId, resourceId: 'user-123' });
await agent.generate(mine, { memory: { thread, resource: 'user-123' } }); Defensive patterns
Strategy: validation
Validate before calling
function assertResourceMatches(messages: Array<{ resourceId?: string }>, expectedResourceId: string): void {
for (const m of messages) {
if (m.resourceId && m.resourceId !== expectedResourceId) {
throw new Error(`Message resourceId ${m.resourceId} != expected ${expectedResourceId}`);
}
}
} Try / catch
try {
await agent.generate(messages, { memory: { thread, resource: resourceId } });
} catch (e) {
if (e instanceof Error && e.message.includes('wrong resourceId')) {
const scoped = messages.map(({ resourceId: _rid, ...m }) => m);
return agent.generate(scoped, { memory: { thread, resource: resourceId } });
}
throw e;
} Prevention
- Always fetch messages scoped to the same resourceId used in the agent call's memory options.
- Migrate stored messages when changing resourceId conventions (email -> user id, etc.).
- Strip resourceId from messages before passing them as raw input.
- In multi-tenant code, assert tenant/resource ownership of message arrays before agent calls.
When it happens
Trigger: Passing messages whose resourceId differs from context.memoryInfo.resourceId — e.g. injecting another user's stored messages into a new user's thread, or sending messages saved under an old resourceId after the resource was renamed/re-keyed.
Common situations: Multi-tenant apps where messages are fetched for the wrong user; changing resourceId scheme (e.g. from email to user ID) without migrating stored messages; shared/cached message arrays reused across users; copy-pasted test fixtures containing a different resourceId.
Related errors
- Received input message with wrong threadId. Input ${message.
- Found unhandled message ${JSON.stringify(message)}
- Could not generate title from input ${JSON.stringify(message
- AGENT_LIST_SUSPENDED_RUNS_INVALID_PER_PAGE
- AGENT_LIST_SUSPENDED_RUNS_INVALID_PAGE
AI-assisted analysis of mastra-ai/mastra@75dd419e61 (2026-08-30).
Data as JSON: /api/errors/4a6cdbe8c7e593f0.
Report an issue: GitHub.