generateCompletion method
Future<CactusCompletionResult>
generateCompletion({
- required List<
ChatMessage> messages, - 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.');
});
}