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; }
}
}