createMessage method

  1. @override
Future<Message> createMessage({
  1. required List<Message> messages,
  2. required String systemPrompt,
  3. List<ToolDefinition> tools = const [],
  4. int? maxTokens,
})
override

Send a non-streaming completion via the Gemini generateContent endpoint.

Implementation

@override
Future<Message> createMessage({
  required List<Message> messages,
  required String systemPrompt,
  List<ToolDefinition> tools = const [],
  int? maxTokens,
}) async {
  final body = _buildRequestBody(
    messages: messages,
    systemPrompt: systemPrompt,
    tools: tools,
    maxTokens: maxTokens,
  );

  final url = '${config.baseUrl}/models/${config.model}'
      ':generateContent?key=${config.apiKey}';

  _log.d('Gemini non-streaming request to ${config.model}');

  final response = await http.post(
    Uri.parse(url),
    headers: {
      'Content-Type': 'application/json',
      ...config.extraHeaders,
    },
    body: jsonEncode(body),
  );

  if (response.statusCode != 200) {
    _log.e('Gemini API error ${response.statusCode}: ${response.body}');
    throw Exception(
      'Gemini API error ${response.statusCode}: ${response.body}',
    );
  }

  return _parseResponse(jsonDecode(response.body) as Map<String, dynamic>);
}