{"record":{"id":"d7dcd7c18c3a5632","repo":"mastra-ai/mastra","slug":"mastra-aiv5-data-part-invalid","errorCode":"MASTRA_AIV5_DATA_PART_INVALID","errorMessage":"Invalid AIV5 data part in getDataStringFromAIV5DataPart","messagePattern":"Invalid AIV5 data part in getDataStringFromAIV5DataPart","errorType":"error_code","errorClass":"MastraError","httpStatus":null,"severity":"error","filePath":"packages/core/src/agent/message-list/adapters/AIV5Adapter.ts","lineNumber":803,"sourceCode":"    };\n  }\n\n  /**\n   * Convert image or file to data URI or URL for V2 file part\n   */\n  private static getDataStringFromAIV5DataPart(part: AIV5Type.ImagePart | AIV5Type.FilePart): string {\n    let mimeType: string;\n    let data: AIV5.FilePart['data'] | AIV5.ImagePart['image'];\n    if ('data' in part) {\n      mimeType = part.mediaType || 'application/octet-stream';\n      data = part.data;\n    } else if ('image' in part) {\n      mimeType = part.mediaType || 'image/jpeg';\n      data = part.image;\n    } else if ('url' in part && typeof (part as any).url === 'string') {\n      return (part as any).url;\n    } else {\n      throw new MastraError({\n        id: 'MASTRA_AIV5_DATA_PART_INVALID',\n        domain: ErrorDomain.AGENT,\n        category: ErrorCategory.USER,\n        text: 'Invalid AIV5 data part in getDataStringFromAIV5DataPart',\n        details: {\n          part,\n        },\n      });\n    }\n\n    if (data instanceof URL) {\n      return data.toString();\n    } else {\n      if (data instanceof Buffer) {\n        const base64 = data.toString('base64');\n        return `data:${mimeType};base64,${base64}`;\n      } else if (typeof data === 'string') {\n        // OpenAI Files API file IDs (e.g. \"file-abc123\") must pass through as-is so","sourceCodeStart":785,"sourceCodeEnd":821,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/packages/core/src/agent/message-list/adapters/AIV5Adapter.ts#L785-L821","documentation":"MastraError thrown by getDataStringFromAIV5DataPart in the AIV5 adapter when a data part claims to be media (image/file) but contains no recognizable payload. The function expects part.image, part.data, or a string part.url; a part with none of these cannot be converted to a data URL/string. Categorized USER because the malformed part came from input messages.","triggerScenarios":"Adding an AIV5 message whose file part has neither data/image bytes nor a string url (e.g. { type: 'file', mediaType: 'application/pdf' } with no data), or an image part where image is undefined/null or an unsupported object type, reached via imageData/fileData converters.","commonSituations":"Serializing messages where binary data was dropped (e.g. stored without the base64 payload); passing a URL object instead of a URL string; sending a file part with only a filename; upgrading from v4 messages whose media shape differs from v5 data parts.","solutions":["Ensure the data part carries one of: a string url, base64 data in part.data, bytes/buffer in part.image (for images), per AI SDK v5 FilePart/DataPart shape.","If you have a URL, pass it as { type: 'file', url: 'https://...' } with url as a string, not a URL instance.","For images use { type: 'image', image: <Uint8Array|base64 string|data URL>, mediaType: 'image/png' }.","Verify persisted messages still contain the data payload after serialization round-trips; log details.part from the error to see what arrived."],"exampleFix":"// before\n{ type: 'file', mediaType: 'application/pdf', filename: 'doc.pdf' }\n\n// after\n{ type: 'file', mediaType: 'application/pdf', data: base64EncodedPdf }","handlingStrategy":"type-guard","validationCode":"function assertExtractableMediaPart(part: any): void {\n  const hasPayload = typeof part?.url === 'string' || part?.data != null || part?.image != null;\n  if (!hasPayload) throw new Error(`Media part missing url/data/image: ${JSON.stringify(part).slice(0, 200)}`);\n}","typeGuard":"function hasMediaPayload(p: any): p is { url: string } | { data: string | Uint8Array } | { image: string | Uint8Array } {\n  return !!p && (typeof p.url === 'string' || p.data != null || p.image != null);\n}","tryCatchPattern":"try {\n  const dataString = getDataStringFromAIV5DataPart(part);\n} catch (e) {\n  if (e instanceof MastraError && e.id === 'MASTRA_AIV5_DATA_PART_INVALID') {\n    logger.warn('Skipping media part without payload', e.details.part);\n    return null;\n  }\n  throw e;\n}","preventionTips":["Always attach the binary payload (base64/Uint8Array) or a string url when constructing file/image data parts.","Convert URL objects to strings before embedding in messages.","Verify media survives your storage round-trip — binary fields are often dropped by JSON serialization.","Follow AI SDK v5 FilePart shape exactly when upgrading from v4 message formats."],"tags":["agent","message-conversion","media","aiv5"],"backgroundTag":"invalid-message-format","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}