Editor/SoundSettings.cs
using System;
using System.IO;
using System.Text.Json;
using Editor;
using Sandbox;

public class SoundSettings : Widget
{
    public class Config : ConfigData
    {
        public string ElevenLabsApiKey { get; set; } = "";
        public string GenerationPath { get; set; } = "generated";
    }

    private LineEdit apiKeyInput;
    private LineEdit pathInput;
    private static Config _settings;
    private Button saveButton;

    public static Config Settings 
    {
        get
        {
            if (_settings == null)
                _settings = EditorUtility.LoadProjectSettings<Config>("settings.json");
            return _settings;
        }
    }

    public SoundSettings() : base(null)
    {
        Layout = Layout.Column();
        var mainLayout = Layout.Add(Layout.Column());
        mainLayout.Margin = 16;

        var apiKeyGroup = mainLayout.AddRow();
        apiKeyGroup.Add(new Label("ElevenLabs API Key:"));
        
        apiKeyInput = new LineEdit(this);
        apiKeyInput.MinimumWidth = 300;
        apiKeyInput.PlaceholderText = "Enter your ElevenLabs API key";
        apiKeyInput.Text = Settings.ElevenLabsApiKey;
        apiKeyGroup.Add(apiKeyInput);

        mainLayout.AddSpacingCell(8);

        var pathGroup = mainLayout.AddRow();
        pathGroup.Add(new Label("Generation Path:"));
        
        pathInput = new LineEdit(this);
        pathInput.MinimumWidth = 300;
        pathInput.PlaceholderText = "Enter generation path (relative to assets)";
        pathInput.Text = Settings.GenerationPath;
        pathGroup.Add(pathInput);

        mainLayout.AddStretchCell();

        var buttonLayout = mainLayout.AddRow();
        buttonLayout.AddStretchCell();

        saveButton = new Button.Primary("Save", "save");
        saveButton.Clicked = SaveSettings;
        buttonLayout.Add(saveButton);
    }

    private void SaveSettings()
    {
        Settings.ElevenLabsApiKey = apiKeyInput.Text;
        Settings.GenerationPath = pathInput.Text;
        EditorUtility.SaveProjectSettings(Settings, "settings.json");
        Dialog.AskConfirm(() => {}, "Settings saved successfully.", "Success", "Okay");
    }

    [Menu("Editor", "AI Tools/Settings")]
    public static void OpenSettings()
    {
        var dialog = new Dialog();
        dialog.Window.Title = "Sound Generation Settings";
        dialog.Window.Size = new Vector2(500, 200);
        dialog.Layout = Layout.Column();
        dialog.Layout.Add(new SoundSettings());
        dialog.Show();
    }

    public static string GetGenerationPath()
    {
        return Path.Combine(Project.Current.GetAssetsPath(), Settings.GenerationPath);
    }
}