MCPSettingsProvider.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using LLM.Editor.Client;
  2. using UnityEditor;
  3. using UnityEngine;
  4. namespace LLM.Editor.Settings
  5. {
  6. /// <summary>
  7. /// Creates the "MCP Assistant" entry in Unity's Project Settings window,
  8. /// allowing for project-wide configuration of the LLM client.
  9. /// </summary>
  10. internal static class MCPSettingsProvider
  11. {
  12. private static SerializedObject _settings;
  13. [SettingsProvider]
  14. public static SettingsProvider CreateMCPSettingsProvider()
  15. {
  16. var provider = new SettingsProvider("Project/MCP Assistant", SettingsScope.Project)
  17. {
  18. label = "MCP Assistant",
  19. guiHandler = OnGUI,
  20. };
  21. return provider;
  22. }
  23. private static void OnGUI(string searchContext)
  24. {
  25. if (_settings == null)
  26. {
  27. var settingsAsset = FindSettingsAsset();
  28. if (settingsAsset != null)
  29. {
  30. _settings = new SerializedObject(settingsAsset);
  31. }
  32. }
  33. if (_settings == null)
  34. {
  35. EditorGUILayout.HelpBox("MCPSettings asset not found. Please create one via 'Assets > Create > LLM > MCP Settings'.", MessageType.Error);
  36. return;
  37. }
  38. _settings.Update();
  39. EditorGUILayout.LabelField("Client Configuration", EditorStyles.boldLabel);
  40. var useDummyClientProp = _settings.FindProperty("useDummyClient");
  41. EditorGUI.BeginChangeCheck();
  42. EditorGUILayout.PropertyField(useDummyClientProp, new GUIContent("Use Dummy Client", "Bypass the real LLM API and use a local, mock client for testing."));
  43. if (EditorGUI.EndChangeCheck())
  44. {
  45. // When the value changes, invalidate the cached client in the factory.
  46. ApiClientFactory.InvalidateClient();
  47. }
  48. var useRagMemoryProp = _settings.FindProperty("useRagMemory");
  49. EditorGUILayout.PropertyField(useRagMemoryProp, new GUIContent("Use RAG Memory", "Enable the Retrieval-Augmented Generation memory system for in-context learning."));
  50. EditorGUILayout.HelpBox("Toggling these will switch between the live Gemini API, a local dummy client, and control the agent's memory system.", MessageType.Info);
  51. EditorGUILayout.Space();
  52. EditorGUILayout.LabelField("Gemini API Configuration", EditorStyles.boldLabel);
  53. EditorGUILayout.PropertyField(_settings.FindProperty("gcpProjectId"));
  54. EditorGUILayout.PropertyField(_settings.FindProperty("gcpRegion"));
  55. EditorGUILayout.PropertyField(_settings.FindProperty("modelName"));
  56. EditorGUILayout.PropertyField(_settings.FindProperty("embeddingModelName"));
  57. EditorGUILayout.PropertyField(_settings.FindProperty("gcloudPath"));
  58. _settings.ApplyModifiedProperties();
  59. }
  60. private static MCPSettings FindSettingsAsset()
  61. {
  62. var guids = AssetDatabase.FindAssets($"t:{nameof(MCPSettings)}");
  63. if (guids.Length <= 0) return null;
  64. var path = AssetDatabase.GUIDToAssetPath(guids[0]);
  65. return AssetDatabase.LoadAssetAtPath<MCPSettings>(path);
  66. }
  67. }
  68. }