chatCompletion method

  1. @override
Future<ChatCompletionResponse> chatCompletion({
  1. required List<ChatMessage> messages,
  2. required ChatCompletionRequest options,
})
override

Implementation

@override
Future<ChatCompletionResponse> chatCompletion({required List<ChatMessage> messages, required ChatCompletionRequest options}) async {
  final body = _body(messages: messages, options: options);

  try {
    final response = await _client.post(
      Uri.parse('$_baseUrl/chat/completions'),
      headers: _headers(),
      body: jsonEncode(body),
    ).timeout(config.timeout);

    if (response.statusCode == 200) {
      final json = jsonDecode(response.body) as Map<String, dynamic>;
      return _parseResponse(json);
    } else if (response.statusCode == 401 || response.statusCode == 403) {
      throw AIAuthenticationException(
        'Authentication failed',
        provider: providerName,
        statusCode: response.statusCode,
      );
    } else if (response.statusCode == 429) {
      throw AIRateLimitException(
        'Rate limit exceeded',
        provider: providerName,
        statusCode: response.statusCode,
      );
    } else {
      final error = jsonDecode(response.body) as Map<String, dynamic>?;
      throw AIException(
        error?['error']?['message'] ?? 'Request failed',
        provider: providerName,
        statusCode: response.statusCode,
      );
    }
  } on TimeoutException {
    throw AINetworkException('Request timed out', provider: providerName);
  } catch (e) {
    if (e is AIException) rethrow;
    throw AINetworkException(e.toString(), provider: providerName);
  }
}