chatWithAgentStream method

Stream<Either<String, List<LlmChatMessage>>> chatWithAgentStream({
  1. required String model,
  2. required List<LlmChatMessage> messages,
  3. String? sessionId,
  4. int? maxTokens,
  5. double? temperature,
})

Implementation

Stream<Either<String, List<LlmChatMessage>>> chatWithAgentStream({
  required String model,
  required List<LlmChatMessage> messages,
  String? sessionId,
  int? maxTokens,
  double? temperature,
}) async* {
  try {
    var body = {
      "stream": true,
      "sessionId": sessionId,
      "model": model,
      "messages": messages
          .map((e) => {'role': e.type, 'content': e.message ?? ''})
          .toList(),
    };
    if (maxTokens != null) {
      body['maxTokens'] = maxTokens;
    }
    if (temperature != null) {
      body['temperature'] = temperature;
    }
    final stream = StreamClient.postChatStream(
      apiKey: apiKey,
      fullPath: '$baseUrl/v1/chat/completions',
      body: body,
      onSuccess: (ChatStreamResponse response) {
        return response;
      },
      onError: (error) {
        debugPrint('streamAiChat onError callback: $error');
        return error;
      },
    );

    bool firstResponseReceived = false;

    await for (var event in stream) {
      if (event is ChatStreamResponse) {
        final _messages = handleResponse(
          response: event,
          messages: messages,
          onFirstResponseReceived: () {
            firstResponseReceived = false;
          },
          firstResponseReceived: firstResponseReceived,
        );
        yield Right(_messages);
        firstResponseReceived = true;
      } else {
        debugPrint('streamAiChat yielding left');
        yield Left(event.toString());
      }
    }
  } catch (e) {
    debugPrint('chatWithAgent yielding left on exception $e');
    yield Left(e.toString());
  }
}