completionWithTools method

Future<CompletionResult> completionWithTools(
  1. List<ChatMessage> messages, {
  2. int maxTokens = 256,
  3. double? temperature,
  4. int? topK,
  5. double? topP,
  6. List<String>? stopSequences,
  7. CactusTokenCallback? onToken,
})

Implementation

Future<CompletionResult> completionWithTools(
  List<ChatMessage> messages, {
  int maxTokens = 256,
  double? temperature,
  int? topK,
  double? topP,
  List<String>? stopSequences,
  CactusTokenCallback? onToken,
}) async {
  if (_context == null) throw CactusException('CactusLM not initialized');

  if (_tools.isEmpty()) {
    final response = await completion(
      messages,
      maxTokens: maxTokens,
      temperature: temperature,
      topP: topP,
    );
    return CompletionResult(
      result: response.text,
      toolCalls: null,
    );
  }

  if (!isLoaded()) {
    return CompletionResult(
      result: "Model is not loaded",
      toolCalls: null,
    );
  }

  final toolSchemas = _tools.getSchemas();
  final toolsJson = jsonEncode(toolSchemas.map((e) => e.toJson()).toList());

  final userMessage = ChatMessage(role: 'user', content: messages.last.content);
  final formattedResult = await _context!.formatChatWithTools([userMessage], toolsJson);

  final params = CactusCompletionParams(
    messages: [ChatMessage(role: 'user', content: formattedResult.prompt)],
    maxPredictedTokens: maxTokens,
    temperature: temperature,
    topP: topP,
    chatTemplate: _chatTemplate,
    grammar: formattedResult.grammar,
  );

  final modelResponse = await _context!.completion(params);

  final toolResult = await parseAndExecuteTool(modelResponse.text, _tools);

  return CompletionResult(
    result: toolResult.toolCalled ? toolResult.toolOutput : modelResponse.text,
    toolCalls: toolResult.toolCalled ? [toolResult.toolName!] : null,
  );
}