diff --git a/src/cascadia/TerminalSettingsEditor/AISettingsViewModel.h b/src/cascadia/TerminalSettingsEditor/AISettingsViewModel.h index e868060bdcb..c62e874817f 100644 --- a/src/cascadia/TerminalSettingsEditor/AISettingsViewModel.h +++ b/src/cascadia/TerminalSettingsEditor/AISettingsViewModel.h @@ -27,7 +27,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation winrt::hstring OpenAIKey(); void OpenAIKey(winrt::hstring key); - GETSET_BINDABLE_ENUM_SETTING(ActiveProvider, Model::LLMProvider, _Settings.GlobalSettings().ActiveProvider); + GETSET_BINDABLE_ENUM_SETTING(ActiveProvider, Model::LLMProvider, _Settings.GlobalSettings().AIInfo().ActiveProvider); private: Model::CascadiaSettings _Settings; diff --git a/src/cascadia/TerminalSettingsEditor/AISettingsViewModel.idl b/src/cascadia/TerminalSettingsEditor/AISettingsViewModel.idl index 8845f6d9f92..e8de6a185a4 100644 --- a/src/cascadia/TerminalSettingsEditor/AISettingsViewModel.idl +++ b/src/cascadia/TerminalSettingsEditor/AISettingsViewModel.idl @@ -11,8 +11,6 @@ namespace Microsoft.Terminal.Settings.Editor { AISettingsViewModel(Microsoft.Terminal.Settings.Model.CascadiaSettings settings); - //Microsoft.Terminal.Settings.Model.LLMProvider ActiveProvider; - Boolean AreAzureOpenAIKeyAndEndpointSet { get; }; String AzureOpenAIEndpoint; String AzureOpenAIKey; diff --git a/src/cascadia/TerminalSettingsModel/AIConfig.cpp b/src/cascadia/TerminalSettingsModel/AIConfig.cpp new file mode 100644 index 00000000000..a465b643c85 --- /dev/null +++ b/src/cascadia/TerminalSettingsModel/AIConfig.cpp @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +#include "pch.h" +#include "AIConfig.h" +#include "AIConfig.g.cpp" + +#include "TerminalSettingsSerializationHelpers.h" +#include "JsonUtils.h" + +using namespace Microsoft::Terminal::Settings::Model; +using namespace winrt::Microsoft::Terminal::Settings::Model::implementation; + +static constexpr std::string_view AIConfigKey{ "aiConfig" }; + +winrt::com_ptr AIConfig::CopyAIConfig(const AIConfig* source) +{ + auto aiConfig{ winrt::make_self() }; + +#define AI_SETTINGS_COPY(type, name, jsonKey, ...) \ + aiConfig->_##name = source->_##name; + MTSM_AI_SETTINGS(AI_SETTINGS_COPY) +#undef AI_SETTINGS_COPY + + return aiConfig; +} + +Json::Value AIConfig::ToJson() const +{ + Json::Value json{ Json::ValueType::objectValue }; + +#define AI_SETTINGS_TO_JSON(type, name, jsonKey, ...) \ + JsonUtils::SetValueForKey(json, jsonKey, _##name); + MTSM_AI_SETTINGS(AI_SETTINGS_TO_JSON) +#undef AI_SETTINGS_TO_JSON + + return json; +} + +void AIConfig::LayerJson(const Json::Value& json) +{ + const auto aiConfigJson = json[JsonKey(AIConfigKey)]; + +#define AI_SETTINGS_LAYER_JSON(type, name, jsonKey, ...) \ + JsonUtils::GetValueForKey(aiConfigJson, jsonKey, _##name); + MTSM_AI_SETTINGS(AI_SETTINGS_LAYER_JSON) +#undef AI_SETTINGS_LAYER_JSON +} diff --git a/src/cascadia/TerminalSettingsModel/AIConfig.h b/src/cascadia/TerminalSettingsModel/AIConfig.h new file mode 100644 index 00000000000..5cba6236932 --- /dev/null +++ b/src/cascadia/TerminalSettingsModel/AIConfig.h @@ -0,0 +1,41 @@ +/*++ +Copyright (c) Microsoft Corporation +Licensed under the MIT license. + +Module Name: +- AIConfig + +Abstract: +- The implementation of the AIConfig winrt class. Provides settings related + to the AI settings of the terminal + +Author(s): +- Pankaj Bhojwani - June 2024 + +--*/ + +#pragma once + +#include "pch.h" +#include "AIConfig.g.h" +#include "IInheritable.h" +#include "JsonUtils.h" +#include "MTSMSettings.h" +#include + +namespace winrt::Microsoft::Terminal::Settings::Model::implementation +{ + struct AIConfig : AIConfigT, IInheritable + { + public: + AIConfig() = default; + static winrt::com_ptr CopyAIConfig(const AIConfig* source); + Json::Value ToJson() const; + void LayerJson(const Json::Value& json); + +#define AI_SETTINGS_INITIALIZE(type, name, jsonKey, ...) \ + INHERITABLE_SETTING(Model::AIConfig, type, name, ##__VA_ARGS__) + MTSM_AI_SETTINGS(AI_SETTINGS_INITIALIZE) +#undef AI_SETTINGS_INITIALIZE + }; +} diff --git a/src/cascadia/TerminalSettingsModel/AIConfig.idl b/src/cascadia/TerminalSettingsModel/AIConfig.idl new file mode 100644 index 00000000000..4ee7563d7f9 --- /dev/null +++ b/src/cascadia/TerminalSettingsModel/AIConfig.idl @@ -0,0 +1,17 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +#include "IInheritable.idl.h" + +namespace Microsoft.Terminal.Settings.Model +{ + enum LLMProvider + { + AzureOpenAI, + OpenAI + }; + + [default_interface] runtimeclass AIConfig { + INHERITABLE_SETTING(LLMProvider, ActiveProvider); + } +} diff --git a/src/cascadia/TerminalSettingsModel/GlobalAppSettings.cpp b/src/cascadia/TerminalSettingsModel/GlobalAppSettings.cpp index 7151444ce7c..cd8bfbeaea7 100644 --- a/src/cascadia/TerminalSettingsModel/GlobalAppSettings.cpp +++ b/src/cascadia/TerminalSettingsModel/GlobalAppSettings.cpp @@ -23,6 +23,7 @@ static constexpr std::string_view ThemeKey{ "theme" }; static constexpr std::string_view DefaultProfileKey{ "defaultProfile" }; static constexpr std::string_view LegacyUseTabSwitcherModeKey{ "useTabSwitcher" }; static constexpr std::string_view LegacyReloadEnvironmentVariablesKey{ "compatibility.reloadEnvironmentVariables" }; +static constexpr std::string_view AIInfoKey{ "aiConfig" }; // Method Description: // - Copies any extraneous data from the parent before completing a CreateChild call @@ -45,6 +46,7 @@ void GlobalAppSettings::_FinalizeInheritance() } } } + _actionMap->_FinalizeInheritance(); } @@ -58,6 +60,9 @@ winrt::com_ptr GlobalAppSettings::Copy() const globals->_actionMap = _actionMap->Copy(); globals->_keybindingsWarnings = _keybindingsWarnings; + const auto aiInfo = AIConfig::CopyAIConfig(winrt::get_self(_AIInfo)); + globals->_AIInfo = *aiInfo; + #define GLOBAL_SETTINGS_COPY(type, name, jsonKey, ...) \ globals->_##name = _##name; MTSM_GLOBAL_SETTINGS(GLOBAL_SETTINGS_COPY) @@ -133,6 +138,10 @@ void GlobalAppSettings::LayerJson(const Json::Value& json, const OriginTag origi // "useTabSwitcher", but prefer "tabSwitcherMode" JsonUtils::GetValueForKey(json, LegacyUseTabSwitcherModeKey, _TabSwitcherMode); + // AI Settings + auto aiInfoImpl = winrt::get_self(_AIInfo); + aiInfoImpl->LayerJson(json); + #define GLOBAL_SETTINGS_LAYER_JSON(type, name, jsonKey, ...) \ JsonUtils::GetValueForKey(json, jsonKey, _##name); MTSM_GLOBAL_SETTINGS(GLOBAL_SETTINGS_LAYER_JSON) @@ -263,6 +272,10 @@ Json::Value GlobalAppSettings::ToJson() json[JsonKey(ActionsKey)] = _actionMap->ToJson(); json[JsonKey(KeybindingsKey)] = _actionMap->KeyBindingsToJson(); + if (auto aiJSON = winrt::get_self(_AIInfo)->ToJson(); !aiJSON.empty()) + { + json[JsonKey(AIInfoKey)] = std::move(aiJSON); + } return json; } @@ -312,3 +325,8 @@ bool GlobalAppSettings::ShouldUsePersistedLayout() const { return FirstWindowPreference() == FirstWindowPreference::PersistedWindowLayout && !IsolatedMode(); } + +winrt::Microsoft::Terminal::Settings::Model::AIConfig GlobalAppSettings::AIInfo() +{ + return _AIInfo; +} diff --git a/src/cascadia/TerminalSettingsModel/GlobalAppSettings.h b/src/cascadia/TerminalSettingsModel/GlobalAppSettings.h index 7b55b7007b5..8d1444c3fd2 100644 --- a/src/cascadia/TerminalSettingsModel/GlobalAppSettings.h +++ b/src/cascadia/TerminalSettingsModel/GlobalAppSettings.h @@ -25,6 +25,7 @@ Author(s): #include "Theme.h" #include "NewTabMenuEntry.h" #include "RemainingProfilesEntry.h" +#include "AIConfig.h" // fwdecl unittest classes namespace SettingsModelUnitTests @@ -72,6 +73,8 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation bool LegacyReloadEnvironmentVariables() const noexcept { return _legacyReloadEnvironmentVariables; } + Model::AIConfig AIInfo(); + INHERITABLE_SETTING(Model::GlobalAppSettings, hstring, UnparsedDefaultProfile, L""); #define GLOBAL_SETTINGS_INITIALIZE(type, name, jsonKey, ...) \ @@ -93,5 +96,6 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation std::vector _keybindingsWarnings; Windows::Foundation::Collections::IMap _colorSchemes{ winrt::single_threaded_map() }; Windows::Foundation::Collections::IMap _themes{ winrt::single_threaded_map() }; + Model::AIConfig _AIInfo{ winrt::make() }; }; } diff --git a/src/cascadia/TerminalSettingsModel/GlobalAppSettings.idl b/src/cascadia/TerminalSettingsModel/GlobalAppSettings.idl index 328d05b00cb..757e5d0c6c3 100644 --- a/src/cascadia/TerminalSettingsModel/GlobalAppSettings.idl +++ b/src/cascadia/TerminalSettingsModel/GlobalAppSettings.idl @@ -7,6 +7,7 @@ import "Theme.idl"; import "ColorScheme.idl"; import "ActionMap.idl"; import "NewTabMenuEntry.idl"; +import "AIConfig.idl"; namespace Microsoft.Terminal.Settings.Model { @@ -49,12 +50,6 @@ namespace Microsoft.Terminal.Settings.Model AfterCurrentTab, }; - enum LLMProvider - { - AzureOpenAI, - OpenAI - }; - [default_interface] runtimeclass GlobalAppSettings { Guid DefaultProfile; @@ -109,7 +104,6 @@ namespace Microsoft.Terminal.Settings.Model INHERITABLE_SETTING(Boolean, IsolatedMode); INHERITABLE_SETTING(Boolean, AllowHeadless); INHERITABLE_SETTING(String, SearchWebDefaultQueryUrl); - INHERITABLE_SETTING(LLMProvider, ActiveProvider); Windows.Foundation.Collections.IMapView ColorSchemes(); void AddColorScheme(ColorScheme scheme); @@ -124,5 +118,7 @@ namespace Microsoft.Terminal.Settings.Model Theme CurrentTheme { get; }; Boolean ShouldUsePersistedLayout(); + + AIConfig AIInfo { get; }; } } diff --git a/src/cascadia/TerminalSettingsModel/MTSMSettings.h b/src/cascadia/TerminalSettingsModel/MTSMSettings.h index 4e4f9a11bbe..cc8f9d7f400 100644 --- a/src/cascadia/TerminalSettingsModel/MTSMSettings.h +++ b/src/cascadia/TerminalSettingsModel/MTSMSettings.h @@ -68,8 +68,7 @@ Author(s): X(winrt::Windows::Foundation::Collections::IVector, NewTabMenu, "newTabMenu", winrt::single_threaded_vector({ Model::RemainingProfilesEntry{} })) \ X(bool, AllowHeadless, "compatibility.allowHeadless", false) \ X(bool, IsolatedMode, "compatibility.isolatedMode", false) \ - X(hstring, SearchWebDefaultQueryUrl, "searchWebDefaultQueryUrl", L"https://www.bing.com/search?q=%22%s%22") \ - X(LLMProvider, ActiveProvider, "activeLLMProvider") + X(hstring, SearchWebDefaultQueryUrl, "searchWebDefaultQueryUrl", L"https://www.bing.com/search?q=%22%s%22") // Also add these settings to: // * Profile.idl @@ -158,3 +157,6 @@ Author(s): X(winrt::Microsoft::Terminal::Settings::Model::ThemeColor, UnfocusedBackground, "unfocusedBackground", nullptr) \ X(winrt::Microsoft::Terminal::Settings::Model::IconStyle, IconStyle, "iconStyle", winrt::Microsoft::Terminal::Settings::Model::IconStyle::Default) \ X(winrt::Microsoft::Terminal::Settings::Model::TabCloseButtonVisibility, ShowCloseButton, "showCloseButton", winrt::Microsoft::Terminal::Settings::Model::TabCloseButtonVisibility::Always) + +#define MTSM_AI_SETTINGS(X) \ + X(winrt::Microsoft::Terminal::Settings::Model::LLMProvider, ActiveProvider, "activeProvider") diff --git a/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.ModelLib.vcxproj b/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.ModelLib.vcxproj index c62763464b0..d18069b3b9d 100644 --- a/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.ModelLib.vcxproj +++ b/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.ModelLib.vcxproj @@ -99,6 +99,9 @@ FontConfig.idl + + AIConfig.idl + EnumMappings.idl @@ -176,6 +179,9 @@ FontConfig.idl + + AIConfig.idl + TerminalSettings.idl @@ -239,6 +245,7 @@ + diff --git a/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.ModelLib.vcxproj.filters b/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.ModelLib.vcxproj.filters index 89b0f24f473..b7c2030a97c 100644 --- a/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.ModelLib.vcxproj.filters +++ b/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.ModelLib.vcxproj.filters @@ -115,6 +115,7 @@ +