buildFollowupPrompt method

String buildFollowupPrompt({
  1. required String originalPrompt,
  2. String? toolsPrompt,
  3. required String toolName,
  4. required String toolResultJson,
  5. bool keepToolsAvailable = false,
})

Build follow-up prompt after tool execution using C++ implementation.

originalPrompt The original user prompt toolsPrompt Formatted tools prompt (can be empty) toolName Name of executed tool toolResultJson Tool result as JSON keepToolsAvailable Whether to keep tools in follow-up Returns follow-up prompt string

Implementation

String buildFollowupPrompt({
  required String originalPrompt,
  String? toolsPrompt,
  required String toolName,
  required String toolResultJson,
  bool keepToolsAvailable = false,
}) {
  try {
    final buildFn = lib.lookupFunction<
        Int32 Function(
          Pointer<Utf8>,
          Pointer<Utf8>,
          Pointer<Utf8>,
          Pointer<Utf8>,
          Int32,
          Pointer<Pointer<Utf8>>,
        ),
        int Function(
          Pointer<Utf8>,
          Pointer<Utf8>,
          Pointer<Utf8>,
          Pointer<Utf8>,
          int,
          Pointer<Pointer<Utf8>>,
        )>('rac_tool_call_build_followup_prompt');

    final racFreeFn = lib.lookupFunction<Void Function(Pointer<Void>),
        void Function(Pointer<Void>)>('rac_free');

    final originalPtr = originalPrompt.toNativeUtf8();
    final toolsPromptPtr =
        toolsPrompt != null ? toolsPrompt.toNativeUtf8() : nullptr;
    final toolNamePtr = toolName.toNativeUtf8();
    final resultPtr = toolResultJson.toNativeUtf8();
    final promptPtrPtr = calloc<Pointer<Utf8>>();

    try {
      final rc = buildFn(
        originalPtr,
        toolsPromptPtr,
        toolNamePtr,
        resultPtr,
        keepToolsAvailable ? RAC_TRUE : RAC_FALSE,
        promptPtrPtr,
      );

      if (rc != RAC_SUCCESS || promptPtrPtr.value == nullptr) {
        return '';
      }

      final result = promptPtrPtr.value.toDartString();
      racFreeFn(promptPtrPtr.value.cast());
      return result;
    } finally {
      calloc.free(originalPtr);
      if (toolsPromptPtr != nullptr) calloc.free(toolsPromptPtr);
      calloc.free(toolNamePtr);
      calloc.free(resultPtr);
      calloc.free(promptPtrPtr);
    }
  } catch (e) {
    _logger.error('buildFollowupPrompt failed: $e');
    return '';
  }
}