generateCompletion method

Future<CactusCompletionResult> generateCompletion({
  1. required List<ChatMessage> messages,
  2. CactusCompletionParams? params,
})

Implementation

Future<CactusCompletionResult> generateCompletion({
  required List<ChatMessage> messages,
  CactusCompletionParams? params
}) async {
  return await _handleLock.synchronized(() async {
    CactusCompletionParams completionParams = params ?? defaultCompletionParams;
    final model = params?.model ?? _lastInitializedModel ?? defaultInitParams.model;
    int? currentHandle = await _getValidatedHandle(model: model, reInit: completionParams.tools?.isNotEmpty == true);
    int quantization = (await Supabase.getModel(model))?.quantization ?? 8;

    if (currentHandle != null) {
      if(completionParams.tools != null) {
        List<CactusTool>? toolsToUse = completionParams.tools;
        if (enableToolFiltering && completionParams.tools != null && completionParams.tools!.isNotEmpty) {
          toolsToUse = await _filterTools(messages, completionParams.tools!);
        }

        // Create params with filtered tools
        completionParams = CactusCompletionParams(
          temperature: completionParams.temperature,
          topK: completionParams.topK,
          topP: completionParams.topP,
          maxTokens: completionParams.maxTokens,
          stopSequences: completionParams.stopSequences,
          tools: toolsToUse,
          completionMode: completionParams.completionMode
        );
      }
      try {
        final result = await CactusContext.completion(currentHandle, messages, completionParams, quantization);
        _logCompletionTelemetry(result, model, success: result.success, message: result.success ? null : result.response);
        return result;
      } catch (e) {
        debugPrint('Local completion failed: $e');
        if (completionParams.completionMode == CompletionMode.local || (completionParams.completionMode == CompletionMode.hybrid && completionParams.cactusToken == null)) {
          _logCompletionTelemetry(null, model, success: false, message: e.toString());
          rethrow;
        }
        debugPrint('Falling back to cloud completion');
      }
    }

    if (completionParams.completionMode == CompletionMode.hybrid && completionParams.cactusToken != null) {
      try {
        final openRouterService = OpenRouterService(apiKey: completionParams.cactusToken!);
        final result = await openRouterService.generateCompletion(
          messages: messages,
          params: params,
        );
        openRouterService.dispose();
        _logCompletionTelemetry(result, model, success: result.success, message: result.success ? null : result.response);
        return result;
      } catch (e) {
        _logCompletionTelemetry(null, model, success: false, message: 'Cloud completion failed: $e');
        throw Exception('Cloud completion failed: $e');
      }
    }

    throw Exception('Model $_lastInitializedModel is not downloaded. Please download it before generating completions.');
  });
}