moeru-ai/airi · error · Error

Provider '${requestedProvider}' not found.

Error message

Provider '${requestedProvider}' not found.

What it means

Thrown by generateHeadless when artistryProviders.get(requestedProvider) returns undefined, meaning the provider name is not registered in the provider map (which holds comfyui, replicate, nanobanana). The name is trimmed and lowercased before lookup, so only exact matches against registered keys resolve.

Source

Thrown at apps/stage-tamagotchi/src/main/services/airi/widgets/artistry-bridge.ts:156

    gh: globalsHash, // Include globals hash (Issue #39)
  })

  if (pendingHeadlessRequests.has(fingerprint)) {
    log.log(`[Headless] Deduplicating identical request: ${params.prompt.slice(0, 30)}...`)
    return pendingHeadlessRequests.get(fingerprint)!
  }

  const executionPromise = (async () => {
    const requestedProvider = (params.provider || artistryConfig.get()?.artistryProvider || DEFAULT_ARTISTRY_PROVIDER).trim().toLowerCase()
    if (requestedProvider === 'none') {
      log.log('[Headless] Provider is \'none\'. Bypassing generation.')
      throw new Error('Artistry provider is disabled.')
    }

    const provider = artistryProviders.get(requestedProvider)
    if (!provider) {
      log.error(`[Headless] Provider '${requestedProvider}' not found in registry.`)
      throw new Error(`Provider '${requestedProvider}' not found.`)
    }

    // Initialize the provider
    if (provider.initialize && activeGlobals) {
      log.log(`[Headless] Initializing provider ${requestedProvider} with globals...`)
      await provider.initialize(activeGlobals)
    }

    log.log(`[Headless] Globals keys: ${Object.keys(activeGlobals || {}).join(', ')}`)
    if (activeGlobals?.image)
      log.log(`[Headless] Source image length: ${activeGlobals.image.length}`)

    const request: ArtistryRequest = {
      prompt: params.prompt,
      negativePrompt: params.options?.negativePrompt,
      width: typeof params.options?.width === 'number' ? params.options.width : undefined,
      height: typeof params.options?.height === 'number' ? params.options.height : undefined,
      model: params.model,

View on GitHub (pinned to 27111382b4)

Solutions

  1. Correct the provider name to exactly match a registered key: 'comfyui', 'replicate', or 'nanobanana'.
  2. If using a custom provider, ensure artistryProviders.set(name, instance) ran before generateHeadless and the key is lowercase.
  3. List available providers from the artistryProviders map to confirm valid names.
  4. Remove stale provider names from saved config after an upgrade.

Example fix

// before
const result = await generateHeadless({ prompt, provider: 'comfy-ui' })

// after
const valid = [...artistryProviders.keys()]
const provider = valid.includes(requestedProvider) ? requestedProvider : DEFAULT_ARTISTRY_PROVIDER
const result = await generateHeadless({ prompt, provider })
Defensive patterns

Strategy: type-guard

Validate before calling

const KNOWN_PROVIDERS = [...artistryProviders.keys()]
const provider = requestedProvider.toLowerCase().trim()
if (!KNOWN_PROVIDERS.includes(provider)) {
  throw new Error(`Unknown provider '${provider}'. Valid: ${KNOWN_PROVIDERS.join(', ')}`)
}

Type guard

function isRegisteredProvider(name: string, registry: Map<string, unknown>): name is string {
  return registry.has(name.trim().toLowerCase())
}

Prevention

When it happens

Trigger: params.provider or the configured artistryProvider is a string that doesn't match any registered provider key — a typo, a renamed provider, or a custom provider that was never registered via artistryProviders.set.

Common situations: Config has a stale provider name after an upgrade renamed a provider; a typo like 'comfy-ui' or 'nano-banana'; a third-party provider was expected but its registration code didn't run; case sensitivity (the lookup lowercases, but a key registered with uppercase won't match).

Related errors


AI-assisted analysis of moeru-ai/airi@27111382b4 (2026-08-12). Data as JSON: /api/errors/00307b71f676f5fe. Report an issue: GitHub.