346 List<GCHandle> handle_list =
new List<GCHandle>();
347 int len = messages.Count;
348 byte[][] role_text_list =
new byte [len][];
349 byte[][] content_text_list =
new byte [len][];
350 AiliaLLM.AILIALLMMultimodalChatMessage [] message_list =
new AiliaLLM.AILIALLMMultimodalChatMessage[len];
353 List<byte[][]> media_type_lists =
new List<byte[][]>();
354 List<byte[][]> media_path_lists =
new List<byte[][]>();
355 List<AiliaLLM.AILIALLMMediaData[]> media_data_arrays =
new List<AiliaLLM.AILIALLMMediaData[]>();
357 for (
int i = 0; i < len; i++){
358 AiliaLLM.AILIALLMMultimodalChatMessage message =
new AiliaLLM.AILIALLMMultimodalChatMessage();
361 role_text_list[i] = System.Text.Encoding.UTF8.GetBytes(messages[i].role+
"\u0000");
362 GCHandle role_handle = GCHandle.Alloc(role_text_list[i], GCHandleType.Pinned);
363 IntPtr role_input = role_handle.AddrOfPinnedObject();
365 content_text_list[i] = System.Text.Encoding.UTF8.GetBytes(messages[i].content+
"\u0000");
366 GCHandle content_handle = GCHandle.Alloc(content_text_list[i], GCHandleType.Pinned);
367 IntPtr content_input = content_handle.AddrOfPinnedObject();
369 message.role = role_input;
370 message.content = content_input;
372 handle_list.Add(role_handle);
373 handle_list.Add(content_handle);
376 if (messages[i].media_data !=
null && messages[i].media_data.Count > 0){
377 int media_count = messages[i].media_data.Count;
378 message.media_count = (uint)media_count;
380 byte[][] media_type_list =
new byte[media_count][];
381 byte[][] media_path_list =
new byte[media_count][];
382 AiliaLLM.AILIALLMMediaData[] media_array =
new AiliaLLM.AILIALLMMediaData[media_count];
384 for (
int j = 0; j < media_count; j++){
385 AiliaLLM.AILIALLMMediaData media =
new AiliaLLM.AILIALLMMediaData();
388 media_type_list[j] = System.Text.Encoding.UTF8.GetBytes(messages[i].media_data[j].media_type+
"\u0000");
389 GCHandle type_handle = GCHandle.Alloc(media_type_list[j], GCHandleType.Pinned);
390 media.media_type = type_handle.AddrOfPinnedObject();
391 handle_list.Add(type_handle);
394 if (!
string.IsNullOrEmpty(messages[i].media_data[j].file_path)){
395 media_path_list[j] = System.Text.Encoding.UTF8.GetBytes(messages[i].media_data[j].file_path+
"\u0000");
396 GCHandle path_handle = GCHandle.Alloc(media_path_list[j], GCHandleType.Pinned);
397 media.file_path = path_handle.AddrOfPinnedObject();
398 handle_list.Add(path_handle);
400 media.file_path = IntPtr.Zero;
404 if (messages[i].media_data[j].data !=
null && messages[i].media_data[j].data.Length > 0){
405 GCHandle data_handle = GCHandle.Alloc(messages[i].media_data[j].data, GCHandleType.Pinned);
406 media.data = data_handle.AddrOfPinnedObject();
407 media.data_size = (uint)messages[i].media_data[j].data.Length;
408 handle_list.Add(data_handle);
410 media.data = IntPtr.Zero;
414 media.width = messages[i].media_data[j].width;
415 media.height = messages[i].media_data[j].height;
417 media_array[j] = media;
420 media_type_lists.Add(media_type_list);
421 media_path_lists.Add(media_path_list);
422 media_data_arrays.Add(media_array);
425 int media_size = Marshal.SizeOf(typeof(AiliaLLM.AILIALLMMediaData)) * media_count;
426 IntPtr media_ptr = Marshal.AllocHGlobal(media_size);
428 for (
int j = 0; j < media_count; j++){
429 IntPtr offset =
new IntPtr(media_ptr.ToInt64() + j * Marshal.SizeOf(typeof(AiliaLLM.AILIALLMMediaData)));
430 Marshal.StructureToPtr(media_array[j], offset,
false);
433 message.media_data = media_ptr;
435 message.media_count = 0;
436 message.media_data = IntPtr.Zero;
439 message_list[i] = message;
442 int size = Marshal.SizeOf(typeof(AiliaLLM.AILIALLMMultimodalChatMessage)) * message_list.Length;
443 IntPtr ptr = Marshal.AllocHGlobal(size);
449 for (
int i = 0; i < message_list.Length; i++)
451 IntPtr offset =
new IntPtr(ptr.ToInt64() + i * Marshal.SizeOf(typeof(AiliaLLM.AILIALLMMultimodalChatMessage)));
452 Marshal.StructureToPtr(message_list[i], offset,
false);
455 status = AiliaLLM.ailiaLLMSetMultimodalPrompt(net, ptr, (uint)len);
460 Marshal.FreeHGlobal(ptr);
461 for (
int i = 0; i < message_list.Length; i++){
462 if (message_list[i].media_data != IntPtr.Zero){
463 Marshal.FreeHGlobal(message_list[i].media_data);
468 for (
int i = 0; i < handle_list.Count; i++){
469 handle_list[i].Free();
472 context_full =
false;
479 Debug.Log(
"ailiaLLMSetMultimodalPrompt failed " + status);
481 if (status == AiliaLLM.AILIA_LLM_STATUS_CONTEXT_FULL){