using AIStudio.Provider; using AIStudio.Tools.PluginSystem; using Lua; namespace AIStudio.Settings.DataModel; public sealed record DataDocumentAnalysisPolicy : ConfigurationBaseObject { private static readonly ILogger LOG = Program.LOGGER_FACTORY.CreateLogger(); /// public override string Id { get; init; } = string.Empty; /// public override uint Num { get; init; } /// public override string Name { get => this.PolicyName; init => this.PolicyName = value; } /// public override bool IsEnterpriseConfiguration { get; init; } /// /// The name of the document analysis policy. /// public string PolicyName { get; set; } = string.Empty; /// /// The description of the document analysis policy. /// public string PolicyDescription { get; set; } = string.Empty; /// /// Is this policy protected? If so, it cannot be deleted or modified by the user. /// public bool IsProtected { get; set; } /// public override Guid EnterpriseConfigurationPluginId { get; init; } = Guid.Empty; /// /// The rules for the document analysis policy. /// public string AnalysisRules { get; set; } = string.Empty; /// /// The rules for the output of the document analysis, e.g., the desired format, structure, etc. /// public string OutputRules { get; set; } = string.Empty; /// /// The minimum confidence level required for a provider to be considered. /// public ConfidenceLevel MinimumProviderConfidence { get; set; } = ConfidenceLevel.NONE; /// /// Which LLM provider should be preselected? /// public string PreselectedProvider { get; set; } = string.Empty; /// /// Preselect a profile? /// public string PreselectedProfile { get; set; } = string.Empty; /// /// Hide the policy definition section in the UI? /// If true, the policy definition panel will be hidden and only the document selection will be shown. /// This is useful for enterprise configurations where users should not see or modify the policy details. /// public bool HidePolicyDefinition { get; set; } public static bool TryProcessConfiguration(int idx, LuaTable table, Guid configPluginId, out ConfigurationBaseObject policy) { policy = new DataDocumentAnalysisPolicy(); if (!table.TryGetValue("Id", out var idValue) || !idValue.TryRead(out var idText) || !Guid.TryParse(idText, out var id)) { LOG.LogWarning("The configured document analysis policy {PolicyIndex} does not contain a valid ID. The ID must be a valid GUID.", idx); return false; } if (!table.TryGetValue("PolicyName", out var nameValue) || !nameValue.TryRead(out var name) || string.IsNullOrWhiteSpace(name)) { LOG.LogWarning("The configured document analysis policy {PolicyIndex} does not contain a valid PolicyName field.", idx); return false; } if (!table.TryGetValue("PolicyDescription", out var descriptionValue) || !descriptionValue.TryRead(out var description) || string.IsNullOrWhiteSpace(description)) { LOG.LogWarning("The configured document analysis policy {PolicyIndex} does not contain a valid PolicyDescription field.", idx); return false; } if (!table.TryGetValue("AnalysisRules", out var analysisRulesValue) || !analysisRulesValue.TryRead(out var analysisRules) || string.IsNullOrWhiteSpace(analysisRules)) { LOG.LogWarning("The configured document analysis policy {PolicyIndex} does not contain valid AnalysisRules field.", idx); return false; } if (!table.TryGetValue("OutputRules", out var outputRulesValue) || !outputRulesValue.TryRead(out var outputRules) || string.IsNullOrWhiteSpace(outputRules)) { LOG.LogWarning("The configured document analysis policy {PolicyIndex} does not contain valid OutputRules field.", idx); return false; } var minimumConfidence = ConfidenceLevel.NONE; if (table.TryGetValue("MinimumProviderConfidence", out var minConfValue) && minConfValue.TryRead(out var minConfText)) { if (!Enum.TryParse(minConfText, true, out minimumConfidence)) { LOG.LogWarning("The configured document analysis policy {PolicyIndex} contains an invalid MinimumProviderConfidence: {ConfidenceLevel}.", idx, minConfText); minimumConfidence = ConfidenceLevel.NONE; } } var preselectedProvider = string.Empty; if (table.TryGetValue("PreselectedProvider", out var providerValue) && providerValue.TryRead(out var providerId)) preselectedProvider = providerId; var preselectedProfile = string.Empty; if (table.TryGetValue("PreselectedProfile", out var profileValue) && profileValue.TryRead(out var profileId)) preselectedProfile = profileId; var hidePolicyDefinition = false; if (table.TryGetValue("HidePolicyDefinition", out var hideValue) && hideValue.TryRead(out var hide)) hidePolicyDefinition = hide; policy = new DataDocumentAnalysisPolicy { Id = id.ToString(), Num = 0, // will be set later by the PluginConfigurationObject PolicyName = name, PolicyDescription = description, AnalysisRules = analysisRules, OutputRules = outputRules, MinimumProviderConfidence = minimumConfidence, PreselectedProvider = preselectedProvider, PreselectedProfile = preselectedProfile, HidePolicyDefinition = hidePolicyDefinition, IsProtected = true, IsEnterpriseConfiguration = true, EnterpriseConfigurationPluginId = configPluginId, }; return true; } }