applyModelsResponse method
void
applyModelsResponse(
- Map<String, dynamic> payload
)
Implementation
void applyModelsResponse(Map<String, dynamic> payload) {
final providers = payload['providers'];
if (providers is! List) {
return;
}
final nextModels = <DatasetChatModelOption>[];
DatasetChatModelOption? active;
for (final providerValue in providers) {
if (providerValue is! Map) {
continue;
}
final provider = providerValue['name']?.toString().trim();
if (provider == null || provider.isEmpty) {
continue;
}
final backend = providerValue['backend']?.toString().trim();
final providerFriendlyName = providerValue['friendly_name']?.toString() ?? provider;
final models = providerValue['models'];
if (models is! List) {
continue;
}
for (final modelValue in models) {
if (modelValue is! Map) {
continue;
}
final model = modelValue['name']?.toString().trim();
if (model == null || model.isEmpty) {
continue;
}
final rawModalities = modelValue['modalities'];
final modalities = rawModalities is List
? [
for (final value in rawModalities)
if (value.toString().trim().isNotEmpty) value.toString().trim(),
]
: const <String>['text'];
final option = DatasetChatModelOption(
backend: backend == null || backend.isEmpty ? null : backend,
provider: provider,
providerFriendlyName: providerFriendlyName,
model: model,
modelFriendlyName: modelValue['friendly_name']?.toString(),
modelDescription: modelValue['description']?.toString(),
modalities: modalities.isEmpty ? const <String>['text'] : modalities,
availableVoices: _stringList(modelValue['available_voices']),
defaultOutputVoice: modelValue['default_output_voice']?.toString(),
inputFormat: DatasetChatAudioFormat.fromJson(modelValue['input_format']),
outputFormat: DatasetChatAudioFormat.fromJson(modelValue['output_format']),
turnDetection: modelValue['turn_detection']?.toString(),
realtimeProtocols: _stringList(modelValue['realtime_protocols']),
supportsAttachments: modelValue['supports_attachments'] == true,
accepts: _stringList(modelValue['accepts']),
active: modelValue['active'] == true,
);
nextModels.add(option);
if (option.active) {
active = option;
}
}
}
final priorActive = _activeModel;
if (priorActive != null) {
final refreshedActive = nextModels.firstWhereOrNull((option) => option.key == priorActive.key);
if (refreshedActive != null) {
active = refreshedActive;
}
}
active ??= nextModels.isEmpty ? null : nextModels.first;
_models = [for (final option in nextModels) option.copyWith(active: option.key == active?.key)];
_activeModel = active?.copyWith(active: true);
_activeModality = _resolvedOutputModality(_activeModel, _activeModality);
_activeVoice = _resolvedVoice(_activeModel, _activeVoice);
_notifyChanged();
}