rankOllamaModels function
List<RankedOllamaModel>
rankOllamaModels({
- required List<
OllamaModelDescriptor> models, - required RecommendationGoal goal,
Rank Ollama models by composite score for a given goal.
Implementation
List<RankedOllamaModel> rankOllamaModels({
required List<OllamaModelDescriptor> models,
required RecommendationGoal goal,
}) {
final ranked = models.map((model) {
final haystack = _modelHaystack(model);
final reasons = <String>[];
var score = 0.0;
if (_includesAny(haystack, _nonChatHints)) {
score -= 40;
reasons.add('not a chat-first model');
}
if (_includesAny(haystack, _codingHints)) {
score += goal == RecommendationGoal.coding
? 24
: goal == RecommendationGoal.balanced
? 10
: 4;
reasons.add('coding-oriented model family');
}
if (_includesAny(haystack, _generalHints)) {
score += goal == RecommendationGoal.latency
? 4
: goal == RecommendationGoal.coding
? 6
: 8;
reasons.add('strong general-purpose model family');
}
if (_includesAny(haystack, _instructHints)) {
score += goal == RecommendationGoal.latency ? 2 : 6;
reasons.add('chat/instruct tuned');
}
if (haystack.contains('vision') || haystack.contains('vl')) {
score -= 2;
reasons.add('vision model adds extra overhead');
}
score += _scoreSizeTier(_inferParameterBillions(model), goal, reasons);
score += _scoreQuantization(model, goal, reasons);
return RankedOllamaModel(
name: model.name,
sizeBytes: model.sizeBytes,
family: model.family,
families: model.families,
parameterSize: model.parameterSize,
quantizationLevel: model.quantizationLevel,
score: score,
reasons: reasons,
summary: reasons.take(3).join(', '),
);
}).toList();
ranked.sort((a, b) => _compareRankedModels(a, b, goal));
return ranked;
}