ruvnet/ruflo · error

No available providers

Error message

No available providers

What it means

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.

Source

Thrown at v3/@claude-flow/providers/src/provider-manager.ts:154

   * Complete a request with automatic provider selection
   */
  async complete(request: LLMRequest, preferredProvider?: LLMProvider): Promise<LLMResponse> {
    // Check cache first
    if (this.config.cache?.enabled) {
      const cached = this.getCached(request);
      if (cached) {
        this.logger.debug('Cache hit', { requestId: request.requestId });
        return cached;
      }
    }

    // Select provider
    const provider = preferredProvider
      ? this.providers.get(preferredProvider)
      : await this.selectProvider(request);

    if (!provider) {
      throw new Error('No available providers');
    }

    const startTime = Date.now();

    try {
      const response = await provider.complete(request);
      this.updateMetrics(provider.name, Date.now() - startTime, false, response.cost?.totalCost || 0);

      // Cache response
      if (this.config.cache?.enabled) {
        this.setCached(request, response);
      }

      this.emit('complete', { provider: provider.name, response });
      return response;
    } catch (error) {
      this.updateMetrics(provider.name, Date.now() - startTime, true, 0);

View on GitHub (pinned to fa13ee4ad6)

Solutions

  1. await manager.initialize() then assert manager.listProviders().length > 0 before sending requests
  2. Check startup logs for 'Failed to initialize <provider>' — that line names exactly which configs were skipped and why
  3. Fix at least one provider config: required API-key env vars, reachable ollamaUrl / ruvector baseUrl
  4. If passing preferredProvider, confirm manager.getProvider(name) is defined, or omit it to let selection choose any registered provider
  5. Run await manager.healthCheck() to see per-provider status before dispatching

Example fix

// before
const manager = new ProviderManager(config);
const res = await manager.complete(request, 'ollama'); // throws: No available providers

// after
const manager = new ProviderManager(config);
await manager.initialize();
if (manager.listProviders().length === 0) {
  throw new Error('No provider initialized — check API keys and server URLs');
}
const res = await manager.complete(request, 'ollama');
Defensive patterns

Strategy: validation

Validate before calling

await manager.initialize();
const registered = manager.listProviders();
if (registered.length === 0) {
  throw new Error('No providers initialized — check API keys and server URLs');
}
let provider = preferred;
if (provider && !registered.includes(provider)) provider = undefined;

Type guard

function isNoProvidersError(e: unknown): boolean {
  return e instanceof Error && e.message === 'No available providers';
}

Try / catch

try {
  return await manager.complete(request);
} catch (e) {
  if (isNoProvidersError(e)) {
    throw new Error(`No available providers (registered: ${manager.listProviders().join(', ') || 'none'})`);
  }
  throw e;
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of ruvnet/ruflo@fa13ee4ad6 (2026-08-18). Data as JSON: /api/errors/a414b340f8d39bfe. Report an issue: GitHub.