{"record":{"id":"6a31c1b5d61e4748","repo":"ruvnet/ruflo","slug":"no-providers-match-the-requirements","errorCode":null,"errorMessage":"No providers match the requirements","messagePattern":"No providers match the requirements","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"v3/@claude-flow/integration/src/provider-adapter.ts","lineNumber":540,"sourceCode":"        const avgCost =\n          (provider.costPerToken.inputPer1K + provider.costPerToken.outputPer1K) / 2;\n        if (requirements.maxCostPer1K && avgCost > requirements.maxCostPer1K) {\n          continue;\n        }\n\n        // Calculate score\n        const { score, reasons } = this.calculateProviderScore(\n          provider,\n          model,\n          requirements\n        );\n\n        candidates.push({ provider, model, score, reasons });\n      }\n    }\n\n    if (candidates.length === 0) {\n      throw new Error('No providers match the requirements');\n    }\n\n    // Sort by score\n    candidates.sort((a, b) => b.score - a.score);\n\n    const best = candidates[0];\n    const alternatives = candidates.slice(1, 4).map(({ provider, model, score }) => ({\n      provider,\n      model,\n      score,\n    }));\n\n    this.emit('provider-selected', {\n      providerId: best.provider.id,\n      modelId: best.model.id,\n      score: best.score,\n    });\n","sourceCodeStart":522,"sourceCodeEnd":558,"githubUrl":"https://github.com/ruvnet/ruflo/blob/fa13ee4ad60ac2090b1480656eb233521790d640/v3/@claude-flow/integration/src/provider-adapter.ts#L522-L558","documentation":"Thrown by ProviderAdapter's provider-selection step: every registered provider/model pair is scored via calculateProviderScore(provider, model, requirements), and if the resulting candidate list is empty the adapter refuses to pick anything. It means either no providers are registered/eligible at all, or your requirements object excluded every combination that exists.","triggerScenarios":"Calling the provider-selection/routing entry point with a requirements object whose constraints (model restrictions, required capabilities, other scoring filters) no registered provider+model pair satisfies; or calling it when zero providers are registered or all were filtered out before the scoring loop.","commonSituations":"A required capability or model name that no configured provider offers (typo, or requirements copied from another environment with a different provider set); all providers disabled, rate-limited, or otherwise ineligible before scoring; overly strict combined constraints (capability + cost + latency) that no single provider meets.","solutions":["Log the registered providers and their models, then diff each field of your requirements against them to find the excluding criterion","Relax the requirements one field at a time (drop optional capabilities, widen model constraints) until at least one candidate survives","Register or enable a provider/model that satisfies the requirements before invoking selection","Check provider status — providers that are disabled, rate-limited, or otherwise filtered never become candidates"],"exampleFix":"// before\nconst requirements = { capabilities: ['tools', 'vision'], maxCostPerCall: 0.0001, maxLatencyMs: 100 };\nconst picked = adapter.selectProvider(model, requirements); // throws: no provider offers 'vision'\n\n// after\nconst requirements = { capabilities: ['tools'] }; // keep only constraints at least one provider meets\nconst picked = adapter.selectProvider(model, requirements);","handlingStrategy":"validation","validationCode":"// Pre-check that at least one registered provider/model survives your requirements\nconst eligible = getRegisteredProviders() // however you enumerate the registry\n  .filter(p => p.status === 'available')\n  .some(p => p.models.some(m => meetsRequirements(m, requirements)));\nif (!eligible) {\n  throw new Error('Requirements exclude all registered providers — fix config before calling selection');\n}","typeGuard":"function isSatisfiableRequirements(req: TaskRequirements, providers: ProviderInfo[]): boolean {\n  return providers.some(p =>\n    p.models.some(m => (req.requiredCapabilities ?? []).every(c => m.capabilities.includes(c)))\n  );\n}","tryCatchPattern":"try {\n  const picked = adapter.selectProvider(model, requirements);\n} catch (e) {\n  if (e instanceof Error && e.message === 'No providers match the requirements') {\n    // log registered providers vs requirements, then relax or register — never retry unchanged\n  }\n  throw e;\n}","preventionTips":["Assert at startup that the provider registry is non-empty and matches your requirements","Keep an integration test that pins your requirements against the registered provider set","Treat this as a configuration error — the same inputs will fail every time"],"tags":["provider-selection","configuration","scoring","no-match"],"backgroundTag":"no-matching-provider","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"}