{"record":{"id":"b9abb2783f8bf439","repo":"ruvnet/ruflo","slug":"provider-providername-not-found","errorCode":null,"errorMessage":"Provider ${providerName} not found","messagePattern":"Provider (.+?) not found","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"v3/@claude-flow/plugins/src/providers/index.ts","lineNumber":243,"sourceCode":"   * Execute a request with automatic provider selection and fallback.\n   */\n  async execute(request: LLMRequest): Promise<LLMResponse> {\n    const provider = this.getBest({ model: request.model });\n\n    if (!provider) {\n      throw new Error(`No available provider for model ${request.model}`);\n    }\n\n    return this.executeWithProvider(provider.definition.name, request);\n  }\n\n  /**\n   * Execute a request on a specific provider with retry.\n   */\n  async executeWithProvider(providerName: string, request: LLMRequest): Promise<LLMResponse> {\n    const entry = this.providers.get(providerName);\n    if (!entry) {\n      throw new Error(`Provider ${providerName} not found`);\n    }\n\n    const retryConfig = this.config.retryConfig!;\n    let lastError: Error | null = null;\n    let delay = retryConfig.initialDelayMs;\n\n    for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {\n      if (attempt > 0) {\n        await this.delay(delay);\n        delay = Math.min(delay * retryConfig.backoffMultiplier, retryConfig.maxDelayMs);\n      }\n\n      try {\n        this.emit(PROVIDER_EVENTS.REQUEST_START, {\n          provider: providerName,\n          model: request.model,\n          attempt,\n        });","sourceCodeStart":225,"sourceCodeEnd":261,"githubUrl":"https://github.com/ruvnet/ruflo/blob/fa13ee4ad60ac2090b1480656eb233521790d640/v3/@claude-flow/plugins/src/providers/index.ts#L225-L261","documentation":"Thrown by LLMProviderRegistry.executeWithProvider() when providers.get(providerName) misses. This is a plain Map lookup on the registered names, so it fires only when the name is genuinely unknown to this registry instance (never registered, unregistered, or a name mismatch).","triggerScenarios":"Calling executeWithProvider('openai', request) when only e.g. 'anthropic' was registered; using a name that differs from the provider's definition.name (typo, casing, 'open-ai' vs 'openai'); calling after unregister(name) removed the entry; calling on a different registry instance than the one the provider was registered on.","commonSituations":"Name constants drifting between definition.name and call sites; multiple registries (one per environment/test) and the provider registered on the wrong one; unregister during shutdown racing in-flight requests.","solutions":["Check registry.get(providerName) first and use the exact definition.name it returns","If the provider was unregistered intentionally, re-register it or route requests to a live name","Centralize provider names in exported constants shared by registration and call sites"],"exampleFix":"// before\nawait registry.executeWithProvider('open-ai', request); // typo -> throws\n\n// after\nconst name = openaiProvider.definition.name; // 'openai'\nif (!registry.get(name)) await registry.register(openaiProvider);\nawait registry.executeWithProvider(name, request);","handlingStrategy":"validation","validationCode":"const provider = registry.get(providerName);\nif (!provider) {\n  throw new Error(\n    `unknown provider '${providerName}'; registered: ${\n      registry.listProviders().map(p => p.definition.name).join(', ')\n    }`\n  );\n}\nawait registry.executeWithProvider(providerName, request);","typeGuard":null,"tryCatchPattern":"try {\n  await registry.executeWithProvider(name, request);\n} catch (err) {\n  if (err instanceof Error && err.message.endsWith('not found')) {\n    await registry.register(requiredProvider); // lazy (re-)register, then retry once\n    return registry.executeWithProvider(name, request);\n  }\n  throw err;\n}","preventionTips":["Source provider names from definition.name via exported constants","Validate provider presence during startup for every name your config references","Treat unregister as a shutdown-only operation; do not run it concurrently with in-flight requests"],"tags":["llm-provider","unknown-name","registry","typescript"],"backgroundTag":"provider-not-found","analyzedSha":"fa13ee4ad60ac2090b1480656eb233521790d640","analyzedAt":"2026-08-18T21:34:22.708Z","contentChangedAt":"2026-08-18T21:34:22.708Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}