linshenkx/prompt-optimizer · error · Error

Provider not found: ${selectedProviderId.value}

Error message

Provider not found: ${selectedProviderId.value}

What it means

saveConfig in useImageModelManager looks up the currently selected provider by selectedProviderId in the local providers cache; if the ID isn't found it aborts with 'Provider not found'. This is a state-consistency error: the selection points at a provider that isn't (or no longer) in the loaded provider list.

Source

Thrown at packages/ui/src/composables/model/useImageModelManager.ts:610

      const isEditing = !!configForm.value.id
      applyDefaultsFromModel(isEditing)
    }
  }

  // 保存配置(优化版本:使用缓存的模型对象)
  const saveConfig = async () => {
    if (!configForm.value.name || !selectedProviderId.value || !selectedModelId.value) {
      toast.error(t('image.config.incomplete'))
      return
    }

    isSaving.value = true

    try {
      const cachedProvider = providers.value.find(p => p.id === selectedProviderId.value)

      if (!cachedProvider) {
        throw new Error(`Provider not found: ${selectedProviderId.value}`)
      }

      // 获取模型信息:优先使用缓存,不存在时通过registry构建
      let cachedModel = models.value.find(m => m.id === selectedModelId.value)
      if (!cachedModel) {
        // 对于自定义模型ID,使用adapter的buildDefaultModel方法构建
        try {
          const adapter = registry.getAdapter(selectedProviderId.value)
          cachedModel = adapter.buildDefaultModel(selectedModelId.value)
        } catch (error) {
          throw new Error(
            `Unable to build model ${selectedModelId.value}: ${error instanceof Error ? error.message : String(error)}`,
            { cause: error }
          )
        }
      }

      // Manager owns authoritative provider/model metadata resolution.

View on GitHub (pinned to 3e677b1d9f)

Solutions

  1. Reload/refresh the provider list and re-select the provider before saving.
  2. Validate that selectedProviderId still exists in providers whenever the list changes (watch) and reset selection if not.
  3. Clear stale persisted selection state on startup.

Example fix

// before
const cachedProvider = providers.value.find(p => p.id === selectedProviderId.value)
if (!cachedProvider) throw new Error(`Provider not found: ...`)

// after — guard before opening save
if (!providers.value.some(p => p.id === selectedProviderId.value)) {
  await loadProviders()
  selectedProviderId.value = providers.value[0]?.id ?? null
}
// then save
Defensive patterns

Strategy: validation

Validate before calling

if (!providers.value.some(p => p.id === selectedProviderId.value)) { await loadProviders(); /* reselect */ }

Type guard

const isKnownProvider = (id: string) => providers.value.some(p => p.id === id)

Try / catch

catch (e) { if (e instanceof Error && e.message.startsWith('Provider not found')) { await loadProviders(); return } throw e }

Prevention

When it happens

Trigger: Saving an image model config after the provider list was reloaded/filtered so the selected provider ID is stale; a race between provider loading and save; or selectedProviderId set to an ID that never existed.

Common situations: User leaves the config dialog open while providers refresh in the background; provider uninstalled/removed while dialog open; restored persisted selectedProviderId referencing a removed provider.

Related errors


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