From 4253ca7eab6ee0993c879ccf63719731f4c86b84 Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Tue, 3 Nov 2026 08:57:02 +0100 Subject: [PATCH] Generated the JSON contracts of the model answers and the Assistant Builder at compile time --- app/MindWork AI Studio/Agents/AgentBase.cs | 5 +++-- .../Agents/AgentJsonContext.cs | 14 ++++++++++++++ .../Assistants/Builder/LauncherTextsResponse.cs | 5 +++-- .../Builder/LauncherTextsResponseJsonContext.cs | 11 +++++++++++ .../Assistants/Builder/LuaResponse.Parse.cs | 5 +++-- .../Builder/LuaResponseJsonContext.cs | 11 +++++++++++ .../Assistants/ERI/ERIServerFileList.cs | 5 +++-- .../ERI/ERIServerFileListJsonContext.cs | 10 ++++++++++ .../AssistantPromptOptimizer.razor.cs | 5 +++-- .../PromptOptimizationJsonContext.cs | 10 ++++++++++ .../SWOTAnalysis/SwotAnalysisModeration.cs | 5 +++-- .../Assistants/SWOTAnalysis/SwotModelAnswer.cs | 5 +++-- .../SWOTAnalysis/SwotModelAnswerJsonContext.cs | 12 ++++++++++++ .../SWOTAnalysis/SwotModerationJsonContext.cs | 11 +++++++++++ .../Tools/PowerPoint/SlideDeckJsonContext.cs | 10 ++++++++++ .../Tools/PowerPoint/SlideDeckSpec.Parsing.cs | 5 +++-- .../AssistantBuilderPromptJsonContext.cs | 14 ++++++++++++++ .../AssistantPluginGenerationService.cs | 5 +++-- app/Tests/Serialization/JsonContractTests.cs | 1 + app/Tests/Serialization/JsonCoverageTests.cs | 2 ++ .../Serialization/JsonTestRoots.ModelAnswers.cs | 17 +++++++++++++++++ 21 files changed, 150 insertions(+), 18 deletions(-) create mode 100644 app/MindWork AI Studio/Agents/AgentJsonContext.cs create mode 100644 app/MindWork AI Studio/Assistants/Builder/LauncherTextsResponseJsonContext.cs create mode 100644 app/MindWork AI Studio/Assistants/Builder/LuaResponseJsonContext.cs create mode 100644 app/MindWork AI Studio/Assistants/ERI/ERIServerFileListJsonContext.cs create mode 100644 app/MindWork AI Studio/Assistants/PromptOptimizer/PromptOptimizationJsonContext.cs create mode 100644 app/MindWork AI Studio/Assistants/SWOTAnalysis/SwotModelAnswerJsonContext.cs create mode 100644 app/MindWork AI Studio/Assistants/SWOTAnalysis/SwotModerationJsonContext.cs create mode 100644 app/MindWork AI Studio/Tools/PowerPoint/SlideDeckJsonContext.cs create mode 100644 app/MindWork AI Studio/Tools/Services/AssistantBuilderPromptJsonContext.cs diff --git a/app/MindWork AI Studio/Agents/AgentBase.cs b/app/MindWork AI Studio/Agents/AgentBase.cs index 0df81ca9d..1011ebd58 100644 --- a/app/MindWork AI Studio/Agents/AgentBase.cs +++ b/app/MindWork AI Studio/Agents/AgentBase.cs @@ -19,10 +19,11 @@ public abstract class AgentBase(ILogger logger, SettingsManager setti Time = DateTimeOffset.UtcNow, }; - internal static readonly JsonSerializerOptions JSON_SERIALIZER_OPTIONS = new() + internal static readonly JsonSerializerOptions JSON_SERIALIZER_OPTIONS = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower, - }; + TypeInfoResolver = AgentJsonContext.Default, + }.AsReadOnly(); protected DataSourceService DataSourceService { get; init; } = dataSourceService; diff --git a/app/MindWork AI Studio/Agents/AgentJsonContext.cs b/app/MindWork AI Studio/Agents/AgentJsonContext.cs new file mode 100644 index 000000000..c1aa7b050 --- /dev/null +++ b/app/MindWork AI Studio/Agents/AgentJsonContext.cs @@ -0,0 +1,14 @@ +using System.Text.Json.Serialization; + +using AIStudio.Agents.AssistantAudit; + +namespace AIStudio.Agents; + +/// +/// The contracts with which System.Text.Json reads the answers of the agents, built at compile time. +/// +[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Metadata)] +[JsonSerializable(typeof(List))] +[JsonSerializable(typeof(RetrievalContextValidationResult))] +[JsonSerializable(typeof(AssistantAuditResult))] +internal sealed partial class AgentJsonContext : JsonSerializerContext; \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/Builder/LauncherTextsResponse.cs b/app/MindWork AI Studio/Assistants/Builder/LauncherTextsResponse.cs index 28408c9ea..4b2ad4491 100644 --- a/app/MindWork AI Studio/Assistants/Builder/LauncherTextsResponse.cs +++ b/app/MindWork AI Studio/Assistants/Builder/LauncherTextsResponse.cs @@ -14,13 +14,14 @@ internal sealed class LauncherTextsResponse { public const string SCHEMA_VERSION_VALUE = "assistant_builder_launcher_texts_v1"; - internal static readonly JsonSerializerOptions JSON_OPTIONS = new() + internal static readonly JsonSerializerOptions JSON_OPTIONS = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower, AllowTrailingCommas = false, ReadCommentHandling = JsonCommentHandling.Disallow, MaxDepth = 8, - }; + TypeInfoResolver = LauncherTextsResponseJsonContext.Default, + }.AsReadOnly(); public string SchemaVersion { get; set; } = string.Empty; diff --git a/app/MindWork AI Studio/Assistants/Builder/LauncherTextsResponseJsonContext.cs b/app/MindWork AI Studio/Assistants/Builder/LauncherTextsResponseJsonContext.cs new file mode 100644 index 000000000..613371a7a --- /dev/null +++ b/app/MindWork AI Studio/Assistants/Builder/LauncherTextsResponseJsonContext.cs @@ -0,0 +1,11 @@ +using System.Text.Json.Serialization; + +namespace AIStudio.Assistants.Builder; + +/// +/// The contracts with which System.Text.Json reads the answer of a model which names a direct chat launcher, built +/// at compile time. +/// +[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Metadata)] +[JsonSerializable(typeof(LauncherTextsResponse))] +internal sealed partial class LauncherTextsResponseJsonContext : JsonSerializerContext; \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/Builder/LuaResponse.Parse.cs b/app/MindWork AI Studio/Assistants/Builder/LuaResponse.Parse.cs index db33a2bcd..37e2ceb99 100644 --- a/app/MindWork AI Studio/Assistants/Builder/LuaResponse.Parse.cs +++ b/app/MindWork AI Studio/Assistants/Builder/LuaResponse.Parse.cs @@ -4,13 +4,14 @@ namespace AIStudio.Assistants.Builder; internal sealed partial class LuaResponse { - internal static readonly JsonSerializerOptions JSON_OPTIONS = new() + internal static readonly JsonSerializerOptions JSON_OPTIONS = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower, AllowTrailingCommas = false, ReadCommentHandling = JsonCommentHandling.Disallow, MaxDepth = 32, - }; + TypeInfoResolver = LuaResponseJsonContext.Default, + }.AsReadOnly(); public static bool TryParse(string modelResponse, out LuaResponse response, out LuaResponseParseError error, out string technicalDetails) { diff --git a/app/MindWork AI Studio/Assistants/Builder/LuaResponseJsonContext.cs b/app/MindWork AI Studio/Assistants/Builder/LuaResponseJsonContext.cs new file mode 100644 index 000000000..1fa2039cf --- /dev/null +++ b/app/MindWork AI Studio/Assistants/Builder/LuaResponseJsonContext.cs @@ -0,0 +1,11 @@ +using System.Text.Json.Serialization; + +namespace AIStudio.Assistants.Builder; + +/// +/// The contracts with which System.Text.Json reads the answer of a model which writes an assistant plugin, built at +/// compile time. +/// +[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Metadata)] +[JsonSerializable(typeof(LuaResponse))] +internal sealed partial class LuaResponseJsonContext : JsonSerializerContext; \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/ERI/ERIServerFileList.cs b/app/MindWork AI Studio/Assistants/ERI/ERIServerFileList.cs index fa3c3be65..ca388216c 100644 --- a/app/MindWork AI Studio/Assistants/ERI/ERIServerFileList.cs +++ b/app/MindWork AI Studio/Assistants/ERI/ERIServerFileList.cs @@ -13,13 +13,14 @@ namespace AIStudio.Assistants.ERI; /// internal sealed class ERIServerFileList { - internal static readonly JsonSerializerOptions JSON_OPTIONS = new() + internal static readonly JsonSerializerOptions JSON_OPTIONS = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, AllowTrailingCommas = false, ReadCommentHandling = JsonCommentHandling.Disallow, MaxDepth = 8, - }; + TypeInfoResolver = ERIServerFileListJsonContext.Default, + }.AsReadOnly(); /// /// The paths of the files, relative to the base directory. diff --git a/app/MindWork AI Studio/Assistants/ERI/ERIServerFileListJsonContext.cs b/app/MindWork AI Studio/Assistants/ERI/ERIServerFileListJsonContext.cs new file mode 100644 index 000000000..dcfd51ca6 --- /dev/null +++ b/app/MindWork AI Studio/Assistants/ERI/ERIServerFileListJsonContext.cs @@ -0,0 +1,10 @@ +using System.Text.Json.Serialization; + +namespace AIStudio.Assistants.ERI; + +/// +/// The contracts with which System.Text.Json reads the files a model plans for an ERI server, built at compile time. +/// +[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Metadata)] +[JsonSerializable(typeof(ERIServerFileList))] +internal sealed partial class ERIServerFileListJsonContext : JsonSerializerContext; \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/PromptOptimizer/AssistantPromptOptimizer.razor.cs b/app/MindWork AI Studio/Assistants/PromptOptimizer/AssistantPromptOptimizer.razor.cs index 88a67530d..5d4c5d720 100644 --- a/app/MindWork AI Studio/Assistants/PromptOptimizer/AssistantPromptOptimizer.razor.cs +++ b/app/MindWork AI Studio/Assistants/PromptOptimizer/AssistantPromptOptimizer.razor.cs @@ -17,10 +17,11 @@ namespace AIStudio.Assistants.PromptOptimizer; public partial class AssistantPromptOptimizer : AssistantBaseCore { - internal static readonly JsonSerializerOptions JSON_OPTIONS = new() + internal static readonly JsonSerializerOptions JSON_OPTIONS = new JsonSerializerOptions { PropertyNameCaseInsensitive = true, - }; + TypeInfoResolver = PromptOptimizationJsonContext.Default, + }.AsReadOnly(); [Inject] private IDialogService DialogService { get; init; } = null!; diff --git a/app/MindWork AI Studio/Assistants/PromptOptimizer/PromptOptimizationJsonContext.cs b/app/MindWork AI Studio/Assistants/PromptOptimizer/PromptOptimizationJsonContext.cs new file mode 100644 index 000000000..a44740d29 --- /dev/null +++ b/app/MindWork AI Studio/Assistants/PromptOptimizer/PromptOptimizationJsonContext.cs @@ -0,0 +1,10 @@ +using System.Text.Json.Serialization; + +namespace AIStudio.Assistants.PromptOptimizer; + +/// +/// The contracts with which System.Text.Json reads the answer of the prompt optimizer, built at compile time. +/// +[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Metadata)] +[JsonSerializable(typeof(PromptOptimizationResult))] +internal sealed partial class PromptOptimizationJsonContext : JsonSerializerContext; \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/SWOTAnalysis/SwotAnalysisModeration.cs b/app/MindWork AI Studio/Assistants/SWOTAnalysis/SwotAnalysisModeration.cs index c6bb9cc58..c37661f2d 100644 --- a/app/MindWork AI Studio/Assistants/SWOTAnalysis/SwotAnalysisModeration.cs +++ b/app/MindWork AI Studio/Assistants/SWOTAnalysis/SwotAnalysisModeration.cs @@ -16,10 +16,11 @@ namespace AIStudio.Assistants.SWOTAnalysis; internal static class SwotAnalysisModeration { // Internal rather than private, so that a test can check the JSON the moderator gets: - internal static readonly JsonSerializerOptions JSON_OPTIONS = new() + internal static readonly JsonSerializerOptions JSON_OPTIONS = new JsonSerializerOptions { WriteIndented = true, - }; + TypeInfoResolver = SwotModerationJsonContext.Default, + }.AsReadOnly(); public static string BuildSystemPrompt(string outputLanguageInstruction) => $""" diff --git a/app/MindWork AI Studio/Assistants/SWOTAnalysis/SwotModelAnswer.cs b/app/MindWork AI Studio/Assistants/SWOTAnalysis/SwotModelAnswer.cs index 0eae03246..506ef1683 100644 --- a/app/MindWork AI Studio/Assistants/SWOTAnalysis/SwotModelAnswer.cs +++ b/app/MindWork AI Studio/Assistants/SWOTAnalysis/SwotModelAnswer.cs @@ -8,13 +8,14 @@ namespace AIStudio.Assistants.SWOTAnalysis; /// internal static class SwotModelAnswer { - internal static readonly JsonSerializerOptions JSON_OPTIONS = new() + internal static readonly JsonSerializerOptions JSON_OPTIONS = new JsonSerializerOptions { PropertyNameCaseInsensitive = true, AllowTrailingCommas = true, ReadCommentHandling = JsonCommentHandling.Skip, RespectNullableAnnotations = true, - }; + TypeInfoResolver = SwotModelAnswerJsonContext.Default, + }.AsReadOnly(); /// /// Reads the JSON object of a model answer into the given type, without checking its content. diff --git a/app/MindWork AI Studio/Assistants/SWOTAnalysis/SwotModelAnswerJsonContext.cs b/app/MindWork AI Studio/Assistants/SWOTAnalysis/SwotModelAnswerJsonContext.cs new file mode 100644 index 000000000..57700406b --- /dev/null +++ b/app/MindWork AI Studio/Assistants/SWOTAnalysis/SwotModelAnswerJsonContext.cs @@ -0,0 +1,12 @@ +using System.Text.Json.Serialization; + +namespace AIStudio.Assistants.SWOTAnalysis; + +/// +/// The contracts with which System.Text.Json reads the answers of the models which work on a SWOT analysis, built at +/// compile time. +/// +[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Metadata)] +[JsonSerializable(typeof(SwotCategoryAnalysisResult))] +[JsonSerializable(typeof(SwotModerationResult))] +internal sealed partial class SwotModelAnswerJsonContext : JsonSerializerContext; \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/SWOTAnalysis/SwotModerationJsonContext.cs b/app/MindWork AI Studio/Assistants/SWOTAnalysis/SwotModerationJsonContext.cs new file mode 100644 index 000000000..ce6cb1da6 --- /dev/null +++ b/app/MindWork AI Studio/Assistants/SWOTAnalysis/SwotModerationJsonContext.cs @@ -0,0 +1,11 @@ +using System.Text.Json.Serialization; + +namespace AIStudio.Assistants.SWOTAnalysis; + +/// +/// The contracts with which System.Text.Json writes the preliminary results the moderator of a SWOT analysis gets, +/// built at compile time. +/// +[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Metadata)] +[JsonSerializable(typeof(Dictionary))] +internal sealed partial class SwotModerationJsonContext : JsonSerializerContext; \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PowerPoint/SlideDeckJsonContext.cs b/app/MindWork AI Studio/Tools/PowerPoint/SlideDeckJsonContext.cs new file mode 100644 index 000000000..89b4ef6c1 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PowerPoint/SlideDeckJsonContext.cs @@ -0,0 +1,10 @@ +using System.Text.Json.Serialization; + +namespace AIStudio.Tools.PowerPoint; + +/// +/// The contracts with which System.Text.Json reads the slides a model plans, built at compile time. +/// +[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Metadata)] +[JsonSerializable(typeof(SlideDeckSpec.DeckDto))] +internal sealed partial class SlideDeckJsonContext : JsonSerializerContext; \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PowerPoint/SlideDeckSpec.Parsing.cs b/app/MindWork AI Studio/Tools/PowerPoint/SlideDeckSpec.Parsing.cs index e4e4a786e..9fc97d585 100644 --- a/app/MindWork AI Studio/Tools/PowerPoint/SlideDeckSpec.Parsing.cs +++ b/app/MindWork AI Studio/Tools/PowerPoint/SlideDeckSpec.Parsing.cs @@ -7,7 +7,7 @@ namespace AIStudio.Tools.PowerPoint; internal sealed partial record SlideDeckSpec { - internal static readonly JsonSerializerOptions JSON_OPTIONS = new() + internal static readonly JsonSerializerOptions JSON_OPTIONS = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower, PropertyNameCaseInsensitive = true, @@ -15,7 +15,8 @@ internal sealed partial record SlideDeckSpec AllowTrailingCommas = true, ReadCommentHandling = JsonCommentHandling.Skip, MaxDepth = 16, - }; + TypeInfoResolver = SlideDeckJsonContext.Default, + }.AsReadOnly(); /// /// The deepest list level a paragraph may have; PowerPoint knows nine, starting at 0. diff --git a/app/MindWork AI Studio/Tools/Services/AssistantBuilderPromptJsonContext.cs b/app/MindWork AI Studio/Tools/Services/AssistantBuilderPromptJsonContext.cs new file mode 100644 index 000000000..38d94de91 --- /dev/null +++ b/app/MindWork AI Studio/Tools/Services/AssistantBuilderPromptJsonContext.cs @@ -0,0 +1,14 @@ +using System.Text.Json.Serialization; + +namespace AIStudio.Tools.Services; + +/// +/// The contracts with which System.Text.Json writes what the Assistant Builder hands to its models, built at compile +/// time. +/// +[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Metadata)] +[JsonSerializable(typeof(AssistantBuilderDraftPromptData))] +[JsonSerializable(typeof(AssistantBuilderGenerationPromptData))] +[JsonSerializable(typeof(AssistantBuilderLauncherPromptData))] +[JsonSerializable(typeof(AssistantBuilderRevisionPromptData))] +internal sealed partial class AssistantBuilderPromptJsonContext : JsonSerializerContext; \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Services/AssistantPluginGenerationService.cs b/app/MindWork AI Studio/Tools/Services/AssistantPluginGenerationService.cs index 1ff7fa87f..94e838470 100644 --- a/app/MindWork AI Studio/Tools/Services/AssistantPluginGenerationService.cs +++ b/app/MindWork AI Studio/Tools/Services/AssistantPluginGenerationService.cs @@ -19,11 +19,12 @@ public sealed class AssistantPluginGenerationService(ToolRegistry toolRegistry, private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(AssistantPluginGenerationService).Namespace, nameof(AssistantPluginGenerationService)); // Internal rather than private, so that a test can check the JSON the models get: - internal static readonly JsonSerializerOptions UNTRUSTED_PROMPT_JSON_OPTIONS = new() + internal static readonly JsonSerializerOptions UNTRUSTED_PROMPT_JSON_OPTIONS = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower, WriteIndented = true, - }; + TypeInfoResolver = AssistantBuilderPromptJsonContext.Default, + }.AsReadOnly(); private const string LUA_RESPONSE_SCHEMA_PATH = "Assistants/Builder/AssistantBuilderLuaResponse.schema.json"; private const string DEFAULT_VERSION = "1.0.0"; diff --git a/app/Tests/Serialization/JsonContractTests.cs b/app/Tests/Serialization/JsonContractTests.cs index 672e7f697..0b5b53288 100644 --- a/app/Tests/Serialization/JsonContractTests.cs +++ b/app/Tests/Serialization/JsonContractTests.cs @@ -22,6 +22,7 @@ public sealed class JsonContractTests [TestCaseSource(typeof(JsonTestRoots), nameof(JsonTestRoots.VisualBriefingHashed))] [TestCaseSource(typeof(JsonTestRoots), nameof(JsonTestRoots.VisualBriefingAnswers))] [TestCaseSource(typeof(JsonTestRoots), nameof(JsonTestRoots.ModelAnswers))] + [TestCaseSource(typeof(JsonTestRoots), nameof(JsonTestRoots.ModelPrompts))] public void TheContractsMatchThoseOfReflection(JsonTestRoot root) { var baseline = JsonReflectionBaseline.Of(root.Options); diff --git a/app/Tests/Serialization/JsonCoverageTests.cs b/app/Tests/Serialization/JsonCoverageTests.cs index 8c5e8d46b..0341124af 100644 --- a/app/Tests/Serialization/JsonCoverageTests.cs +++ b/app/Tests/Serialization/JsonCoverageTests.cs @@ -23,6 +23,8 @@ public sealed class JsonCoverageTests [TestCaseSource(typeof(JsonTestRoots), nameof(JsonTestRoots.VisualBriefingStored))] [TestCaseSource(typeof(JsonTestRoots), nameof(JsonTestRoots.VisualBriefingHashed))] [TestCaseSource(typeof(JsonTestRoots), nameof(JsonTestRoots.VisualBriefingAnswers))] + [TestCaseSource(typeof(JsonTestRoots), nameof(JsonTestRoots.ModelAnswers))] + [TestCaseSource(typeof(JsonTestRoots), nameof(JsonTestRoots.ModelPrompts))] public void EveryContractComesFromSourceGeneration(JsonTestRoot root) { var typesWithoutGeneratedContract = JsonTypeGraph.Collect(root.Type, root.Options) diff --git a/app/Tests/Serialization/JsonTestRoots.ModelAnswers.cs b/app/Tests/Serialization/JsonTestRoots.ModelAnswers.cs index 25b77392b..ad9c4dc30 100644 --- a/app/Tests/Serialization/JsonTestRoots.ModelAnswers.cs +++ b/app/Tests/Serialization/JsonTestRoots.ModelAnswers.cs @@ -5,6 +5,7 @@ using AIStudio.Assistants.ERI; using AIStudio.Assistants.PromptOptimizer; using AIStudio.Assistants.SWOTAnalysis; using AIStudio.Tools.PowerPoint; +using AIStudio.Tools.Services; namespace AIStudio.Tests.Serialization; @@ -33,4 +34,20 @@ public static partial class JsonTestRoots yield return Case(new(typeof(ERIServerFileList), ERIServerFileList.JSON_OPTIONS)); yield return Case(new(typeof(SlideDeckSpec.DeckDto), SlideDeckSpec.JSON_OPTIONS)); } + + /// + /// The JSON which the Assistant Builder and the moderation of a SWOT analysis put into their prompts. + /// + public static IEnumerable ModelPrompts() + { + TestHost.PrepareStaticState(); + + var untrusted = AssistantPluginGenerationService.UNTRUSTED_PROMPT_JSON_OPTIONS; + yield return Case(new(typeof(AssistantBuilderDraftPromptData), untrusted)); + yield return Case(new(typeof(AssistantBuilderGenerationPromptData), untrusted)); + yield return Case(new(typeof(AssistantBuilderLauncherPromptData), untrusted)); + yield return Case(new(typeof(AssistantBuilderRevisionPromptData), untrusted)); + + yield return Case(new(typeof(Dictionary), SwotAnalysisModeration.JSON_OPTIONS)); + } } \ No newline at end of file