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

  1. Populate modelKey from the currently selected/default model before building the request.
  2. Require model configuration on first run before message optimization is available.
  3. Type-check requests against MessageOptimizationRequest to catch omissions at build time.
  4. 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

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


AI-assisted analysis of linshenkx/prompt-optimizer@3e677b1d9f (2026-08-27). Data as JSON: /api/errors/cde79b735956bf96. Report an issue: GitHub.