linshenkx/prompt-optimizer · warning · FavoriteValidationError

Function mode (functionMode) cannot be empty

Error message

Function mode (functionMode) cannot be empty

What it means

addFavorite rejects with FavoriteValidationError when favorite.functionMode is falsy. Every favorite must declare its function mode (e.g. basic/context/image) so downstream behavior is deterministic.

Source

Thrown at packages/core/src/services/favorite/manager.ts:271

        // ✅ 标记已初始化
        await this.storageProvider.setItem('favorite_categories_initialized', 'true');
      }
    } catch (error) {
      console.warn('[FavoriteManager] Failed to ensure default categories:', error);
    }
  }

  async addFavorite(favorite: Omit<FavoritePrompt, 'id' | 'createdAt' | 'updatedAt' | 'useCount'>): Promise<string> {
    await this.ensureInitialized();

    // 验证输入
    if (!favorite.content?.trim()) {
      throw new FavoriteValidationError('Prompt content cannot be empty');
    }

    // 验证 functionMode 必填
    if (!favorite.functionMode) {
      throw new FavoriteValidationError('Function mode (functionMode) cannot be empty');
    }

    // 验证功能模式分类的完整性
    if (favorite.functionMode === 'basic' || favorite.functionMode === 'context') {
      if (!favorite.optimizationMode) {
        throw new FavoriteValidationError(`${favorite.functionMode} mode must specify optimizationMode`);
      }
    }

    if (favorite.functionMode === 'image') {
      if (!favorite.imageSubMode) {
        throw new FavoriteValidationError('Image mode must specify imageSubMode');
      }
    }

    assertFavoriteMetadataHasNoInlineImages(favorite.metadata);

    const favoriteData = {

View on GitHub (pinned to 3e677b1d9f)

Solutions

  1. Set functionMode explicitly on every favorite you create
  2. Default it in a mapping layer when upgrading old call sites
  3. Catch FavoriteValidationError to find remaining call sites during migration

Example fix

// before
await manager.addFavorite({ content, title });
// after
await manager.addFavorite({ content, title, functionMode: 'basic', optimizationMode: 'standard' });
Defensive patterns

Strategy: validation

Validate before calling

if (!fav.functionMode) fav = { ...fav, functionMode: 'basic', optimizationMode: 'standard' };

Type guard

const hasFunctionMode = (f: Partial<FavoritePrompt>): f is FavoritePrompt & { functionMode: string } => !!f.functionMode;

Try / catch

try { await manager.addFavorite(fav); } catch (e) { if (e instanceof FavoriteValidationError && /functionMode/.test(e.message)) { fav.functionMode = 'basic'; return manager.addFavorite(fav as any); } throw e; }

Prevention

When it happens

Trigger: await manager.addFavorite({ content: 'x' }) with no functionMode — introduced when the functionMode field became mandatory.

Common situations: Code written against an older API where functionMode was optional; deserialized records missing the field; form not updated after upgrading the library.

Related errors


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