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
- Pass a non-empty provider id string matching a registered model (e.g. 'openai')
- Default the value: provider ?? settings.defaultProvider ?? 'openai'
- 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
- Default provider at the call site: provider ?? 'openai'
- Disable send buttons until a provider is selected
- Lint for forgotten optional chains when reading provider settings
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
- Messages array cannot be empty
- Each message must have role and content
- Invalid message role: ${msg.role}
- Message content must be a string
- Model provider metadata cannot be empty
AI-assisted analysis of linshenkx/prompt-optimizer@3e677b1d9f (2026-08-27).
Data as JSON: /api/errors/26db86f4b8c7cf78.
Report an issue: GitHub.