Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
import 'package:flutter/services.dart'; | |
import 'package:yaml/yaml.dart'; | |
/// Represents a curated LLM model with metadata | |
class CuratedModel { | |
final String modelId; | |
final String displayName; | |
final String numOfParameters; | |
const CuratedModel({ | |
required this.modelId, | |
required this.displayName, | |
required this.numOfParameters, | |
}); | |
/// Get speed category based on parameter count | |
String get speedCategory { | |
final paramValue = _parseParameters(numOfParameters); | |
if (paramValue <= 1) return 'Fastest'; | |
if (paramValue <= 2) return 'Faster'; | |
if (paramValue <= 4) return 'Fast'; | |
if (paramValue < 8) return 'Normal'; | |
if (paramValue < 17) return 'Slow'; | |
if (paramValue < 32) return 'Slower'; | |
return 'Slowest'; | |
} | |
/// Get speed emoji for visual representation | |
String get speedEmoji { | |
switch (speedCategory) { | |
case 'Fastest': | |
return 'π'; | |
case 'Faster': | |
return 'β‘'; | |
case 'Fast': | |
return 'π'; | |
case 'Normal': | |
return 'πΆ'; | |
case 'Slow': | |
return 'π'; | |
case 'Slower': | |
return 'π’'; | |
case 'Slowest': | |
return 'π¦₯'; | |
default: | |
return 'β'; | |
} | |
} | |
/// Parse parameter string to numeric value (in billions) | |
double _parseParameters(String params) { | |
final numStr = params.replaceAll('B', '').trim(); | |
return double.tryParse(numStr) ?? 0.0; | |
} | |
/// Create from YAML map | |
factory CuratedModel.fromYaml(YamlMap yaml) { | |
return CuratedModel( | |
modelId: yaml['model_id'] as String, | |
displayName: yaml['display_name'] as String, | |
numOfParameters: yaml['num_of_parameters'] as String, | |
); | |
} | |
/// Load all curated models from assets | |
static Future<List<CuratedModel>> loadFromAssets() async { | |
try { | |
final yamlString = await rootBundle.loadString('assets/config/curated_models.yaml'); | |
final yamlData = loadYaml(yamlString); | |
final models = <CuratedModel>[]; | |
if (yamlData['models'] != null) { | |
for (final modelYaml in yamlData['models']) { | |
models.add(CuratedModel.fromYaml(modelYaml)); | |
} | |
} | |
// Sort by parameter count (smallest first) | |
models.sort((a, b) => a._parseParameters(a.numOfParameters) | |
.compareTo(b._parseParameters(b.numOfParameters))); | |
return models; | |
} catch (e) { | |
// Return default models if loading fails | |
return _defaultModels; | |
} | |
} | |
/// Default models in case asset loading fails | |
static const List<CuratedModel> _defaultModels = [ | |
CuratedModel( | |
modelId: ' Qwen/Qwen3-0.6B', | |
displayName: ' Qwen/Qwen 0.6B', | |
numOfParameters: '0.6B', | |
), | |
CuratedModel( | |
modelId: 'Unbabel/Tower-Plus-2B', | |
displayName: 'Tower-Plus-2B', | |
numOfParameters: '2B', | |
), | |
]; | |
bool operator ==(Object other) => | |
identical(this, other) || | |
other is CuratedModel && | |
runtimeType == other.runtimeType && | |
modelId == other.modelId; | |
int get hashCode => modelId.hashCode; | |
String toString() => 'CuratedModel(modelId: $modelId, displayName: $displayName, parameters: $numOfParameters)'; | |
} |