linshenkx/prompt-optimizer · error · RequestConfigError

Model provider cannot be empty

Error message

Model provider cannot be empty

What it means

Thrown by sendMessageStructured when the provider argument is falsy. The service uses the provider id to resolve both the model config and the adapter, so an empty/undefined provider cannot proceed. This is a caller-side programming error, not an environmental issue.

Source

Thrown at packages/core/src/services/llm/service.ts:85

      throw new RequestConfigError('Model provider metadata cannot be empty');
    }
    if (!modelConfig.modelMeta || !modelConfig.modelMeta.id) {
      throw new RequestConfigError('Model metadata cannot be empty');
    }
    // Default behavior: disabled models cannot be used for normal requests.
    // Connection testing is allowed to bypass this check (align with image model test behavior).
    if (!options.allowDisabled && !modelConfig.enabled) {
      throw new RequestConfigError('Model is not enabled');
    }
  }

  /**
   * 发送消息(结构化格式)
   */
  async sendMessageStructured(messages: Message[], provider: string): Promise<LLMResponse> {
    try {
      if (!provider) {
        throw new RequestConfigError('Model provider cannot be empty');
      }

      const modelConfig = await this.modelManager.getModel(provider);
      if (!modelConfig) {
        throw new RequestConfigError(`Model ${provider} not found`);
      }

      this.validateModelConfig(modelConfig);
      this.validateMessages(messages);

      // 通过 Registry 获取 Adapter
      const adapter = this.registry.getAdapter(modelConfig.providerMeta.id);

      const runtimeConfig = this.prepareRuntimeConfig(modelConfig);

      // 使用 Adapter 发送消息
      return await adapter.sendMessage(messages, runtimeConfig);

View on GitHub (pinned to 3e677b1d9f)

Solutions

  1. Pass a non-empty provider id string matching a registered model (e.g. 'openai')
  2. Default the value: provider ?? settings.defaultProvider ?? 'openai'
  3. Guard the call site: if (!provider) return early with a user-facing prompt to pick a model

Example fix

// before
const provider = userSettings?.provider; // undefined
await llm.sendMessageStructured(msgs, provider);

// after
const provider = userSettings?.provider ?? 'openai';
if (!provider) throw new Error('Select a provider first');
await llm.sendMessageStructured(msgs, provider);
Defensive patterns

Strategy: type-guard

Validate before calling

if (!provider || typeof provider !== 'string') throw new Error('Select a provider before sending');

Type guard

const isNonEmptyProvider = (p: unknown): p is string => typeof p === 'string' && p.length > 0;

Try / catch

catch (e) { if (e instanceof RequestConfigError && /provider cannot be empty/.test(e.message)) { /* surface 'pick a model' UI */ } }

Prevention

When it happens

Trigger: Calling sendMessageStructured(messages, '') , sendMessageStructured(messages, undefined), or with a variable that failed to populate (e.g. a settings read that returned undefined).

Common situations: Optional-chain reads like settings?.defaultProvider that silently yield undefined; UI state where the user hasn't selected a provider yet; refactors that changed the parameter from a config object to a plain provider string.

Understand the failure class

Background: Missing required parameter errors: what 'X is required' and 'the required X param is missing' mean, and how to fix them — this error's family across 27 libraries.

Related errors


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