{"record":{"id":"a414b340f8d39bfe","repo":"ruvnet/ruflo","slug":"no-available-providers","errorCode":null,"errorMessage":"No available providers","messagePattern":"No available providers","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"v3/@claude-flow/providers/src/provider-manager.ts","lineNumber":154,"sourceCode":"   * Complete a request with automatic provider selection\n   */\n  async complete(request: LLMRequest, preferredProvider?: LLMProvider): Promise<LLMResponse> {\n    // Check cache first\n    if (this.config.cache?.enabled) {\n      const cached = this.getCached(request);\n      if (cached) {\n        this.logger.debug('Cache hit', { requestId: request.requestId });\n        return cached;\n      }\n    }\n\n    // Select provider\n    const provider = preferredProvider\n      ? this.providers.get(preferredProvider)\n      : await this.selectProvider(request);\n\n    if (!provider) {\n      throw new Error('No available providers');\n    }\n\n    const startTime = Date.now();\n\n    try {\n      const response = await provider.complete(request);\n      this.updateMetrics(provider.name, Date.now() - startTime, false, response.cost?.totalCost || 0);\n\n      // Cache response\n      if (this.config.cache?.enabled) {\n        this.setCached(request, response);\n      }\n\n      this.emit('complete', { provider: provider.name, response });\n      return response;\n    } catch (error) {\n      this.updateMetrics(provider.name, Date.now() - startTime, true, 0);\n","sourceCodeStart":136,"sourceCodeEnd":172,"githubUrl":"https://github.com/ruvnet/ruflo/blob/fa13ee4ad60ac2090b1480656eb233521790d640/v3/@claude-flow/providers/src/provider-manager.ts#L136-L172","documentation":"Thrown by ProviderManager.complete() when no LLM provider can service the request. initialize() swallows per-provider failures (provider-manager.ts:96-98) and only registers providers that started successfully, so the internal map can be empty or missing the one you named. Reaching this throw means either preferredProvider was never registered, or selectProvider() found zero available providers.","triggerScenarios":"complete(req) when every entry in config.providers failed initialize() (missing API key, unreachable local server); complete(req, 'ollama') when the Ollama provider failed to start and is absent from the map; calling complete() before await manager.initialize() resolves.","commonSituations":"Missing ANTHROPIC_API_KEY/OPENAI_API_KEY so all cloud providers are skipped at init; local Ollama/RuVector server down at init time; forgetting to await initialize(); passing a preferredProvider string that doesn't match the registered set.","solutions":["await manager.initialize() then assert manager.listProviders().length > 0 before sending requests","Check startup logs for 'Failed to initialize <provider>' — that line names exactly which configs were skipped and why","Fix at least one provider config: required API-key env vars, reachable ollamaUrl / ruvector baseUrl","If passing preferredProvider, confirm manager.getProvider(name) is defined, or omit it to let selection choose any registered provider","Run await manager.healthCheck() to see per-provider status before dispatching"],"exampleFix":"// before\nconst manager = new ProviderManager(config);\nconst res = await manager.complete(request, 'ollama'); // throws: No available providers\n\n// after\nconst manager = new ProviderManager(config);\nawait manager.initialize();\nif (manager.listProviders().length === 0) {\n  throw new Error('No provider initialized — check API keys and server URLs');\n}\nconst res = await manager.complete(request, 'ollama');","handlingStrategy":"validation","validationCode":"await manager.initialize();\nconst registered = manager.listProviders();\nif (registered.length === 0) {\n  throw new Error('No providers initialized — check API keys and server URLs');\n}\nlet provider = preferred;\nif (provider && !registered.includes(provider)) provider = undefined;","typeGuard":"function isNoProvidersError(e: unknown): boolean {\n  return e instanceof Error && e.message === 'No available providers';\n}","tryCatchPattern":"try {\n  return await manager.complete(request);\n} catch (e) {\n  if (isNoProvidersError(e)) {\n    throw new Error(`No available providers (registered: ${manager.listProviders().join(', ') || 'none'})`);\n  }\n  throw e;\n}","preventionTips":["Always await initialize() and assert listProviders() is non-empty at startup","Treat empty listProviders() as a startup blocker with a clear message, not a runtime surprise","Don't pass preferredProvider values you haven't verified against listProviders()"],"tags":["llm","provider-manager","initialization","configuration"],"backgroundTag":"llm-provider-unavailable","analyzedSha":"fa13ee4ad60ac2090b1480656eb233521790d640","analyzedAt":"2026-08-18T21:34:22.708Z","contentChangedAt":"2026-08-18T21:34:22.708Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}