updateVoiceMode method

void updateVoiceMode(
  1. bool useRealtimeApi
)

Implementation

void updateVoiceMode(bool useRealtimeApi) {
  voiceModeProvider.stopVoiceMode();
  voiceModeProvider.dispose();

  if (useRealtimeApi) {
    var p = RealtimeVoiceModeProvider(
      onStart: () async {
        notifyListeners();
        await _createConversationIfNecessary();
      },
      setStatus: (status) {
        this.status = status;
        notifyListeners();
      },
      onTranscriptionEnd: (transcriptionEnd) async {
        var msg = Message(
          id: transcriptionEnd.id,
          date: DateTime.now(),
          role: transcriptionEnd.role,
          text: transcriptionEnd.content,
        );
        messages.add(msg);

        if (transcriptionEnd.role == Role.user) {
          var id = conversation?.id;
          if (id != null) {
            var rep = createThreadsRepository();
            await rep.createMessage(id, msg);
          }
        }
      },
      onResponse: (response) async {
        var outputItem = response.output.firstWhereOrNull((x) {
          return x.role == Role.assistant;
        });
        var content = outputItem?.content.single;
        var text = content?.text ?? content?.transcript;
        if (text == null) return;

        var msg = Message.assistant(
          message: text,
          usage: response.usage,
        );
        var id = conversation?.id;
        if (id != null) {
          var rep = createThreadsRepository();
          await rep.createMessage(id, msg);
        }
      },
      onError: (errorMessage) {
        _showError(
          title: 'Erro',
          message: errorMessage,
        );
      },
    );

    voiceModeProvider = p;
  } else {
    voiceModeProvider = VoiceModeProvider(
      errorReporter: (context, message) {
        _showError(
          title: context,
          message: message,
        );
      },
      notifyListeners: () => notifyListeners(),
      isVoiceMode: () => isVoiceMode,
      setStatus: (status) => this.status = status,
      getStatus: () => status,
      send: ({
        required onChunk,
        required text,
      }) async {
        controller.text = text;
        await send(
          onChunk: onChunk,
          endStatus: null,
        );
      },
    );
  }
}