Set multimodal prompt messages.
376 List<GCHandle> handle_list =
new List<GCHandle>();
377 int len = messages.Count;
378 byte[][] role_text_list =
new byte [len][];
379 byte[][] content_text_list =
new byte [len][];
380 AiliaLLM.AILIALLMMultimodalChatMessage [] message_list =
new AiliaLLM.AILIALLMMultimodalChatMessage[len];
383 List<byte[][]> media_type_lists =
new List<byte[][]>();
384 List<byte[][]> media_path_lists =
new List<byte[][]>();
385 List<AiliaLLM.AILIALLMMediaData[]> media_data_arrays =
new List<AiliaLLM.AILIALLMMediaData[]>();
387 for (
int i = 0; i < len; i++){
388 AiliaLLM.AILIALLMMultimodalChatMessage message =
new AiliaLLM.AILIALLMMultimodalChatMessage();
391 role_text_list[i] = System.Text.Encoding.UTF8.GetBytes(messages[i].role+
"\u0000");
392 GCHandle role_handle = GCHandle.Alloc(role_text_list[i], GCHandleType.Pinned);
393 IntPtr role_input = role_handle.AddrOfPinnedObject();
395 content_text_list[i] = System.Text.Encoding.UTF8.GetBytes(messages[i].content+
"\u0000");
396 GCHandle content_handle = GCHandle.Alloc(content_text_list[i], GCHandleType.Pinned);
397 IntPtr content_input = content_handle.AddrOfPinnedObject();
399 message.role = role_input;
400 message.content = content_input;
402 handle_list.Add(role_handle);
403 handle_list.Add(content_handle);
406 if (messages[i].media_data !=
null && messages[i].media_data.Count > 0){
407 int media_count = messages[i].media_data.Count;
408 message.media_count = (uint)media_count;
410 byte[][] media_type_list =
new byte[media_count][];
411 byte[][] media_path_list =
new byte[media_count][];
412 AiliaLLM.AILIALLMMediaData[] media_array =
new AiliaLLM.AILIALLMMediaData[media_count];
414 for (
int j = 0; j < media_count; j++){
415 AiliaLLM.AILIALLMMediaData media =
new AiliaLLM.AILIALLMMediaData();
418 media_type_list[j] = System.Text.Encoding.UTF8.GetBytes(messages[i].media_data[j].media_type+
"\u0000");
419 GCHandle type_handle = GCHandle.Alloc(media_type_list[j], GCHandleType.Pinned);
420 media.media_type = type_handle.AddrOfPinnedObject();
421 handle_list.Add(type_handle);
424 if (!
string.IsNullOrEmpty(messages[i].media_data[j].file_path)){
425 media_path_list[j] = System.Text.Encoding.UTF8.GetBytes(messages[i].media_data[j].file_path+
"\u0000");
426 GCHandle path_handle = GCHandle.Alloc(media_path_list[j], GCHandleType.Pinned);
427 media.file_path = path_handle.AddrOfPinnedObject();
428 handle_list.Add(path_handle);
430 media.file_path = IntPtr.Zero;
434 if (messages[i].media_data[j].data !=
null && messages[i].media_data[j].data.Length > 0){
435 GCHandle data_handle = GCHandle.Alloc(messages[i].media_data[j].data, GCHandleType.Pinned);
436 media.data = data_handle.AddrOfPinnedObject();
437 media.data_size = (uint)messages[i].media_data[j].data.Length;
438 handle_list.Add(data_handle);
440 media.data = IntPtr.Zero;
444 media.width = messages[i].media_data[j].width;
445 media.height = messages[i].media_data[j].height;
447 media_array[j] = media;
450 media_type_lists.Add(media_type_list);
451 media_path_lists.Add(media_path_list);
452 media_data_arrays.Add(media_array);
455 int media_size = Marshal.SizeOf(typeof(AiliaLLM.AILIALLMMediaData)) * media_count;
456 IntPtr media_ptr = Marshal.AllocHGlobal(media_size);
458 for (
int j = 0; j < media_count; j++){
459 IntPtr offset =
new IntPtr(media_ptr.ToInt64() + j * Marshal.SizeOf(typeof(AiliaLLM.AILIALLMMediaData)));
460 Marshal.StructureToPtr(media_array[j], offset,
false);
463 message.media_data = media_ptr;
465 message.media_count = 0;
466 message.media_data = IntPtr.Zero;
469 message_list[i] = message;
472 int size = Marshal.SizeOf(typeof(AiliaLLM.AILIALLMMultimodalChatMessage)) * message_list.Length;
473 IntPtr ptr = Marshal.AllocHGlobal(size);
479 for (
int i = 0; i < message_list.Length; i++)
481 IntPtr offset =
new IntPtr(ptr.ToInt64() + i * Marshal.SizeOf(typeof(AiliaLLM.AILIALLMMultimodalChatMessage)));
482 Marshal.StructureToPtr(message_list[i], offset,
false);
485 status = AiliaLLM.ailiaLLMSetMultimodalPrompt(net, ptr, (uint)len);
490 Marshal.FreeHGlobal(ptr);
491 for (
int i = 0; i < message_list.Length; i++){
492 if (message_list[i].media_data != IntPtr.Zero){
493 Marshal.FreeHGlobal(message_list[i].media_data);
498 for (
int i = 0; i < handle_list.Count; i++){
499 handle_list[i].Free();
502 context_full =
false;
509 Debug.Log(
"ailiaLLMSetMultimodalPrompt failed " + status);
511 if (status == AiliaLLM.AILIA_LLM_STATUS_CONTEXT_FULL){