From a8e543f445692fd9a49037791933878dfe3b6892 Mon Sep 17 00:00:00 2001 From: Antonis Makropoulos Date: Thu, 11 Jan 2024 20:09:10 +0200 Subject: [PATCH 01/18] escape spaces in chmod, show download complete --- Runtime/LLMUnitySetup.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Runtime/LLMUnitySetup.cs b/Runtime/LLMUnitySetup.cs index 7460916f..57fcb2bf 100644 --- a/Runtime/LLMUnitySetup.cs +++ b/Runtime/LLMUnitySetup.cs @@ -110,9 +110,10 @@ public static async Task DownloadFile( if (executable && Application.platform != RuntimePlatform.WindowsEditor && Application.platform != RuntimePlatform.WindowsPlayer){ // macOS/Linux: Set executable permissions using chmod - RunProcess("chmod", "+x " + savePath); + RunProcess("chmod", $"+x \"{savePath}\""); } AssetDatabase.StopAssetEditing(); + Debug.Log($"Download complete!"); } progresscallback(1f); callback?.Invoke(savePath); From 851cbaffff29d9a69452e721d8ce493644df2329 Mon Sep 17 00:00:00 2001 From: Antonis Makropoulos Date: Thu, 11 Jan 2024 20:10:16 +0200 Subject: [PATCH 02/18] escape spaces in llama.cpp server start --- Runtime/LLM.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Runtime/LLM.cs b/Runtime/LLM.cs index 92947a20..def609a2 100644 --- a/Runtime/LLM.cs +++ b/Runtime/LLM.cs @@ -157,15 +157,15 @@ private void StartLLMServer() } string binary = server; - string arguments = $" --port {port} -m {modelPath} -c {contextSize} -b {batchSize} --log-disable --nobrowser"; + string arguments = $" --port {port} -m \"{modelPath}\" -c {contextSize} -b {batchSize} --log-disable --nobrowser"; if (numThreads > 0) arguments += $" -t {numThreads}"; if (numGPULayers > 0) arguments += $" -ngl {numGPULayers}"; - if (loraPath != "") arguments += $" --lora {loraPath}"; + if (loraPath != "") arguments += $" --lora \"{loraPath}\""; List<(string, string)> environment = null; if (Application.platform != RuntimePlatform.WindowsEditor && Application.platform != RuntimePlatform.WindowsPlayer){ // use APE binary directly if not on Windows - arguments = $"{binary} {arguments}"; + arguments = $"\"{binary}\" {arguments}"; binary = SelectApeBinary(); if (numGPULayers <= 0){ // prevent nvcc building if not using GPU From 3cf9e7017362c2ffc05b7afc1dde1f0a93e1d582 Mon Sep 17 00:00:00 2001 From: Antonis Makropoulos Date: Fri, 12 Jan 2024 08:48:37 +0200 Subject: [PATCH 03/18] fix scaling issues in Samples --- Samples~/ChatBot/Bubble.cs | 4 ++- Samples~/ChatBot/ChatBot.cs | 1 - Samples~/ChatBot/Scene.unity | 7 ++-- Samples~/ServerClient/Scene.unity | 46 ++++++++++++++------------ Samples~/SimpleInteraction/Scene.unity | 19 ++++++----- 5 files changed, 41 insertions(+), 36 deletions(-) diff --git a/Samples~/ChatBot/Bubble.cs b/Samples~/ChatBot/Bubble.cs index 7f8e7471..bb808b0e 100644 --- a/Samples~/ChatBot/Bubble.cs +++ b/Samples~/ChatBot/Bubble.cs @@ -83,7 +83,9 @@ void SetBubblePosition(RectTransform bubbleRectTransform, RectTransform imageRec if (bubbleUI.bottomPosition == 1) anchoredPosition.y *= -1; bubbleRectTransform.anchoredPosition = anchoredPosition; - bubbleRectTransform.sizeDelta = new Vector2(600 - 2*bubbleUI.textPadding, bubbleRectTransform.sizeDelta.y - 2*bubbleUI.textPadding); + float width = bubbleUI.bubbleWidth == -1? bubbleRectTransform.sizeDelta.x: bubbleUI.bubbleWidth; + float height = bubbleUI.bubbleHeight == -1? bubbleRectTransform.sizeDelta.y: bubbleUI.bubbleHeight; + bubbleRectTransform.sizeDelta = new Vector2(width-2*bubbleUI.textPadding, height-2*bubbleUI.textPadding); SyncParentRectTransform(imageRectTransform); imageRectTransform.offsetMin = new Vector2(-bubbleUI.textPadding, -bubbleUI.textPadding); imageRectTransform.offsetMax = new Vector2(bubbleUI.textPadding, bubbleUI.textPadding); diff --git a/Samples~/ChatBot/ChatBot.cs b/Samples~/ChatBot/ChatBot.cs index 2951595f..8f46b708 100644 --- a/Samples~/ChatBot/ChatBot.cs +++ b/Samples~/ChatBot/ChatBot.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Threading.Tasks; using LLMUnity; -using TMPro; namespace LLMUnitySamples { diff --git a/Samples~/ChatBot/Scene.unity b/Samples~/ChatBot/Scene.unity index 363a0755..bac6b516 100644 --- a/Samples~/ChatBot/Scene.unity +++ b/Samples~/ChatBot/Scene.unity @@ -177,7 +177,7 @@ MonoBehaviour: fontColor: {r: 1, g: 1, b: 1, a: 1} font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} fontSize: 16 - bubbleWidth: 600 + bubbleWidth: 450 llm: {fileID: 817827756} textPadding: 10 bubbleSpacing: 10 @@ -444,6 +444,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: a50e3140c3ecaaf1c848dbf141cc2074, type: 3} m_Name: m_EditorClassIdentifier: + advancedOptions: 0 host: localhost port: 13333 stream: 1 @@ -834,10 +835,10 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} m_Name: m_EditorClassIdentifier: - m_UiScaleMode: 0 + m_UiScaleMode: 1 m_ReferencePixelsPerUnit: 100 m_ScaleFactor: 1 - m_ReferenceResolution: {x: 1550, y: 600} + m_ReferenceResolution: {x: 1280, y: 720} m_ScreenMatchMode: 0 m_MatchWidthOrHeight: 1 m_PhysicalUnit: 3 diff --git a/Samples~/ServerClient/Scene.unity b/Samples~/ServerClient/Scene.unity index 720b6c4e..010241b8 100644 --- a/Samples~/ServerClient/Scene.unity +++ b/Samples~/ServerClient/Scene.unity @@ -171,10 +171,10 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} m_Name: m_EditorClassIdentifier: - m_UiScaleMode: 0 + m_UiScaleMode: 1 m_ReferencePixelsPerUnit: 100 m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} + m_ReferenceResolution: {x: 1280, y: 720} m_ScreenMatchMode: 0 m_MatchWidthOrHeight: 0 m_PhysicalUnit: 3 @@ -661,7 +661,7 @@ GameObject: - component: {fileID: 856480604} - component: {fileID: 856480603} m_Layer: 5 - m_Name: Text (Legacy) + m_Name: Player title m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -683,7 +683,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 21.000015, y: 150} + m_AnchoredPosition: {x: 0, y: 160} m_SizeDelta: {x: 160, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &856480603 @@ -926,7 +926,7 @@ GameObject: - component: {fileID: 921839200} - component: {fileID: 921839199} m_Layer: 5 - m_Name: AIImage2 + m_Name: AI 2 Image m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -947,10 +947,10 @@ RectTransform: - {fileID: 728022959} m_Father: {fileID: 158550917} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 249, y: -110.69} - m_SizeDelta: {x: -781.57996, y: -493.27884} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 200, y: -110} + m_SizeDelta: {x: 350, y: 100} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &921839199 MonoBehaviour: @@ -1027,8 +1027,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 249, y: 87.002} - m_SizeDelta: {x: 294.42, y: 95.9957} + m_AnchoredPosition: {x: 200, y: 90} + m_SizeDelta: {x: 350, y: 100} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &954556175 MonoBehaviour: @@ -1215,6 +1215,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: a50e3140c3ecaaf1c848dbf141cc2074, type: 3} m_Name: m_EditorClassIdentifier: + advancedOptions: 0 host: localhost port: 13333 stream: 1 @@ -1344,7 +1345,7 @@ GameObject: - component: {fileID: 1342801407} - component: {fileID: 1342801406} m_Layer: 5 - m_Name: Text (Legacy) (1) + m_Name: AI 1 title m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -1366,7 +1367,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: -213, y: -46.061} + m_AnchoredPosition: {x: -200, y: -45} m_SizeDelta: {x: 160, y: 29.6652} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1342801406 @@ -1423,7 +1424,7 @@ GameObject: - component: {fileID: 1448762427} - component: {fileID: 1448762426} m_Layer: 5 - m_Name: Text (Legacy) (2) + m_Name: AI 2 title m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -1445,7 +1446,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 249, y: -45.997} + m_AnchoredPosition: {x: 200, y: -45} m_SizeDelta: {x: 160, y: 29.6652} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1448762426 @@ -1519,6 +1520,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e95e88cdd1b0a159692667660a065473, type: 3} m_Name: m_EditorClassIdentifier: + advancedOptions: 0 host: localhost port: 13333 stream: 1 @@ -1663,8 +1665,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: -206.21, y: 87.002} - m_SizeDelta: {x: 294.42, y: 95.9957} + m_AnchoredPosition: {x: -200, y: 90} + m_SizeDelta: {x: 350, y: 100} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1966107897 MonoBehaviour: @@ -1852,7 +1854,7 @@ GameObject: - component: {fileID: 2091685449} - component: {fileID: 2091685448} m_Layer: 5 - m_Name: AIImage1 + m_Name: AI 1 Image m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -1873,10 +1875,10 @@ RectTransform: - {fileID: 887085509} m_Father: {fileID: 158550917} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -206.21002, y: -110.75391} - m_SizeDelta: {x: -781.57996, y: -493.27884} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -200, y: -110} + m_SizeDelta: {x: 350, y: 100} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2091685448 MonoBehaviour: diff --git a/Samples~/SimpleInteraction/Scene.unity b/Samples~/SimpleInteraction/Scene.unity index 17cdaaa9..a932f764 100644 --- a/Samples~/SimpleInteraction/Scene.unity +++ b/Samples~/SimpleInteraction/Scene.unity @@ -218,10 +218,10 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} m_Name: m_EditorClassIdentifier: - m_UiScaleMode: 0 + m_UiScaleMode: 1 m_ReferencePixelsPerUnit: 100 m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} + m_ReferenceResolution: {x: 1280, y: 720} m_ScreenMatchMode: 0 m_MatchWidthOrHeight: 0 m_PhysicalUnit: 3 @@ -455,7 +455,7 @@ GameObject: - component: {fileID: 856480604} - component: {fileID: 856480603} m_Layer: 5 - m_Name: Text (Legacy) + m_Name: Player title m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -737,6 +737,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: a50e3140c3ecaaf1c848dbf141cc2074, type: 3} m_Name: m_EditorClassIdentifier: + advancedOptions: 0 host: localhost port: 13333 stream: 1 @@ -866,7 +867,7 @@ GameObject: - component: {fileID: 1342801407} - component: {fileID: 1342801406} m_Layer: 5 - m_Name: Text (Legacy) (1) + m_Name: AI title m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -1049,8 +1050,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 10.375999, y: 87.00699} - m_SizeDelta: {x: 294.42, y: 95.9957} + m_AnchoredPosition: {x: 10.375977, y: 87.00699} + m_SizeDelta: {x: 400, y: 100} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1966107897 MonoBehaviour: @@ -1259,10 +1260,10 @@ RectTransform: - {fileID: 887085509} m_Father: {fileID: 158550917} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 10.375977, y: -110.75391} - m_SizeDelta: {x: -781.57996, y: -493.27884} + m_SizeDelta: {x: 400, y: 100} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &2091685448 MonoBehaviour: From 3c4d3ee43df0d1e3217bffb53a5d2026fd850889 Mon Sep 17 00:00:00 2001 From: Antonis Makropoulos Date: Fri, 12 Jan 2024 09:13:02 +0200 Subject: [PATCH 04/18] bump version to 1.0.1 --- VERSION | 1 + package.json | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 VERSION diff --git a/VERSION b/VERSION new file mode 100644 index 00000000..7dea76ed --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.0.1 diff --git a/package.json b/package.json index f3df500f..c2b51889 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ai.undream.llmunity", - "version": "1.0.0", + "version": "1.0.1", "displayName": "LLMUnity", "description": "LLMUnity allows to run and distribute LLM models in the Unity engine.", "unity": "2022.3", @@ -42,4 +42,4 @@ "email": "antonis@undream.ai", "url": "https://undream.ai" } -} \ No newline at end of file +} From c2053e88d9a8cb462760f4ad7d9054cac7e377e2 Mon Sep 17 00:00:00 2001 From: Antonis Makropoulos Date: Fri, 12 Jan 2024 11:10:35 +0200 Subject: [PATCH 05/18] fix scale to 1 in elements --- Samples~/ChatBot/Bubble.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Samples~/ChatBot/Bubble.cs b/Samples~/ChatBot/Bubble.cs index bb808b0e..1523b55d 100644 --- a/Samples~/ChatBot/Bubble.cs +++ b/Samples~/ChatBot/Bubble.cs @@ -78,6 +78,7 @@ void SetBubblePosition(RectTransform bubbleRectTransform, RectTransform imageRec bubbleRectTransform.pivot = new Vector2(bubbleUI.leftPosition, bubbleUI.bottomPosition); bubbleRectTransform.anchorMin = new Vector2(bubbleUI.leftPosition, bubbleUI.bottomPosition); bubbleRectTransform.anchorMax = new Vector2(bubbleUI.leftPosition, bubbleUI.bottomPosition); + bubbleRectTransform.localScale = Vector3.one; Vector2 anchoredPosition = new Vector2(bubbleUI.bubbleOffset + bubbleUI.textPadding, bubbleUI.bubbleOffset + bubbleUI.textPadding); if (bubbleUI.leftPosition == 1) anchoredPosition.x *= -1; if (bubbleUI.bottomPosition == 1) anchoredPosition.y *= -1; @@ -156,6 +157,7 @@ GameObject CreatePlaceholderObject(Transform parent, RectTransform textRectTrans RectTransform placeholderRectTransform = placeholderObject.GetComponent(); placeholderRectTransform.sizeDelta = textRectTransform.sizeDelta; placeholderRectTransform.anchoredPosition = textRectTransform.anchoredPosition; + placeholderRectTransform.localScale = Vector3.one; SyncParentRectTransform(placeholderRectTransform); return placeholderObject; } @@ -170,7 +172,9 @@ GameObject CreateInputFieldObject(Transform parent, Text textObject, Text placeh inputField.lineType = InputField.LineType.MultiLineSubmit; inputField.shouldHideMobileInput = false; inputField.shouldActivateOnSelect = true; - SyncParentRectTransform(inputFieldObject.GetComponent()); + RectTransform inputFieldRect = inputFieldObject.GetComponent(); + inputFieldRect.localScale = Vector3.one; + SyncParentRectTransform(inputFieldRect); return inputFieldObject; } From a3a919141dd36b914601d03701655e3d79b9222a Mon Sep 17 00:00:00 2001 From: Antonis Makropoulos Date: Fri, 12 Jan 2024 11:11:08 +0200 Subject: [PATCH 06/18] modify anchoredPosition instead of position --- Samples~/ChatBot/ChatBot.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Samples~/ChatBot/ChatBot.cs b/Samples~/ChatBot/ChatBot.cs index 8f46b708..23daf6a2 100644 --- a/Samples~/ChatBot/ChatBot.cs +++ b/Samples~/ChatBot/ChatBot.cs @@ -116,7 +116,7 @@ public void UpdateBubblePositions() for (int i = chatBubbles.Count - 1; i >= 0; i--) { Bubble bubble = chatBubbles[i]; RectTransform childRect = bubble.GetRectTransform(); - childRect.position = new Vector2(childRect.position.x, y); + childRect.anchoredPosition = new Vector2(childRect.anchoredPosition.x, y); // last bubble outside the container if (y > containerHeight && lastBubbleOutsideFOV == -1){ From e224d377a84e432436789ab5c418c28e5e64355c Mon Sep 17 00:00:00 2001 From: Antonis Makropoulos Date: Fri, 12 Jan 2024 11:12:20 +0200 Subject: [PATCH 07/18] increase bubble width and font size --- Samples~/ChatBot/Scene.unity | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Samples~/ChatBot/Scene.unity b/Samples~/ChatBot/Scene.unity index bac6b516..cea98ca6 100644 --- a/Samples~/ChatBot/Scene.unity +++ b/Samples~/ChatBot/Scene.unity @@ -176,8 +176,8 @@ MonoBehaviour: aiColor: {r: 0.11372549, g: 0.11372549, b: 0.28627452, a: 1} fontColor: {r: 1, g: 1, b: 1, a: 1} font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - fontSize: 16 - bubbleWidth: 450 + fontSize: 20 + bubbleWidth: 600 llm: {fileID: 817827756} textPadding: 10 bubbleSpacing: 10 From a2cec08185171857283482b8b0ee9824771f8fdf Mon Sep 17 00:00:00 2001 From: Antonis Makropoulos Date: Fri, 12 Jan 2024 11:14:50 +0200 Subject: [PATCH 08/18] add meta file for VERSION --- VERSION.meta | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 VERSION.meta diff --git a/VERSION.meta b/VERSION.meta new file mode 100644 index 00000000..9a6d4847 --- /dev/null +++ b/VERSION.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e73550046e9b28a4286e228a75e6f91c +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From 3726e389f1b4a4c99726fce645e3c0df1d64a00d Mon Sep 17 00:00:00 2001 From: Antonis Makropoulos Date: Fri, 12 Jan 2024 11:42:59 +0200 Subject: [PATCH 09/18] set font size to 16 --- Samples~/ChatBot/Scene.unity | 2 +- Samples~/ServerClient/Scene.unity | 14 +++++++------- Samples~/SimpleInteraction/Scene.unity | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Samples~/ChatBot/Scene.unity b/Samples~/ChatBot/Scene.unity index cea98ca6..fcaf286b 100644 --- a/Samples~/ChatBot/Scene.unity +++ b/Samples~/ChatBot/Scene.unity @@ -176,7 +176,7 @@ MonoBehaviour: aiColor: {r: 0.11372549, g: 0.11372549, b: 0.28627452, a: 1} fontColor: {r: 1, g: 1, b: 1, a: 1} font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - fontSize: 20 + fontSize: 16 bubbleWidth: 600 llm: {fileID: 817827756} textPadding: 10 diff --git a/Samples~/ServerClient/Scene.unity b/Samples~/ServerClient/Scene.unity index 010241b8..3e191d33 100644 --- a/Samples~/ServerClient/Scene.unity +++ b/Samples~/ServerClient/Scene.unity @@ -291,7 +291,7 @@ MonoBehaviour: m_Calls: [] m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 + m_FontSize: 16 m_FontStyle: 2 m_BestFit: 0 m_MinSize: 10 @@ -445,7 +445,7 @@ MonoBehaviour: m_Calls: [] m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 + m_FontSize: 16 m_FontStyle: 0 m_BestFit: 0 m_MinSize: 10 @@ -598,7 +598,7 @@ MonoBehaviour: m_Calls: [] m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 + m_FontSize: 16 m_FontStyle: 0 m_BestFit: 0 m_MinSize: 10 @@ -788,7 +788,7 @@ MonoBehaviour: m_Calls: [] m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 + m_FontSize: 16 m_FontStyle: 0 m_BestFit: 0 m_MinSize: 10 @@ -1313,10 +1313,10 @@ MonoBehaviour: m_Calls: [] m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 + m_FontSize: 16 m_FontStyle: 2 m_BestFit: 0 - m_MinSize: 10 + m_MinSize: 1 m_MaxSize: 40 m_Alignment: 0 m_AlignByGeometry: 0 @@ -1608,7 +1608,7 @@ MonoBehaviour: m_Calls: [] m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 + m_FontSize: 16 m_FontStyle: 0 m_BestFit: 0 m_MinSize: 10 diff --git a/Samples~/SimpleInteraction/Scene.unity b/Samples~/SimpleInteraction/Scene.unity index a932f764..11184453 100644 --- a/Samples~/SimpleInteraction/Scene.unity +++ b/Samples~/SimpleInteraction/Scene.unity @@ -582,7 +582,7 @@ MonoBehaviour: m_Calls: [] m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 + m_FontSize: 16 m_FontStyle: 0 m_BestFit: 0 m_MinSize: 10 @@ -835,7 +835,7 @@ MonoBehaviour: m_Calls: [] m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 + m_FontSize: 16 m_FontStyle: 2 m_BestFit: 0 m_MinSize: 10 @@ -993,7 +993,7 @@ MonoBehaviour: m_Calls: [] m_FontData: m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} - m_FontSize: 14 + m_FontSize: 16 m_FontStyle: 0 m_BestFit: 0 m_MinSize: 10 From dc45e642264607389f9560ea14762eca80bd7b7f Mon Sep 17 00:00:00 2001 From: Antonis Makropoulos Date: Fri, 12 Jan 2024 11:59:12 +0200 Subject: [PATCH 10/18] change name of assistants in ServerClient sample --- Samples~/ServerClient/Scene.unity | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Samples~/ServerClient/Scene.unity b/Samples~/ServerClient/Scene.unity index 3e191d33..cd217635 100644 --- a/Samples~/ServerClient/Scene.unity +++ b/Samples~/ServerClient/Scene.unity @@ -1225,7 +1225,7 @@ MonoBehaviour: topP: 0.9 nPredict: 256 playerName: Human - AIName: Assistant + AIName: Adam prompt: A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions. modelHide: 1 @@ -1530,10 +1530,9 @@ MonoBehaviour: topP: 0.9 nPredict: 256 playerName: Human - AIName: Assistant + AIName: Eve prompt: A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions. - The assistant name is Helen. --- !u!4 &1493015759 Transform: m_ObjectHideFlags: 0 From 4b2fc2476b67e712686d6aab166e95248b7a327d Mon Sep 17 00:00:00 2001 From: Antonis Makropoulos Date: Fri, 12 Jan 2024 11:59:35 +0200 Subject: [PATCH 11/18] show chat settings independent of model --- Editor/LLMEditor.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Editor/LLMEditor.cs b/Editor/LLMEditor.cs index 854415b1..e5f925ca 100644 --- a/Editor/LLMEditor.cs +++ b/Editor/LLMEditor.cs @@ -63,8 +63,10 @@ public override void OnInspectorGUI() ShowProgress(llmScript.modelCopyProgress, "Model Copying"); if (llmScript.model != ""){ AddModelSettings(llmScriptSO, false); - AddChatSettings(llmScriptSO); + } else { + EditorGUILayout.Space(); } + AddChatSettings(llmScriptSO); GUI.enabled = true; EditorGUI.EndChangeCheck(); From 8914cc3a93a643d24d66efc8607d84937e0c6c1d Mon Sep 17 00:00:00 2001 From: Antonis Makropoulos Date: Fri, 12 Jan 2024 14:05:31 +0200 Subject: [PATCH 12/18] Allow multiple slots for parallel processing based on number of LLMClient objects --- Runtime/LLM.cs | 8 +++++--- Runtime/LLMClient.cs | 11 +++++++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Runtime/LLM.cs b/Runtime/LLM.cs index def609a2..8a988dae 100644 --- a/Runtime/LLM.cs +++ b/Runtime/LLM.cs @@ -15,6 +15,7 @@ public class LLM : LLMClient [Server] public int numThreads = -1; [Server] public int numGPULayers = 0; + [ServerAdvanced] public int parallelPrompts = -1; [ServerAdvanced] public bool debug = false; [Model] public string model = ""; @@ -95,11 +96,11 @@ public async void SetLora(string path){ } #endif - new void OnEnable() + new public void Start() { // start the llm server and run the OnEnable of the client StartLLMServer(); - base.OnEnable(); + base.Start(); } private string SelectApeBinary(){ @@ -156,8 +157,9 @@ private void StartLLMServer() if (!File.Exists(loraPath)) throw new System.Exception($"File {loraPath} not found!"); } + int slots = parallelPrompts == -1? LLMClientCounter: parallelPrompts; string binary = server; - string arguments = $" --port {port} -m \"{modelPath}\" -c {contextSize} -b {batchSize} --log-disable --nobrowser"; + string arguments = $" --port {port} -m \"{modelPath}\" -c {contextSize} -b {batchSize} --log-disable --nobrowser -np {slots}"; if (numThreads > 0) arguments += $" -t {numThreads}"; if (numGPULayers > 0) arguments += $" -ngl {numGPULayers}"; if (loraPath != "") arguments += $" --lora \"{loraPath}\""; diff --git a/Runtime/LLMClient.cs b/Runtime/LLMClient.cs index cb890395..76fe84fc 100644 --- a/Runtime/LLMClient.cs +++ b/Runtime/LLMClient.cs @@ -14,7 +14,8 @@ public class ServerAdvancedAttribute : PropertyAttribute {} public class ModelAdvancedAttribute : PropertyAttribute {} public class LLMClient : MonoBehaviour - { + { + protected static int LLMClientCounter = 0; [HideInInspector] public bool advancedOptions = false; [ClientAdvanced] public string host = "localhost"; @@ -32,6 +33,7 @@ public class LLMClient : MonoBehaviour [TextArea(5, 10), Chat] public string prompt = "A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions."; private int nKeep = -1; + private bool counted = false; private string currentPrompt; private List chat; @@ -46,7 +48,12 @@ public LLMClient() chat.Add(new ChatMessage{role="system", content=prompt}); } - public async void OnEnable(){ + void OnEnable(){ + if (!counted) LLMClientCounter++; + counted = true; + } + + public async void Start(){ // initialise the prompt and set the keep tokens based on its length currentPrompt = prompt; await Tokenize(prompt, SetNKeep); From 69f3d77a916fee08415a938363004451a20c6997 Mon Sep 17 00:00:00 2001 From: Antonis Makropoulos Date: Fri, 12 Jan 2024 14:06:03 +0200 Subject: [PATCH 13/18] add parallelPrompts to Sample Scenes --- Samples~/ChatBot/Scene.unity | 1 + Samples~/ServerClient/Scene.unity | 1 + Samples~/SimpleInteraction/Scene.unity | 1 + 3 files changed, 3 insertions(+) diff --git a/Samples~/ChatBot/Scene.unity b/Samples~/ChatBot/Scene.unity index fcaf286b..ccca69d8 100644 --- a/Samples~/ChatBot/Scene.unity +++ b/Samples~/ChatBot/Scene.unity @@ -460,6 +460,7 @@ MonoBehaviour: modelHide: 1 numThreads: -1 numGPULayers: 0 + parallelPrompts: -1 debug: 0 model: lora: diff --git a/Samples~/ServerClient/Scene.unity b/Samples~/ServerClient/Scene.unity index cd217635..bc5daf80 100644 --- a/Samples~/ServerClient/Scene.unity +++ b/Samples~/ServerClient/Scene.unity @@ -1231,6 +1231,7 @@ MonoBehaviour: modelHide: 1 numThreads: -1 numGPULayers: 0 + parallelPrompts: -1 debug: 0 model: lora: diff --git a/Samples~/SimpleInteraction/Scene.unity b/Samples~/SimpleInteraction/Scene.unity index 11184453..5f4d945c 100644 --- a/Samples~/SimpleInteraction/Scene.unity +++ b/Samples~/SimpleInteraction/Scene.unity @@ -753,6 +753,7 @@ MonoBehaviour: modelHide: 1 numThreads: -1 numGPULayers: 0 + parallelPrompts: -1 debug: 0 model: lora: From 38d53ee9c5ec65dae6351554efc91c657d171372 Mon Sep 17 00:00:00 2001 From: Antonis Makropoulos Date: Fri, 12 Jan 2024 14:17:12 +0200 Subject: [PATCH 14/18] add parallelPrompts option to Readme, updte advanced options --- .github/GameObject.png | Bin 65719 -> 49989 bytes README.md | 23 ++++++++++++++--------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/.github/GameObject.png b/.github/GameObject.png index 22c5021e5bd6f4629821ccf6a8db61b79728d458..17da8ea1a7eb0a03715c24211b81d39b7f3f3afd 100644 GIT binary patch literal 49989 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 Rbrt;2=;7lnBg`Gv{ttUPd$#}p literal 65719 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 @@ -178,10 +180,12 @@ The server can be either a LLMUnity server or a standard [llama.cpp server](http - `Num GPU Layers` number of model layers to offload to the GPU. If set to 0 the GPU is not used. Use a large number i.e. >30 to utilise the GPU as much as possible.
If the user's GPU is not supported, the LLM will fall back to the CPU -- `Debug` select to log the output of the model in the Unity Editor -- `Port` port to run the server - `Stream` select to receive the reply from the model as it is produced (recommended!).
If it is not selected, the full reply from the model is received in one go +- Advanced options: + - `Parallel Prompts` number of prompts that can happen in parallel (default: -1 = number of LLM/LLMClient objects) + - `Debug` select to log the output of the model in the Unity Editor + - `Port` port to run the server #### :hugs: Model Settings - `Download model` click to download the default model (Mistral 7B Instruct) @@ -189,13 +193,14 @@ If it is not selected, the full reply from the model is received in one go - `Load lora` click to load a LORA model in .bin format - `Model` the model being used (inside the Assets/StreamingAssets folder) - `Lora` the LORA model being used (inside the Assets/StreamingAssets folder) -- `Context Size` Size of the prompt context (0 = context size of the model) -- `Batch Size` Batch size for prompt processing (default: 512) -- `Seed` seed for reproducibility. For random results every time select -1 -- `Temperature` LLM temperature, lower values give more deterministic answers -- `Top K` top-k sampling (default: 40, 0 = disabled) -- `Top P` top-p sampling (default: 0.9, 1.0 = disabled) -- `Num Predict` number of tokens to predict (default: 256, -1 = infinity, -2 = until context filled) +- Advanced options: + - `Context Size` Size of the prompt context (0 = context size of the model) + - `Batch Size` Batch size for prompt processing (default: 512) + - `Seed` seed for reproducibility. For random results every time select -1 + - `Temperature` LLM temperature, lower values give more deterministic answers + - `Top K` top-k sampling (default: 40, 0 = disabled) + - `Top P` top-p sampling (default: 0.9, 1.0 = disabled) + - `Num Predict` number of tokens to predict (default: 256, -1 = infinity, -2 = until context filled) #### :left_speech_bubble: Chat Settings - `Player Name` the name of the player From db885082524a41fc53363ed0a6f09b876955ed5e Mon Sep 17 00:00:00 2001 From: Antonis Makropoulos Date: Fri, 12 Jan 2024 14:27:09 +0200 Subject: [PATCH 15/18] add changelog --- CHANGELOG.md | 7 +++++++ CHANGELOG.md.meta | 7 +++++++ 2 files changed, 14 insertions(+) create mode 100644 CHANGELOG.md create mode 100644 CHANGELOG.md.meta diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..9771ffe4 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,7 @@ +## v1.0.1 +- Fix running commands for projects with space in path + - closes #8 + - closes #9 +- Fix sample scenes for different screen resolutions + - closes #10 +- Allow parallel prompts \ No newline at end of file diff --git a/CHANGELOG.md.meta b/CHANGELOG.md.meta new file mode 100644 index 00000000..0adeaede --- /dev/null +++ b/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e33a768d6d643a252955048bc00f5c90 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From d9154d0226a5c139eb7d59d038221b72b0422f7b Mon Sep 17 00:00:00 2001 From: Antonis Makropoulos Date: Fri, 12 Jan 2024 15:00:42 +0200 Subject: [PATCH 16/18] reduce waiting time to 1 min --- Runtime/LLM.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/LLM.cs b/Runtime/LLM.cs index 8a988dae..dfe51d0f 100644 --- a/Runtime/LLM.cs +++ b/Runtime/LLM.cs @@ -177,7 +177,7 @@ private void StartLLMServer() Debug.Log($"Server command: {binary} {arguments}"); process = LLMUnitySetup.CreateProcess(binary, arguments, CheckIfListening, DebugLogError, environment); // wait for at most 2' - serverStarted.WaitOne(120000); + serverStarted.WaitOne(60000); } public void StopProcess() From 1323b2096db9453da5a4f4f38c61905115f45071 Mon Sep 17 00:00:00 2001 From: Antonis Makropoulos Date: Fri, 12 Jan 2024 15:32:32 +0200 Subject: [PATCH 17/18] start server on enable, counter on awake, LLMClient before LLM execution order --- Runtime/LLM.cs | 5 +++-- Runtime/LLMClient.cs | 11 +++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Runtime/LLM.cs b/Runtime/LLM.cs index dfe51d0f..381cbc37 100644 --- a/Runtime/LLM.cs +++ b/Runtime/LLM.cs @@ -9,6 +9,7 @@ namespace LLMUnity { + [DefaultExecutionOrder(-1)] public class LLM : LLMClient { [HideInInspector] public bool modelHide = true; @@ -96,11 +97,11 @@ public async void SetLora(string path){ } #endif - new public void Start() + new public void OnEnable() { // start the llm server and run the OnEnable of the client StartLLMServer(); - base.Start(); + base.OnEnable(); } private string SelectApeBinary(){ diff --git a/Runtime/LLMClient.cs b/Runtime/LLMClient.cs index 76fe84fc..86535b84 100644 --- a/Runtime/LLMClient.cs +++ b/Runtime/LLMClient.cs @@ -13,6 +13,7 @@ public class ClientAdvancedAttribute : PropertyAttribute {} public class ServerAdvancedAttribute : PropertyAttribute {} public class ModelAdvancedAttribute : PropertyAttribute {} + [DefaultExecutionOrder(-2)] public class LLMClient : MonoBehaviour { protected static int LLMClientCounter = 0; @@ -48,12 +49,14 @@ public LLMClient() chat.Add(new ChatMessage{role="system", content=prompt}); } - void OnEnable(){ - if (!counted) LLMClientCounter++; - counted = true; + public void Awake(){ + if (!counted){ + LLMClientCounter++; + counted = true; + } } - public async void Start(){ + public async void OnEnable(){ // initialise the prompt and set the keep tokens based on its length currentPrompt = prompt; await Tokenize(prompt, SetNKeep); From 5e2ed97b1c1ecf585257326b73e004c43fa32c12 Mon Sep 17 00:00:00 2001 From: Antonis Makropoulos Date: Fri, 12 Jan 2024 16:36:20 +0200 Subject: [PATCH 18/18] use FindObjectsOfType, run LLM objects before LLMClient --- Runtime/LLM.cs | 6 +++--- Runtime/LLMClient.cs | 11 +---------- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/Runtime/LLM.cs b/Runtime/LLM.cs index 381cbc37..05977223 100644 --- a/Runtime/LLM.cs +++ b/Runtime/LLM.cs @@ -9,7 +9,7 @@ namespace LLMUnity { - [DefaultExecutionOrder(-1)] + [DefaultExecutionOrder(-2)] public class LLM : LLMClient { [HideInInspector] public bool modelHide = true; @@ -38,7 +38,7 @@ public class LLM : LLMClient private static float binariesDone = 0; private Process process; private bool serverListening = false; - private static ManualResetEvent serverStarted = new ManualResetEvent(false); + public ManualResetEvent serverStarted = new ManualResetEvent(false); private static string GetAssetPath(string relPath=""){ // Path to store llm server binaries and models @@ -158,7 +158,7 @@ private void StartLLMServer() if (!File.Exists(loraPath)) throw new System.Exception($"File {loraPath} not found!"); } - int slots = parallelPrompts == -1? LLMClientCounter: parallelPrompts; + int slots = parallelPrompts == -1? FindObjectsOfType().Length: parallelPrompts; string binary = server; string arguments = $" --port {port} -m \"{modelPath}\" -c {contextSize} -b {batchSize} --log-disable --nobrowser -np {slots}"; if (numThreads > 0) arguments += $" -t {numThreads}"; diff --git a/Runtime/LLMClient.cs b/Runtime/LLMClient.cs index 86535b84..1584e46d 100644 --- a/Runtime/LLMClient.cs +++ b/Runtime/LLMClient.cs @@ -13,10 +13,9 @@ public class ClientAdvancedAttribute : PropertyAttribute {} public class ServerAdvancedAttribute : PropertyAttribute {} public class ModelAdvancedAttribute : PropertyAttribute {} - [DefaultExecutionOrder(-2)] + [DefaultExecutionOrder(-1)] public class LLMClient : MonoBehaviour { - protected static int LLMClientCounter = 0; [HideInInspector] public bool advancedOptions = false; [ClientAdvanced] public string host = "localhost"; @@ -34,7 +33,6 @@ public class LLMClient : MonoBehaviour [TextArea(5, 10), Chat] public string prompt = "A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions."; private int nKeep = -1; - private bool counted = false; private string currentPrompt; private List chat; @@ -49,13 +47,6 @@ public LLMClient() chat.Add(new ChatMessage{role="system", content=prompt}); } - public void Awake(){ - if (!counted){ - LLMClientCounter++; - counted = true; - } - } - public async void OnEnable(){ // initialise the prompt and set the keep tokens based on its length currentPrompt = prompt;