chat method

  1. @override
Future<String> chat({
  1. required String apiKey,
  2. required String model,
  3. required ChatRequest request,
})
override

Multi-turn. Returns the assistant's raw text for the final turn.

Implementation

@override
Future<String> chat({
  required String apiKey,
  required String model,
  required ChatRequest request,
}) async {
  final body = jsonEncode(_buildPayload(model, request, stream: false));
  final res = await retryRequest(
    send: () => _http
        .post(
          Uri.parse('$_baseUrl/chat/completions'),
          headers: {
            'Authorization': 'Bearer $apiKey',
            'Content-Type': 'application/json',
          },
          body: body,
        )
        .timeout(_timeout),
    providerLabel: 'OpenAI',
    isHardFailure: (r) =>
        r.statusCode == 429 && r.body.toLowerCase().contains('quota'),
  );
  final json = jsonDecode(res.body) as Map<String, Object?>;
  final choices = json['choices'] as List<Object?>?;
  if (choices == null || choices.isEmpty) {
    throw const AiBrokerException('OpenAI returned no choices.');
  }
  final first = choices.first as Map<String, Object?>;
  final message = first['message'] as Map<String, Object?>?;
  final content = message?['content'] as String?;
  if (content == null || content.isEmpty) {
    throw const AiBrokerException('OpenAI returned empty content.');
  }
  return content.trim();
}