chat method
Future<String>
chat({
- required String apiKey,
- required String model,
- 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();
}