From 7b65d96cd82df20654d4c65c1d946ea39b5a9f6b Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Sun, 1 Nov 2026 21:00:06 +0100 Subject: [PATCH] Made the stored JSON types settable instead of init-only --- .../AssistantAudit/AssistantAuditFinding.cs | 12 +-- app/MindWork AI Studio/Chat/ChatDraft.cs | 11 ++- app/MindWork AI Studio/Chat/ChatThread.cs | 16 ++-- app/MindWork AI Studio/Chat/ContentBlock.cs | 6 +- app/MindWork AI Studio/Chat/ContentImage.cs | 2 +- app/MindWork AI Studio/Chat/FileAttachment.cs | 20 ++++- .../Chat/FileAttachmentImage.cs | 2 +- app/MindWork AI Studio/Chat/IImageSource.cs | 2 +- .../Chat/ReportedTokenUsage.cs | 6 +- .../Settings/ChatTemplate.cs | 27 +++++-- .../Settings/DataModel/Data.cs | 80 +++++++++---------- .../Settings/DataModel/DataApp.cs | 2 +- .../DataAssistantPluginEnterpriseApproval.cs | 14 ++-- .../DataModel/DataDocumentAnalysisPolicy.cs | 10 +-- .../DataModel/DataMandatoryInfoAcceptance.cs | 10 +-- .../Settings/DataModel/DataSourceERI_V1.cs | 34 ++++---- .../DataModel/DataSourceLocalDirectory.cs | 40 +++++----- .../Settings/DataModel/DataSourceLocalFile.cs | 30 +++---- .../Settings/DataModel/DataSourceMailbox.cs | 46 +++++------ .../DataModel/PreviousModels/DataV1V3.cs | 4 +- .../DataModel/PreviousModels/DataV4.cs | 30 +++---- .../DataModel/PreviousModels/DataV5.cs | 66 +++++++-------- .../Settings/EmbeddingProvider.cs | 30 ++++++- .../Settings/IDataSource.cs | 4 +- .../Settings/IDataSourceBase.cs | 2 +- .../Settings/IERIDataSource.cs | 14 ++-- .../Settings/IExternalDataSource.cs | 2 +- .../Settings/IIndexedDataSource.cs | 8 +- .../Settings/ManagedEditableDefaultState.cs | 4 +- app/MindWork AI Studio/Settings/Profile.cs | 14 ++++ app/MindWork AI Studio/Settings/Provider.cs | 31 ++++++- .../Settings/ProviderCapabilityOverrides.cs | 22 ++--- .../Settings/TranscriptionProvider.cs | 21 +++++ .../Assistants/PluginAssistantAudit.cs | 8 +- .../PluginSystem/ConfigurationBaseObject.cs | 10 +-- .../Tools/RAG/RetrievalImageContext.cs | 2 +- .../Tools/RAG/SourcePassage.cs | 32 ++++---- app/Tests/Tools/EmbeddingSignatureTests.cs | 12 +-- 38 files changed, 406 insertions(+), 280 deletions(-) diff --git a/app/MindWork AI Studio/Agents/AssistantAudit/AssistantAuditFinding.cs b/app/MindWork AI Studio/Agents/AssistantAudit/AssistantAuditFinding.cs index 449052e12..0fe05d4fa 100644 --- a/app/MindWork AI Studio/Agents/AssistantAudit/AssistantAuditFinding.cs +++ b/app/MindWork AI Studio/Agents/AssistantAudit/AssistantAuditFinding.cs @@ -13,11 +13,11 @@ public sealed class AssistantAuditFinding /// #pragma warning restore MWAIS0005 [JsonIgnore] - public AssistantAuditLevel Severity { get; private init; } = AssistantAuditLevel.UNKNOWN; + public AssistantAuditLevel Severity { get; private set; } = AssistantAuditLevel.UNKNOWN; /// - /// Gets or initializes the JSON-facing severity label used by the audit model response. + /// Gets or sets the JSON-facing severity label used by the audit model response. /// [JsonPropertyName("severity")] public string SeverityText @@ -30,7 +30,7 @@ public sealed class AssistantAuditFinding _ => "unknown", }; - init => this.Severity = value.Trim().ToLowerInvariant() switch + set => this.Severity = value.Trim().ToLowerInvariant() switch { "critical" => AssistantAuditLevel.DANGEROUS, "medium" => AssistantAuditLevel.CAUTION, @@ -39,7 +39,7 @@ public sealed class AssistantAuditFinding }; } - public string Category { get; init; } = string.Empty; - public string Location { get; init; } = string.Empty; - public string Description { get; init; } = string.Empty; + public string Category { get; set; } = string.Empty; + public string Location { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; } diff --git a/app/MindWork AI Studio/Chat/ChatDraft.cs b/app/MindWork AI Studio/Chat/ChatDraft.cs index afbf81f06..c7e26f830 100644 --- a/app/MindWork AI Studio/Chat/ChatDraft.cs +++ b/app/MindWork AI Studio/Chat/ChatDraft.cs @@ -26,11 +26,16 @@ public sealed class ChatDraft { private readonly Lock stateLock = new(); + // + // The setters are internal only for reading the JSON, since its source generation reaches no private + // setter. Everything else changes the draft through the methods below, which hold the lock. + // + /// /// The text of the message. /// [JsonInclude] - public string Text { get; private set; } = string.Empty; + public string Text { get; internal set; } = string.Empty; /// /// The files attached to the message, the transcripts of audio and video files included. @@ -40,7 +45,7 @@ public sealed class ChatDraft /// transcript is still a transcript after the chat was loaded again. /// [JsonInclude] - public IReadOnlyList FileAttachments { get; private set; } = []; + public IReadOnlyList FileAttachments { get; internal set; } = []; /// /// The texts a preview read of the attached files, which sending takes along instead of reading the files again. @@ -53,7 +58,7 @@ public sealed class ChatDraft /// store holds the texts themselves. /// [JsonInclude] - public IReadOnlyList PreviewedTexts { get; private set; } = []; + public IReadOnlyList PreviewedTexts { get; internal set; } = []; /// /// Whether the draft holds neither text nor attachments. diff --git a/app/MindWork AI Studio/Chat/ChatThread.cs b/app/MindWork AI Studio/Chat/ChatThread.cs index c1a13db34..9d2dde6af 100644 --- a/app/MindWork AI Studio/Chat/ChatThread.cs +++ b/app/MindWork AI Studio/Chat/ChatThread.cs @@ -23,7 +23,7 @@ public sealed record ChatThread /// /// The unique identifier of the chat thread. /// - public Guid ChatId { get; init; } + public Guid ChatId { get; set; } /// /// The unique identifier of the workspace. @@ -42,16 +42,16 @@ public sealed record ChatThread /// Every copy of this thread made with a with expression shares the draft, because such a copy is /// still the same chat. A copy which becomes another chat needs a draft of its own. /// - public ChatDraft Draft { get; init; } = new(); + public ChatDraft Draft { get; set; } = new(); // Compatibility shim: until v26.9.1, a chat stored only the transcripts of its draft, in a list of their own. See documentation/compatibility-shims/2026-10-chat-pending-media-transcripts.md; remove after 2027-04-11. [JsonInclude] [JsonPropertyName("pending_media_transcripts")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - private List? LegacyPendingMediaTranscripts + internal List? LegacyPendingMediaTranscripts { get => null; - init + set { if (value is not null) this.Draft.AddAttachments(value); @@ -127,7 +127,7 @@ public sealed record ChatThread /// continues it must meet the level. /// [JsonInclude] - public ConfidenceLevel RequiredProviderConfidence { get; private set; } = ConfidenceLevel.NONE; + public ConfidenceLevel RequiredProviderConfidence { get; internal set; } = ConfidenceLevel.NONE; public void RequireProviderConfidence(ConfidenceLevel minimumProviderConfidence) { @@ -164,7 +164,7 @@ public sealed record ChatThread /// internal content demands nothing. /// [JsonInclude] - public OutboundDataRequirement RequiredOutboundDataRestriction { get; private set; } = OutboundDataRequirement.NONE; + public OutboundDataRequirement RequiredOutboundDataRestriction { get; internal set; } = OutboundDataRequirement.NONE; /// /// Tightens where this chat may still send data to what the data brought in demands, and @@ -229,7 +229,7 @@ public sealed record ChatThread /// immutable, so that a copy of the thread never shares a set which grows later. /// [JsonInclude] - public ImmutableHashSet WebAddressesWrittenByModels { get; private set; } = []; + public ImmutableHashSet WebAddressesWrittenByModels { get; internal set; } = []; /// /// The name of the chat thread. Usually generated by an AI model or manually edited by the user. @@ -244,7 +244,7 @@ public sealed record ChatThread /// /// The content blocks of the chat thread. /// - public List Blocks { get; init; } = []; + public List Blocks { get; set; } = []; /// /// The component running this thread, which decides the tools it may use and what its requests name. diff --git a/app/MindWork AI Studio/Chat/ContentBlock.cs b/app/MindWork AI Studio/Chat/ContentBlock.cs index 3961980ae..46b19ebc5 100644 --- a/app/MindWork AI Studio/Chat/ContentBlock.cs +++ b/app/MindWork AI Studio/Chat/ContentBlock.cs @@ -8,12 +8,12 @@ public class ContentBlock /// /// Time when the content block was created. /// - public DateTimeOffset Time { get; init; } + public DateTimeOffset Time { get; set; } /// /// Type of the content block, e.g., text, image, voice, etc. /// - public ContentType ContentType { get; init; } = ContentType.NONE; + public ContentType ContentType { get; set; } = ContentType.NONE; /// /// The content of the block. @@ -28,7 +28,7 @@ public class ContentBlock /// /// Should the content block be hidden from the user? /// - public bool HideFromUser { get; init; } + public bool HideFromUser { get; set; } public ContentBlock DeepClone(bool changeHideState = false, bool hideFromUser = true) => new() { diff --git a/app/MindWork AI Studio/Chat/ContentImage.cs b/app/MindWork AI Studio/Chat/ContentImage.cs index 8af5501ce..a56e3887b 100644 --- a/app/MindWork AI Studio/Chat/ContentImage.cs +++ b/app/MindWork AI Studio/Chat/ContentImage.cs @@ -58,7 +58,7 @@ public sealed class ContentImage : IContent, IImageSource /// /// Is the image source a URL, a local file path, a base64 string, etc.? /// - public required ContentImageSource SourceType { get; init; } + public required ContentImageSource SourceType { get; set; } /// /// The image source. diff --git a/app/MindWork AI Studio/Chat/FileAttachment.cs b/app/MindWork AI Studio/Chat/FileAttachment.cs index 11cb4731d..0f518be30 100644 --- a/app/MindWork AI Studio/Chat/FileAttachment.cs +++ b/app/MindWork AI Studio/Chat/FileAttachment.cs @@ -15,8 +15,22 @@ namespace AIStudio.Chat; [JsonDerivedType(typeof(FileAttachment), typeDiscriminator: "file")] [JsonDerivedType(typeof(FileAttachmentImage), typeDiscriminator: "image")] [JsonDerivedType(typeof(ManagedTranscriptAttachment), typeDiscriminator: "managed_transcript")] -public record FileAttachment(FileAttachmentType Type, string FileName, [property: JsonConverter(typeof(DataDirectoryRelativePathConverter))] string FilePath, long FileSizeBytes) +public record FileAttachment(FileAttachmentType Type, string FileName, string FilePath, long FileSizeBytes) { + // + // The properties of the parameters, declared again to be settable. A derived attachment gets the type from + // its own constructor, and the source generation of System.Text.Json sets every init-only property while it + // creates the object, also one missing in the JSON, which would lose that type. Keep them first and in the + // order of the parameters, which is the order they get stored in: + // + public FileAttachmentType Type { get; set; } = Type; + public string FileName { get; set; } = FileName; + + [JsonConverter(typeof(DataDirectoryRelativePathConverter))] + public string FilePath { get; set; } = FilePath; + + public long FileSizeBytes { get; set; } = FileSizeBytes; + /// /// Gets a value indicating whether the file type is forbidden and should not be attached. /// @@ -69,7 +83,7 @@ public record FileAttachment(FileAttachmentType Type, string FileName, [property /// of chat templates, while null. /// [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public Guid? ProvenanceId { get; init; } + public Guid? ProvenanceId { get; set; } /// /// The state of the file which the stored text was read from, see ProvenanceId, or null while @@ -80,7 +94,7 @@ public record FileAttachment(FileAttachmentType Type, string FileName, [property /// DataChat.ReadChangedAttachmentsAgain. Left out of the chat file while null. /// [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public FileVersion? Version { get; init; } + public FileVersion? Version { get; set; } /// /// Whether the file changed since its text was stored. diff --git a/app/MindWork AI Studio/Chat/FileAttachmentImage.cs b/app/MindWork AI Studio/Chat/FileAttachmentImage.cs index 19d002e0d..c046229ff 100644 --- a/app/MindWork AI Studio/Chat/FileAttachmentImage.cs +++ b/app/MindWork AI Studio/Chat/FileAttachmentImage.cs @@ -10,7 +10,7 @@ public record FileAttachmentImage(string FileName, string FilePath, long FileSiz /// /// Is the image source a URL, a local file path, a base64 string, etc.? /// - public ContentImageSource SourceType { get; init; } = ContentImageSource.LOCAL_PATH; + public ContentImageSource SourceType { get; set; } = ContentImageSource.LOCAL_PATH; /// /// The image source. diff --git a/app/MindWork AI Studio/Chat/IImageSource.cs b/app/MindWork AI Studio/Chat/IImageSource.cs index 1931630f3..e073593ec 100644 --- a/app/MindWork AI Studio/Chat/IImageSource.cs +++ b/app/MindWork AI Studio/Chat/IImageSource.cs @@ -8,7 +8,7 @@ public interface IImageSource /// /// Is the image source a URL, a local file path, a base64 string, etc.? /// - public ContentImageSource SourceType { get; init; } + public ContentImageSource SourceType { get; set; } /// /// The image source. diff --git a/app/MindWork AI Studio/Chat/ReportedTokenUsage.cs b/app/MindWork AI Studio/Chat/ReportedTokenUsage.cs index b005241fd..482381090 100644 --- a/app/MindWork AI Studio/Chat/ReportedTokenUsage.cs +++ b/app/MindWork AI Studio/Chat/ReportedTokenUsage.cs @@ -20,7 +20,7 @@ public sealed record ReportedTokenUsage /// /// What everything sent to the model cost. /// - public int PromptTokens { get; init; } + public int PromptTokens { get; set; } /// /// Which model the number was charged for. @@ -31,7 +31,7 @@ public sealed record ReportedTokenUsage /// being an answer about the request which is about to be sent, and the estimate, wrong as it /// is, is at least wrong about the right model. /// - public string ModelId { get; init; } = string.Empty; + public string ModelId { get; set; } = string.Empty; /// /// How many blocks the conversation had when the request went out, this answer included. @@ -45,7 +45,7 @@ public sealed record ReportedTokenUsage /// Taken when the request is sent rather than when the report arrives: whatever is deleted /// while the answer streams in was still part of what the provider counted. /// - public int BlockCount { get; init; } + public int BlockCount { get; set; } /// /// States the stored number as a usage again. diff --git a/app/MindWork AI Studio/Settings/ChatTemplate.cs b/app/MindWork AI Studio/Settings/ChatTemplate.cs index 2e3b836e7..645c878cb 100644 --- a/app/MindWork AI Studio/Settings/ChatTemplate.cs +++ b/app/MindWork AI Studio/Settings/ChatTemplate.cs @@ -22,6 +22,23 @@ public record ChatTemplate( bool IsEnterpriseConfiguration = false, Guid EnterpriseConfigurationPluginId = default) : ConfigurationBaseObject { + // + // The properties of the parameters, declared again to be settable. The source generation of System.Text.Json + // sets every init-only property while it creates the object, also one missing in the JSON, so its value from + // the parameterless constructor would get lost. Keep them first and in the order of the parameters, which is + // the order they get stored in: + // + public override uint Num { get; set; } = Num; + public override string Id { get; set; } = Id; + public override string Name { get; set; } = Name; + public string SystemPrompt { get; set; } = SystemPrompt; + public string PredefinedUserPrompt { get; set; } = PredefinedUserPrompt; + public List ExampleConversation { get; set; } = ExampleConversation; + public List FileAttachments { get; set; } = FileAttachments; + public bool AllowProfileUsage { get; set; } = AllowProfileUsage; + public override bool IsEnterpriseConfiguration { get; set; } = IsEnterpriseConfiguration; + public override Guid EnterpriseConfigurationPluginId { get; set; } = EnterpriseConfigurationPluginId; + private const string ATTACHMENTS_DIRECTORY = "attachments"; public ChatTemplate() : this(0, Guid.Empty.ToString(), string.Empty, string.Empty, string.Empty, [], [], false) @@ -38,7 +55,7 @@ public record ChatTemplate( /// A preselection, not a limit: the user changes the selection in the chat as usual, and a /// tool still has to meet the confidence requirements of the provider in use. /// - public HashSet? ToolIds { get; init; } + public HashSet? ToolIds { get; set; } /// /// The data source options a chat started with this template begins with. @@ -49,7 +66,7 @@ public record ChatTemplate( /// list of sources: whether data sources are used at all, whether an agent picks them, and /// whether the retrieved data is validated. /// - public DataSourceOptions? DataSourceOptions { get; init; } + public DataSourceOptions? DataSourceOptions { get; set; } /// /// The profile this template preselects for a chat started with it. @@ -63,7 +80,7 @@ public record ChatTemplate( /// nothing for a template which does not allow profiles, and a profile which is gone leaves the /// chat default in place. /// - public string? ProfileId { get; init; } + public string? ProfileId { get; set; } /// /// The provider, and with it the model, this template preselects for a chat started with it. @@ -74,7 +91,7 @@ public record ChatTemplate( /// provider which is gone, or which may not be used for chats, leaves the chat to start as if /// the template said nothing. /// - public string? ProviderId { get; init; } + public string? ProviderId { get; set; } /// /// The name of the workspace a chat started with this template is kept in. @@ -89,7 +106,7 @@ public record ChatTemplate( /// workspace on purpose, for example from the workspace list, stays there, and so does every /// chat while workspaces are switched off. /// - public string? WorkspaceName { get; init; } + public string? WorkspaceName { get; set; } private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(ChatTemplate).Namespace, nameof(ChatTemplate)); diff --git a/app/MindWork AI Studio/Settings/DataModel/Data.cs b/app/MindWork AI Studio/Settings/DataModel/Data.cs index 82f5c3b68..c767994da 100644 --- a/app/MindWork AI Studio/Settings/DataModel/Data.cs +++ b/app/MindWork AI Studio/Settings/DataModel/Data.cs @@ -11,32 +11,32 @@ public sealed class Data /// The version of the settings file. Allows us to upgrade the settings /// when a new version is available. /// - public Version Version { get; init; } = Version.V6; + public Version Version { get; set; } = Version.V6; /// /// List of configured providers. /// - public List Providers { get; init; } = []; + public List Providers { get; set; } = []; /// /// Settings concerning confidence levels. /// - public DataConfidence Confidence { get; init; } = new(x => x.Confidence); + public DataConfidence Confidence { get; set; } = new(x => x.Confidence); /// /// Settings concerning data source security checks. /// - public DataSourceSecuritySettings DataSourceSecurity { get; init; } = new(x => x.DataSourceSecurity); + public DataSourceSecuritySettings DataSourceSecurity { get; set; } = new(x => x.DataSourceSecurity); /// /// A collection of embedding providers configured. /// - public List EmbeddingProviders { get; init; } = []; + public List EmbeddingProviders { get; set; } = []; /// /// A collection of speech providers configured. /// - public List TranscriptionProviders { get; init; } = []; + public List TranscriptionProviders { get; set; } = []; /// /// A collection of data sources configured. @@ -59,17 +59,17 @@ public sealed class Data /// /// Settings which apply to all mailboxes. /// - public DataMailboxes MailboxSettings { get; init; } = new(x => x.MailboxSettings); + public DataMailboxes MailboxSettings { get; set; } = new(x => x.MailboxSettings); /// /// List of configured profiles. /// - public List Profiles { get; init; } = []; + public List Profiles { get; set; } = []; /// /// List of configured chat templates. /// - public List ChatTemplates { get; init; } = []; + public List ChatTemplates { get; set; } = []; /// /// List of enabled plugins. @@ -161,74 +161,74 @@ public sealed class Data /// public uint NextDocumentAnalysisPolicyNum { get; set; } = 1; - public DataApp App { get; init; } = new(x => x.App); + public DataApp App { get; set; } = new(x => x.App); - public DataChat Chat { get; init; } = new(x => x.Chat); + public DataChat Chat { get; set; } = new(x => x.Chat); - public DataWorkspace Workspace { get; init; } = new(); + public DataWorkspace Workspace { get; set; } = new(); - public DataIconFinder IconFinder { get; init; } = new(); + public DataIconFinder IconFinder { get; set; } = new(); - public DataTranslation Translation { get; init; } = new(); + public DataTranslation Translation { get; set; } = new(); - public DataCoding Coding { get; init; } = new(); + public DataCoding Coding { get; set; } = new(); - public DataERI ERI { get; init; } = new(); + public DataERI ERI { get; set; } = new(); - public DataDocumentAnalysis DocumentAnalysis { get; init; } = new(); + public DataDocumentAnalysis DocumentAnalysis { get; set; } = new(); /// /// Gets the managed Batch Processing Assistant defaults. /// - public DataBatchProcessing BatchProcessing { get; init; } = new(x => x.BatchProcessing); + public DataBatchProcessing BatchProcessing { get; set; } = new(x => x.BatchProcessing); - public DataMandatoryInformation MandatoryInformation { get; init; } = new(); + public DataMandatoryInformation MandatoryInformation { get; set; } = new(); - public DataTextSummarizer TextSummarizer { get; init; } = new(); + public DataTextSummarizer TextSummarizer { get; set; } = new(); - public DataSWOTAnalysis SWOTAnalysis { get; init; } = new(); + public DataSWOTAnalysis SWOTAnalysis { get; set; } = new(); - public DataTextContentCleaner TextContentCleaner { get; init; } = new(); + public DataTextContentCleaner TextContentCleaner { get; set; } = new(); - public DataAgentDataSourceSelection AgentDataSourceSelection { get; init; } = new(x => x.AgentDataSourceSelection); + public DataAgentDataSourceSelection AgentDataSourceSelection { get; set; } = new(x => x.AgentDataSourceSelection); - public DataAgentRetrievalContextValidation AgentRetrievalContextValidation { get; init; } = new(x => x.AgentRetrievalContextValidation); + public DataAgentRetrievalContextValidation AgentRetrievalContextValidation { get; set; } = new(x => x.AgentRetrievalContextValidation); - public DataAssistantPluginAudit AssistantPluginAudit { get; init; } = new(x => x.AssistantPluginAudit); + public DataAssistantPluginAudit AssistantPluginAudit { get; set; } = new(x => x.AssistantPluginAudit); - public DataAgenda Agenda { get; init; } = new(); + public DataAgenda Agenda { get; set; } = new(); - public DataGrammarSpelling GrammarSpelling { get; init; } = new(); + public DataGrammarSpelling GrammarSpelling { get; set; } = new(); - public DataRewriteImprove RewriteImprove { get; init; } = new(); + public DataRewriteImprove RewriteImprove { get; set; } = new(); - public DataPromptOptimizer PromptOptimizer { get; init; } = new(); + public DataPromptOptimizer PromptOptimizer { get; set; } = new(); - public DataEMail EMail { get; init; } = new(); + public DataEMail EMail { get; set; } = new(); - public DataSlideBuilder SlideBuilder { get; init; } = new(x => x.SlideBuilder); + public DataSlideBuilder SlideBuilder { get; set; } = new(x => x.SlideBuilder); /// /// Gets the managed Assistant Builder defaults. /// - public DataAssistantBuilder AssistantBuilder { get; init; } = new(x => x.AssistantBuilder); + public DataAssistantBuilder AssistantBuilder { get; set; } = new(x => x.AssistantBuilder); /// /// Gets the managed Visual Briefing Assistant defaults. /// - public DataVisualBriefing VisualBriefing { get; init; } = new(x => x.VisualBriefing); + public DataVisualBriefing VisualBriefing { get; set; } = new(x => x.VisualBriefing); - public DataLegalCheck LegalCheck { get; init; } = new(); + public DataLegalCheck LegalCheck { get; set; } = new(); - public DataSynonyms Synonyms { get; init; } = new(); + public DataSynonyms Synonyms { get; set; } = new(); - public DataMyTasks MyTasks { get; init; } = new(); + public DataMyTasks MyTasks { get; set; } = new(); - public DataJobPostings JobPostings { get; init; } = new(); + public DataJobPostings JobPostings { get; set; } = new(); - public DataBiasOfTheDay BiasOfTheDay { get; init; } = new(); + public DataBiasOfTheDay BiasOfTheDay { get; set; } = new(); - public DataI18N I18N { get; init; } = new(); + public DataI18N I18N { get; set; } = new(); - public DataTools Tools { get; init; } = new(x => x.Tools); + public DataTools Tools { get; set; } = new(x => x.Tools); } diff --git a/app/MindWork AI Studio/Settings/DataModel/DataApp.cs b/app/MindWork AI Studio/Settings/DataModel/DataApp.cs index a9fc8e3bf..5616f45ee 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataApp.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataApp.cs @@ -398,7 +398,7 @@ public sealed class DataApp(Expression>? configSelection = n /// /// Settings for indexing local data sources. /// - public DataDataSourceIndexing DataSourceIndexing { get; init; } = new(x => x.App.DataSourceIndexing); + public DataDataSourceIndexing DataSourceIndexing { get; set; } = new(x => x.App.DataSourceIndexing); /// /// List of assistants that should be hidden from the UI. diff --git a/app/MindWork AI Studio/Settings/DataModel/DataAssistantPluginEnterpriseApproval.cs b/app/MindWork AI Studio/Settings/DataModel/DataAssistantPluginEnterpriseApproval.cs index d9026c6ba..44a7dd1a9 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataAssistantPluginEnterpriseApproval.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataAssistantPluginEnterpriseApproval.cs @@ -5,11 +5,11 @@ namespace AIStudio.Settings.DataModel; /// public sealed class DataAssistantPluginEnterpriseApproval { - public string PluginHash { get; init; } = string.Empty; - public string DisplayName { get; init; } = string.Empty; - public string Comment { get; init; } = string.Empty; - public string ApprovedBy { get; init; } = string.Empty; - public DateTimeOffset? ApprovedAtUtc { get; init; } + public string PluginHash { get; set; } = string.Empty; + public string DisplayName { get; set; } = string.Empty; + public string Comment { get; set; } = string.Empty; + public string ApprovedBy { get; set; } = string.Empty; + public DateTimeOffset? ApprovedAtUtc { get; set; } /// /// Whether the organization wants this assistant plugin to be enabled, instead of leaving that @@ -21,7 +21,7 @@ public sealed class DataAssistantPluginEnterpriseApproval /// colleague still has to switch it on. This field is how an organization makes that decision /// instead. /// - public bool Activate { get; init; } + public bool Activate { get; set; } /// /// Whether the user may switch an assistant plugin the organization activated off again. @@ -32,5 +32,5 @@ public sealed class DataAssistantPluginEnterpriseApproval /// change. It has no meaning of its own while Activate is false, because there is nothing to /// override then. /// - public bool AllowUserOverride { get; init; } + public bool AllowUserOverride { get; set; } } diff --git a/app/MindWork AI Studio/Settings/DataModel/DataDocumentAnalysisPolicy.cs b/app/MindWork AI Studio/Settings/DataModel/DataDocumentAnalysisPolicy.cs index 91e5aea64..40b07eee5 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataDocumentAnalysisPolicy.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataDocumentAnalysisPolicy.cs @@ -12,20 +12,20 @@ public sealed record DataDocumentAnalysisPolicy : ConfigurationBaseObject private static readonly ILogger LOG = Program.LOGGER_FACTORY.CreateLogger(); /// - public override string Id { get; init; } = string.Empty; + public override string Id { get; set; } = string.Empty; /// - public override uint Num { get; init; } + public override uint Num { get; set; } /// public override string Name { get => this.PolicyName; - init => this.PolicyName = value; + set => this.PolicyName = value; } /// - public override bool IsEnterpriseConfiguration { get; init; } + public override bool IsEnterpriseConfiguration { get; set; } /// /// The name of the document analysis policy. @@ -43,7 +43,7 @@ public sealed record DataDocumentAnalysisPolicy : ConfigurationBaseObject public bool IsProtected { get; set; } /// - public override Guid EnterpriseConfigurationPluginId { get; init; } = Guid.Empty; + public override Guid EnterpriseConfigurationPluginId { get; set; } = Guid.Empty; /// /// The rules for the document analysis policy. diff --git a/app/MindWork AI Studio/Settings/DataModel/DataMandatoryInfoAcceptance.cs b/app/MindWork AI Studio/Settings/DataModel/DataMandatoryInfoAcceptance.cs index e24969d0a..0951f3e3a 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataMandatoryInfoAcceptance.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataMandatoryInfoAcceptance.cs @@ -5,25 +5,25 @@ public sealed record DataMandatoryInfoAcceptance /// /// The ID of the mandatory info that was accepted. /// - public string InfoId { get; init; } = string.Empty; + public string InfoId { get; set; } = string.Empty; /// /// The accepted version string. /// - public string AcceptedVersion { get; init; } = string.Empty; + public string AcceptedVersion { get; set; } = string.Empty; /// /// The accepted hash of the mandatory info content. /// - public string AcceptedHash { get; init; } = string.Empty; + public string AcceptedHash { get; set; } = string.Empty; /// /// The UTC time of the acceptance. /// - public DateTimeOffset AcceptedAtUtc { get; init; } + public DateTimeOffset AcceptedAtUtc { get; set; } /// /// The plugin that provided the accepted info at the time of acceptance. /// - public Guid EnterpriseConfigurationPluginId { get; init; } = Guid.Empty; + public Guid EnterpriseConfigurationPluginId { get; set; } = Guid.Empty; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/DataSourceERI_V1.cs b/app/MindWork AI Studio/Settings/DataModel/DataSourceERI_V1.cs index 031942aed..426bad57e 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataSourceERI_V1.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataSourceERI_V1.cs @@ -20,7 +20,7 @@ namespace AIStudio.Settings.DataModel; /// /// An external data source, accessed via an ERI server, cf. https://github.com/MindWorkAI/ERI. /// -public readonly record struct DataSourceERI_V1 : IERIDataSource +public record struct DataSourceERI_V1: IERIDataSource { private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(); @@ -34,52 +34,52 @@ public readonly record struct DataSourceERI_V1 : IERIDataSource } /// - public uint Num { get; init; } + public uint Num { get; set; } /// - public string Id { get; init; } = Guid.Empty.ToString(); + public string Id { get; set; } = Guid.Empty.ToString(); /// - public string Name { get; init; } = string.Empty; + public string Name { get; set; } = string.Empty; /// - public DataSourceType Type { get; init; } = DataSourceType.NONE; + public DataSourceType Type { get; set; } = DataSourceType.NONE; /// - public string Hostname { get; init; } = string.Empty; + public string Hostname { get; set; } = string.Empty; /// - public int Port { get; init; } + public int Port { get; set; } /// - public AuthMethod AuthMethod { get; init; } = AuthMethod.NONE; + public AuthMethod AuthMethod { get; set; } = AuthMethod.NONE; /// - public string Username { get; init; } = string.Empty; + public string Username { get; set; } = string.Empty; /// - public DataSourceERIUsernamePasswordMode UsernamePasswordMode { get; init; } = DataSourceERIUsernamePasswordMode.USER_MANAGED; + public DataSourceERIUsernamePasswordMode UsernamePasswordMode { get; set; } = DataSourceERIUsernamePasswordMode.USER_MANAGED; /// - public DataSourceSecurity SecurityPolicy { get; init; } = DataSourceSecurity.NOT_SPECIFIED; + public DataSourceSecurity SecurityPolicy { get; set; } = DataSourceSecurity.NOT_SPECIFIED; /// - public OutboundDataRestriction OutboundDataRestriction { get; init; } = DataSourceOutboundDataExtensions.DEFAULT_OUTBOUND_DATA_RESTRICTION; + public OutboundDataRestriction OutboundDataRestriction { get; set; } = DataSourceOutboundDataExtensions.DEFAULT_OUTBOUND_DATA_RESTRICTION; /// - public bool IsEnterpriseConfiguration { get; init; } + public bool IsEnterpriseConfiguration { get; set; } /// - public Guid EnterpriseConfigurationPluginId { get; init; } = Guid.Empty; + public Guid EnterpriseConfigurationPluginId { get; set; } = Guid.Empty; /// - public ERIVersion Version { get; init; } = ERIVersion.V1; + public ERIVersion Version { get; set; } = ERIVersion.V1; /// - public string SelectedRetrievalId { get; init; } = string.Empty; + public string SelectedRetrievalId { get; set; } = string.Empty; /// - public ushort MaxMatches { get; init; } = 10; + public ushort MaxMatches { get; set; } = 10; /// public async Task> RetrieveDataAsync(IContent lastUserPrompt, ChatThread thread, CancellationToken token = default) diff --git a/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalDirectory.cs b/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalDirectory.cs index e21320e2b..13cdbbe2f 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalDirectory.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalDirectory.cs @@ -10,7 +10,7 @@ namespace AIStudio.Settings.DataModel; /// /// Represents a local directory as a data source. /// -public readonly record struct DataSourceLocalDirectory : IInternalDataSource +public record struct DataSourceLocalDirectory: IInternalDataSource { // Selects what folder data sources indexed before they had file patterns, plus every other // file whose content is readable text, e.g., a Terraform file or a script without an extension. @@ -27,46 +27,46 @@ public readonly record struct DataSourceLocalDirectory : IInternalDataSource } /// - public uint Num { get; init; } + public uint Num { get; set; } /// - public string Id { get; init; } = Guid.Empty.ToString(); + public string Id { get; set; } = Guid.Empty.ToString(); /// - public string Name { get; init; } = string.Empty; + public string Name { get; set; } = string.Empty; /// /// The description of the data source. What kind of data does it contain? /// What is the data source used for? /// - public string Description { get; init; } = string.Empty; + public string Description { get; set; } = string.Empty; /// - public DataSourceType Type { get; init; } = DataSourceType.NONE; + public DataSourceType Type { get; set; } = DataSourceType.NONE; /// - public string EmbeddingId { get; init; } = Guid.Empty.ToString(); + public string EmbeddingId { get; set; } = Guid.Empty.ToString(); /// - public int MaxChunkTokenLength { get; init; } + public int MaxChunkTokenLength { get; set; } /// - public int ChunkOverlapTokenLength { get; init; } = DataSourceEmbeddingService.DEFAULT_CHUNK_OVERLAP_TOKEN_LENGTH; + public int ChunkOverlapTokenLength { get; set; } = DataSourceEmbeddingService.DEFAULT_CHUNK_OVERLAP_TOKEN_LENGTH; /// - public ConfidenceLevel ConfidenceLevel { get; init; } = ConfidenceLevel.UNKNOWN; + public ConfidenceLevel ConfidenceLevel { get; set; } = ConfidenceLevel.UNKNOWN; /// - public bool IsEnterpriseConfiguration { get; init; } + public bool IsEnterpriseConfiguration { get; set; } /// - public Guid EnterpriseConfigurationPluginId { get; init; } = Guid.Empty; + public Guid EnterpriseConfigurationPluginId { get; set; } = Guid.Empty; /// - public ushort MaxMatches { get; init; } = 10; + public ushort MaxMatches { get; set; } = 10; /// - public OutboundDataRestriction OutboundDataRestriction { get; init; } = DataSourceOutboundDataExtensions.DEFAULT_OUTBOUND_DATA_RESTRICTION; + public OutboundDataRestriction OutboundDataRestriction { get; set; } = DataSourceOutboundDataExtensions.DEFAULT_OUTBOUND_DATA_RESTRICTION; /// public Task> RetrieveDataAsync(IContent lastUserPrompt, ChatThread thread, CancellationToken token = default) => @@ -79,31 +79,31 @@ public readonly record struct DataSourceLocalDirectory : IInternalDataSource /// /// The path to the directory. /// - public string Path { get; init; } = string.Empty; + public string Path { get; set; } = string.Empty; /// /// Semicolon-separated file-name patterns which decide which files below the path /// are considered for indexing. /// - public string FilePatterns { get; init; } = DEFAULT_FILE_PATTERNS; + public string FilePatterns { get; set; } = DEFAULT_FILE_PATTERNS; /// /// The files and folders below the path which are left out, even when a file pattern selects /// them, cf. FileExclusions. Data sources from before this list existed get the default list, /// so their build outputs and dependencies leave the index during the next run. /// - public string ExcludePatterns { get; init; } = FileExclusions.DEFAULT_PATTERNS; + public string ExcludePatterns { get; set; } = FileExclusions.DEFAULT_PATTERNS; /// /// The largest file below the path which is indexed, in megabytes. A larger file which the /// patterns select is not indexed, and the embedding page tells the user about it. /// - public int MaxFileSizeMegabytes { get; init; } = FolderFileSelection.DEFAULT_MAX_FILE_SIZE_MEGABYTES; + public int MaxFileSizeMegabytes { get; set; } = FolderFileSelection.DEFAULT_MAX_FILE_SIZE_MEGABYTES; /// /// Whether files in folders below the path are considered for indexing. /// - public bool IncludeSubdirectories { get; init; } = DEFAULT_INCLUDE_SUBDIRECTORIES; + public bool IncludeSubdirectories { get; set; } = DEFAULT_INCLUDE_SUBDIRECTORIES; /// /// Whether hidden files and the files in hidden folders below the path are considered for @@ -114,7 +114,7 @@ public readonly record struct DataSourceLocalDirectory : IInternalDataSource /// the hidden files it names, cf. FileNamePatterns.NamesHiddenFile. Hidden folders are entered /// only while this is on. /// - public bool IncludeHiddenFilesAndFolders { get; init; } = DEFAULT_INCLUDE_HIDDEN_FILES_AND_FOLDERS; + public bool IncludeHiddenFilesAndFolders { get; set; } = DEFAULT_INCLUDE_HIDDEN_FILES_AND_FOLDERS; /// /// The patterns used at runtime. An invalid value can only come from malformed or hand-edited diff --git a/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalFile.cs b/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalFile.cs index f2bcf3160..638c2b7d0 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalFile.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalFile.cs @@ -8,53 +8,53 @@ namespace AIStudio.Settings.DataModel; /// /// Represents one local file as a data source. /// -public readonly record struct DataSourceLocalFile : IInternalDataSource +public record struct DataSourceLocalFile: IInternalDataSource { public DataSourceLocalFile() { } /// - public uint Num { get; init; } + public uint Num { get; set; } /// - public string Id { get; init; } = Guid.Empty.ToString(); + public string Id { get; set; } = Guid.Empty.ToString(); /// - public string Name { get; init; } = string.Empty; + public string Name { get; set; } = string.Empty; /// /// The description of the data source. What kind of data does it contain? /// What is the data source used for? /// - public string Description { get; init; } = string.Empty; + public string Description { get; set; } = string.Empty; /// - public DataSourceType Type { get; init; } = DataSourceType.NONE; + public DataSourceType Type { get; set; } = DataSourceType.NONE; /// - public string EmbeddingId { get; init; } = Guid.Empty.ToString(); + public string EmbeddingId { get; set; } = Guid.Empty.ToString(); /// - public int MaxChunkTokenLength { get; init; } + public int MaxChunkTokenLength { get; set; } /// - public int ChunkOverlapTokenLength { get; init; } = DataSourceEmbeddingService.DEFAULT_CHUNK_OVERLAP_TOKEN_LENGTH; + public int ChunkOverlapTokenLength { get; set; } = DataSourceEmbeddingService.DEFAULT_CHUNK_OVERLAP_TOKEN_LENGTH; /// - public ConfidenceLevel ConfidenceLevel { get; init; } = ConfidenceLevel.UNKNOWN; + public ConfidenceLevel ConfidenceLevel { get; set; } = ConfidenceLevel.UNKNOWN; /// - public bool IsEnterpriseConfiguration { get; init; } + public bool IsEnterpriseConfiguration { get; set; } /// - public Guid EnterpriseConfigurationPluginId { get; init; } = Guid.Empty; + public Guid EnterpriseConfigurationPluginId { get; set; } = Guid.Empty; /// - public ushort MaxMatches { get; init; } = 10; + public ushort MaxMatches { get; set; } = 10; /// - public OutboundDataRestriction OutboundDataRestriction { get; init; } = DataSourceOutboundDataExtensions.DEFAULT_OUTBOUND_DATA_RESTRICTION; + public OutboundDataRestriction OutboundDataRestriction { get; set; } = DataSourceOutboundDataExtensions.DEFAULT_OUTBOUND_DATA_RESTRICTION; /// public Task> RetrieveDataAsync(IContent lastUserPrompt, ChatThread thread, CancellationToken token = default) => @@ -67,5 +67,5 @@ public readonly record struct DataSourceLocalFile : IInternalDataSource /// /// The path to the file. /// - public string FilePath { get; init; } = string.Empty; + public string FilePath { get; set; } = string.Empty; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/DataSourceMailbox.cs b/app/MindWork AI Studio/Settings/DataModel/DataSourceMailbox.cs index b07a876fa..9e14338ba 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataSourceMailbox.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataSourceMailbox.cs @@ -13,70 +13,70 @@ namespace AIStudio.Settings.DataModel; /// IDataSource: classic RAG, Semantic Search and the agents never see a mailbox. Only the mail /// tools read from one. /// -public readonly record struct DataSourceMailbox : IIndexedDataSource, ISecretId +public record struct DataSourceMailbox: IIndexedDataSource, ISecretId { public DataSourceMailbox() { } /// - public uint Num { get; init; } + public uint Num { get; set; } /// - public string Id { get; init; } = Guid.Empty.ToString(); + public string Id { get; set; } = Guid.Empty.ToString(); /// - public string Name { get; init; } = string.Empty; + public string Name { get; set; } = string.Empty; /// - public DataSourceType Type { get; init; } = DataSourceType.MAILBOX; + public DataSourceType Type { get; set; } = DataSourceType.MAILBOX; /// - public bool IsEnterpriseConfiguration { get; init; } + public bool IsEnterpriseConfiguration { get; set; } /// - public Guid EnterpriseConfigurationPluginId { get; init; } = Guid.Empty; + public Guid EnterpriseConfigurationPluginId { get; set; } = Guid.Empty; /// - public string EmbeddingId { get; init; } = Guid.Empty.ToString(); + public string EmbeddingId { get; set; } = Guid.Empty.ToString(); /// - public int MaxChunkTokenLength { get; init; } + public int MaxChunkTokenLength { get; set; } /// - public int ChunkOverlapTokenLength { get; init; } = DataSourceEmbeddingService.DEFAULT_CHUNK_OVERLAP_TOKEN_LENGTH; + public int ChunkOverlapTokenLength { get; set; } = DataSourceEmbeddingService.DEFAULT_CHUNK_OVERLAP_TOKEN_LENGTH; /// /// /// There is no default, the user has to choose one of the levels which IsAllowedMailboxConfidence /// accepts. Until then, the level is NONE, and no provider may read the mailbox. /// - public ConfidenceLevel ConfidenceLevel { get; init; } = ConfidenceLevel.NONE; + public ConfidenceLevel ConfidenceLevel { get; set; } = ConfidenceLevel.NONE; /// /// The host name of the IMAP server, e.g., imap.example.org. /// - public string Host { get; init; } = string.Empty; + public string Host { get; set; } = string.Empty; /// /// The port of the IMAP server. The default is the one for IMAP with TLS from the first byte on. /// - public int Port { get; init; } = MailboxTransportSecurityExtensions.SSL_ON_CONNECT_PORT; + public int Port { get; set; } = MailboxTransportSecurityExtensions.SSL_ON_CONNECT_PORT; /// /// How the connection to the IMAP server is encrypted. /// - public MailboxTransportSecurity TransportSecurity { get; init; } = MailboxTransportSecurity.SSL_ON_CONNECT; + public MailboxTransportSecurity TransportSecurity { get; set; } = MailboxTransportSecurity.SSL_ON_CONNECT; /// /// How AI Studio signs in to the IMAP server. /// - public MailboxAuthMethod AuthMethod { get; init; } = MailboxAuthMethod.PASSWORD; + public MailboxAuthMethod AuthMethod { get; set; } = MailboxAuthMethod.PASSWORD; /// /// The username to sign in with, often the e-mail address. /// - public string Username { get; init; } = string.Empty; + public string Username { get; set; } = string.Empty; /// /// The folder to which the synchronization and all mail tools are restricted, together with its subfolders. @@ -86,7 +86,7 @@ public readonly record struct DataSourceMailbox : IIndexedDataSource, ISecretId /// means the whole mailbox, apart from the trash and the junk folder. The sent mails and the /// drafts may come along from outside of it, see IncludeSentAndDrafts. /// - public string RootFolder { get; init; } = string.Empty; + public string RootFolder { get; set; } = string.Empty; /// /// Whether the folders for sent mails and for drafts are synchronized as well, when they lie outside the root folder. @@ -96,22 +96,22 @@ public readonly record struct DataSourceMailbox : IIndexedDataSource, ISecretId /// marks as such count, without their subfolders. A mailbox stored before this setting existed /// loads with it switched on, so that its next sync fetches them. /// - public bool IncludeSentAndDrafts { get; init; } = true; + public bool IncludeSentAndDrafts { get; set; } = true; /// /// How far back the index reaches. Flagged mails and drafts are indexed regardless of their age. /// - public MailboxMaxAge MaxAge { get; init; } = MailboxMaxAge.LAST_12_MONTHS; + public MailboxMaxAge MaxAge { get; set; } = MailboxMaxAge.LAST_12_MONTHS; /// /// Whether the text of attached documents is indexed as well. /// - public bool IndexAttachments { get; init; } = true; + public bool IndexAttachments { get; set; } = true; /// /// The size in megabytes up to which the text of an attachment is indexed. Of a larger one, only the name is. /// - public int MaxAttachmentSizeMegabytes { get; init; } = 10; + public int MaxAttachmentSizeMegabytes { get; set; } = 10; /// /// Where a chat may still send data, once it has read from this mailbox. @@ -119,12 +119,12 @@ public readonly record struct DataSourceMailbox : IIndexedDataSource, ISecretId /// /// An organization may demand a stricter one, see DataMailboxes.MinimumOutboundDataRestriction. /// - public OutboundDataRestriction OutboundDataRestriction { get; init; } = OutboundDataRestriction.ONLY_CONFIGURED_SERVICES; + public OutboundDataRestriction OutboundDataRestriction { get; set; } = OutboundDataRestriction.ONLY_CONFIGURED_SERVICES; /// /// The maximum number of mails one search returns. Searched page by page, it is the size of a page. /// - public ushort MaxMatches { get; init; } = 10; + public ushort MaxMatches { get; set; } = 10; #region Implementation of ISecretId diff --git a/app/MindWork AI Studio/Settings/DataModel/PreviousModels/DataV1V3.cs b/app/MindWork AI Studio/Settings/DataModel/PreviousModels/DataV1V3.cs index 88a8a3d29..a459f818a 100644 --- a/app/MindWork AI Studio/Settings/DataModel/PreviousModels/DataV1V3.cs +++ b/app/MindWork AI Studio/Settings/DataModel/PreviousModels/DataV1V3.cs @@ -13,12 +13,12 @@ public sealed class DataV1V3 /// The version of the settings file. Allows us to upgrade the settings /// when a new version is available. /// - public Version Version { get; init; } = Version.V3; + public Version Version { get; set; } = Version.V3; /// /// List of configured providers. /// - public List Providers { get; init; } = []; + public List Providers { get; set; } = []; /// /// The next provider number to use. diff --git a/app/MindWork AI Studio/Settings/DataModel/PreviousModels/DataV4.cs b/app/MindWork AI Studio/Settings/DataModel/PreviousModels/DataV4.cs index 694064671..c91f1fcff 100644 --- a/app/MindWork AI Studio/Settings/DataModel/PreviousModels/DataV4.cs +++ b/app/MindWork AI Studio/Settings/DataModel/PreviousModels/DataV4.cs @@ -6,22 +6,22 @@ public sealed class DataV4 /// The version of the settings file. Allows us to upgrade the settings /// when a new version is available. /// - public Version Version { get; init; } + public Version Version { get; set; } /// /// List of configured providers. /// - public List Providers { get; init; } = []; + public List Providers { get; set; } = []; /// /// Settings concerning the LLM providers. /// - public DataLLMProvidersV5 LLMProviders { get; init; } = new(); + public DataLLMProvidersV5 LLMProviders { get; set; } = new(); /// /// List of configured profiles. /// - public List Profiles { get; init; } = []; + public List Profiles { get; set; } = []; /// /// The next provider number to use. @@ -33,27 +33,27 @@ public sealed class DataV4 /// public uint NextProfileNum { get; set; } = 1; - public DataApp App { get; init; } = new(x => x.App); + public DataApp App { get; set; } = new(x => x.App); - public DataChat Chat { get; init; } = new(); + public DataChat Chat { get; set; } = new(); - public DataWorkspace Workspace { get; init; } = new(); + public DataWorkspace Workspace { get; set; } = new(); - public DataIconFinder IconFinder { get; init; } = new(); + public DataIconFinder IconFinder { get; set; } = new(); - public DataTranslation Translation { get; init; } = new(); + public DataTranslation Translation { get; set; } = new(); - public DataCoding Coding { get; init; } = new(); + public DataCoding Coding { get; set; } = new(); - public DataTextSummarizer TextSummarizer { get; init; } = new(); + public DataTextSummarizer TextSummarizer { get; set; } = new(); - public DataTextContentCleaner TextContentCleaner { get; init; } = new(); + public DataTextContentCleaner TextContentCleaner { get; set; } = new(); - public DataAgenda Agenda { get; init; } = new(); + public DataAgenda Agenda { get; set; } = new(); - public DataGrammarSpelling GrammarSpelling { get; init; } = new(); + public DataGrammarSpelling GrammarSpelling { get; set; } = new(); - public DataRewriteImprove RewriteImprove { get; init; } = new(); + public DataRewriteImprove RewriteImprove { get; set; } = new(); public DataEMail EMail { get; set; } = new(); diff --git a/app/MindWork AI Studio/Settings/DataModel/PreviousModels/DataV5.cs b/app/MindWork AI Studio/Settings/DataModel/PreviousModels/DataV5.cs index 3f568ce6b..4a7e3afdc 100644 --- a/app/MindWork AI Studio/Settings/DataModel/PreviousModels/DataV5.cs +++ b/app/MindWork AI Studio/Settings/DataModel/PreviousModels/DataV5.cs @@ -8,27 +8,27 @@ public sealed class DataV5 /// The version of the settings file. Allows us to upgrade the settings /// when a new version is available. /// - public Version Version { get; init; } = Version.V5; + public Version Version { get; set; } = Version.V5; /// /// List of configured providers. /// - public List Providers { get; init; } = []; + public List Providers { get; set; } = []; /// /// Settings concerning the LLM providers. /// - public DataLLMProvidersV5 LLMProviders { get; init; } = new(); + public DataLLMProvidersV5 LLMProviders { get; set; } = new(); /// /// A collection of embedding providers configured. /// - public List EmbeddingProviders { get; init; } = []; + public List EmbeddingProviders { get; set; } = []; /// /// A collection of speech providers configured. /// - public List TranscriptionProviders { get; init; } = []; + public List TranscriptionProviders { get; set; } = []; /// /// A collection of data sources configured. @@ -38,12 +38,12 @@ public sealed class DataV5 /// /// List of configured profiles. /// - public List Profiles { get; init; } = []; + public List Profiles { get; set; } = []; /// /// List of configured chat templates. /// - public List ChatTemplates { get; init; } = []; + public List ChatTemplates { get; set; } = []; /// /// List of enabled plugins. @@ -95,55 +95,55 @@ public sealed class DataV5 /// public uint NextDocumentAnalysisPolicyNum { get; set; } = 1; - public DataApp App { get; init; } = new(x => x.App); + public DataApp App { get; set; } = new(x => x.App); - public DataChat Chat { get; init; } = new(); + public DataChat Chat { get; set; } = new(); - public DataWorkspace Workspace { get; init; } = new(); + public DataWorkspace Workspace { get; set; } = new(); - public DataIconFinder IconFinder { get; init; } = new(); + public DataIconFinder IconFinder { get; set; } = new(); - public DataTranslation Translation { get; init; } = new(); + public DataTranslation Translation { get; set; } = new(); - public DataCoding Coding { get; init; } = new(); + public DataCoding Coding { get; set; } = new(); - public DataERI ERI { get; init; } = new(); + public DataERI ERI { get; set; } = new(); - public DataDocumentAnalysis DocumentAnalysis { get; init; } = new(); + public DataDocumentAnalysis DocumentAnalysis { get; set; } = new(); - public DataMandatoryInformation MandatoryInformation { get; init; } = new(); + public DataMandatoryInformation MandatoryInformation { get; set; } = new(); - public DataTextSummarizer TextSummarizer { get; init; } = new(); + public DataTextSummarizer TextSummarizer { get; set; } = new(); - public DataTextContentCleaner TextContentCleaner { get; init; } = new(); + public DataTextContentCleaner TextContentCleaner { get; set; } = new(); - public DataAgentDataSourceSelection AgentDataSourceSelection { get; init; } = new(); + public DataAgentDataSourceSelection AgentDataSourceSelection { get; set; } = new(); - public DataAgentRetrievalContextValidation AgentRetrievalContextValidation { get; init; } = new(); + public DataAgentRetrievalContextValidation AgentRetrievalContextValidation { get; set; } = new(); - public DataAssistantPluginAudit AssistantPluginAudit { get; init; } = new(x => x.AssistantPluginAudit); + public DataAssistantPluginAudit AssistantPluginAudit { get; set; } = new(x => x.AssistantPluginAudit); - public DataAgenda Agenda { get; init; } = new(); + public DataAgenda Agenda { get; set; } = new(); - public DataGrammarSpelling GrammarSpelling { get; init; } = new(); + public DataGrammarSpelling GrammarSpelling { get; set; } = new(); - public DataRewriteImprove RewriteImprove { get; init; } = new(); + public DataRewriteImprove RewriteImprove { get; set; } = new(); - public DataPromptOptimizer PromptOptimizer { get; init; } = new(); + public DataPromptOptimizer PromptOptimizer { get; set; } = new(); - public DataEMail EMail { get; init; } = new(); + public DataEMail EMail { get; set; } = new(); - public DataSlideBuilder SlideBuilder { get; init; } = new(); + public DataSlideBuilder SlideBuilder { get; set; } = new(); - public DataLegalCheck LegalCheck { get; init; } = new(); + public DataLegalCheck LegalCheck { get; set; } = new(); - public DataSynonyms Synonyms { get; init; } = new(); + public DataSynonyms Synonyms { get; set; } = new(); - public DataMyTasks MyTasks { get; init; } = new(); + public DataMyTasks MyTasks { get; set; } = new(); - public DataJobPostings JobPostings { get; init; } = new(); + public DataJobPostings JobPostings { get; set; } = new(); - public DataBiasOfTheDay BiasOfTheDay { get; init; } = new(); + public DataBiasOfTheDay BiasOfTheDay { get; set; } = new(); - public DataI18N I18N { get; init; } = new(); + public DataI18N I18N { get; set; } = new(); } \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/EmbeddingProvider.cs b/app/MindWork AI Studio/Settings/EmbeddingProvider.cs index b59b5f4a4..430134b4d 100644 --- a/app/MindWork AI Studio/Settings/EmbeddingProvider.cs +++ b/app/MindWork AI Studio/Settings/EmbeddingProvider.cs @@ -23,7 +23,7 @@ public sealed record EmbeddingProvider( Guid EnterpriseConfigurationPluginId = default, string Hostname = "http://localhost:1234", Host Host = Host.NONE, - [property: JsonConverter(typeof(DataDirectoryRelativePathConverter))] string TokenizerPath = "", + string TokenizerPath = "", string TokenizerFingerprint = "", int EmbeddingBatchSize = 0, int TokenLimit = 0, @@ -32,6 +32,34 @@ public sealed record EmbeddingProvider( HFInferenceProvider HFInferenceProvider = HFInferenceProvider.NONE, bool PromptForUserAPIKey = false) : ConfigurationBaseObject, ISecretId, IUserProvidedAPIKey { + // + // The properties of the parameters, declared again to be settable. The source generation of System.Text.Json + // sets every init-only property while it creates the object, also one missing in the JSON, so its value from + // the parameterless constructor would get lost. Keep them first and in the order of the parameters, which is + // the order they get stored in: + // + public override uint Num { get; set; } = Num; + public override string Id { get; set; } = Id; + public override string Name { get; set; } = Name; + public LLMProviders UsedLLMProvider { get; set; } = UsedLLMProvider; + public Model Model { get; set; } = Model; + public bool IsSelfHosted { get; set; } = IsSelfHosted; + public override bool IsEnterpriseConfiguration { get; set; } = IsEnterpriseConfiguration; + public override Guid EnterpriseConfigurationPluginId { get; set; } = EnterpriseConfigurationPluginId; + public string Hostname { get; set; } = Hostname; + public Host Host { get; set; } = Host; + + [JsonConverter(typeof(DataDirectoryRelativePathConverter))] + public string TokenizerPath { get; set; } = TokenizerPath; + + public string TokenizerFingerprint { get; set; } = TokenizerFingerprint; + public int EmbeddingBatchSize { get; set; } = EmbeddingBatchSize; + public int TokenLimit { get; set; } = TokenLimit; + public bool AllowUserProvidedAPIKey { get; set; } = AllowUserProvidedAPIKey; + public string CustomIconDataUrl { get; set; } = CustomIconDataUrl; + public HFInferenceProvider HFInferenceProvider { get; set; } = HFInferenceProvider; + public bool PromptForUserAPIKey { get; set; } = PromptForUserAPIKey; + public const int DEFAULT_TOKEN_LIMIT = 8192; public const int DEFAULT_EMBEDDING_BATCH_SIZE = 1; diff --git a/app/MindWork AI Studio/Settings/IDataSource.cs b/app/MindWork AI Studio/Settings/IDataSource.cs index ef6598cbd..d16d824fc 100644 --- a/app/MindWork AI Studio/Settings/IDataSource.cs +++ b/app/MindWork AI Studio/Settings/IDataSource.cs @@ -18,7 +18,7 @@ public interface IDataSource : IDataSourceBase /// /// The maximum number of matches one retrieval returns. Searched page by page, it is the size of a page. /// - public ushort MaxMatches { get; init; } + public ushort MaxMatches { get; set; } /// /// Where a chat may still send data, once content of this data source reached it. @@ -29,7 +29,7 @@ public interface IDataSource : IDataSourceBase /// DataSourceSecuritySettings.MinimumOutboundDataRestriction, and so does a data source which only /// self-hosted providers may see. /// - public OutboundDataRestriction OutboundDataRestriction { get; init; } + public OutboundDataRestriction OutboundDataRestriction { get; set; } /// /// The last page which can be retrieved from this data source. diff --git a/app/MindWork AI Studio/Settings/IDataSourceBase.cs b/app/MindWork AI Studio/Settings/IDataSourceBase.cs index 9cd88dfbe..12fd42f4f 100644 --- a/app/MindWork AI Studio/Settings/IDataSourceBase.cs +++ b/app/MindWork AI Studio/Settings/IDataSourceBase.cs @@ -17,5 +17,5 @@ public interface IDataSourceBase : IConfigurationObject /// /// Which type of data source is this? /// - public DataSourceType Type { get; init; } + public DataSourceType Type { get; set; } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/IERIDataSource.cs b/app/MindWork AI Studio/Settings/IERIDataSource.cs index 40dd625d4..f58ed7e76 100644 --- a/app/MindWork AI Studio/Settings/IERIDataSource.cs +++ b/app/MindWork AI Studio/Settings/IERIDataSource.cs @@ -9,35 +9,35 @@ public interface IERIDataSource : IExternalDataSource /// /// The hostname of the ERI server. /// - public string Hostname { get; init; } + public string Hostname { get; set; } /// /// The port of the ERI server. /// - public int Port { get; init; } + public int Port { get; set; } /// /// The authentication method to use. /// - public AuthMethod AuthMethod { get; init; } + public AuthMethod AuthMethod { get; set; } /// /// The username to use for authentication, when the auth. method is USERNAME_PASSWORD. /// - public string Username { get; init; } + public string Username { get; set; } /// /// How username/password authentication should obtain the username. /// - public DataSourceERIUsernamePasswordMode UsernamePasswordMode { get; init; } + public DataSourceERIUsernamePasswordMode UsernamePasswordMode { get; set; } /// /// The ERI specification to use. /// - public ERIVersion Version { get; init; } + public ERIVersion Version { get; set; } /// /// The ID of the selected retrieval process. /// - public string SelectedRetrievalId { get; init; } + public string SelectedRetrievalId { get; set; } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/IExternalDataSource.cs b/app/MindWork AI Studio/Settings/IExternalDataSource.cs index 74d41f2a7..9b3fc7501 100644 --- a/app/MindWork AI Studio/Settings/IExternalDataSource.cs +++ b/app/MindWork AI Studio/Settings/IExternalDataSource.cs @@ -9,7 +9,7 @@ public interface IExternalDataSource : IDataSource, ISecretId /// /// Which data security policy is applied to this external data source? /// - public DataSourceSecurity SecurityPolicy { get; init; } + public DataSourceSecurity SecurityPolicy { get; set; } #region Implementation of ISecretId diff --git a/app/MindWork AI Studio/Settings/IIndexedDataSource.cs b/app/MindWork AI Studio/Settings/IIndexedDataSource.cs index 0bd26d441..da094f972 100644 --- a/app/MindWork AI Studio/Settings/IIndexedDataSource.cs +++ b/app/MindWork AI Studio/Settings/IIndexedDataSource.cs @@ -15,21 +15,21 @@ public interface IIndexedDataSource : IDataSourceBase /// /// Which provider confidence level is required by this data source? /// - public ConfidenceLevel ConfidenceLevel { get; init; } + public ConfidenceLevel ConfidenceLevel { get; set; } /// /// The unique identifier of the embedding provider used by this data source. /// - public string EmbeddingId { get; init; } + public string EmbeddingId { get; set; } /// /// Optional maximum number of tokens per embedding chunk for this data source. /// A value of 0 means the embedding provider's setting is used. /// - public int MaxChunkTokenLength { get; init; } + public int MaxChunkTokenLength { get; set; } /// /// Optional number of tokens to overlap between consecutive chunks. /// - public int ChunkOverlapTokenLength { get; init; } + public int ChunkOverlapTokenLength { get; set; } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/ManagedEditableDefaultState.cs b/app/MindWork AI Studio/Settings/ManagedEditableDefaultState.cs index 8904c4979..7507420a5 100644 --- a/app/MindWork AI Studio/Settings/ManagedEditableDefaultState.cs +++ b/app/MindWork AI Studio/Settings/ManagedEditableDefaultState.cs @@ -2,7 +2,7 @@ namespace AIStudio.Settings; public sealed class ManagedEditableDefaultState { - public Guid ConfigPluginId { get; init; } = Guid.Empty; + public Guid ConfigPluginId { get; set; } = Guid.Empty; - public string LastAppliedValue { get; init; } = string.Empty; + public string LastAppliedValue { get; set; } = string.Empty; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/Profile.cs b/app/MindWork AI Studio/Settings/Profile.cs index 925a5936c..fc675ddfb 100644 --- a/app/MindWork AI Studio/Settings/Profile.cs +++ b/app/MindWork AI Studio/Settings/Profile.cs @@ -15,6 +15,20 @@ public record Profile( bool IsEnterpriseConfiguration = false, Guid EnterpriseConfigurationPluginId = default): ConfigurationBaseObject { + // + // The properties of the parameters, declared again to be settable. The source generation of System.Text.Json + // sets every init-only property while it creates the object, also one missing in the JSON, so its value from + // the parameterless constructor would get lost. Keep them first and in the order of the parameters, which is + // the order they get stored in: + // + public override uint Num { get; set; } = Num; + public override string Id { get; set; } = Id; + public override string Name { get; set; } = Name; + public string NeedToKnow { get; set; } = NeedToKnow; + public string Actions { get; set; } = Actions; + public override bool IsEnterpriseConfiguration { get; set; } = IsEnterpriseConfiguration; + public override Guid EnterpriseConfigurationPluginId { get; set; } = EnterpriseConfigurationPluginId; + public Profile() : this(0, Guid.Empty.ToString(), string.Empty, string.Empty, string.Empty) { } diff --git a/app/MindWork AI Studio/Settings/Provider.cs b/app/MindWork AI Studio/Settings/Provider.cs index 3498de8f2..601f8a71d 100644 --- a/app/MindWork AI Studio/Settings/Provider.cs +++ b/app/MindWork AI Studio/Settings/Provider.cs @@ -38,12 +38,39 @@ public sealed record Provider( Host Host = Host.NONE, HFInferenceProvider HFInferenceProvider = HFInferenceProvider.NONE, string AdditionalJsonApiParameters = "", - [property: JsonConverter(typeof(DataDirectoryRelativePathConverter))] string TokenizerPath = "", + string TokenizerPath = "", ProviderCapabilityOverrides? CapabilityOverrides = null, bool AllowUserProvidedAPIKey = false, string CustomIconDataUrl = "", bool PromptForUserAPIKey = false) : ConfigurationBaseObject, ISecretId, IUserProvidedAPIKey { + // + // The properties of the parameters, declared again to be settable. The source generation of System.Text.Json + // sets every init-only property while it creates the object, also one missing in the JSON, so its value from + // the parameterless constructor would get lost. Keep them first and in the order of the parameters, which is + // the order they get stored in: + // + public override uint Num { get; set; } = Num; + public override string Id { get; set; } = Id; + public string InstanceName { get; set; } = InstanceName; + public LLMProviders UsedLLMProvider { get; set; } = UsedLLMProvider; + public Model Model { get; set; } = Model; + public bool IsSelfHosted { get; set; } = IsSelfHosted; + public override bool IsEnterpriseConfiguration { get; set; } = IsEnterpriseConfiguration; + public override Guid EnterpriseConfigurationPluginId { get; set; } = EnterpriseConfigurationPluginId; + public string Hostname { get; set; } = Hostname; + public Host Host { get; set; } = Host; + public HFInferenceProvider HFInferenceProvider { get; set; } = HFInferenceProvider; + public string AdditionalJsonApiParameters { get; set; } = AdditionalJsonApiParameters; + + [JsonConverter(typeof(DataDirectoryRelativePathConverter))] + public string TokenizerPath { get; set; } = TokenizerPath; + + public ProviderCapabilityOverrides? CapabilityOverrides { get; set; } = CapabilityOverrides; + public bool AllowUserProvidedAPIKey { get; set; } = AllowUserProvidedAPIKey; + public string CustomIconDataUrl { get; set; } = CustomIconDataUrl; + public bool PromptForUserAPIKey { get; set; } = PromptForUserAPIKey; + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(); public static readonly Provider NONE = new(); @@ -86,7 +113,7 @@ public sealed record Provider( public override string Name { get => this.InstanceName; - init => this.InstanceName = value; + set => this.InstanceName = value; } #endregion diff --git a/app/MindWork AI Studio/Settings/ProviderCapabilityOverrides.cs b/app/MindWork AI Studio/Settings/ProviderCapabilityOverrides.cs index 598e1cd37..2d1293f60 100644 --- a/app/MindWork AI Studio/Settings/ProviderCapabilityOverrides.cs +++ b/app/MindWork AI Studio/Settings/ProviderCapabilityOverrides.cs @@ -89,35 +89,35 @@ public sealed record ProviderCapabilityOverrides [JsonPropertyName("AUDIO_INPUT")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public bool? AudioInput { get; init; } + public bool? AudioInput { get; set; } [JsonPropertyName("FUNCTION_CALLING")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public bool? FunctionCalling { get; init; } + public bool? FunctionCalling { get; set; } [JsonPropertyName("MULTIPLE_IMAGE_INPUT")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public bool? MultipleImageInput { get; init; } + public bool? MultipleImageInput { get; set; } [JsonPropertyName("SPEECH_INPUT")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public bool? SpeechInput { get; init; } + public bool? SpeechInput { get; set; } [JsonPropertyName("VIDEO_INPUT")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public bool? VideoInput { get; init; } + public bool? VideoInput { get; set; } [JsonPropertyName("OPTIONAL_REASONING")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public bool? OptionalReasoning { get; init; } + public bool? OptionalReasoning { get; set; } [JsonPropertyName("ALWAYS_REASONING")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public bool? AlwaysReasoning { get; init; } + public bool? AlwaysReasoning { get; set; } [JsonPropertyName("REASONING_BY_DEFAULT")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public bool? ReasoningByDefault { get; init; } + public bool? ReasoningByDefault { get; set; } /// /// How many tokens this installation reads and writes, or null to keep the automatic answer. @@ -131,21 +131,21 @@ public sealed record ProviderCapabilityOverrides /// [JsonPropertyName(CONTEXT_WINDOW_KEY)] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public int? ContextWindowTokens { get; init; } + public int? ContextWindowTokens { get; set; } /// /// How many images one message may carry, or null to keep the automatic answer. /// [JsonPropertyName(MAX_IMAGES_PER_MESSAGE_KEY)] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public int? MaxImagesPerMessage { get; init; } + public int? MaxImagesPerMessage { get; set; } /// /// How many images one request may carry, or null to keep the automatic answer. /// [JsonPropertyName(MAX_IMAGES_PER_REQUEST_KEY)] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public int? MaxImagesPerRequest { get; init; } + public int? MaxImagesPerRequest { get; set; } [JsonIgnore] public bool HasOverrides => diff --git a/app/MindWork AI Studio/Settings/TranscriptionProvider.cs b/app/MindWork AI Studio/Settings/TranscriptionProvider.cs index f5dec6b84..7473720f7 100644 --- a/app/MindWork AI Studio/Settings/TranscriptionProvider.cs +++ b/app/MindWork AI Studio/Settings/TranscriptionProvider.cs @@ -27,6 +27,27 @@ public sealed record TranscriptionProvider( HFInferenceProvider HFInferenceProvider = HFInferenceProvider.NONE, bool PromptForUserAPIKey = false) : ConfigurationBaseObject, ISecretId, IUserProvidedAPIKey { + // + // The properties of the parameters, declared again to be settable. The source generation of System.Text.Json + // sets every init-only property while it creates the object, also one missing in the JSON, so its value from + // the parameterless constructor would get lost. Keep them first and in the order of the parameters, which is + // the order they get stored in: + // + public override uint Num { get; set; } = Num; + public override string Id { get; set; } = Id; + public override string Name { get; set; } = Name; + public LLMProviders UsedLLMProvider { get; set; } = UsedLLMProvider; + public Model Model { get; set; } = Model; + public bool IsSelfHosted { get; set; } = IsSelfHosted; + public override bool IsEnterpriseConfiguration { get; set; } = IsEnterpriseConfiguration; + public override Guid EnterpriseConfigurationPluginId { get; set; } = EnterpriseConfigurationPluginId; + public string Hostname { get; set; } = Hostname; + public Host Host { get; set; } = Host; + public bool AllowUserProvidedAPIKey { get; set; } = AllowUserProvidedAPIKey; + public string CustomIconDataUrl { get; set; } = CustomIconDataUrl; + public HFInferenceProvider HFInferenceProvider { get; set; } = HFInferenceProvider; + public bool PromptForUserAPIKey { get; set; } = PromptForUserAPIKey; + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(); public static readonly TranscriptionProvider NONE = new(); diff --git a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/PluginAssistantAudit.cs b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/PluginAssistantAudit.cs index 6f46cc1ab..6048b2cd3 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/Assistants/PluginAssistantAudit.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/Assistants/PluginAssistantAudit.cs @@ -4,13 +4,13 @@ namespace AIStudio.Tools.PluginSystem.Assistants; public sealed class PluginAssistantAudit { - public Guid PluginId { get; init; } - public string PluginHash { get; init; } = string.Empty; + public Guid PluginId { get; set; } + public string PluginHash { get; set; } = string.Empty; public DateTimeOffset AuditedAtUtc { get; set; } public string AuditProviderId { get; set; } = string.Empty; public string AuditProviderName { get; set; } = string.Empty; - public AssistantAuditLevel Level { get; init; } = AssistantAuditLevel.UNKNOWN; - public string Summary { get; init; } = string.Empty; + public AssistantAuditLevel Level { get; set; } = AssistantAuditLevel.UNKNOWN; + public string Summary { get; set; } = string.Empty; public float Confidence { get; set; } public string PromptPreview { get; set; } = string.Empty; public List Findings { get; set; } = []; diff --git a/app/MindWork AI Studio/Tools/PluginSystem/ConfigurationBaseObject.cs b/app/MindWork AI Studio/Tools/PluginSystem/ConfigurationBaseObject.cs index 97d48d616..d23edf42b 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/ConfigurationBaseObject.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/ConfigurationBaseObject.cs @@ -5,19 +5,19 @@ public abstract record ConfigurationBaseObject : IConfigurationObject #region Implementation of IConfigurationObject /// - public abstract string Id { get; init; } + public abstract string Id { get; set; } /// - public abstract uint Num { get; init; } + public abstract uint Num { get; set; } /// - public abstract string Name { get; init; } + public abstract string Name { get; set; } /// - public abstract bool IsEnterpriseConfiguration { get; init; } + public abstract bool IsEnterpriseConfiguration { get; set; } /// - public abstract Guid EnterpriseConfigurationPluginId { get; init; } + public abstract Guid EnterpriseConfigurationPluginId { get; set; } #endregion } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/RAG/RetrievalImageContext.cs b/app/MindWork AI Studio/Tools/RAG/RetrievalImageContext.cs index 4d50e6975..c69cd2854 100644 --- a/app/MindWork AI Studio/Tools/RAG/RetrievalImageContext.cs +++ b/app/MindWork AI Studio/Tools/RAG/RetrievalImageContext.cs @@ -32,7 +32,7 @@ public sealed class RetrievalImageContext : IRetrievalContext, IImageSource /// /// Is the image source a URL, a local file path, a base64 string, etc.? /// - public required ContentImageSource SourceType { get; init; } + public required ContentImageSource SourceType { get; set; } /// /// The image source. diff --git a/app/MindWork AI Studio/Tools/RAG/SourcePassage.cs b/app/MindWork AI Studio/Tools/RAG/SourcePassage.cs index 30ed436af..76d8eae1a 100644 --- a/app/MindWork AI Studio/Tools/RAG/SourcePassage.cs +++ b/app/MindWork AI Studio/Tools/RAG/SourcePassage.cs @@ -25,27 +25,27 @@ public sealed record SourcePassage /// the passage. The list of sources tells sources apart by their address without the fragment, /// and so does the search for the passages of a source, see GetPassagesOf. /// - public string SourceUrl { get; init; } = string.Empty; + public string SourceUrl { get; set; } = string.Empty; /// /// The name of where the passage was found, e.g., a document or a database. /// - public string DataSourceName { get; init; } = string.Empty; + public string DataSourceName { get; set; } = string.Empty; /// /// The path to the content, e.g., a file path or a URL. /// - public string Path { get; init; } = string.Empty; + public string Path { get; set; } = string.Empty; /// /// The category of the content, like text or image. /// - public RetrievalContentCategory Category { get; init; } + public RetrievalContentCategory Category { get; set; } /// /// What type of content the passage is, like a document or a transcript. /// - public RetrievalContentType Type { get; init; } + public RetrievalContentType Type { get; set; } /// /// The entry of the provenance store which holds the matched text and the content around it, @@ -57,7 +57,7 @@ public sealed record SourcePassage /// stored, Text and SurroundingContent are empty. Left out of the chat file while null. /// [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public Guid? ProvenanceId { get; init; } + public Guid? ProvenanceId { get; set; } /// /// The matched text, filtered for prompt injections, as long as it is not stored, see ProvenanceId. @@ -65,22 +65,22 @@ public sealed record SourcePassage /// /// Empty for an image which matched: the AI is only told that it did, never shown the image. /// - public string Text { get; init; } = string.Empty; + public string Text { get; set; } = string.Empty; /// /// The content around the matched text, filtered for prompt injections, as long as it is not stored, see ProvenanceId. /// - public IReadOnlyList SurroundingContent { get; init; } = []; + public IReadOnlyList SurroundingContent { get; set; } = []; /// /// The page the passage starts on, or null when it has none. /// - public int? PageNumber { get; init; } + public int? PageNumber { get; set; } /// /// The page the passage ends on, or null when it is not known. /// - public int? EndPageNumber { get; init; } + public int? EndPageNumber { get; set; } // // Where a passage without pages is. Left out of the chat file while unknown, which they are for @@ -91,31 +91,31 @@ public sealed record SourcePassage /// The sheet of a spreadsheet the passage is from, or null. /// [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public string? SheetName { get; init; } + public string? SheetName { get; set; } /// /// The row the passage starts at, counted from one: a row of its sheet, or of a table such as a CSV file. /// [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public int? StartRow { get; init; } + public int? StartRow { get; set; } /// /// The row the passage ends at, or null when it is not known. /// [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public int? EndRow { get; init; } + public int? EndRow { get; set; } /// /// The line the passage starts at, counted from one, for text and source code, or null. /// [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public int? StartLine { get; init; } + public int? StartLine { get; set; } /// /// The line the passage ends at, or null when it is not known. /// [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - public int? EndLine { get; init; } + public int? EndLine { get; set; } /// /// Which part of its document the passage is, counted from one, or null when the data source @@ -126,5 +126,5 @@ public sealed record SourcePassage /// indexed before these were kept. Wherever they are known, they say it better, see /// SourcePassageExtensions.GetLocation. /// - public int? ChunkNumber { get; init; } + public int? ChunkNumber { get; set; } } \ No newline at end of file diff --git a/app/Tests/Tools/EmbeddingSignatureTests.cs b/app/Tests/Tools/EmbeddingSignatureTests.cs index cf8ed3f76..ca017cd1f 100644 --- a/app/Tests/Tools/EmbeddingSignatureTests.cs +++ b/app/Tests/Tools/EmbeddingSignatureTests.cs @@ -234,7 +234,7 @@ public sealed class EmbeddingSignatureTests /// /// A data source which is embedded but not kept in DataSources, the way mailboxes are. /// - private readonly record struct IndexedElsewhere() : IIndexedDataSource + private record struct IndexedElsewhere() : IIndexedDataSource { public string Id => "0c3f9b52-7d4e-4a1b-9e6f-2b8c5d7a1e40"; @@ -246,14 +246,14 @@ public sealed class EmbeddingSignatureTests public Guid EnterpriseConfigurationPluginId => Guid.Empty; - public DataSourceType Type { get; init; } = DataSourceType.NONE; + public DataSourceType Type { get; set; } = DataSourceType.NONE; - public ConfidenceLevel ConfidenceLevel { get; init; } = ConfidenceLevel.LOW; + public ConfidenceLevel ConfidenceLevel { get; set; } = ConfidenceLevel.LOW; - public string EmbeddingId { get; init; } = Guid.Empty.ToString(); + public string EmbeddingId { get; set; } = Guid.Empty.ToString(); - public int MaxChunkTokenLength { get; init; } + public int MaxChunkTokenLength { get; set; } - public int ChunkOverlapTokenLength { get; init; } + public int ChunkOverlapTokenLength { get; set; } } }