using LLM.Editor.Client;
using UnityEditor;
using UnityEngine;
namespace LLM.Editor.Settings
{
///
/// Creates the "MCP Assistant" entry in Unity's Project Settings window,
/// allowing for project-wide configuration of the LLM client.
///
internal static class MCPSettingsProvider
{
private static SerializedObject _settings;
[SettingsProvider]
public static SettingsProvider CreateMCPSettingsProvider()
{
var provider = new SettingsProvider("Project/MCP Assistant", SettingsScope.Project)
{
label = "MCP Assistant",
guiHandler = OnGUI,
};
return provider;
}
private static void OnGUI(string searchContext)
{
if (_settings == null)
{
var settingsAsset = FindSettingsAsset();
if (settingsAsset != null)
{
_settings = new SerializedObject(settingsAsset);
}
}
if (_settings == null)
{
EditorGUILayout.HelpBox("MCPSettings asset not found. Please create one via 'Assets > Create > LLM > MCP Settings'.", MessageType.Error);
return;
}
_settings.Update();
EditorGUILayout.LabelField("Client Configuration", EditorStyles.boldLabel);
var useDummyClientProp = _settings.FindProperty("useDummyClient");
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(useDummyClientProp, new GUIContent("Use Dummy Client", "Bypass the real LLM API and use a local, mock client for testing."));
if (EditorGUI.EndChangeCheck())
{
// When the value changes, invalidate the cached client in the factory.
ApiClientFactory.InvalidateClient();
}
var useRagMemoryProp = _settings.FindProperty("useRagMemory");
EditorGUILayout.PropertyField(useRagMemoryProp, new GUIContent("Use RAG Memory", "Enable the Retrieval-Augmented Generation memory system for in-context learning."));
EditorGUILayout.HelpBox("Toggling these will switch between the live Gemini API, a local dummy client, and control the agent's memory system.", MessageType.Info);
EditorGUILayout.Space();
EditorGUILayout.LabelField("Gemini API Configuration", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(_settings.FindProperty("gcpProjectId"));
EditorGUILayout.PropertyField(_settings.FindProperty("gcpRegion"));
EditorGUILayout.PropertyField(_settings.FindProperty("modelName"));
EditorGUILayout.PropertyField(_settings.FindProperty("embeddingModelName"));
EditorGUILayout.PropertyField(_settings.FindProperty("gcloudPath"));
_settings.ApplyModifiedProperties();
}
private static MCPSettings FindSettingsAsset()
{
var guids = AssetDatabase.FindAssets($"t:{nameof(MCPSettings)}");
if (guids.Length <= 0) return null;
var path = AssetDatabase.GUIDToAssetPath(guids[0]);
return AssetDatabase.LoadAssetAtPath(path);
}
}
}