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 message completion with automatic retry.

Implementation

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

      final url = Uri.parse('${config.baseUrl}/v1/messages');
      SintSentinel.logger.d('AnthropicClient.createMessage: POST $url (attempt: $attempt)');

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

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

      if (response.statusCode != 200) {
        SintSentinel.logger.e('AnthropicClient API error ${response.statusCode}: ${response.body}');
        throw classifyApiError(
          statusCode: response.statusCode,
          body: response.body,
          retryAfterHeader: response.headers['retry-after'],
        );
      }

      return _parseMessageResponse(jsonDecode(response.body));
    },
  );
}