validate method

Validate structured output Uses C++ rac_structured_output_validate

Implementation

StructuredOutputValidationResult validate(String text, String schema) {
  final textPtr = text.toNativeUtf8();
  final schemaPtr = schema.toNativeUtf8();

  final configPtr = calloc<RacStructuredOutputConfigStruct>();
  configPtr.ref.jsonSchema = schemaPtr;
  configPtr.ref.includeSchemaInPrompt = 1;

  final validationPtr = calloc<RacStructuredOutputValidationStruct>();

  try {
    final lib = PlatformLoader.loadCommons();
    final validateFn = lib.lookupFunction<
            Int32 Function(
                Pointer<Utf8>,
                Pointer<RacStructuredOutputConfigStruct>,
                Pointer<RacStructuredOutputValidationStruct>),
            int Function(
                Pointer<Utf8>,
                Pointer<RacStructuredOutputConfigStruct>,
                Pointer<RacStructuredOutputValidationStruct>)>(
        'rac_structured_output_validate');

    final result = validateFn(textPtr, configPtr, validationPtr);

    if (result != RAC_SUCCESS) {
      return _fallbackValidate(text);
    }

    final validation = validationPtr.ref;
    final isValid = validation.isValid == 1;
    final containsJson = validation.extractedJson != nullptr;

    String? errorMessage;
    if (validation.errorMessage != nullptr) {
      errorMessage = validation.errorMessage.toDartString();
      lib.lookupFunction<Void Function(Pointer<Void>),
          void Function(Pointer<Void>)>('rac_free')(
        validation.errorMessage.cast<Void>(),
      );
    }

    if (validation.extractedJson != nullptr) {
      lib.lookupFunction<Void Function(Pointer<Void>),
          void Function(Pointer<Void>)>('rac_free')(
        validation.extractedJson.cast<Void>(),
      );
    }

    return StructuredOutputValidationResult(
      isValid: isValid,
      containsJSON: containsJson,
      error: errorMessage,
    );
  } catch (e) {
    _logger.error('validate exception: $e');
    return _fallbackValidate(text);
  } finally {
    calloc.free(textPtr);
    calloc.free(schemaPtr);
    calloc.free(configPtr);
    calloc.free(validationPtr);
  }
}