moeru-ai/airi · warning · Error

Artistry provider is disabled.

Error message

Artistry provider is disabled.

What it means

Thrown by generateHeadless when the resolved artistry provider name equals 'none'. Resolution order is params.provider, then the configured artistryProvider, then DEFAULT_ARTISTRY_PROVIDER; if the effective value is 'none', generation is intentionally bypassed and this error surfaces the deliberate disablement.

Source

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

  const fingerprint = JSON.stringify({
    p: params.prompt,
    m: params.model,
    pr: params.provider,
    o: params.options,
    ih: imageHash,
    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}`)

View on GitHub (pinned to 27111382b4)

Solutions

  1. Set artistryProvider to a valid provider name (comfyui, replicate, nanobanana) in the artistry config.
  2. Before calling generateHeadless, check the resolved provider and skip/handle the 'none' case gracefully in the caller.
  3. If 'none' is a legitimate 'feature off' state, treat this error as a signal to fall back to a placeholder or no-op rather than surfacing it to the user.

Example fix

// before
const result = await generateHeadless({ prompt, provider: resolvedProvider })

// after
if (resolvedProvider === 'none') {
  return { imageUrl: undefined, error: 'Artistry is disabled' }
}
const result = await generateHeadless({ prompt, provider: resolvedProvider })
Defensive patterns

Strategy: validation

Validate before calling

const provider = (params.provider || artistryConfig.get()?.artistryProvider || DEFAULT_ARTISTRY_PROVIDER).trim().toLowerCase()
if (provider === 'none') {
  return { imageUrl: undefined, error: 'Artistry is disabled' }
}
return await generateHeadless(params)

Try / catch

try {
  return await generateHeadless(params)
} catch (e) {
  if (/provider is disabled/i.test(errorMessageFrom(e) ?? '')) {
    return { imageUrl: undefined, error: 'Artistry disabled' }
  }
  throw e
}

Prevention

When it happens

Trigger: The artistry config sets artistryProvider to 'none' (disabling image generation), or a caller explicitly passes provider: 'none', and then code still attempts generateHeadless expecting an image.

Common situations: A user turned off the artistry provider in settings but a widget/feature still calls generateHeadless; the config default resolved to 'none' after a config reset; a feature was not updated to handle the disabled-provider case.

Related errors


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