buildFollowupPrompt method
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 '';
}
}