sendMessage method

  1. @override
Future<String> sendMessage({
  1. required String systemPrompt,
  2. required List<Map<String, String>> messages,
  3. int maxTokens = 4096,
})
override

Send messages and return the complete assistant response.

Implementation

@override
Future<String> sendMessage({
  required String systemPrompt,
  required List<Map<String, String>> messages,
  int maxTokens = 4096,
}) async {
  final token = await _auth.getAccessToken();
  final model = await _getModel();

  dev.log(
    'OpenAI API request: model=$model, '
    'systemPrompt=${systemPrompt.length} chars, '
    'messages=${messages.length}, '
    'maxTokens=$maxTokens',
    name: 'OpenAiDatasource',
  );

  final apiMessages = <Map<String, String>>[
    {'role': 'system', 'content': systemPrompt},
    ...messages,
  ];

  try {
    final response = await _dio.post(
      _provider.apiUrl,
      options: Options(
        headers: {
          'Authorization': 'Bearer $token',
          'content-type': 'application/json',
        },
      ),
      data: {
        'model': model,
        'max_completion_tokens': maxTokens,
        'messages': apiMessages,
      },
    );

    final data = response.data as Map<String, dynamic>;
    final choices = data['choices'] as List<dynamic>;
    if (choices.isEmpty) {
      throw Exception('No choices in OpenAI API response.');
    }
    final message = choices[0]['message'] as Map<String, dynamic>;
    return message['content'] as String;
  } on DioException catch (e) {
    throw _mapDioError(e);
  }
}