linshenkx/prompt-optimizer · error · RequestConfigError

Model metadata cannot be empty

Error message

Model metadata cannot be empty

What it means

Thrown by validateRequest when modelConfig.modelMeta is missing or has no id. The model metadata id selects the concrete model (e.g. which vision LLM) within the provider, so the service refuses requests without it.

Source

Thrown at packages/core/src/services/image-understanding/service.ts:55

    await adapter.sendImageUnderstandingStream(runtimeRequest, request.modelConfig, callbacks)
  }

  private validateRequest(request: ImageUnderstandingExecutionRequest): void {
    if (!request || typeof request !== 'object') {
      throw new RequestConfigError('Image understanding request cannot be empty')
    }

    const modelConfig = request.modelConfig
    if (!modelConfig) {
      throw new RequestConfigError('Model config cannot be empty')
    }

    if (!modelConfig.providerMeta?.id) {
      throw new RequestConfigError('Model provider metadata cannot be empty')
    }

    if (!modelConfig.modelMeta?.id) {
      throw new RequestConfigError('Model metadata cannot be empty')
    }

    if (!modelConfig.enabled) {
      throw new RequestConfigError('Model is not enabled')
    }
  }

  private async prepareRuntimeRequest(
    request: ImageUnderstandingExecutionRequest
  ): Promise<ImageUnderstandingExecutionRequest> {
    const images = await normalizeImageInputsForLlm(request.images, this.imageInputOptions)
    return {
      ...request,
      images: images ?? request.images,
    }
  }
}

View on GitHub (pinned to 3e677b1d9f)

Solutions

  1. Set modelMeta: { id: '<model-id>', ... } on the config.
  2. Retrieve the config from the model manager rather than hand-building it.
  3. Add a runtime guard on restored configs checking modelMeta?.id before use.

Example fix

// before
modelConfig = { providerMeta: { id: 'dashscope' }, enabled: true } // no modelMeta

// after
modelConfig = {
  providerMeta: { id: 'dashscope' },
  modelMeta: { id: 'qwen2.5-vl-72b-instruct' },
  enabled: true,
}
Defensive patterns

Strategy: type-guard

Validate before calling

if (!request.modelConfig.modelMeta?.id) {
  throw new Error('modelConfig.modelMeta.id required')
}

Type guard

const hasModelMeta = (c: any): c is { modelMeta: { id: string } } =>
  typeof c?.modelMeta?.id === 'string' && c.modelMeta.id.length > 0

Prevention

When it happens

Trigger: Passing a modelConfig that has providerMeta but no modelMeta, or modelMeta: {} without an id.

Common situations: Configs assembled from provider-level settings only; partial config objects after refactors; deserialization dropping nested fields.

Related errors


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