{"record":{"id":"00307b71f676f5fe","repo":"moeru-ai/airi","slug":"provider-requestedprovider-not-found","errorCode":null,"errorMessage":"Provider '${requestedProvider}' not found.","messagePattern":"Provider '(.+?)' not found\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"apps/stage-tamagotchi/src/main/services/airi/widgets/artistry-bridge.ts","lineNumber":156,"sourceCode":"    gh: globalsHash, // Include globals hash (Issue #39)\n  })\n\n  if (pendingHeadlessRequests.has(fingerprint)) {\n    log.log(`[Headless] Deduplicating identical request: ${params.prompt.slice(0, 30)}...`)\n    return pendingHeadlessRequests.get(fingerprint)!\n  }\n\n  const executionPromise = (async () => {\n    const requestedProvider = (params.provider || artistryConfig.get()?.artistryProvider || DEFAULT_ARTISTRY_PROVIDER).trim().toLowerCase()\n    if (requestedProvider === 'none') {\n      log.log('[Headless] Provider is \\'none\\'. Bypassing generation.')\n      throw new Error('Artistry provider is disabled.')\n    }\n\n    const provider = artistryProviders.get(requestedProvider)\n    if (!provider) {\n      log.error(`[Headless] Provider '${requestedProvider}' not found in registry.`)\n      throw new Error(`Provider '${requestedProvider}' not found.`)\n    }\n\n    // Initialize the provider\n    if (provider.initialize && activeGlobals) {\n      log.log(`[Headless] Initializing provider ${requestedProvider} with globals...`)\n      await provider.initialize(activeGlobals)\n    }\n\n    log.log(`[Headless] Globals keys: ${Object.keys(activeGlobals || {}).join(', ')}`)\n    if (activeGlobals?.image)\n      log.log(`[Headless] Source image length: ${activeGlobals.image.length}`)\n\n    const request: ArtistryRequest = {\n      prompt: params.prompt,\n      negativePrompt: params.options?.negativePrompt,\n      width: typeof params.options?.width === 'number' ? params.options.width : undefined,\n      height: typeof params.options?.height === 'number' ? params.options.height : undefined,\n      model: params.model,","sourceCodeStart":138,"sourceCodeEnd":174,"githubUrl":"https://github.com/moeru-ai/airi/blob/27111382b4a79a7e983289d6e983a06af185ed0f/apps/stage-tamagotchi/src/main/services/airi/widgets/artistry-bridge.ts#L138-L174","documentation":"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.","triggerScenarios":"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.","commonSituations":"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).","solutions":["Correct the provider name to exactly match a registered key: 'comfyui', 'replicate', or 'nanobanana'.","If using a custom provider, ensure artistryProviders.set(name, instance) ran before generateHeadless and the key is lowercase.","List available providers from the artistryProviders map to confirm valid names.","Remove stale provider names from saved config after an upgrade."],"exampleFix":"// before\nconst result = await generateHeadless({ prompt, provider: 'comfy-ui' })\n\n// after\nconst valid = [...artistryProviders.keys()]\nconst provider = valid.includes(requestedProvider) ? requestedProvider : DEFAULT_ARTISTRY_PROVIDER\nconst result = await generateHeadless({ prompt, provider })","handlingStrategy":"type-guard","validationCode":"const KNOWN_PROVIDERS = [...artistryProviders.keys()]\nconst provider = requestedProvider.toLowerCase().trim()\nif (!KNOWN_PROVIDERS.includes(provider)) {\n  throw new Error(`Unknown provider '${provider}'. Valid: ${KNOWN_PROVIDERS.join(', ')}`)\n}","typeGuard":"function isRegisteredProvider(name: string, registry: Map<string, unknown>): name is string {\n  return registry.has(name.trim().toLowerCase())\n}","tryCatchPattern":null,"preventionTips":["Validate provider names against artistryProviders.keys() before calling generateHeadless.","After upgrades, migrate any stale provider names in saved config.","Register custom providers with lowercase keys to match the lookup normalization."],"tags":["artistry","providers","config","registry"],"backgroundTag":null,"analyzedSha":"27111382b4a79a7e983289d6e983a06af185ed0f","analyzedAt":"2026-08-12T18:33:34.132Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}