linshenkx/prompt-optimizer · warning · DataInvalidFormatError
Data must be an object
Error message
Data must be an object
What it means
OptimizationError thrown by validateMessageOptimizationRequest when request.modelKey is empty in the message-optimization flow — the same missing-model check as validateInput but for optimizeMessage/optimizeMessageStream requests.
Source
Thrown at packages/core/src/services/data/manager.ts:106
const exportFormat = {
version: 1,
data
};
return JSON.stringify(exportFormat, null, 2); // 格式化输出,便于调试
}
async importAllData(dataString: string): Promise<void> {
let exportData: any;
try {
exportData = JSON.parse(dataString);
} catch (error) {
throw new DataInvalidJsonError(error instanceof Error ? error.message : String(error))
}
if (!exportData || typeof exportData !== 'object' || Array.isArray(exportData)) {
throw new DataInvalidFormatError('Data must be an object')
}
// Support both old and new format for backward compatibility
let dataToImport: Record<string, any>;
// New format: { version: 1, data: { ... } }
if (exportData.version) {
if (!exportData.data || typeof exportData.data !== 'object' || Array.isArray(exportData.data)) {
throw new DataInvalidFormatError('"data" property is missing or not an object')
}
dataToImport = exportData.data;
}
// Old format: direct data object { history: [...], models: [...], ... }
else if (exportData.history || exportData.models || exportData.imageModels || exportData.userTemplates || exportData.userSettings || exportData.contexts) {
dataToImport = exportData;
}
else {
throw new DataInvalidFormatError('Unrecognized data structure')View on GitHub (pinned to 3e677b1d9f)
Solutions
- Populate modelKey from the currently selected/default model before building the request.
- Require model configuration on first run before message optimization is available.
- Type-check requests against MessageOptimizationRequest to catch omissions at build time.
- Surface 'choose a model' guidance when this error is caught.
Example fix
// before
await promptService.optimizeMessage({ selectedMessageId: id, messages });
// after
await promptService.optimizeMessage({ selectedMessageId: id, messages, modelKey: selectedModel.key }); Defensive patterns
Strategy: validation
Validate before calling
const modelKey = selectedModel?.key ?? settings.defaultModelKey;
if (!modelKey?.trim()) throw new Error('Select a model'); Type guard
function hasModelKey(k: unknown): k is string { return typeof k === 'string' && k.trim().length > 0; } Try / catch
try { await svc.optimizeMessage(req); } catch (e) { if (e instanceof OptimizationError && /Model key/.test(e.message)) promptModelSelection(); } Prevention
- Always build requests with the current model selection
- Configure a default model on first run
- Type-check requests at compile time
When it happens
Trigger: Calling optimizeMessage without a model key: no default model configured, model selector not loaded, or the request object built without copying the selected model.
Common situations: Fresh install with no model set, settings reset, UI race on initial render, request builders that omit modelKey when refactoring.
Related errors
- DATA_ERROR_CODES.ELECTRON_API_UNAVAILABLE
- "data" property is missing or not an object
- Unrecognized data structure
- Function mode must not be empty.
- Model config cannot be empty
AI-assisted analysis of linshenkx/prompt-optimizer@3e677b1d9f (2026-08-27).
Data as JSON: /api/errors/cde79b735956bf96.
Report an issue: GitHub.