prompt method

Future<void> prompt({
  1. String? message,
  2. List<Message>? previousMessages,
  3. required void onChunk(
    1. Message message,
    2. String chunk
    ),
  4. void onMessageCreated(
    1. Message msg
    )?,
  5. void onMessageCreateError(
    1. Object error
    )?,
})

Implementation

Future<void> prompt({
  String? message,
  List<Message>? previousMessages,
  required void Function(Message message, String chunk) onChunk,
  void Function(Message msg)? onMessageCreated,
  void Function(Object error)? onMessageCreateError,
}) async {
  var threadId = conversation.id!;

  // Adding the message sent
  Message? selfMessage;
  if (message != null) {
    selfMessage = Message(
      date: DateTime.now(),
      text: message,
      role: Role.user,
    );
    conversation.messages.add(selfMessage);
  }

  // Creating message object to update on every chunk.
  var msg = Message(
    date: DateTime.now(),
    text: '',
    role: Role.assistant,
  );
  conversation.messages.add(msg);

  // Obtaining stream of characters of the response.
  var stream = completion.fetchStream(
    onError: onError,
    retries: retries,
    onJsonComplete: onJsonComplete,
    previousMessages: [
      if (selfMessage != null) selfMessage,
      ...previousMessages ?? [],
    ],
  );
  await for (var chunk in stream) {
    msg.text += chunk;
    onChunk(msg, chunk);
  }

  /// We don't need to wait for this.
  /// Use [onMessageCreated] if necessary.
  Future<void> createMessage(Message msg) async {
    try {
      if (msg.text.isEmpty) {
        throw Exception('Message text is empty');
      }
      await threads.createMessage(threadId, msg);
      if (onMessageCreated != null) onMessageCreated(msg);
    } catch (e) {
      if (onMessageCreateError != null) onMessageCreateError(e);
    }
  }

  if (!completion.addsPreviousMessagesToThread) {
    Future<void> createPreviousMessages() async {
      for (var pm in previousMessages ?? []) {
        await createMessage(pm);
      }
      if (selfMessage != null) await createMessage(selfMessage);
    }

    createPreviousMessages();
  }

  // Saving response message to the thread
  if (!completion.addsResponseAutomatically) {
    createMessage(msg);
  }
}