preparePrompt method

String preparePrompt(
  1. String originalPrompt,
  2. String schema, {
  3. bool includeSchemaInPrompt = true,
})

Prepare prompt with structured output instructions Uses C++ rac_structured_output_prepare_prompt

Implementation

String preparePrompt(String originalPrompt, String schema,
    {bool includeSchemaInPrompt = true}) {
  final promptPtr = originalPrompt.toNativeUtf8();
  final schemaPtr = schema.toNativeUtf8();

  // Build config struct
  final configPtr = calloc<RacStructuredOutputConfigStruct>();
  configPtr.ref.jsonSchema = schemaPtr;
  configPtr.ref.includeSchemaInPrompt = includeSchemaInPrompt ? 1 : 0;

  final preparedPtrPtr = calloc<Pointer<Utf8>>();

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

    final result = preparePromptFn(promptPtr, configPtr, preparedPtrPtr);

    if (result != RAC_SUCCESS) {
      _logger.warning('preparePrompt failed with code $result');
      return _fallbackPreparePrompt(originalPrompt, schema,
          includeSchemaInPrompt: includeSchemaInPrompt);
    }

    final preparedPtr = preparedPtrPtr.value;
    if (preparedPtr == nullptr) {
      return _fallbackPreparePrompt(originalPrompt, schema,
          includeSchemaInPrompt: includeSchemaInPrompt);
    }

    final prepared = preparedPtr.toDartString();
    lib.lookupFunction<Void Function(Pointer<Void>),
        void Function(Pointer<Void>)>('rac_free')(preparedPtr.cast<Void>());

    return prepared;
  } catch (e) {
    _logger.error('preparePrompt exception: $e');
    return _fallbackPreparePrompt(originalPrompt, schema,
        includeSchemaInPrompt: includeSchemaInPrompt);
  } finally {
    calloc.free(promptPtr);
    calloc.free(schemaPtr);
    calloc.free(configPtr);
    calloc.free(preparedPtrPtr);
  }
}