rankOllamaModels function

List<RankedOllamaModel> rankOllamaModels({
  1. required List<OllamaModelDescriptor> models,
  2. 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;
}