190 List<GCHandle> handle_list =
new List<GCHandle>();
191 int len = messages.Count;
192 byte[][] role_text_list =
new byte [len][];
193 byte[][] conntent_text_list =
new byte [len][];
194 AiliaLLM.AILIAChatMessage [] message_list =
new AiliaLLM.AILIAChatMessage[len];
195 for (
int i = 0; i< len; i++){
196 AiliaLLM.AILIAChatMessage message =
new AiliaLLM.AILIAChatMessage();
198 role_text_list[i] = System.Text.Encoding.UTF8.GetBytes(messages[i].role+
"\u0000");
199 GCHandle role_handle = GCHandle.Alloc(role_text_list[i], GCHandleType.Pinned);
200 IntPtr role_input = role_handle.AddrOfPinnedObject();
202 conntent_text_list[i] = System.Text.Encoding.UTF8.GetBytes(messages[i].content+
"\u0000");
203 GCHandle content_handle = GCHandle.Alloc(conntent_text_list[i], GCHandleType.Pinned);
204 IntPtr content_input = content_handle.AddrOfPinnedObject();
206 message.role = role_input;
207 message.content = content_input;
208 message_list[i] = message;
210 handle_list.Add(role_handle);
211 handle_list.Add(content_handle);
214 int size = Marshal.SizeOf(typeof(AiliaLLM.AILIAChatMessage)) * message_list.Length;
215 IntPtr ptr = Marshal.AllocHGlobal(size);
221 for (
int i = 0; i < message_list.Length; i++)
223 IntPtr offset =
new IntPtr(ptr.ToInt64() + i * Marshal.SizeOf(typeof(AiliaLLM.AILIAChatMessage)));
224 Marshal.StructureToPtr(message_list[i], offset,
false);
227 status = AiliaLLM.ailiaLLMSetPrompt(net, ptr, (uint)len);
231 Marshal.FreeHGlobal(ptr);
234 for (
int i = 0; i < handle_list.Count; i++){
235 handle_list[i].Free();
238 context_full =
false;
245 Debug.Log(
"ailiaLLMSetPrompt failed " + status);
247 if (status == AiliaLLM.AILIA_LLM_STATUS_CONTEXT_FULL){