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 chat completion and return the response as a Message.

Implementation

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

  final body = <String, dynamic>{
    'model': config.model,
    'messages': openAiMessages,
    'max_tokens': maxTokens ?? config.maxTokens,
  };

  if (tools.isNotEmpty) {
    body['tools'] = tools.map((t) => t.toOpenAiMap()).toList();
  }

  final url = Uri.parse('${config.baseUrl}/chat/completions');
  SintSentinel.logger.d('OpenAiShim.createMessage: POST $url');

  final response = await SintSentinel.guard(
    () => http.post(url, headers: _headers, body: jsonEncode(body)),
    tag: 'OpenAiShim.createMessage',
  );

  SintSentinel.logger.d('OpenAiShim.createMessage response: ${response.statusCode}');

  if (response.statusCode != 200) {
    SintSentinel.logger.e('OpenAiShim API error ${response.statusCode}: ${response.body}');
    throw Exception(
      'OpenAI API error ${response.statusCode}: ${response.body}',
    );
  }

  return _parseOpenAiResponse(jsonDecode(response.body));
}