ruvnet/ruflo · error
No providers match the requirements
Error message
No providers match the requirements
What it means
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.
Source
Thrown at v3/@claude-flow/integration/src/provider-adapter.ts:540
const avgCost =
(provider.costPerToken.inputPer1K + provider.costPerToken.outputPer1K) / 2;
if (requirements.maxCostPer1K && avgCost > requirements.maxCostPer1K) {
continue;
}
// Calculate score
const { score, reasons } = this.calculateProviderScore(
provider,
model,
requirements
);
candidates.push({ provider, model, score, reasons });
}
}
if (candidates.length === 0) {
throw new Error('No providers match the requirements');
}
// Sort by score
candidates.sort((a, b) => b.score - a.score);
const best = candidates[0];
const alternatives = candidates.slice(1, 4).map(({ provider, model, score }) => ({
provider,
model,
score,
}));
this.emit('provider-selected', {
providerId: best.provider.id,
modelId: best.model.id,
score: best.score,
});
View on GitHub (pinned to fa13ee4ad6)
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
Example fix
// before
const requirements = { capabilities: ['tools', 'vision'], maxCostPerCall: 0.0001, maxLatencyMs: 100 };
const picked = adapter.selectProvider(model, requirements); // throws: no provider offers 'vision'
// after
const requirements = { capabilities: ['tools'] }; // keep only constraints at least one provider meets
const picked = adapter.selectProvider(model, requirements); Defensive patterns
Strategy: validation
Validate before calling
// Pre-check that at least one registered provider/model survives your requirements
const eligible = getRegisteredProviders() // however you enumerate the registry
.filter(p => p.status === 'available')
.some(p => p.models.some(m => meetsRequirements(m, requirements)));
if (!eligible) {
throw new Error('Requirements exclude all registered providers — fix config before calling selection');
} Type guard
function isSatisfiableRequirements(req: TaskRequirements, providers: ProviderInfo[]): boolean {
return providers.some(p =>
p.models.some(m => (req.requiredCapabilities ?? []).every(c => m.capabilities.includes(c)))
);
} Try / catch
try {
const picked = adapter.selectProvider(model, requirements);
} catch (e) {
if (e instanceof Error && e.message === 'No providers match the requirements') {
// log registered providers vs requirements, then relax or register — never retry unchanged
}
throw e;
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- Pool ${this.id} at maximum capacity (${this.config.maxWorker
- Invalid completion type
- MCP server "${server.name}" returned HTTP ${httpStatus}: ${h
- No endpoints configured. This build requires OpenAI-compatib
- Only 'openai' endpoint type is supported in this build
AI-assisted analysis of ruvnet/ruflo@fa13ee4ad6 (2026-08-18).
Data as JSON: /api/errors/6a31c1b5d61e4748.
Report an issue: GitHub.