applyModelsResponse method

void applyModelsResponse(
  1. 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();
}