diff --git a/app/MindWork AI Studio/Assistants/SWOTAnalysis/SwotAnalysisContentPresentation.cs b/app/MindWork AI Studio/Assistants/SWOTAnalysis/SwotAnalysisContentPresentation.cs index 30476cf19..aa4307a92 100644 --- a/app/MindWork AI Studio/Assistants/SWOTAnalysis/SwotAnalysisContentPresentation.cs +++ b/app/MindWork AI Studio/Assistants/SWOTAnalysis/SwotAnalysisContentPresentation.cs @@ -10,7 +10,7 @@ internal static class SwotAnalysisContentPresentation /// Fails the reading of stored data which holds a null where the result expects a value, so that /// the result view never meets one. /// - private static readonly JsonSerializerOptions JSON_OPTIONS = new() + internal static readonly JsonSerializerOptions JSON_OPTIONS = new() { RespectNullableAnnotations = true, }; diff --git a/app/MindWork AI Studio/Tools/Databases/ProvenanceStore/SqliteProvenanceStoreClientImplementation.cs b/app/MindWork AI Studio/Tools/Databases/ProvenanceStore/SqliteProvenanceStoreClientImplementation.cs index 7b677eb67..b7e198555 100644 --- a/app/MindWork AI Studio/Tools/Databases/ProvenanceStore/SqliteProvenanceStoreClientImplementation.cs +++ b/app/MindWork AI Studio/Tools/Databases/ProvenanceStore/SqliteProvenanceStoreClientImplementation.cs @@ -39,7 +39,7 @@ public sealed class SqliteProvenanceStoreClientImplementation(string name, strin /// Writes the content around a passage the way it reads: the default encoder would turn every /// character outside ASCII into an escape, cf. ToolExecutionResult.MODEL_CONTENT_OPTIONS. /// - private static readonly JsonSerializerOptions JSON_OPTIONS = new() { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; + internal static readonly JsonSerializerOptions JSON_OPTIONS = new() { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }; private readonly string databasePath = databasePath; private readonly string lastCleanupPath = Path.Join(basePath, LAST_CLEANUP_FILENAME); diff --git a/app/Tests/Serialization/Fixtures/chat.json b/app/Tests/Serialization/Fixtures/chat.json new file mode 100644 index 000000000..c2fdd2b39 --- /dev/null +++ b/app/Tests/Serialization/Fixtures/chat.json @@ -0,0 +1,442 @@ +{ + "chat_id": "00000000-0000-4000-8000-000000000001", + "workspace_id": "00000000-0000-4000-8000-000000000002", + "last_media_transcript_number": 9000000000, + "draft": { + "text": "text sample 3", + "file_attachments": [ + { + "$type": "file", + "type": "IMAGE", + "file_name": "FileName sample 4", + "file_path": "/samples/FilePath-5.txt", + "file_size_bytes": 4000000006, + "is_forbidden": false, + "is_valid": true, + "is_image": true, + "file_path_as_url": "/local/file?path=%2Fsamples%2FFilePath-5.txt", + "provenance_id": "00000000-0000-4000-8000-000000000007", + "version": { + "last_write_utc": "2026-10-29T11:08:00Z", + "length": 4000000009 + } + }, + { + "$type": "image", + "source_type": "LOCAL_PATH", + "type": "IMAGE", + "file_name": "FileName sample 10", + "file_path": "/samples/FilePath-11.txt", + "file_size_bytes": 4000000012, + "is_forbidden": false, + "is_valid": true, + "is_image": true, + "file_path_as_url": "/local/file?path=%2Fsamples%2FFilePath-11.txt", + "provenance_id": "00000000-0000-4000-8000-000000000013", + "version": { + "last_write_utc": "2026-10-29T11:14:00Z", + "length": 4000000015 + } + }, + { + "$type": "managed_transcript", + "original_file_name": "OriginalFileName sample 19", + "is_staged": true, + "type": "IMAGE", + "file_name": "FileName sample 16", + "file_path": "/samples/FilePath-17.txt", + "file_size_bytes": 4000000018, + "is_forbidden": false, + "is_valid": true, + "is_image": false, + "file_path_as_url": "/local/file?path=%2Fsamples%2FFilePath-17.txt", + "provenance_id": "00000000-0000-4000-8000-000000000020", + "version": { + "last_write_utc": "2026-10-29T11:21:00Z", + "length": 4000000022 + } + }, + { + "$type": "managed_transcript", + "original_file_name": "OriginalFileName sample 34", + "is_staged": true, + "type": "IMAGE", + "file_name": "FileName sample 31", + "file_path": "/samples/FilePath-32.txt", + "file_size_bytes": 4000000033, + "is_forbidden": false, + "is_valid": true, + "is_image": false, + "file_path_as_url": "/local/file?path=%2Fsamples%2FFilePath-32.txt", + "provenance_id": "00000000-0000-4000-8000-000000000035", + "version": { + "last_write_utc": "2026-10-29T11:36:00Z", + "length": 4000000037 + } + }, + { + "$type": "managed_transcript", + "original_file_name": "OriginalFileName sample 41", + "is_staged": true, + "type": "IMAGE", + "file_name": "FileName sample 38", + "file_path": "/samples/FilePath-39.txt", + "file_size_bytes": 4000000040, + "is_forbidden": false, + "is_valid": true, + "is_image": false, + "file_path_as_url": "/local/file?path=%2Fsamples%2FFilePath-39.txt", + "provenance_id": "00000000-0000-4000-8000-000000000042", + "version": { + "last_write_utc": "2026-10-29T11:43:00Z", + "length": 4000000044 + } + } + ], + "previewed_texts": [ + { + "file_path": "/samples/FilePath-23.txt", + "provenance_id": "00000000-0000-4000-8000-000000000024", + "version": { + "last_write_utc": "2026-10-29T11:25:00Z", + "length": 4000000026 + } + }, + { + "file_path": "/samples/FilePath-27.txt", + "provenance_id": "00000000-0000-4000-8000-000000000028", + "version": { + "last_write_utc": "2026-10-29T11:29:00Z", + "length": 4000000030 + } + } + ] + }, + "selected_provider": "selected_provider sample 45", + "selected_profile": "selected_profile sample 46", + "selected_chat_template": "selected_chat_template sample 47", + "selected_tool_ids": [ + "selected_tool_ids sample 48", + "selected_tool_ids sample 49" + ], + "include_date_time": true, + "data_source_options": { + "disable_data_sources": true, + "automatic_data_source_selection": true, + "automatic_validation": true, + "retrieval_mode": "EVERY_MESSAGE", + "preselected_data_source_ids": [ + "preselected_data_source_ids sample 50", + "preselected_data_source_ids sample 51" + ] + }, + "ai_selected_data_sources": [ + { + "data_source": { + "$type_discriminator": "LOCAL_DIRECTORY", + "num": 7, + "id": "id sample 52", + "name": "name sample 53", + "description": "description sample 54", + "type": "LOCAL_FILE", + "embedding_id": "embedding_id sample 55", + "max_chunk_token_length": 46, + "chunk_overlap_token_length": 47, + "confidence_level": "UNTRUSTED", + "is_enterprise_configuration": true, + "enterprise_configuration_plugin_id": "00000000-0000-4000-8000-000000000058", + "max_matches": 8, + "outbound_data_restriction": "ONLY_LINKS_FROM_CHAT", + "path": "/samples/path-59.txt", + "file_patterns": "file_patterns sample 60", + "exclude_patterns": "exclude_patterns sample 61", + "max_file_size_megabytes": 52, + "include_subdirectories": true, + "include_hidden_files_and_folders": true + }, + "ai_decision": { + "id": "id sample 63", + "reason": "reason sample 64", + "confidence": 2.25 + }, + "selected": true + }, + { + "data_source": { + "$type_discriminator": "LOCAL_FILE", + "num": 7, + "id": "id sample 65", + "name": "name sample 66", + "description": "description sample 67", + "type": "LOCAL_FILE", + "embedding_id": "embedding_id sample 68", + "max_chunk_token_length": 59, + "chunk_overlap_token_length": 60, + "confidence_level": "UNTRUSTED", + "is_enterprise_configuration": true, + "enterprise_configuration_plugin_id": "00000000-0000-4000-8000-000000000071", + "max_matches": 8, + "outbound_data_restriction": "ONLY_LINKS_FROM_CHAT", + "file_path": "/samples/file_path-72.txt" + }, + "ai_decision": { + "id": "id sample 73", + "reason": "reason sample 74", + "confidence": 2.25 + }, + "selected": true + } + ], + "data_security": "ALLOW_ANY", + "required_provider_confidence": "UNTRUSTED", + "required_outbound_data_restriction": { + "restriction": "ONLY_LINKS_FROM_CHAT", + "origin": "MAILBOX", + "reference": "Reference sample 75" + }, + "web_addresses_written_by_models": [ + "web_addresses_written_by_models sample 77", + "web_addresses_written_by_models sample 76" + ], + "name": "name sample 78", + "system_prompt": "system_prompt sample 79", + "blocks": [ + { + "time": "2026-10-29T13:50:15+01:00", + "content_type": "UNKNOWN", + "content": { + "$type": "text", + "sources": [ + { + "title": "Title sample 81", + "url": "URL sample 82", + "origin": "RAG" + }, + { + "title": "Title sample 83", + "url": "URL sample 84", + "origin": "RAG" + } + ], + "file_attachments": [ + { + "$type": "file", + "type": "IMAGE", + "file_name": "FileName sample 85", + "file_path": "/samples/FilePath-86.txt", + "file_size_bytes": 4000000087, + "is_forbidden": false, + "is_valid": true, + "is_image": true, + "file_path_as_url": "/local/file?path=%2Fsamples%2FFilePath-86.txt", + "provenance_id": "00000000-0000-4000-8000-000000000088", + "version": { + "last_write_utc": "2026-10-29T12:29:00Z", + "length": 4000000090 + } + }, + { + "$type": "image", + "source_type": "LOCAL_PATH", + "type": "IMAGE", + "file_name": "FileName sample 91", + "file_path": "/samples/FilePath-92.txt", + "file_size_bytes": 4000000093, + "is_forbidden": false, + "is_valid": true, + "is_image": true, + "file_path_as_url": "/local/file?path=%2Fsamples%2FFilePath-92.txt", + "provenance_id": "00000000-0000-4000-8000-000000000094", + "version": { + "last_write_utc": "2026-10-29T12:35:00Z", + "length": 4000000096 + } + }, + { + "$type": "managed_transcript", + "original_file_name": "OriginalFileName sample 100", + "is_staged": true, + "type": "IMAGE", + "file_name": "FileName sample 97", + "file_path": "/samples/FilePath-98.txt", + "file_size_bytes": 4000000099, + "is_forbidden": false, + "is_valid": true, + "is_image": false, + "file_path_as_url": "/local/file?path=%2Fsamples%2FFilePath-98.txt", + "provenance_id": "00000000-0000-4000-8000-000000000101", + "version": { + "last_write_utc": "2026-10-29T12:42:00Z", + "length": 4000000103 + } + } + ], + "tool_invocations": [ + { + "order": 44, + "tool_id": "tool_id sample 105", + "tool_name": "tool_name sample 106", + "tool_icon": "tool_icon sample 107", + "tool_call_id": "tool_call_id sample 108", + "status": "SUCCESS", + "was_executed": true, + "status_message": "status_message sample 109", + "arguments": { + "argumentsKey sample 110": "arguments sample 111", + "argumentsKey sample 112": "arguments sample 113" + } + }, + { + "order": 54, + "tool_id": "tool_id sample 115", + "tool_name": "tool_name sample 116", + "tool_icon": "tool_icon sample 117", + "tool_call_id": "tool_call_id sample 118", + "status": "SUCCESS", + "was_executed": true, + "status_message": "status_message sample 119", + "arguments": { + "argumentsKey sample 120": "arguments sample 121", + "argumentsKey sample 122": "arguments sample 123" + } + } + ], + "presentation": { + "kind": "SWOT_ANALYSIS", + "data": { + "sample": 124, + "text": "Gr\u00F6\u00DFe" + } + }, + "source_passages": [ + { + "source_url": "source_url sample 125", + "data_source_name": "data_source_name sample 126", + "path": "/samples/path-127.txt", + "category": "UNKNOWN", + "type": "UNKNOWN", + "provenance_id": "00000000-0000-4000-8000-000000000128", + "text": "text sample 129", + "surrounding_content": [ + "surrounding_content sample 130", + "surrounding_content sample 131" + ], + "page_number": 72, + "end_page_number": 73, + "sheet_name": "sheet_name sample 134", + "start_row": 75, + "end_row": 76, + "start_line": 77, + "end_line": 78, + "chunk_number": 79 + }, + { + "source_url": "source_url sample 140", + "data_source_name": "data_source_name sample 141", + "path": "/samples/path-142.txt", + "category": "UNKNOWN", + "type": "UNKNOWN", + "provenance_id": "00000000-0000-4000-8000-000000000143", + "text": "text sample 144", + "surrounding_content": [ + "surrounding_content sample 145", + "surrounding_content sample 146" + ], + "page_number": 87, + "end_page_number": 88, + "sheet_name": "sheet_name sample 149", + "start_row": 40, + "end_row": 41, + "start_line": 42, + "end_line": 43, + "chunk_number": 44 + } + ], + "reported_usage": { + "prompt_tokens": 45, + "model_id": "model_id sample 156", + "block_count": 47 + }, + "text": "text sample 158" + }, + "role": "UNKNOWN", + "hide_from_user": true + }, + { + "time": "2026-10-29T15:09:15+01:00", + "content_type": "UNKNOWN", + "content": { + "$type": "image", + "sources": [ + { + "title": "Title sample 160", + "url": "URL sample 161", + "origin": "RAG" + }, + { + "title": "Title sample 162", + "url": "URL sample 163", + "origin": "RAG" + } + ], + "file_attachments": [ + { + "$type": "file", + "type": "IMAGE", + "file_name": "FileName sample 164", + "file_path": "/samples/FilePath-165.txt", + "file_size_bytes": 4000000166, + "is_forbidden": false, + "is_valid": true, + "is_image": true, + "file_path_as_url": "/local/file?path=%2Fsamples%2FFilePath-165.txt", + "provenance_id": "00000000-0000-4000-8000-000000000167", + "version": { + "last_write_utc": "2026-10-29T13:48:00Z", + "length": 4000000169 + } + }, + { + "$type": "image", + "source_type": "LOCAL_PATH", + "type": "IMAGE", + "file_name": "FileName sample 170", + "file_path": "/samples/FilePath-171.txt", + "file_size_bytes": 4000000172, + "is_forbidden": false, + "is_valid": true, + "is_image": true, + "file_path_as_url": "/local/file?path=%2Fsamples%2FFilePath-171.txt", + "provenance_id": "00000000-0000-4000-8000-000000000173", + "version": { + "last_write_utc": "2026-10-29T13:54:00Z", + "length": 4000000175 + } + }, + { + "$type": "managed_transcript", + "original_file_name": "OriginalFileName sample 179", + "is_staged": true, + "type": "IMAGE", + "file_name": "FileName sample 176", + "file_path": "/samples/FilePath-177.txt", + "file_size_bytes": 4000000178, + "is_forbidden": false, + "is_valid": true, + "is_image": false, + "file_path_as_url": "/local/file?path=%2Fsamples%2FFilePath-177.txt", + "provenance_id": "00000000-0000-4000-8000-000000000180", + "version": { + "last_write_utc": "2026-10-29T14:01:00Z", + "length": 4000000182 + } + } + ], + "source_type": "LOCAL_PATH", + "source": "source sample 183" + }, + "role": "UNKNOWN", + "hide_from_user": true + } + ] +} \ No newline at end of file diff --git a/app/Tests/Serialization/Fixtures/data-backup-manifest.json b/app/Tests/Serialization/Fixtures/data-backup-manifest.json new file mode 100644 index 000000000..0bb6ba6d6 --- /dev/null +++ b/app/Tests/Serialization/Fixtures/data-backup-manifest.json @@ -0,0 +1,21 @@ +{ + "format_version": 41, + "app_version": "AppVersion sample 2", + "settings_version": "SettingsVersion sample 3", + "created_at_utc": "2026-10-29T12:34:15+01:00", + "source_data_directory": "SourceDataDirectory sample 5", + "source_config_directory": "SourceConfigDirectory sample 6", + "includes_data_source_indexes": true, + "entries": [ + { + "name": "Name sample 7", + "size": 4000000008, + "sha256": "Sha256 sample 9" + }, + { + "name": "Name sample 10", + "size": 4000000011, + "sha256": "Sha256 sample 12" + } + ] +} \ No newline at end of file diff --git a/app/Tests/Serialization/Fixtures/data-restore-plan.json b/app/Tests/Serialization/Fixtures/data-restore-plan.json new file mode 100644 index 000000000..5bd50c119 --- /dev/null +++ b/app/Tests/Serialization/Fixtures/data-restore-plan.json @@ -0,0 +1,24 @@ +{ + "format_version": 41, + "prepared_at_utc": "2026-10-29T12:32:15+01:00", + "backup_created_at_utc": "2026-10-29T12:33:15+01:00", + "backup_app_version": "BackupAppVersion sample 4", + "elements": [ + { + "location": "CONFIG_DIRECTORY", + "relative_path": "/samples/RelativePath-5.txt", + "keep": [ + "Keep sample 6", + "Keep sample 7" + ] + }, + { + "location": "CONFIG_DIRECTORY", + "relative_path": "/samples/RelativePath-8.txt", + "keep": [ + "Keep sample 9", + "Keep sample 10" + ] + } + ] +} \ No newline at end of file diff --git a/app/Tests/Serialization/Fixtures/data-restore-report.json b/app/Tests/Serialization/Fixtures/data-restore-report.json new file mode 100644 index 000000000..b2b8530aa --- /dev/null +++ b/app/Tests/Serialization/Fixtures/data-restore-report.json @@ -0,0 +1,8 @@ +{ + "outcome": "REFUSED", + "detail": "Detail sample 1", + "prepared_at_utc": "PreparedAtUtc sample 2", + "backup_created_at_utc": "BackupCreatedAtUtc sample 3", + "backup_app_version": "BackupAppVersion sample 4", + "finished_at_utc": "FinishedAtUtc sample 5" +} \ No newline at end of file diff --git a/app/Tests/Serialization/Fixtures/provenance-surrounding-content.json b/app/Tests/Serialization/Fixtures/provenance-surrounding-content.json new file mode 100644 index 000000000..89358c4dd --- /dev/null +++ b/app/Tests/Serialization/Fixtures/provenance-surrounding-content.json @@ -0,0 +1 @@ +["Vor dem Treffer: Größe & \"Zitat\" für C# 14","Nach dem Treffer: 50 % – fertig, 'oder?'"] \ No newline at end of file diff --git a/app/Tests/Serialization/Fixtures/settings-v1.json b/app/Tests/Serialization/Fixtures/settings-v1.json new file mode 100644 index 000000000..563d99c2c --- /dev/null +++ b/app/Tests/Serialization/Fixtures/settings-v1.json @@ -0,0 +1,71 @@ +{ + "Version": "V1", + "Providers": [ + { + "Num": 7, + "Id": "Id sample 1", + "InstanceName": "InstanceName sample 2", + "UsedProvider": "OPEN_AI", + "Model": { + "Id": "Id sample 3", + "DisplayName": "DisplayName sample 4", + "IsSystemModel": false + }, + "IsSelfHosted": true, + "Hostname": "Hostname sample 5", + "Host": "LM_STUDIO" + }, + { + "Num": 7, + "Id": "Id sample 6", + "InstanceName": "InstanceName sample 7", + "UsedProvider": "OPEN_AI", + "Model": { + "Id": "Id sample 8", + "DisplayName": "DisplayName sample 9", + "IsSystemModel": false + }, + "IsSelfHosted": true, + "Hostname": "Hostname sample 10", + "Host": "LM_STUDIO" + } + ], + "NextProviderNum": 7, + "IsSavingEnergy": true, + "EnableSpellchecking": true, + "UpdateInterval": "DISABLE_UPDATES", + "NavigationBehavior": "NEVER_EXPAND_USE_TOOLTIPS", + "ShortcutSendBehavior": "MODIFER_ENTER_IS_SENDING", + "PreselectChatOptions": true, + "PreselectedChatProvider": "PreselectedChatProvider sample 11", + "WorkspaceStorageBehavior": "STORE_CHATS_AUTOMATICALLY", + "WorkspaceStorageTemporaryMaintenancePolicy": "DELETE_OLDER_THAN_7_DAYS", + "PreselectIconOptions": true, + "PreselectedIconSource": "ICONS8", + "PreselectedIconProvider": "PreselectedIconProvider sample 12", + "LiveTranslationDebounceIntervalMilliseconds": 53, + "PreselectTranslationOptions": true, + "PreselectLiveTranslation": true, + "HideWebContentReaderForTranslation": true, + "PreselectWebContentReaderForTranslation": true, + "PreselectContentCleanerAgentForTranslation": true, + "PreselectedTranslationTargetLanguage": "EN_US", + "PreselectTranslationOtherLanguage": "PreselectTranslationOtherLanguage sample 14", + "PreselectedTranslationProvider": "PreselectedTranslationProvider sample 15", + "PreselectCodingOptions": true, + "PreselectCodingCompilerMessages": true, + "PreselectedCodingLanguage": "BASH", + "PreselectedCodingOtherLanguage": "PreselectedCodingOtherLanguage sample 16", + "PreselectedCodingProvider": "PreselectedCodingProvider sample 17", + "PreselectTextSummarizerOptions": true, + "HideWebContentReaderForTextSummarizer": true, + "PreselectWebContentReaderForTextSummarizer": true, + "PreselectContentCleanerAgentForTextSummarizer": true, + "PreselectedTextSummarizerTargetLanguage": "EN_US", + "PreselectedTextSummarizerOtherLanguage": "PreselectedTextSummarizerOtherLanguage sample 18", + "PreselectedTextSummarizerComplexity": "SIMPLE_LANGUAGE", + "PreselectedTextSummarizerExpertInField": "PreselectedTextSummarizerExpertInField sample 19", + "PreselectedTextSummarizerProvider": "PreselectedTextSummarizerProvider sample 20", + "PreselectAgentTextContentCleanerOptions": true, + "PreselectedAgentTextContentCleanerProvider": "PreselectedAgentTextContentCleanerProvider sample 21" +} \ No newline at end of file diff --git a/app/Tests/Serialization/Fixtures/settings-v4.json b/app/Tests/Serialization/Fixtures/settings-v4.json new file mode 100644 index 000000000..282da8c5c --- /dev/null +++ b/app/Tests/Serialization/Fixtures/settings-v4.json @@ -0,0 +1,305 @@ +{ + "Version": "V4", + "Providers": [ + { + "Num": 7, + "Id": "Id sample 1", + "InstanceName": "InstanceName sample 2", + "UsedProvider": "OPEN_AI", + "Model": { + "Id": "Id sample 3", + "DisplayName": "DisplayName sample 4", + "IsSystemModel": false + }, + "IsSelfHosted": true, + "Hostname": "Hostname sample 5", + "Host": "LM_STUDIO" + }, + { + "Num": 7, + "Id": "Id sample 6", + "InstanceName": "InstanceName sample 7", + "UsedProvider": "OPEN_AI", + "Model": { + "Id": "Id sample 8", + "DisplayName": "DisplayName sample 9", + "IsSystemModel": false + }, + "IsSelfHosted": true, + "Hostname": "Hostname sample 10", + "Host": "LM_STUDIO" + } + ], + "LLMProviders": { + "EnforceGlobalMinimumConfidence": true, + "GlobalMinimumConfidence": "UNTRUSTED", + "ShowProviderConfidence": true, + "ConfidenceScheme": "TRUST_USA_EUROPE", + "CustomConfidenceScheme": { + "OPEN_AI": "UNTRUSTED", + "ANTHROPIC": "UNKNOWN" + } + }, + "Profiles": [ + { + "Num": 7, + "Id": "Id sample 11", + "Name": "Name sample 12", + "NeedToKnow": "NeedToKnow sample 13", + "Actions": "Actions sample 14", + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000015" + }, + { + "Num": 7, + "Id": "Id sample 16", + "Name": "Name sample 17", + "NeedToKnow": "NeedToKnow sample 18", + "Actions": "Actions sample 19", + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000020" + } + ], + "NextProviderNum": 7, + "NextProfileNum": 7, + "App": { + "LanguageBehavior": "MANUAL", + "LanguagePluginId": "00000000-0000-4000-8000-000000000021", + "PreferredTheme": "LIGHT", + "IsSavingEnergy": true, + "EnableSpellchecking": true, + "CloseExportMessagesAutomatically": true, + "UpdateInterval": "DISABLE_UPDATES", + "UpdateInstallation": "AUTOMATIC", + "NavigationBehavior": "NEVER_EXPAND_USE_TOOLTIPS", + "StartPage": "CHAT", + "InterfaceScreenSizes": [ + { + "ScreenKey": "ScreenKey sample 22", + "Size": "SYSTEM_SCALING", + "CustomPercent": 63 + }, + { + "ScreenKey": "ScreenKey sample 24", + "Size": "SYSTEM_SCALING", + "CustomPercent": 65 + } + ], + "ShowPromptInjectionAlert": true, + "ShowIntroduction": true, + "ShowQuickStartGuide": true, + "ShowLastChangelog": true, + "ShowVision": true, + "PreviewVisibility": "RELEASE_CANDIDATE", + "EnabledPreviewFeatures": [ + "PRE_WRITER_MODE_2024", + "PRE_RAG_2024" + ], + "PreselectedProvider": "PreselectedProvider sample 26", + "PreselectedProfile": "PreselectedProfile sample 27", + "PreselectedChatTemplate": "PreselectedChatTemplate sample 28", + "UseTranscriptionProvider": "UseTranscriptionProvider sample 29", + "OpusBitrate": "KBPS_32", + "ShortcutVoiceRecording": "ShortcutVoiceRecording sample 30", + "ShortcutVoiceRecordingDisplayName": "ShortcutVoiceRecordingDisplayName sample 31", + "ShortcutVoiceRecordingDisplaySource": "ShortcutVoiceRecordingDisplaySource sample 32", + "HttpClientTimeoutSeconds": 73, + "ShareFeatureUsageWithSelfHostedServerOperators": true, + "ExternalHttpCustomRootCertificatesEnabled": true, + "ExternalHttpCustomRootCertificateBundlePath": "/samples/ExternalHttpCustomRootCertificateBundlePath-34.txt", + "ExternalHttpCustomRootCertificateAllowedHosts": [ + "ExternalHttpCustomRootCertificateAllowedHosts sample 35", + "ExternalHttpCustomRootCertificateAllowedHosts sample 36" + ], + "AllowUserToAddProvider": true, + "AllowUserToAddLLMProvider": true, + "AllowUserToAddEmbeddingProvider": true, + "AllowUserToAddTranscriptionProvider": true, + "ProhibitedProviders": [ + "OPEN_AI", + "ANTHROPIC" + ], + "AllowUserToAddMailbox": true, + "AllowUserToImportConfigurationSnippets": true, + "AllowUserToImportProfile": true, + "AllowUserToImportLLMProvider": true, + "AllowUserToImportEmbeddingProvider": true, + "AllowUserToImportTranscriptionProvider": true, + "AllowUserToImportChatTemplate": true, + "AllowUserToImportERIDataSource": true, + "AllowUserToImportDocumentAnalysisPolicy": true, + "AllowUserToImportPlugins": true, + "AllowUserToImportConfigurationPlugins": true, + "AllowUserToSharePlugins": true, + "AllowUserToBackUpData": true, + "AllowUserToRestoreData": true, + "ShowAdminSettings": true, + "EnterpriseEncryptionExportFormat": "V2", + "AddAIGeneratedContentDisclosure": true, + "DataSourceIndexing": { + "AutomaticRefresh": true, + "MinimumPauseBetweenStepsSeconds": 77, + "MaximumPauseBetweenStepsSeconds": 78 + }, + "HiddenAssistants": [ + "UNKNOWN", + "GRAMMAR_SPELLING_ASSISTANT" + ] + }, + "Chat": { + "ShortcutSendBehavior": "MODIFER_ENTER_IS_SENDING", + "LoadingProviderBehavior": "ALWAYS_USE_DEFAULT_CHAT_PROVIDER", + "AddChatProviderBehavior": "ADDED_CHATS_USE_LATEST_PROVIDER", + "SendToChatDataSourceBehavior": "APPLY_STANDARD_CHAT_DATA_SOURCE_OPTIONS", + "PreselectOptions": true, + "PreselectedProvider": "PreselectedProvider sample 39", + "PreselectedProfile": "PreselectedProfile sample 40", + "PreselectedChatTemplate": "PreselectedChatTemplate sample 41", + "PreselectedDataSourcesDisabled": true, + "PreselectedDataSourcesAutomaticSelection": true, + "PreselectedDataSourcesAutomaticValidation": true, + "PreselectedDataSourceIds": [ + "PreselectedDataSourceIds sample 44", + "PreselectedDataSourceIds sample 45" + ], + "PreselectedDataSourcesRetrievalMode": "EVERY_MESSAGE", + "PreselectedDataSourceOptions": { + "DisableDataSources": true, + "AutomaticDataSourceSelection": true, + "AutomaticValidation": true, + "RetrievalMode": "EVERY_MESSAGE", + "PreselectedDataSourceIds": [ + "PreselectedDataSourceIds sample 44", + "PreselectedDataSourceIds sample 45" + ] + }, + "ShowLatestMessageAfterLoading": true, + "ReadChangedAttachmentsAgain": true + }, + "Workspace": { + "StorageBehavior": "STORE_CHATS_AUTOMATICALLY", + "StorageTemporaryMaintenancePolicy": "DELETE_OLDER_THAN_7_DAYS", + "DisplayBehavior": "TOGGLE_SIDEBAR", + "IsSidebarVisible": true, + "SplitterPosition": 1.5 + }, + "IconFinder": { + "PreselectOptions": true, + "PreselectedSource": "ICONS8", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 46" + }, + "Translation": { + "DebounceIntervalMilliseconds": 87, + "PreselectOptions": true, + "PreselectLiveTranslation": true, + "HideWebContentReader": true, + "PreselectWebContentReader": true, + "PreselectContentCleanerAgent": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectOtherLanguage": "PreselectOtherLanguage sample 48", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 49" + }, + "Coding": { + "PreselectOptions": true, + "PreselectCompilerMessages": true, + "PreselectedProgrammingLanguage": "BASH", + "PreselectedOtherProgrammingLanguage": "PreselectedOtherProgrammingLanguage sample 50", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 51", + "PreselectedProfile": "PreselectedProfile sample 52" + }, + "TextSummarizer": { + "PreselectOptions": true, + "HideWebContentReader": true, + "PreselectWebContentReader": true, + "PreselectContentCleanerAgent": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 53", + "PreselectedComplexity": "SIMPLE_LANGUAGE", + "PreselectedExpertInField": "PreselectedExpertInField sample 54", + "PreselectedImportantAspects": "PreselectedImportantAspects sample 55", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 56" + }, + "TextContentCleaner": { + "PreselectAgentOptions": true, + "PreselectedAgentProvider": "PreselectedAgentProvider sample 57" + }, + "Agenda": { + "PreselectOptions": true, + "PreselectName": "PreselectName sample 58", + "PreselectTopic": "PreselectTopic sample 59", + "PreselectObjective": "PreselectObjective sample 60", + "PreselectModerator": "PreselectModerator sample 61", + "PreselectDuration": "PreselectDuration sample 62", + "PreselectStartTime": "PreselectStartTime sample 63", + "PreselectIntroduceParticipants": true, + "PreselectNumberParticipants": "PEER_TO_PEER", + "PreselectActiveParticipation": true, + "PreselectIsMeetingVirtual": true, + "PreselectLocation": "PreselectLocation sample 64", + "PreselectJointDinner": true, + "PreselectSocialActivity": true, + "PreselectArriveAndDepart": true, + "PreselectLunchTime": 55, + "PreselectBreakTime": 56, + "PreselectedTargetLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 67", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 68", + "PreselectedProfile": "PreselectedProfile sample 69" + }, + "GrammarSpelling": { + "PreselectOptions": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 70", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 71" + }, + "RewriteImprove": { + "PreselectOptions": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 72", + "PreselectedWritingStyle": "EVERYDAY", + "PreselectedSentenceStructure": "ACTIVE", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 73" + }, + "EMail": { + "PreselectOptions": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectOtherLanguage": "PreselectOtherLanguage sample 74", + "PreselectedWritingStyle": "BUSINESS_FORMAL", + "Greeting": "Greeting sample 75", + "SenderName": "SenderName sample 76", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 77", + "PreselectedProfile": "PreselectedProfile sample 78" + }, + "LegalCheck": { + "PreselectOptions": true, + "HideWebContentReader": true, + "PreselectWebContentReader": true, + "PreselectContentCleanerAgent": true, + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 79", + "PreselectedProfile": "PreselectedProfile sample 80" + }, + "Synonyms": { + "PreselectOptions": true, + "PreselectedLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 81", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 82" + }, + "MyTasks": { + "PreselectOptions": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectOtherLanguage": "PreselectOtherLanguage sample 83", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 84", + "PreselectedProfile": "PreselectedProfile sample 85" + } +} \ No newline at end of file diff --git a/app/Tests/Serialization/Fixtures/settings-v5.json b/app/Tests/Serialization/Fixtures/settings-v5.json new file mode 100644 index 000000000..328838924 --- /dev/null +++ b/app/Tests/Serialization/Fixtures/settings-v5.json @@ -0,0 +1,1583 @@ +{ + "Version": "V5", + "Providers": [ + { + "Num": 7, + "Id": "Id sample 1", + "InstanceName": "Name sample 13", + "UsedLLMProvider": "OPEN_AI", + "Model": { + "Id": "Id sample 3", + "DisplayName": "DisplayName sample 4", + "IsSystemModel": false + }, + "IsSelfHosted": true, + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000005", + "Hostname": "Hostname sample 6", + "Host": "LM_STUDIO", + "HFInferenceProvider": "AUTOMATIC", + "AdditionalJsonApiParameters": "AdditionalJsonApiParameters sample 7", + "TokenizerPath": "/samples/TokenizerPath-8.txt", + "CapabilityOverrides": { + "AUDIO_INPUT": true, + "FUNCTION_CALLING": true, + "MULTIPLE_IMAGE_INPUT": true, + "SPEECH_INPUT": true, + "VIDEO_INPUT": true, + "OPTIONAL_REASONING": true, + "ALWAYS_REASONING": true, + "REASONING_BY_DEFAULT": true, + "CONTEXT_WINDOW": 49, + "MAX_IMAGES_PER_MESSAGE": 50, + "MAX_IMAGES_PER_REQUEST": 51 + }, + "AllowUserProvidedAPIKey": true, + "CustomIconDataUrl": "CustomIconDataUrl sample 12", + "PromptForUserAPIKey": true, + "Name": "Name sample 13" + }, + { + "Num": 7, + "Id": "Id sample 14", + "InstanceName": "Name sample 26", + "UsedLLMProvider": "OPEN_AI", + "Model": { + "Id": "Id sample 16", + "DisplayName": "DisplayName sample 17", + "IsSystemModel": false + }, + "IsSelfHosted": true, + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000018", + "Hostname": "Hostname sample 19", + "Host": "LM_STUDIO", + "HFInferenceProvider": "AUTOMATIC", + "AdditionalJsonApiParameters": "AdditionalJsonApiParameters sample 20", + "TokenizerPath": "/samples/TokenizerPath-21.txt", + "CapabilityOverrides": { + "AUDIO_INPUT": true, + "FUNCTION_CALLING": true, + "MULTIPLE_IMAGE_INPUT": true, + "SPEECH_INPUT": true, + "VIDEO_INPUT": true, + "OPTIONAL_REASONING": true, + "ALWAYS_REASONING": true, + "REASONING_BY_DEFAULT": true, + "CONTEXT_WINDOW": 62, + "MAX_IMAGES_PER_MESSAGE": 63, + "MAX_IMAGES_PER_REQUEST": 64 + }, + "AllowUserProvidedAPIKey": true, + "CustomIconDataUrl": "CustomIconDataUrl sample 25", + "PromptForUserAPIKey": true, + "Name": "Name sample 26" + } + ], + "LLMProviders": { + "EnforceGlobalMinimumConfidence": true, + "GlobalMinimumConfidence": "UNTRUSTED", + "ShowProviderConfidence": true, + "ConfidenceScheme": "TRUST_USA_EUROPE", + "CustomConfidenceScheme": { + "OPEN_AI": "UNTRUSTED", + "ANTHROPIC": "UNKNOWN" + } + }, + "EmbeddingProviders": [ + { + "Num": 7, + "Id": "Id sample 27", + "Name": "Name sample 28", + "UsedLLMProvider": "OPEN_AI", + "Model": { + "Id": "Id sample 29", + "DisplayName": "DisplayName sample 30", + "IsSystemModel": false + }, + "IsSelfHosted": true, + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000031", + "Hostname": "Hostname sample 32", + "Host": "LM_STUDIO", + "TokenizerPath": "/samples/TokenizerPath-33.txt", + "TokenizerFingerprint": "TokenizerFingerprint sample 34", + "EmbeddingBatchSize": 75, + "TokenLimit": 76, + "AllowUserProvidedAPIKey": true, + "CustomIconDataUrl": "CustomIconDataUrl sample 37", + "HFInferenceProvider": "AUTOMATIC", + "PromptForUserAPIKey": true + }, + { + "Num": 7, + "Id": "Id sample 38", + "Name": "Name sample 39", + "UsedLLMProvider": "OPEN_AI", + "Model": { + "Id": "Id sample 40", + "DisplayName": "DisplayName sample 41", + "IsSystemModel": false + }, + "IsSelfHosted": true, + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000042", + "Hostname": "Hostname sample 43", + "Host": "LM_STUDIO", + "TokenizerPath": "/samples/TokenizerPath-44.txt", + "TokenizerFingerprint": "TokenizerFingerprint sample 45", + "EmbeddingBatchSize": 86, + "TokenLimit": 87, + "AllowUserProvidedAPIKey": true, + "CustomIconDataUrl": "CustomIconDataUrl sample 48", + "HFInferenceProvider": "AUTOMATIC", + "PromptForUserAPIKey": true + } + ], + "TranscriptionProviders": [ + { + "Num": 7, + "Id": "Id sample 49", + "Name": "Name sample 50", + "UsedLLMProvider": "OPEN_AI", + "Model": { + "Id": "Id sample 51", + "DisplayName": "DisplayName sample 52", + "IsSystemModel": false + }, + "IsSelfHosted": true, + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000053", + "Hostname": "Hostname sample 54", + "Host": "LM_STUDIO", + "AllowUserProvidedAPIKey": true, + "CustomIconDataUrl": "CustomIconDataUrl sample 55", + "HFInferenceProvider": "AUTOMATIC", + "PromptForUserAPIKey": true + }, + { + "Num": 7, + "Id": "Id sample 56", + "Name": "Name sample 57", + "UsedLLMProvider": "OPEN_AI", + "Model": { + "Id": "Id sample 58", + "DisplayName": "DisplayName sample 59", + "IsSystemModel": false + }, + "IsSelfHosted": true, + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000060", + "Hostname": "Hostname sample 61", + "Host": "LM_STUDIO", + "AllowUserProvidedAPIKey": true, + "CustomIconDataUrl": "CustomIconDataUrl sample 62", + "HFInferenceProvider": "AUTOMATIC", + "PromptForUserAPIKey": true + } + ], + "DataSources": [ + { + "$type_discriminator": "LOCAL_DIRECTORY", + "Num": 7, + "Id": "Id sample 63", + "Name": "Name sample 64", + "Description": "Description sample 65", + "Type": "LOCAL_FILE", + "EmbeddingId": "EmbeddingId sample 66", + "MaxChunkTokenLength": 57, + "ChunkOverlapTokenLength": 58, + "ConfidenceLevel": "UNTRUSTED", + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000069", + "MaxMatches": 8, + "OutboundDataRestriction": "ONLY_LINKS_FROM_CHAT", + "Path": "/samples/Path-70.txt", + "FilePatterns": "FilePatterns sample 71", + "ExcludePatterns": "ExcludePatterns sample 72", + "MaxFileSizeMegabytes": 63, + "IncludeSubdirectories": true, + "IncludeHiddenFilesAndFolders": true + }, + { + "$type_discriminator": "LOCAL_FILE", + "Num": 7, + "Id": "Id sample 74", + "Name": "Name sample 75", + "Description": "Description sample 76", + "Type": "LOCAL_FILE", + "EmbeddingId": "EmbeddingId sample 77", + "MaxChunkTokenLength": 68, + "ChunkOverlapTokenLength": 69, + "ConfidenceLevel": "UNTRUSTED", + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000080", + "MaxMatches": 8, + "OutboundDataRestriction": "ONLY_LINKS_FROM_CHAT", + "FilePath": "/samples/FilePath-81.txt" + }, + { + "$type_discriminator": "ERI_V1", + "Num": 7, + "Id": "Id sample 82", + "Name": "Name sample 83", + "Type": "LOCAL_FILE", + "Hostname": "Hostname sample 84", + "Port": 75, + "AuthMethod": "KERBEROS", + "Username": "Username sample 86", + "UsernamePasswordMode": "SHARED_USERNAME_AND_PASSWORD", + "SecurityPolicy": "ALLOW_ANY", + "OutboundDataRestriction": "ONLY_LINKS_FROM_CHAT", + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000087", + "Version": "V1", + "SelectedRetrievalId": "SelectedRetrievalId sample 88", + "MaxMatches": 8 + } + ], + "Profiles": [ + { + "Num": 7, + "Id": "Id sample 89", + "Name": "Name sample 90", + "NeedToKnow": "NeedToKnow sample 91", + "Actions": "Actions sample 92", + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000093" + }, + { + "Num": 7, + "Id": "Id sample 94", + "Name": "Name sample 95", + "NeedToKnow": "NeedToKnow sample 96", + "Actions": "Actions sample 97", + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000098" + } + ], + "ChatTemplates": [ + { + "Num": 7, + "Id": "Id sample 99", + "Name": "Name sample 100", + "SystemPrompt": "SystemPrompt sample 101", + "PredefinedUserPrompt": "PredefinedUserPrompt sample 102", + "ExampleConversation": [ + { + "Time": "2026-10-29T14:13:15+01:00", + "ContentType": "UNKNOWN", + "Content": { + "$type": "text", + "Sources": [ + { + "Title": "Title sample 104", + "URL": "URL sample 105", + "Origin": "RAG" + }, + { + "Title": "Title sample 106", + "URL": "URL sample 107", + "Origin": "RAG" + } + ], + "FileAttachments": [ + { + "$type": "file", + "Type": "IMAGE", + "FileName": "FileName sample 108", + "FilePath": "/samples/FilePath-109.txt", + "FileSizeBytes": 4000000110, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-109.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000111", + "Version": { + "LastWriteUtc": "2026-10-29T12:52:00Z", + "Length": 4000000113 + } + }, + { + "$type": "image", + "SourceType": "LOCAL_PATH", + "Type": "IMAGE", + "FileName": "FileName sample 114", + "FilePath": "/samples/FilePath-115.txt", + "FileSizeBytes": 4000000116, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-115.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000117", + "Version": { + "LastWriteUtc": "2026-10-29T12:58:00Z", + "Length": 4000000119 + } + }, + { + "$type": "managed_transcript", + "OriginalFileName": "OriginalFileName sample 123", + "IsStaged": true, + "Type": "IMAGE", + "FileName": "FileName sample 120", + "FilePath": "/samples/FilePath-121.txt", + "FileSizeBytes": 4000000122, + "IsForbidden": false, + "IsValid": true, + "IsImage": false, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-121.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000124", + "Version": { + "LastWriteUtc": "2026-10-29T13:05:00Z", + "Length": 4000000126 + } + } + ], + "ToolInvocations": [ + { + "Order": 67, + "ToolId": "ToolId sample 128", + "ToolName": "ToolName sample 129", + "ToolIcon": "ToolIcon sample 130", + "ToolCallId": "ToolCallId sample 131", + "Status": "SUCCESS", + "WasExecuted": true, + "StatusMessage": "StatusMessage sample 132", + "Arguments": { + "ArgumentsKey sample 133": "Arguments sample 134", + "ArgumentsKey sample 135": "Arguments sample 136" + } + }, + { + "Order": 77, + "ToolId": "ToolId sample 138", + "ToolName": "ToolName sample 139", + "ToolIcon": "ToolIcon sample 140", + "ToolCallId": "ToolCallId sample 141", + "Status": "SUCCESS", + "WasExecuted": true, + "StatusMessage": "StatusMessage sample 142", + "Arguments": { + "ArgumentsKey sample 143": "Arguments sample 144", + "ArgumentsKey sample 145": "Arguments sample 146" + } + } + ], + "Presentation": { + "Kind": "SWOT_ANALYSIS", + "Data": { + "sample": 147, + "text": "Gr\u00F6\u00DFe" + } + }, + "SourcePassages": [ + { + "SourceUrl": "SourceUrl sample 148", + "DataSourceName": "DataSourceName sample 149", + "Path": "/samples/Path-150.txt", + "Category": "UNKNOWN", + "Type": "UNKNOWN", + "ProvenanceId": "00000000-0000-4000-8000-000000000151", + "Text": "Text sample 152", + "SurroundingContent": [ + "SurroundingContent sample 153", + "SurroundingContent sample 154" + ], + "PageNumber": 45, + "EndPageNumber": 46, + "SheetName": "SheetName sample 157", + "StartRow": 48, + "EndRow": 49, + "StartLine": 50, + "EndLine": 51, + "ChunkNumber": 52 + }, + { + "SourceUrl": "SourceUrl sample 163", + "DataSourceName": "DataSourceName sample 164", + "Path": "/samples/Path-165.txt", + "Category": "UNKNOWN", + "Type": "UNKNOWN", + "ProvenanceId": "00000000-0000-4000-8000-000000000166", + "Text": "Text sample 167", + "SurroundingContent": [ + "SurroundingContent sample 168", + "SurroundingContent sample 169" + ], + "PageNumber": 60, + "EndPageNumber": 61, + "SheetName": "SheetName sample 172", + "StartRow": 63, + "EndRow": 64, + "StartLine": 65, + "EndLine": 66, + "ChunkNumber": 67 + } + ], + "ReportedUsage": { + "PromptTokens": 68, + "ModelId": "ModelId sample 179", + "BlockCount": 70 + }, + "Text": "Text sample 181" + }, + "Role": "UNKNOWN", + "HideFromUser": true + }, + { + "Time": "2026-10-29T15:32:15+01:00", + "ContentType": "UNKNOWN", + "Content": { + "$type": "image", + "Sources": [ + { + "Title": "Title sample 183", + "URL": "URL sample 184", + "Origin": "RAG" + }, + { + "Title": "Title sample 185", + "URL": "URL sample 186", + "Origin": "RAG" + } + ], + "FileAttachments": [ + { + "$type": "file", + "Type": "IMAGE", + "FileName": "FileName sample 187", + "FilePath": "/samples/FilePath-188.txt", + "FileSizeBytes": 4000000189, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-188.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000190", + "Version": { + "LastWriteUtc": "2026-10-29T14:11:00Z", + "Length": 4000000192 + } + }, + { + "$type": "image", + "SourceType": "LOCAL_PATH", + "Type": "IMAGE", + "FileName": "FileName sample 193", + "FilePath": "/samples/FilePath-194.txt", + "FileSizeBytes": 4000000195, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-194.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000196", + "Version": { + "LastWriteUtc": "2026-10-29T14:17:00Z", + "Length": 4000000198 + } + }, + { + "$type": "managed_transcript", + "OriginalFileName": "OriginalFileName sample 202", + "IsStaged": true, + "Type": "IMAGE", + "FileName": "FileName sample 199", + "FilePath": "/samples/FilePath-200.txt", + "FileSizeBytes": 4000000201, + "IsForbidden": false, + "IsValid": true, + "IsImage": false, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-200.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000203", + "Version": { + "LastWriteUtc": "2026-10-29T14:24:00Z", + "Length": 4000000205 + } + } + ], + "SourceType": "LOCAL_PATH", + "Source": "Source sample 206" + }, + "Role": "UNKNOWN", + "HideFromUser": true + } + ], + "FileAttachments": [ + { + "$type": "file", + "Type": "IMAGE", + "FileName": "FileName sample 207", + "FilePath": "/samples/FilePath-208.txt", + "FileSizeBytes": 4000000209, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-208.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000210", + "Version": { + "LastWriteUtc": "2026-10-29T14:31:00Z", + "Length": 4000000212 + } + }, + { + "$type": "image", + "SourceType": "LOCAL_PATH", + "Type": "IMAGE", + "FileName": "FileName sample 213", + "FilePath": "/samples/FilePath-214.txt", + "FileSizeBytes": 4000000215, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-214.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000216", + "Version": { + "LastWriteUtc": "2026-10-29T14:37:00Z", + "Length": 4000000218 + } + }, + { + "$type": "managed_transcript", + "OriginalFileName": "OriginalFileName sample 222", + "IsStaged": true, + "Type": "IMAGE", + "FileName": "FileName sample 219", + "FilePath": "/samples/FilePath-220.txt", + "FileSizeBytes": 4000000221, + "IsForbidden": false, + "IsValid": true, + "IsImage": false, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-220.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000223", + "Version": { + "LastWriteUtc": "2026-10-29T14:44:00Z", + "Length": 4000000225 + } + } + ], + "AllowProfileUsage": true, + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000226", + "ToolIds": [ + "ToolIds sample 227", + "ToolIds sample 228" + ], + "DataSourceOptions": { + "DisableDataSources": true, + "AutomaticDataSourceSelection": true, + "AutomaticValidation": true, + "RetrievalMode": "EVERY_MESSAGE", + "PreselectedDataSourceIds": [ + "PreselectedDataSourceIds sample 229", + "PreselectedDataSourceIds sample 230" + ] + }, + "ProfileId": "ProfileId sample 231", + "ProviderId": "ProviderId sample 232", + "WorkspaceName": "WorkspaceName sample 233" + }, + { + "Num": 7, + "Id": "Id sample 234", + "Name": "Name sample 235", + "SystemPrompt": "SystemPrompt sample 236", + "PredefinedUserPrompt": "PredefinedUserPrompt sample 237", + "ExampleConversation": [ + { + "Time": "2026-10-29T16:28:15+01:00", + "ContentType": "UNKNOWN", + "Content": { + "$type": "text", + "Sources": [ + { + "Title": "Title sample 239", + "URL": "URL sample 240", + "Origin": "RAG" + }, + { + "Title": "Title sample 241", + "URL": "URL sample 242", + "Origin": "RAG" + } + ], + "FileAttachments": [ + { + "$type": "file", + "Type": "IMAGE", + "FileName": "FileName sample 243", + "FilePath": "/samples/FilePath-244.txt", + "FileSizeBytes": 4000000245, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-244.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000246", + "Version": { + "LastWriteUtc": "2026-10-29T15:07:00Z", + "Length": 4000000248 + } + }, + { + "$type": "image", + "SourceType": "LOCAL_PATH", + "Type": "IMAGE", + "FileName": "FileName sample 249", + "FilePath": "/samples/FilePath-250.txt", + "FileSizeBytes": 4000000251, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-250.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000252", + "Version": { + "LastWriteUtc": "2026-10-29T15:13:00Z", + "Length": 4000000254 + } + }, + { + "$type": "managed_transcript", + "OriginalFileName": "OriginalFileName sample 258", + "IsStaged": true, + "Type": "IMAGE", + "FileName": "FileName sample 255", + "FilePath": "/samples/FilePath-256.txt", + "FileSizeBytes": 4000000257, + "IsForbidden": false, + "IsValid": true, + "IsImage": false, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-256.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000259", + "Version": { + "LastWriteUtc": "2026-10-29T15:20:00Z", + "Length": 4000000261 + } + } + ], + "ToolInvocations": [ + { + "Order": 52, + "ToolId": "ToolId sample 263", + "ToolName": "ToolName sample 264", + "ToolIcon": "ToolIcon sample 265", + "ToolCallId": "ToolCallId sample 266", + "Status": "SUCCESS", + "WasExecuted": true, + "StatusMessage": "StatusMessage sample 267", + "Arguments": { + "ArgumentsKey sample 268": "Arguments sample 269", + "ArgumentsKey sample 270": "Arguments sample 271" + } + }, + { + "Order": 62, + "ToolId": "ToolId sample 273", + "ToolName": "ToolName sample 274", + "ToolIcon": "ToolIcon sample 275", + "ToolCallId": "ToolCallId sample 276", + "Status": "SUCCESS", + "WasExecuted": true, + "StatusMessage": "StatusMessage sample 277", + "Arguments": { + "ArgumentsKey sample 278": "Arguments sample 279", + "ArgumentsKey sample 280": "Arguments sample 281" + } + } + ], + "Presentation": { + "Kind": "SWOT_ANALYSIS", + "Data": { + "sample": 282, + "text": "Gr\u00F6\u00DFe" + } + }, + "SourcePassages": [ + { + "SourceUrl": "SourceUrl sample 283", + "DataSourceName": "DataSourceName sample 284", + "Path": "/samples/Path-285.txt", + "Category": "UNKNOWN", + "Type": "UNKNOWN", + "ProvenanceId": "00000000-0000-4000-8000-000000000286", + "Text": "Text sample 287", + "SurroundingContent": [ + "SurroundingContent sample 288", + "SurroundingContent sample 289" + ], + "PageNumber": 80, + "EndPageNumber": 81, + "SheetName": "SheetName sample 292", + "StartRow": 83, + "EndRow": 84, + "StartLine": 85, + "EndLine": 86, + "ChunkNumber": 87 + }, + { + "SourceUrl": "SourceUrl sample 298", + "DataSourceName": "DataSourceName sample 299", + "Path": "/samples/Path-300.txt", + "Category": "UNKNOWN", + "Type": "UNKNOWN", + "ProvenanceId": "00000000-0000-4000-8000-000000000301", + "Text": "Text sample 302", + "SurroundingContent": [ + "SurroundingContent sample 303", + "SurroundingContent sample 304" + ], + "PageNumber": 45, + "EndPageNumber": 46, + "SheetName": "SheetName sample 307", + "StartRow": 48, + "EndRow": 49, + "StartLine": 50, + "EndLine": 51, + "ChunkNumber": 52 + } + ], + "ReportedUsage": { + "PromptTokens": 53, + "ModelId": "ModelId sample 314", + "BlockCount": 55 + }, + "Text": "Text sample 316" + }, + "Role": "UNKNOWN", + "HideFromUser": true + }, + { + "Time": "2026-10-29T17:47:15+01:00", + "ContentType": "UNKNOWN", + "Content": { + "$type": "image", + "Sources": [ + { + "Title": "Title sample 318", + "URL": "URL sample 319", + "Origin": "RAG" + }, + { + "Title": "Title sample 320", + "URL": "URL sample 321", + "Origin": "RAG" + } + ], + "FileAttachments": [ + { + "$type": "file", + "Type": "IMAGE", + "FileName": "FileName sample 322", + "FilePath": "/samples/FilePath-323.txt", + "FileSizeBytes": 4000000324, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-323.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000325", + "Version": { + "LastWriteUtc": "2026-10-29T16:26:00Z", + "Length": 4000000327 + } + }, + { + "$type": "image", + "SourceType": "LOCAL_PATH", + "Type": "IMAGE", + "FileName": "FileName sample 328", + "FilePath": "/samples/FilePath-329.txt", + "FileSizeBytes": 4000000330, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-329.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000331", + "Version": { + "LastWriteUtc": "2026-10-29T16:32:00Z", + "Length": 4000000333 + } + }, + { + "$type": "managed_transcript", + "OriginalFileName": "OriginalFileName sample 337", + "IsStaged": true, + "Type": "IMAGE", + "FileName": "FileName sample 334", + "FilePath": "/samples/FilePath-335.txt", + "FileSizeBytes": 4000000336, + "IsForbidden": false, + "IsValid": true, + "IsImage": false, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-335.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000338", + "Version": { + "LastWriteUtc": "2026-10-29T16:39:00Z", + "Length": 4000000340 + } + } + ], + "SourceType": "LOCAL_PATH", + "Source": "Source sample 341" + }, + "Role": "UNKNOWN", + "HideFromUser": true + } + ], + "FileAttachments": [ + { + "$type": "file", + "Type": "IMAGE", + "FileName": "FileName sample 342", + "FilePath": "/samples/FilePath-343.txt", + "FileSizeBytes": 4000000344, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-343.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000345", + "Version": { + "LastWriteUtc": "2026-10-29T16:46:00Z", + "Length": 4000000347 + } + }, + { + "$type": "image", + "SourceType": "LOCAL_PATH", + "Type": "IMAGE", + "FileName": "FileName sample 348", + "FilePath": "/samples/FilePath-349.txt", + "FileSizeBytes": 4000000350, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-349.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000351", + "Version": { + "LastWriteUtc": "2026-10-29T16:52:00Z", + "Length": 4000000353 + } + }, + { + "$type": "managed_transcript", + "OriginalFileName": "OriginalFileName sample 357", + "IsStaged": true, + "Type": "IMAGE", + "FileName": "FileName sample 354", + "FilePath": "/samples/FilePath-355.txt", + "FileSizeBytes": 4000000356, + "IsForbidden": false, + "IsValid": true, + "IsImage": false, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-355.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000358", + "Version": { + "LastWriteUtc": "2026-10-29T16:59:00Z", + "Length": 4000000360 + } + } + ], + "AllowProfileUsage": true, + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000361", + "ToolIds": [ + "ToolIds sample 362", + "ToolIds sample 363" + ], + "DataSourceOptions": { + "DisableDataSources": true, + "AutomaticDataSourceSelection": true, + "AutomaticValidation": true, + "RetrievalMode": "EVERY_MESSAGE", + "PreselectedDataSourceIds": [ + "PreselectedDataSourceIds sample 364", + "PreselectedDataSourceIds sample 365" + ] + }, + "ProfileId": "ProfileId sample 366", + "ProviderId": "ProviderId sample 367", + "WorkspaceName": "WorkspaceName sample 368" + } + ], + "EnabledPlugins": [ + "00000000-0000-4000-8000-000000000369", + "00000000-0000-4000-8000-000000000370" + ], + "ManagedEditableDefaults": { + "ManagedEditableDefaultsKey sample 371": { + "ConfigPluginId": "00000000-0000-4000-8000-000000000372", + "LastAppliedValue": "LastAppliedValue sample 373" + }, + "ManagedEditableDefaultsKey sample 374": { + "ConfigPluginId": "00000000-0000-4000-8000-000000000375", + "LastAppliedValue": "LastAppliedValue sample 376" + } + }, + "AssistantPluginAudits": [ + { + "PluginId": "00000000-0000-4000-8000-000000000377", + "PluginHash": "PluginHash sample 378", + "AuditedAtUtc": "2026-10-29T18:49:15+01:00", + "AuditProviderId": "AuditProviderId sample 380", + "AuditProviderName": "AuditProviderName sample 381", + "Level": "DANGEROUS", + "Summary": "Summary sample 382", + "Confidence": 2.25, + "PromptPreview": "PromptPreview sample 383", + "Findings": [ + { + "severity": "unknown", + "Category": "Category sample 385", + "Location": "Location sample 386", + "Description": "Description sample 387" + }, + { + "severity": "unknown", + "Category": "Category sample 389", + "Location": "Location sample 390", + "Description": "Description sample 391" + } + ] + }, + { + "PluginId": "00000000-0000-4000-8000-000000000392", + "PluginHash": "PluginHash sample 393", + "AuditedAtUtc": "2026-10-29T19:04:15+01:00", + "AuditProviderId": "AuditProviderId sample 395", + "AuditProviderName": "AuditProviderName sample 396", + "Level": "DANGEROUS", + "Summary": "Summary sample 397", + "Confidence": 2.25, + "PromptPreview": "PromptPreview sample 398", + "Findings": [ + { + "severity": "unknown", + "Category": "Category sample 400", + "Location": "Location sample 401", + "Description": "Description sample 402" + }, + { + "severity": "unknown", + "Category": "Category sample 404", + "Location": "Location sample 405", + "Description": "Description sample 406" + } + ] + } + ], + "NextProviderNum": 7, + "NextEmbeddingNum": 7, + "NextTranscriptionNum": 7, + "NextDataSourceNum": 7, + "NextProfileNum": 7, + "NextChatTemplateNum": 7, + "NextDocumentAnalysisPolicyNum": 7, + "App": { + "LanguageBehavior": "MANUAL", + "LanguagePluginId": "00000000-0000-4000-8000-000000000407", + "PreferredTheme": "LIGHT", + "IsSavingEnergy": true, + "EnableSpellchecking": true, + "CloseExportMessagesAutomatically": true, + "UpdateInterval": "DISABLE_UPDATES", + "UpdateInstallation": "AUTOMATIC", + "NavigationBehavior": "NEVER_EXPAND_USE_TOOLTIPS", + "StartPage": "CHAT", + "InterfaceScreenSizes": [ + { + "ScreenKey": "ScreenKey sample 408", + "Size": "SYSTEM_SCALING", + "CustomPercent": 49 + }, + { + "ScreenKey": "ScreenKey sample 410", + "Size": "SYSTEM_SCALING", + "CustomPercent": 51 + } + ], + "ShowPromptInjectionAlert": true, + "ShowIntroduction": true, + "ShowQuickStartGuide": true, + "ShowLastChangelog": true, + "ShowVision": true, + "PreviewVisibility": "RELEASE_CANDIDATE", + "EnabledPreviewFeatures": [ + "PRE_WRITER_MODE_2024", + "PRE_RAG_2024" + ], + "PreselectedProvider": "PreselectedProvider sample 412", + "PreselectedProfile": "PreselectedProfile sample 413", + "PreselectedChatTemplate": "PreselectedChatTemplate sample 414", + "UseTranscriptionProvider": "UseTranscriptionProvider sample 415", + "OpusBitrate": "KBPS_32", + "ShortcutVoiceRecording": "ShortcutVoiceRecording sample 416", + "ShortcutVoiceRecordingDisplayName": "ShortcutVoiceRecordingDisplayName sample 417", + "ShortcutVoiceRecordingDisplaySource": "ShortcutVoiceRecordingDisplaySource sample 418", + "HttpClientTimeoutSeconds": 59, + "ShareFeatureUsageWithSelfHostedServerOperators": true, + "ExternalHttpCustomRootCertificatesEnabled": true, + "ExternalHttpCustomRootCertificateBundlePath": "/samples/ExternalHttpCustomRootCertificateBundlePath-420.txt", + "ExternalHttpCustomRootCertificateAllowedHosts": [ + "ExternalHttpCustomRootCertificateAllowedHosts sample 421", + "ExternalHttpCustomRootCertificateAllowedHosts sample 422" + ], + "AllowUserToAddProvider": true, + "AllowUserToAddLLMProvider": true, + "AllowUserToAddEmbeddingProvider": true, + "AllowUserToAddTranscriptionProvider": true, + "ProhibitedProviders": [ + "OPEN_AI", + "ANTHROPIC" + ], + "AllowUserToAddMailbox": true, + "AllowUserToImportConfigurationSnippets": true, + "AllowUserToImportProfile": true, + "AllowUserToImportLLMProvider": true, + "AllowUserToImportEmbeddingProvider": true, + "AllowUserToImportTranscriptionProvider": true, + "AllowUserToImportChatTemplate": true, + "AllowUserToImportERIDataSource": true, + "AllowUserToImportDocumentAnalysisPolicy": true, + "AllowUserToImportPlugins": true, + "AllowUserToImportConfigurationPlugins": true, + "AllowUserToSharePlugins": true, + "AllowUserToBackUpData": true, + "AllowUserToRestoreData": true, + "ShowAdminSettings": true, + "EnterpriseEncryptionExportFormat": "V2", + "AddAIGeneratedContentDisclosure": true, + "DataSourceIndexing": { + "AutomaticRefresh": true, + "MinimumPauseBetweenStepsSeconds": 63, + "MaximumPauseBetweenStepsSeconds": 64 + }, + "HiddenAssistants": [ + "UNKNOWN", + "GRAMMAR_SPELLING_ASSISTANT" + ] + }, + "Chat": { + "ShortcutSendBehavior": "MODIFER_ENTER_IS_SENDING", + "LoadingProviderBehavior": "ALWAYS_USE_DEFAULT_CHAT_PROVIDER", + "AddChatProviderBehavior": "ADDED_CHATS_USE_LATEST_PROVIDER", + "SendToChatDataSourceBehavior": "APPLY_STANDARD_CHAT_DATA_SOURCE_OPTIONS", + "PreselectOptions": true, + "PreselectedProvider": "PreselectedProvider sample 425", + "PreselectedProfile": "PreselectedProfile sample 426", + "PreselectedChatTemplate": "PreselectedChatTemplate sample 427", + "PreselectedDataSourcesDisabled": true, + "PreselectedDataSourcesAutomaticSelection": true, + "PreselectedDataSourcesAutomaticValidation": true, + "PreselectedDataSourceIds": [ + "PreselectedDataSourceIds sample 430", + "PreselectedDataSourceIds sample 431" + ], + "PreselectedDataSourcesRetrievalMode": "EVERY_MESSAGE", + "PreselectedDataSourceOptions": { + "DisableDataSources": true, + "AutomaticDataSourceSelection": true, + "AutomaticValidation": true, + "RetrievalMode": "EVERY_MESSAGE", + "PreselectedDataSourceIds": [ + "PreselectedDataSourceIds sample 430", + "PreselectedDataSourceIds sample 431" + ] + }, + "ShowLatestMessageAfterLoading": true, + "ReadChangedAttachmentsAgain": true + }, + "Workspace": { + "StorageBehavior": "STORE_CHATS_AUTOMATICALLY", + "StorageTemporaryMaintenancePolicy": "DELETE_OLDER_THAN_7_DAYS", + "DisplayBehavior": "TOGGLE_SIDEBAR", + "IsSidebarVisible": true, + "SplitterPosition": 1.5 + }, + "IconFinder": { + "PreselectOptions": true, + "PreselectedSource": "ICONS8", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 432" + }, + "Translation": { + "DebounceIntervalMilliseconds": 73, + "PreselectOptions": true, + "PreselectLiveTranslation": true, + "HideWebContentReader": true, + "PreselectWebContentReader": true, + "PreselectContentCleanerAgent": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectOtherLanguage": "PreselectOtherLanguage sample 434", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 435" + }, + "Coding": { + "PreselectOptions": true, + "PreselectCompilerMessages": true, + "PreselectedProgrammingLanguage": "BASH", + "PreselectedOtherProgrammingLanguage": "PreselectedOtherProgrammingLanguage sample 436", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 437", + "PreselectedProfile": "PreselectedProfile sample 438" + }, + "ERI": { + "AutoSaveChanges": true, + "PreselectOptions": true, + "ERIServers": [ + { + "ServerName": "ServerName sample 439", + "ServerDescription": "ServerDescription sample 440", + "ERIVersion": "V1", + "ProgrammingLanguage": "C", + "OtherProgrammingLanguage": "OtherProgrammingLanguage sample 441", + "DataSource": "CUSTOM", + "DataSourceProductName": "DataSourceProductName sample 442", + "OtherDataSource": "OtherDataSource sample 443", + "DataSourceHostname": "DataSourceHostname sample 444", + "DataSourcePort": 85, + "UserTypedPort": true, + "AuthMethods": [ + "KERBEROS", + "USERNAME_PASSWORD" + ], + "AuthDescription": "AuthDescription sample 446", + "OperatingSystem": "WINDOWS", + "AllowedLLMProviders": "ANY", + "EmbeddingInfos": [ + { + "EmbeddingType": "EmbeddingType sample 447", + "EmbeddingName": "EmbeddingName sample 448", + "Description": "Description sample 449", + "UsedWhen": "UsedWhen sample 450", + "Link": "Link sample 451" + }, + { + "EmbeddingType": "EmbeddingType sample 452", + "EmbeddingName": "EmbeddingName sample 453", + "Description": "Description sample 454", + "UsedWhen": "UsedWhen sample 455", + "Link": "Link sample 456" + } + ], + "RetrievalInfos": [ + { + "Name": "Name sample 457", + "Description": "Description sample 458", + "Link": "Link sample 459", + "ParametersDescription": { + "ParametersDescriptionKey sample 460": "ParametersDescription sample 461", + "ParametersDescriptionKey sample 462": "ParametersDescription sample 463" + }, + "Embeddings": [ + { + "EmbeddingType": "EmbeddingType sample 464", + "EmbeddingName": "EmbeddingName sample 465", + "Description": "Description sample 466", + "UsedWhen": "UsedWhen sample 467", + "Link": "Link sample 468" + }, + { + "EmbeddingType": "EmbeddingType sample 469", + "EmbeddingName": "EmbeddingName sample 470", + "Description": "Description sample 471", + "UsedWhen": "UsedWhen sample 472", + "Link": "Link sample 473" + } + ] + }, + { + "Name": "Name sample 474", + "Description": "Description sample 475", + "Link": "Link sample 476", + "ParametersDescription": { + "ParametersDescriptionKey sample 477": "ParametersDescription sample 478", + "ParametersDescriptionKey sample 479": "ParametersDescription sample 480" + }, + "Embeddings": [ + { + "EmbeddingType": "EmbeddingType sample 481", + "EmbeddingName": "EmbeddingName sample 482", + "Description": "Description sample 483", + "UsedWhen": "UsedWhen sample 484", + "Link": "Link sample 485" + }, + { + "EmbeddingType": "EmbeddingType sample 486", + "EmbeddingName": "EmbeddingName sample 487", + "Description": "Description sample 488", + "UsedWhen": "UsedWhen sample 489", + "Link": "Link sample 490" + } + ] + } + ], + "AdditionalLibraries": "AdditionalLibraries sample 491", + "WriteToFilesystem": true, + "BaseDirectory": "BaseDirectory sample 492", + "PreviouslyGeneratedFiles": [ + "PreviouslyGeneratedFiles sample 493", + "PreviouslyGeneratedFiles sample 494" + ] + }, + { + "ServerName": "ServerName sample 495", + "ServerDescription": "ServerDescription sample 496", + "ERIVersion": "V1", + "ProgrammingLanguage": "C", + "OtherProgrammingLanguage": "OtherProgrammingLanguage sample 497", + "DataSource": "CUSTOM", + "DataSourceProductName": "DataSourceProductName sample 498", + "OtherDataSource": "OtherDataSource sample 499", + "DataSourceHostname": "DataSourceHostname sample 500", + "DataSourcePort": 41, + "UserTypedPort": true, + "AuthMethods": [ + "KERBEROS", + "USERNAME_PASSWORD" + ], + "AuthDescription": "AuthDescription sample 502", + "OperatingSystem": "WINDOWS", + "AllowedLLMProviders": "ANY", + "EmbeddingInfos": [ + { + "EmbeddingType": "EmbeddingType sample 503", + "EmbeddingName": "EmbeddingName sample 504", + "Description": "Description sample 505", + "UsedWhen": "UsedWhen sample 506", + "Link": "Link sample 507" + }, + { + "EmbeddingType": "EmbeddingType sample 508", + "EmbeddingName": "EmbeddingName sample 509", + "Description": "Description sample 510", + "UsedWhen": "UsedWhen sample 511", + "Link": "Link sample 512" + } + ], + "RetrievalInfos": [ + { + "Name": "Name sample 513", + "Description": "Description sample 514", + "Link": "Link sample 515", + "ParametersDescription": { + "ParametersDescriptionKey sample 516": "ParametersDescription sample 517", + "ParametersDescriptionKey sample 518": "ParametersDescription sample 519" + }, + "Embeddings": [ + { + "EmbeddingType": "EmbeddingType sample 520", + "EmbeddingName": "EmbeddingName sample 521", + "Description": "Description sample 522", + "UsedWhen": "UsedWhen sample 523", + "Link": "Link sample 524" + }, + { + "EmbeddingType": "EmbeddingType sample 525", + "EmbeddingName": "EmbeddingName sample 526", + "Description": "Description sample 527", + "UsedWhen": "UsedWhen sample 528", + "Link": "Link sample 529" + } + ] + }, + { + "Name": "Name sample 530", + "Description": "Description sample 531", + "Link": "Link sample 532", + "ParametersDescription": { + "ParametersDescriptionKey sample 533": "ParametersDescription sample 534", + "ParametersDescriptionKey sample 535": "ParametersDescription sample 536" + }, + "Embeddings": [ + { + "EmbeddingType": "EmbeddingType sample 537", + "EmbeddingName": "EmbeddingName sample 538", + "Description": "Description sample 539", + "UsedWhen": "UsedWhen sample 540", + "Link": "Link sample 541" + }, + { + "EmbeddingType": "EmbeddingType sample 542", + "EmbeddingName": "EmbeddingName sample 543", + "Description": "Description sample 544", + "UsedWhen": "UsedWhen sample 545", + "Link": "Link sample 546" + } + ] + } + ], + "AdditionalLibraries": "AdditionalLibraries sample 547", + "WriteToFilesystem": true, + "BaseDirectory": "BaseDirectory sample 548", + "PreviouslyGeneratedFiles": [ + "PreviouslyGeneratedFiles sample 549", + "PreviouslyGeneratedFiles sample 550" + ] + } + ], + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 551", + "PreselectedProfile": "PreselectedProfile sample 552" + }, + "DocumentAnalysis": { + "Policies": [ + { + "Id": "Id sample 553", + "Num": 7, + "Name": "PolicyName sample 555", + "IsEnterpriseConfiguration": true, + "PolicyName": "PolicyName sample 555", + "PolicyDescription": "PolicyDescription sample 556", + "IsProtected": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000557", + "AnalysisRules": "AnalysisRules sample 558", + "OutputRules": "OutputRules sample 559", + "MinimumProviderConfidence": "UNTRUSTED", + "AllowedToolIds": [ + "AllowedToolIds sample 560", + "AllowedToolIds sample 561" + ], + "PreselectedProvider": "PreselectedProvider sample 562", + "PreselectedProfile": "PreselectedProfile sample 563", + "HidePolicyDefinition": true + }, + { + "Id": "Id sample 564", + "Num": 7, + "Name": "PolicyName sample 566", + "IsEnterpriseConfiguration": true, + "PolicyName": "PolicyName sample 566", + "PolicyDescription": "PolicyDescription sample 567", + "IsProtected": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000568", + "AnalysisRules": "AnalysisRules sample 569", + "OutputRules": "OutputRules sample 570", + "MinimumProviderConfidence": "UNTRUSTED", + "AllowedToolIds": [ + "AllowedToolIds sample 571", + "AllowedToolIds sample 572" + ], + "PreselectedProvider": "PreselectedProvider sample 573", + "PreselectedProfile": "PreselectedProfile sample 574", + "HidePolicyDefinition": true + } + ] + }, + "MandatoryInformation": { + "Acceptances": [ + { + "InfoId": "InfoId sample 575", + "AcceptedVersion": "AcceptedVersion sample 576", + "AcceptedHash": "AcceptedHash sample 577", + "AcceptedAtUtc": "2026-10-29T22:08:15+01:00", + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000579" + }, + { + "InfoId": "InfoId sample 580", + "AcceptedVersion": "AcceptedVersion sample 581", + "AcceptedHash": "AcceptedHash sample 582", + "AcceptedAtUtc": "2026-10-29T22:13:15+01:00", + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000584" + } + ] + }, + "TextSummarizer": { + "PreselectOptions": true, + "HideWebContentReader": true, + "PreselectWebContentReader": true, + "PreselectContentCleanerAgent": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 585", + "PreselectedComplexity": "SIMPLE_LANGUAGE", + "PreselectedExpertInField": "PreselectedExpertInField sample 586", + "PreselectedImportantAspects": "PreselectedImportantAspects sample 587", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 588" + }, + "TextContentCleaner": { + "PreselectAgentOptions": true, + "PreselectedAgentProvider": "PreselectedAgentProvider sample 589" + }, + "AgentDataSourceSelection": { + "PreselectAgentOptions": true, + "PreselectedAgentProvider": "PreselectedAgentProvider sample 590" + }, + "AgentRetrievalContextValidation": { + "EnableRetrievalContextValidation": true, + "PreselectAgentOptions": true, + "PreselectedAgentProvider": "PreselectedAgentProvider sample 591", + "NumParallelValidations": 82 + }, + "AssistantPluginAudit": { + "RequireAuditBeforeActivation": true, + "PreselectedAgentProvider": "PreselectedAgentProvider sample 593", + "MinimumLevel": "DANGEROUS", + "BlockActivationBelowMinimum": true, + "AutomaticallyAuditAssistants": true, + "EnterpriseApprovedPlugins": [ + { + "PluginHash": "PluginHash sample 594", + "DisplayName": "DisplayName sample 595", + "Comment": "Comment sample 596", + "ApprovedBy": "ApprovedBy sample 597", + "ApprovedAtUtc": "2026-10-29T22:28:15+01:00", + "Activate": true, + "AllowUserOverride": true + }, + { + "PluginHash": "PluginHash sample 599", + "DisplayName": "DisplayName sample 600", + "Comment": "Comment sample 601", + "ApprovedBy": "ApprovedBy sample 602", + "ApprovedAtUtc": "2026-10-29T22:33:15+01:00", + "Activate": true, + "AllowUserOverride": true + } + ] + }, + "Agenda": { + "PreselectOptions": true, + "PreselectName": "PreselectName sample 604", + "PreselectTopic": "PreselectTopic sample 605", + "PreselectObjective": "PreselectObjective sample 606", + "PreselectModerator": "PreselectModerator sample 607", + "PreselectDuration": "PreselectDuration sample 608", + "PreselectStartTime": "PreselectStartTime sample 609", + "PreselectIntroduceParticipants": true, + "PreselectNumberParticipants": "PEER_TO_PEER", + "PreselectActiveParticipation": true, + "PreselectIsMeetingVirtual": true, + "PreselectLocation": "PreselectLocation sample 610", + "PreselectJointDinner": true, + "PreselectSocialActivity": true, + "PreselectArriveAndDepart": true, + "PreselectLunchTime": 51, + "PreselectBreakTime": 52, + "PreselectedTargetLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 613", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 614", + "PreselectedProfile": "PreselectedProfile sample 615" + }, + "GrammarSpelling": { + "PreselectOptions": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 616", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 617" + }, + "RewriteImprove": { + "PreselectOptions": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 618", + "PreselectedWritingStyle": "EVERYDAY", + "PreselectedSentenceStructure": "ACTIVE", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 619" + }, + "PromptOptimizer": { + "PreselectOptions": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 620", + "PreselectedImportantAspects": "PreselectedImportantAspects sample 621", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 622" + }, + "EMail": { + "PreselectOptions": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectOtherLanguage": "PreselectOtherLanguage sample 623", + "PreselectedWritingStyle": "BUSINESS_FORMAL", + "Greeting": "Greeting sample 624", + "SenderName": "SenderName sample 625", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 626", + "PreselectedProfile": "PreselectedProfile sample 627" + }, + "SlideBuilder": { + "TemplatePath": "/samples/TemplatePath-628.txt", + "PreselectedFooterText": "PreselectedFooterText sample 629", + "PreselectedMaxBulletPointsPerSlide": 70, + "PreselectedKeepEmptyPicturePlaceholders": true, + "PreselectedPictureLibraryPath": "/samples/PreselectedPictureLibraryPath-631.txt", + "PreselectedLayouts": { + "TABLE_OF_CONTENTS": "PreselectedLayouts sample 632", + "AGENDA": "PreselectedLayouts sample 633" + }, + "PreselectedTemplateSlideUses": { + "74": "KEEP", + "75": "EDIT" + }, + "PreselectOptions": true, + "PreselectedProfile": "PreselectedProfile sample 636", + "PreselectedProvider": "PreselectedProvider sample 637", + "PreselectedTargetLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 638", + "PreselectedAudienceProfile": "STUDENTS", + "PreselectedAudienceAgeGroup": "CHILDREN", + "PreselectedAudienceOrganizationalLevel": "TRAINEES", + "PreselectedAudienceExpertise": "NON_EXPERTS", + "PreselectedOccasion": "TALK", + "PreselectedOtherOccasion": "PreselectedOtherOccasion sample 639", + "PreselectedImportantAspects": "PreselectedImportantAspects sample 640", + "MinimumProviderConfidence": "UNTRUSTED" + }, + "LegalCheck": { + "PreselectOptions": true, + "HideWebContentReader": true, + "PreselectWebContentReader": true, + "PreselectContentCleanerAgent": true, + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 641", + "PreselectedProfile": "PreselectedProfile sample 642" + }, + "Synonyms": { + "PreselectOptions": true, + "PreselectedLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 643", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 644" + }, + "MyTasks": { + "PreselectOptions": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectOtherLanguage": "PreselectOtherLanguage sample 645", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 646", + "PreselectedProfile": "PreselectedProfile sample 647" + }, + "JobPostings": { + "PreselectOptions": true, + "PreselectedMandatoryInformation": "PreselectedMandatoryInformation sample 648", + "PreselectedJobDescription": "PreselectedJobDescription sample 649", + "PreselectedQualifications": "PreselectedQualifications sample 650", + "PreselectedResponsibilities": "PreselectedResponsibilities sample 651", + "PreselectedCompanyName": "PreselectedCompanyName sample 652", + "PreselectedWorkLocation": "PreselectedWorkLocation sample 653", + "PreselectedCountryLegalFramework": "PreselectedCountryLegalFramework sample 654", + "PreselectedTargetLanguage": "EN_US", + "PreselectOtherLanguage": "PreselectOtherLanguage sample 655", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 656" + }, + "BiasOfTheDay": { + "UsedBias": [ + 47, + 48 + ], + "DateLastBiasDrawn": "2026-10-29", + "BiasOfTheDayChatId": "00000000-0000-4000-8000-000000000659", + "BiasOfTheDayId": "00000000-0000-4000-8000-000000000660", + "RestrictOneBiasPerDay": true, + "PreselectOptions": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 661", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProfile": "PreselectedProfile sample 662", + "PreselectedProvider": "PreselectedProvider sample 663" + }, + "I18N": { + "PreselectOptions": true, + "PreselectedLanguagePluginId": "00000000-0000-4000-8000-000000000664", + "PreselectedTargetLanguage": "EN_US", + "PreselectOtherLanguage": "PreselectOtherLanguage sample 665", + "PreselectedProvider": "PreselectedProvider sample 666" + } +} \ No newline at end of file diff --git a/app/Tests/Serialization/Fixtures/settings.json b/app/Tests/Serialization/Fixtures/settings.json new file mode 100644 index 000000000..9ced33f11 --- /dev/null +++ b/app/Tests/Serialization/Fixtures/settings.json @@ -0,0 +1,1759 @@ +{ + "Version": "V6", + "Providers": [ + { + "Num": 7, + "Id": "Id sample 1", + "InstanceName": "Name sample 13", + "UsedLLMProvider": "OPEN_AI", + "Model": { + "Id": "Id sample 3", + "DisplayName": "DisplayName sample 4", + "IsSystemModel": false + }, + "IsSelfHosted": true, + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000005", + "Hostname": "Hostname sample 6", + "Host": "LM_STUDIO", + "HFInferenceProvider": "AUTOMATIC", + "AdditionalJsonApiParameters": "AdditionalJsonApiParameters sample 7", + "TokenizerPath": "/samples/TokenizerPath-8.txt", + "CapabilityOverrides": { + "AUDIO_INPUT": true, + "FUNCTION_CALLING": true, + "MULTIPLE_IMAGE_INPUT": true, + "SPEECH_INPUT": true, + "VIDEO_INPUT": true, + "OPTIONAL_REASONING": true, + "ALWAYS_REASONING": true, + "REASONING_BY_DEFAULT": true, + "CONTEXT_WINDOW": 49, + "MAX_IMAGES_PER_MESSAGE": 50, + "MAX_IMAGES_PER_REQUEST": 51 + }, + "AllowUserProvidedAPIKey": true, + "CustomIconDataUrl": "CustomIconDataUrl sample 12", + "PromptForUserAPIKey": true, + "Name": "Name sample 13" + }, + { + "Num": 7, + "Id": "Id sample 14", + "InstanceName": "Name sample 26", + "UsedLLMProvider": "OPEN_AI", + "Model": { + "Id": "Id sample 16", + "DisplayName": "DisplayName sample 17", + "IsSystemModel": false + }, + "IsSelfHosted": true, + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000018", + "Hostname": "Hostname sample 19", + "Host": "LM_STUDIO", + "HFInferenceProvider": "AUTOMATIC", + "AdditionalJsonApiParameters": "AdditionalJsonApiParameters sample 20", + "TokenizerPath": "/samples/TokenizerPath-21.txt", + "CapabilityOverrides": { + "AUDIO_INPUT": true, + "FUNCTION_CALLING": true, + "MULTIPLE_IMAGE_INPUT": true, + "SPEECH_INPUT": true, + "VIDEO_INPUT": true, + "OPTIONAL_REASONING": true, + "ALWAYS_REASONING": true, + "REASONING_BY_DEFAULT": true, + "CONTEXT_WINDOW": 62, + "MAX_IMAGES_PER_MESSAGE": 63, + "MAX_IMAGES_PER_REQUEST": 64 + }, + "AllowUserProvidedAPIKey": true, + "CustomIconDataUrl": "CustomIconDataUrl sample 25", + "PromptForUserAPIKey": true, + "Name": "Name sample 26" + } + ], + "Confidence": { + "EnforceGlobalMinimumConfidence": true, + "GlobalMinimumConfidence": "UNTRUSTED", + "ShowProviderConfidence": true, + "ConfidenceScheme": "TRUST_USA_EUROPE", + "CustomConfidenceScheme": { + "OPEN_AI": "UNTRUSTED", + "ANTHROPIC": "UNKNOWN" + } + }, + "DataSourceSecurity": { + "TrustedProviderIds": [ + "TrustedProviderIds sample 27", + "TrustedProviderIds sample 28" + ], + "MinimumOutboundDataRestriction": "ONLY_LINKS_FROM_CHAT" + }, + "EmbeddingProviders": [ + { + "Num": 7, + "Id": "Id sample 29", + "Name": "Name sample 30", + "UsedLLMProvider": "OPEN_AI", + "Model": { + "Id": "Id sample 31", + "DisplayName": "DisplayName sample 32", + "IsSystemModel": false + }, + "IsSelfHosted": true, + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000033", + "Hostname": "Hostname sample 34", + "Host": "LM_STUDIO", + "TokenizerPath": "/samples/TokenizerPath-35.txt", + "TokenizerFingerprint": "TokenizerFingerprint sample 36", + "EmbeddingBatchSize": 77, + "TokenLimit": 78, + "AllowUserProvidedAPIKey": true, + "CustomIconDataUrl": "CustomIconDataUrl sample 39", + "HFInferenceProvider": "AUTOMATIC", + "PromptForUserAPIKey": true + }, + { + "Num": 7, + "Id": "Id sample 40", + "Name": "Name sample 41", + "UsedLLMProvider": "OPEN_AI", + "Model": { + "Id": "Id sample 42", + "DisplayName": "DisplayName sample 43", + "IsSystemModel": false + }, + "IsSelfHosted": true, + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000044", + "Hostname": "Hostname sample 45", + "Host": "LM_STUDIO", + "TokenizerPath": "/samples/TokenizerPath-46.txt", + "TokenizerFingerprint": "TokenizerFingerprint sample 47", + "EmbeddingBatchSize": 88, + "TokenLimit": 89, + "AllowUserProvidedAPIKey": true, + "CustomIconDataUrl": "CustomIconDataUrl sample 50", + "HFInferenceProvider": "AUTOMATIC", + "PromptForUserAPIKey": true + } + ], + "TranscriptionProviders": [ + { + "Num": 7, + "Id": "Id sample 51", + "Name": "Name sample 52", + "UsedLLMProvider": "OPEN_AI", + "Model": { + "Id": "Id sample 53", + "DisplayName": "DisplayName sample 54", + "IsSystemModel": false + }, + "IsSelfHosted": true, + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000055", + "Hostname": "Hostname sample 56", + "Host": "LM_STUDIO", + "AllowUserProvidedAPIKey": true, + "CustomIconDataUrl": "CustomIconDataUrl sample 57", + "HFInferenceProvider": "AUTOMATIC", + "PromptForUserAPIKey": true + }, + { + "Num": 7, + "Id": "Id sample 58", + "Name": "Name sample 59", + "UsedLLMProvider": "OPEN_AI", + "Model": { + "Id": "Id sample 60", + "DisplayName": "DisplayName sample 61", + "IsSystemModel": false + }, + "IsSelfHosted": true, + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000062", + "Hostname": "Hostname sample 63", + "Host": "LM_STUDIO", + "AllowUserProvidedAPIKey": true, + "CustomIconDataUrl": "CustomIconDataUrl sample 64", + "HFInferenceProvider": "AUTOMATIC", + "PromptForUserAPIKey": true + } + ], + "DataSources": [ + { + "$type_discriminator": "LOCAL_DIRECTORY", + "Num": 7, + "Id": "Id sample 65", + "Name": "Name sample 66", + "Description": "Description sample 67", + "Type": "LOCAL_FILE", + "EmbeddingId": "EmbeddingId sample 68", + "MaxChunkTokenLength": 59, + "ChunkOverlapTokenLength": 60, + "ConfidenceLevel": "UNTRUSTED", + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000071", + "MaxMatches": 8, + "OutboundDataRestriction": "ONLY_LINKS_FROM_CHAT", + "Path": "/samples/Path-72.txt", + "FilePatterns": "FilePatterns sample 73", + "ExcludePatterns": "ExcludePatterns sample 74", + "MaxFileSizeMegabytes": 65, + "IncludeSubdirectories": true, + "IncludeHiddenFilesAndFolders": true + }, + { + "$type_discriminator": "LOCAL_FILE", + "Num": 7, + "Id": "Id sample 76", + "Name": "Name sample 77", + "Description": "Description sample 78", + "Type": "LOCAL_FILE", + "EmbeddingId": "EmbeddingId sample 79", + "MaxChunkTokenLength": 70, + "ChunkOverlapTokenLength": 71, + "ConfidenceLevel": "UNTRUSTED", + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000082", + "MaxMatches": 8, + "OutboundDataRestriction": "ONLY_LINKS_FROM_CHAT", + "FilePath": "/samples/FilePath-83.txt" + }, + { + "$type_discriminator": "ERI_V1", + "Num": 7, + "Id": "Id sample 84", + "Name": "Name sample 85", + "Type": "LOCAL_FILE", + "Hostname": "Hostname sample 86", + "Port": 77, + "AuthMethod": "KERBEROS", + "Username": "Username sample 88", + "UsernamePasswordMode": "SHARED_USERNAME_AND_PASSWORD", + "SecurityPolicy": "ALLOW_ANY", + "OutboundDataRestriction": "ONLY_LINKS_FROM_CHAT", + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000089", + "Version": "V1", + "SelectedRetrievalId": "SelectedRetrievalId sample 90", + "MaxMatches": 8 + } + ], + "Mailboxes": [ + { + "Num": 7, + "Id": "Id sample 91", + "Name": "Name sample 92", + "Type": "LOCAL_FILE", + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000093", + "EmbeddingId": "EmbeddingId sample 94", + "MaxChunkTokenLength": 85, + "ChunkOverlapTokenLength": 86, + "ConfidenceLevel": "UNTRUSTED", + "Host": "Host sample 97", + "Port": 88, + "TransportSecurity": "SSL_ON_CONNECT", + "AuthMethod": "PASSWORD", + "Username": "Username sample 99", + "RootFolder": "RootFolder sample 100", + "IncludeSentAndDrafts": true, + "MaxAge": "LAST_6_MONTHS", + "IndexAttachments": true, + "MaxAttachmentSizeMegabytes": 41, + "OutboundDataRestriction": "ONLY_LINKS_FROM_CHAT", + "MaxMatches": 8 + }, + { + "Num": 7, + "Id": "Id sample 102", + "Name": "Name sample 103", + "Type": "LOCAL_FILE", + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000104", + "EmbeddingId": "EmbeddingId sample 105", + "MaxChunkTokenLength": 46, + "ChunkOverlapTokenLength": 47, + "ConfidenceLevel": "UNTRUSTED", + "Host": "Host sample 108", + "Port": 49, + "TransportSecurity": "SSL_ON_CONNECT", + "AuthMethod": "PASSWORD", + "Username": "Username sample 110", + "RootFolder": "RootFolder sample 111", + "IncludeSentAndDrafts": true, + "MaxAge": "LAST_6_MONTHS", + "IndexAttachments": true, + "MaxAttachmentSizeMegabytes": 52, + "OutboundDataRestriction": "ONLY_LINKS_FROM_CHAT", + "MaxMatches": 8 + } + ], + "MailboxSettings": { + "MinimumOutboundDataRestriction": "ONLY_LINKS_FROM_CHAT", + "AllowOnlyOrganizationMailServers": true + }, + "Profiles": [ + { + "Num": 7, + "Id": "Id sample 113", + "Name": "Name sample 114", + "NeedToKnow": "NeedToKnow sample 115", + "Actions": "Actions sample 116", + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000117" + }, + { + "Num": 7, + "Id": "Id sample 118", + "Name": "Name sample 119", + "NeedToKnow": "NeedToKnow sample 120", + "Actions": "Actions sample 121", + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000122" + } + ], + "ChatTemplates": [ + { + "Num": 7, + "Id": "Id sample 123", + "Name": "Name sample 124", + "SystemPrompt": "SystemPrompt sample 125", + "PredefinedUserPrompt": "PredefinedUserPrompt sample 126", + "ExampleConversation": [ + { + "Time": "2026-10-29T14:37:15+01:00", + "ContentType": "UNKNOWN", + "Content": { + "$type": "text", + "Sources": [ + { + "Title": "Title sample 128", + "URL": "URL sample 129", + "Origin": "RAG" + }, + { + "Title": "Title sample 130", + "URL": "URL sample 131", + "Origin": "RAG" + } + ], + "FileAttachments": [ + { + "$type": "file", + "Type": "IMAGE", + "FileName": "FileName sample 132", + "FilePath": "/samples/FilePath-133.txt", + "FileSizeBytes": 4000000134, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-133.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000135", + "Version": { + "LastWriteUtc": "2026-10-29T13:16:00Z", + "Length": 4000000137 + } + }, + { + "$type": "image", + "SourceType": "LOCAL_PATH", + "Type": "IMAGE", + "FileName": "FileName sample 138", + "FilePath": "/samples/FilePath-139.txt", + "FileSizeBytes": 4000000140, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-139.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000141", + "Version": { + "LastWriteUtc": "2026-10-29T13:22:00Z", + "Length": 4000000143 + } + }, + { + "$type": "managed_transcript", + "OriginalFileName": "OriginalFileName sample 147", + "IsStaged": true, + "Type": "IMAGE", + "FileName": "FileName sample 144", + "FilePath": "/samples/FilePath-145.txt", + "FileSizeBytes": 4000000146, + "IsForbidden": false, + "IsValid": true, + "IsImage": false, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-145.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000148", + "Version": { + "LastWriteUtc": "2026-10-29T13:29:00Z", + "Length": 4000000150 + } + } + ], + "ToolInvocations": [ + { + "Order": 41, + "ToolId": "ToolId sample 152", + "ToolName": "ToolName sample 153", + "ToolIcon": "ToolIcon sample 154", + "ToolCallId": "ToolCallId sample 155", + "Status": "SUCCESS", + "WasExecuted": true, + "StatusMessage": "StatusMessage sample 156", + "Arguments": { + "ArgumentsKey sample 157": "Arguments sample 158", + "ArgumentsKey sample 159": "Arguments sample 160" + } + }, + { + "Order": 51, + "ToolId": "ToolId sample 162", + "ToolName": "ToolName sample 163", + "ToolIcon": "ToolIcon sample 164", + "ToolCallId": "ToolCallId sample 165", + "Status": "SUCCESS", + "WasExecuted": true, + "StatusMessage": "StatusMessage sample 166", + "Arguments": { + "ArgumentsKey sample 167": "Arguments sample 168", + "ArgumentsKey sample 169": "Arguments sample 170" + } + } + ], + "Presentation": { + "Kind": "SWOT_ANALYSIS", + "Data": { + "sample": 171, + "text": "Gr\u00F6\u00DFe" + } + }, + "SourcePassages": [ + { + "SourceUrl": "SourceUrl sample 172", + "DataSourceName": "DataSourceName sample 173", + "Path": "/samples/Path-174.txt", + "Category": "UNKNOWN", + "Type": "UNKNOWN", + "ProvenanceId": "00000000-0000-4000-8000-000000000175", + "Text": "Text sample 176", + "SurroundingContent": [ + "SurroundingContent sample 177", + "SurroundingContent sample 178" + ], + "PageNumber": 69, + "EndPageNumber": 70, + "SheetName": "SheetName sample 181", + "StartRow": 72, + "EndRow": 73, + "StartLine": 74, + "EndLine": 75, + "ChunkNumber": 76 + }, + { + "SourceUrl": "SourceUrl sample 187", + "DataSourceName": "DataSourceName sample 188", + "Path": "/samples/Path-189.txt", + "Category": "UNKNOWN", + "Type": "UNKNOWN", + "ProvenanceId": "00000000-0000-4000-8000-000000000190", + "Text": "Text sample 191", + "SurroundingContent": [ + "SurroundingContent sample 192", + "SurroundingContent sample 193" + ], + "PageNumber": 84, + "EndPageNumber": 85, + "SheetName": "SheetName sample 196", + "StartRow": 87, + "EndRow": 88, + "StartLine": 89, + "EndLine": 40, + "ChunkNumber": 41 + } + ], + "ReportedUsage": { + "PromptTokens": 42, + "ModelId": "ModelId sample 203", + "BlockCount": 44 + }, + "Text": "Text sample 205" + }, + "Role": "UNKNOWN", + "HideFromUser": true + }, + { + "Time": "2026-10-29T15:56:15+01:00", + "ContentType": "UNKNOWN", + "Content": { + "$type": "image", + "Sources": [ + { + "Title": "Title sample 207", + "URL": "URL sample 208", + "Origin": "RAG" + }, + { + "Title": "Title sample 209", + "URL": "URL sample 210", + "Origin": "RAG" + } + ], + "FileAttachments": [ + { + "$type": "file", + "Type": "IMAGE", + "FileName": "FileName sample 211", + "FilePath": "/samples/FilePath-212.txt", + "FileSizeBytes": 4000000213, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-212.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000214", + "Version": { + "LastWriteUtc": "2026-10-29T14:35:00Z", + "Length": 4000000216 + } + }, + { + "$type": "image", + "SourceType": "LOCAL_PATH", + "Type": "IMAGE", + "FileName": "FileName sample 217", + "FilePath": "/samples/FilePath-218.txt", + "FileSizeBytes": 4000000219, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-218.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000220", + "Version": { + "LastWriteUtc": "2026-10-29T14:41:00Z", + "Length": 4000000222 + } + }, + { + "$type": "managed_transcript", + "OriginalFileName": "OriginalFileName sample 226", + "IsStaged": true, + "Type": "IMAGE", + "FileName": "FileName sample 223", + "FilePath": "/samples/FilePath-224.txt", + "FileSizeBytes": 4000000225, + "IsForbidden": false, + "IsValid": true, + "IsImage": false, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-224.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000227", + "Version": { + "LastWriteUtc": "2026-10-29T14:48:00Z", + "Length": 4000000229 + } + } + ], + "SourceType": "LOCAL_PATH", + "Source": "Source sample 230" + }, + "Role": "UNKNOWN", + "HideFromUser": true + } + ], + "FileAttachments": [ + { + "$type": "file", + "Type": "IMAGE", + "FileName": "FileName sample 231", + "FilePath": "/samples/FilePath-232.txt", + "FileSizeBytes": 4000000233, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-232.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000234", + "Version": { + "LastWriteUtc": "2026-10-29T14:55:00Z", + "Length": 4000000236 + } + }, + { + "$type": "image", + "SourceType": "LOCAL_PATH", + "Type": "IMAGE", + "FileName": "FileName sample 237", + "FilePath": "/samples/FilePath-238.txt", + "FileSizeBytes": 4000000239, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-238.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000240", + "Version": { + "LastWriteUtc": "2026-10-29T15:01:00Z", + "Length": 4000000242 + } + }, + { + "$type": "managed_transcript", + "OriginalFileName": "OriginalFileName sample 246", + "IsStaged": true, + "Type": "IMAGE", + "FileName": "FileName sample 243", + "FilePath": "/samples/FilePath-244.txt", + "FileSizeBytes": 4000000245, + "IsForbidden": false, + "IsValid": true, + "IsImage": false, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-244.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000247", + "Version": { + "LastWriteUtc": "2026-10-29T15:08:00Z", + "Length": 4000000249 + } + } + ], + "AllowProfileUsage": true, + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000250", + "ToolIds": [ + "ToolIds sample 251", + "ToolIds sample 252" + ], + "DataSourceOptions": { + "DisableDataSources": true, + "AutomaticDataSourceSelection": true, + "AutomaticValidation": true, + "RetrievalMode": "EVERY_MESSAGE", + "PreselectedDataSourceIds": [ + "PreselectedDataSourceIds sample 253", + "PreselectedDataSourceIds sample 254" + ] + }, + "ProfileId": "ProfileId sample 255", + "ProviderId": "ProviderId sample 256", + "WorkspaceName": "WorkspaceName sample 257" + }, + { + "Num": 7, + "Id": "Id sample 258", + "Name": "Name sample 259", + "SystemPrompt": "SystemPrompt sample 260", + "PredefinedUserPrompt": "PredefinedUserPrompt sample 261", + "ExampleConversation": [ + { + "Time": "2026-10-29T16:52:15+01:00", + "ContentType": "UNKNOWN", + "Content": { + "$type": "text", + "Sources": [ + { + "Title": "Title sample 263", + "URL": "URL sample 264", + "Origin": "RAG" + }, + { + "Title": "Title sample 265", + "URL": "URL sample 266", + "Origin": "RAG" + } + ], + "FileAttachments": [ + { + "$type": "file", + "Type": "IMAGE", + "FileName": "FileName sample 267", + "FilePath": "/samples/FilePath-268.txt", + "FileSizeBytes": 4000000269, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-268.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000270", + "Version": { + "LastWriteUtc": "2026-10-29T15:31:00Z", + "Length": 4000000272 + } + }, + { + "$type": "image", + "SourceType": "LOCAL_PATH", + "Type": "IMAGE", + "FileName": "FileName sample 273", + "FilePath": "/samples/FilePath-274.txt", + "FileSizeBytes": 4000000275, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-274.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000276", + "Version": { + "LastWriteUtc": "2026-10-29T15:37:00Z", + "Length": 4000000278 + } + }, + { + "$type": "managed_transcript", + "OriginalFileName": "OriginalFileName sample 282", + "IsStaged": true, + "Type": "IMAGE", + "FileName": "FileName sample 279", + "FilePath": "/samples/FilePath-280.txt", + "FileSizeBytes": 4000000281, + "IsForbidden": false, + "IsValid": true, + "IsImage": false, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-280.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000283", + "Version": { + "LastWriteUtc": "2026-10-29T15:44:00Z", + "Length": 4000000285 + } + } + ], + "ToolInvocations": [ + { + "Order": 76, + "ToolId": "ToolId sample 287", + "ToolName": "ToolName sample 288", + "ToolIcon": "ToolIcon sample 289", + "ToolCallId": "ToolCallId sample 290", + "Status": "SUCCESS", + "WasExecuted": true, + "StatusMessage": "StatusMessage sample 291", + "Arguments": { + "ArgumentsKey sample 292": "Arguments sample 293", + "ArgumentsKey sample 294": "Arguments sample 295" + } + }, + { + "Order": 86, + "ToolId": "ToolId sample 297", + "ToolName": "ToolName sample 298", + "ToolIcon": "ToolIcon sample 299", + "ToolCallId": "ToolCallId sample 300", + "Status": "SUCCESS", + "WasExecuted": true, + "StatusMessage": "StatusMessage sample 301", + "Arguments": { + "ArgumentsKey sample 302": "Arguments sample 303", + "ArgumentsKey sample 304": "Arguments sample 305" + } + } + ], + "Presentation": { + "Kind": "SWOT_ANALYSIS", + "Data": { + "sample": 306, + "text": "Gr\u00F6\u00DFe" + } + }, + "SourcePassages": [ + { + "SourceUrl": "SourceUrl sample 307", + "DataSourceName": "DataSourceName sample 308", + "Path": "/samples/Path-309.txt", + "Category": "UNKNOWN", + "Type": "UNKNOWN", + "ProvenanceId": "00000000-0000-4000-8000-000000000310", + "Text": "Text sample 311", + "SurroundingContent": [ + "SurroundingContent sample 312", + "SurroundingContent sample 313" + ], + "PageNumber": 54, + "EndPageNumber": 55, + "SheetName": "SheetName sample 316", + "StartRow": 57, + "EndRow": 58, + "StartLine": 59, + "EndLine": 60, + "ChunkNumber": 61 + }, + { + "SourceUrl": "SourceUrl sample 322", + "DataSourceName": "DataSourceName sample 323", + "Path": "/samples/Path-324.txt", + "Category": "UNKNOWN", + "Type": "UNKNOWN", + "ProvenanceId": "00000000-0000-4000-8000-000000000325", + "Text": "Text sample 326", + "SurroundingContent": [ + "SurroundingContent sample 327", + "SurroundingContent sample 328" + ], + "PageNumber": 69, + "EndPageNumber": 70, + "SheetName": "SheetName sample 331", + "StartRow": 72, + "EndRow": 73, + "StartLine": 74, + "EndLine": 75, + "ChunkNumber": 76 + } + ], + "ReportedUsage": { + "PromptTokens": 77, + "ModelId": "ModelId sample 338", + "BlockCount": 79 + }, + "Text": "Text sample 340" + }, + "Role": "UNKNOWN", + "HideFromUser": true + }, + { + "Time": "2026-10-29T18:11:15+01:00", + "ContentType": "UNKNOWN", + "Content": { + "$type": "image", + "Sources": [ + { + "Title": "Title sample 342", + "URL": "URL sample 343", + "Origin": "RAG" + }, + { + "Title": "Title sample 344", + "URL": "URL sample 345", + "Origin": "RAG" + } + ], + "FileAttachments": [ + { + "$type": "file", + "Type": "IMAGE", + "FileName": "FileName sample 346", + "FilePath": "/samples/FilePath-347.txt", + "FileSizeBytes": 4000000348, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-347.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000349", + "Version": { + "LastWriteUtc": "2026-10-29T16:50:00Z", + "Length": 4000000351 + } + }, + { + "$type": "image", + "SourceType": "LOCAL_PATH", + "Type": "IMAGE", + "FileName": "FileName sample 352", + "FilePath": "/samples/FilePath-353.txt", + "FileSizeBytes": 4000000354, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-353.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000355", + "Version": { + "LastWriteUtc": "2026-10-29T16:56:00Z", + "Length": 4000000357 + } + }, + { + "$type": "managed_transcript", + "OriginalFileName": "OriginalFileName sample 361", + "IsStaged": true, + "Type": "IMAGE", + "FileName": "FileName sample 358", + "FilePath": "/samples/FilePath-359.txt", + "FileSizeBytes": 4000000360, + "IsForbidden": false, + "IsValid": true, + "IsImage": false, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-359.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000362", + "Version": { + "LastWriteUtc": "2026-10-29T17:03:00Z", + "Length": 4000000364 + } + } + ], + "SourceType": "LOCAL_PATH", + "Source": "Source sample 365" + }, + "Role": "UNKNOWN", + "HideFromUser": true + } + ], + "FileAttachments": [ + { + "$type": "file", + "Type": "IMAGE", + "FileName": "FileName sample 366", + "FilePath": "/samples/FilePath-367.txt", + "FileSizeBytes": 4000000368, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-367.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000369", + "Version": { + "LastWriteUtc": "2026-10-29T17:10:00Z", + "Length": 4000000371 + } + }, + { + "$type": "image", + "SourceType": "LOCAL_PATH", + "Type": "IMAGE", + "FileName": "FileName sample 372", + "FilePath": "/samples/FilePath-373.txt", + "FileSizeBytes": 4000000374, + "IsForbidden": false, + "IsValid": true, + "IsImage": true, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-373.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000375", + "Version": { + "LastWriteUtc": "2026-10-29T17:16:00Z", + "Length": 4000000377 + } + }, + { + "$type": "managed_transcript", + "OriginalFileName": "OriginalFileName sample 381", + "IsStaged": true, + "Type": "IMAGE", + "FileName": "FileName sample 378", + "FilePath": "/samples/FilePath-379.txt", + "FileSizeBytes": 4000000380, + "IsForbidden": false, + "IsValid": true, + "IsImage": false, + "FilePathAsUrl": "/local/file?path=%2Fsamples%2FFilePath-379.txt", + "ProvenanceId": "00000000-0000-4000-8000-000000000382", + "Version": { + "LastWriteUtc": "2026-10-29T17:23:00Z", + "Length": 4000000384 + } + } + ], + "AllowProfileUsage": true, + "IsEnterpriseConfiguration": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000385", + "ToolIds": [ + "ToolIds sample 386", + "ToolIds sample 387" + ], + "DataSourceOptions": { + "DisableDataSources": true, + "AutomaticDataSourceSelection": true, + "AutomaticValidation": true, + "RetrievalMode": "EVERY_MESSAGE", + "PreselectedDataSourceIds": [ + "PreselectedDataSourceIds sample 388", + "PreselectedDataSourceIds sample 389" + ] + }, + "ProfileId": "ProfileId sample 390", + "ProviderId": "ProviderId sample 391", + "WorkspaceName": "WorkspaceName sample 392" + } + ], + "EnabledPlugins": [ + "00000000-0000-4000-8000-000000000393", + "00000000-0000-4000-8000-000000000394" + ], + "ManagedEditableDefaults": { + "ManagedEditableDefaultsKey sample 395": { + "ConfigPluginId": "00000000-0000-4000-8000-000000000396", + "LastAppliedValue": "LastAppliedValue sample 397" + }, + "ManagedEditableDefaultsKey sample 398": { + "ConfigPluginId": "00000000-0000-4000-8000-000000000399", + "LastAppliedValue": "LastAppliedValue sample 400" + } + }, + "ManagedLockedConfigurations": { + "ManagedLockedConfigurationsKey sample 401": "00000000-0000-4000-8000-000000000402", + "ManagedLockedConfigurationsKey sample 403": "00000000-0000-4000-8000-000000000404" + }, + "ManagedUserValueSnapshots": { + "ManagedUserValueSnapshotsKey sample 405": "ManagedUserValueSnapshots sample 406", + "ManagedUserValueSnapshotsKey sample 407": "ManagedUserValueSnapshots sample 408" + }, + "AssistantPluginAudits": [ + { + "PluginId": "00000000-0000-4000-8000-000000000409", + "PluginHash": "PluginHash sample 410", + "AuditedAtUtc": "2026-10-29T19:21:15+01:00", + "AuditProviderId": "AuditProviderId sample 412", + "AuditProviderName": "AuditProviderName sample 413", + "Level": "DANGEROUS", + "Summary": "Summary sample 414", + "Confidence": 2.25, + "PromptPreview": "PromptPreview sample 415", + "Findings": [ + { + "severity": "unknown", + "Category": "Category sample 417", + "Location": "Location sample 418", + "Description": "Description sample 419" + }, + { + "severity": "unknown", + "Category": "Category sample 421", + "Location": "Location sample 422", + "Description": "Description sample 423" + } + ] + }, + { + "PluginId": "00000000-0000-4000-8000-000000000424", + "PluginHash": "PluginHash sample 425", + "AuditedAtUtc": "2026-10-29T19:36:15+01:00", + "AuditProviderId": "AuditProviderId sample 427", + "AuditProviderName": "AuditProviderName sample 428", + "Level": "DANGEROUS", + "Summary": "Summary sample 429", + "Confidence": 2.25, + "PromptPreview": "PromptPreview sample 430", + "Findings": [ + { + "severity": "unknown", + "Category": "Category sample 432", + "Location": "Location sample 433", + "Description": "Description sample 434" + }, + { + "severity": "unknown", + "Category": "Category sample 436", + "Location": "Location sample 437", + "Description": "Description sample 438" + } + ] + } + ], + "AppliedEnterpriseAssistantActivations": [ + "AppliedEnterpriseAssistantActivations sample 439", + "AppliedEnterpriseAssistantActivations sample 440" + ], + "StoredDataPathsAreRelative": true, + "NextProviderNum": 7, + "NextEmbeddingNum": 7, + "NextTranscriptionNum": 7, + "NextDataSourceNum": 7, + "NextProfileNum": 7, + "NextChatTemplateNum": 7, + "NextDocumentAnalysisPolicyNum": 7, + "App": { + "LanguageBehavior": "MANUAL", + "LanguagePluginId": "00000000-0000-4000-8000-000000000441", + "PreferredTheme": "LIGHT", + "IsSavingEnergy": true, + "EnableSpellchecking": true, + "CloseExportMessagesAutomatically": true, + "UpdateInterval": "DISABLE_UPDATES", + "UpdateInstallation": "AUTOMATIC", + "NavigationBehavior": "NEVER_EXPAND_USE_TOOLTIPS", + "StartPage": "CHAT", + "InterfaceScreenSizes": [ + { + "ScreenKey": "ScreenKey sample 442", + "Size": "SYSTEM_SCALING", + "CustomPercent": 83 + }, + { + "ScreenKey": "ScreenKey sample 444", + "Size": "SYSTEM_SCALING", + "CustomPercent": 85 + } + ], + "ShowPromptInjectionAlert": true, + "ShowIntroduction": true, + "ShowQuickStartGuide": true, + "ShowLastChangelog": true, + "ShowVision": true, + "PreviewVisibility": "RELEASE_CANDIDATE", + "EnabledPreviewFeatures": [ + "PRE_WRITER_MODE_2024", + "PRE_RAG_2024" + ], + "PreselectedProvider": "PreselectedProvider sample 446", + "PreselectedProfile": "PreselectedProfile sample 447", + "PreselectedChatTemplate": "PreselectedChatTemplate sample 448", + "UseTranscriptionProvider": "UseTranscriptionProvider sample 449", + "OpusBitrate": "KBPS_32", + "ShortcutVoiceRecording": "ShortcutVoiceRecording sample 450", + "ShortcutVoiceRecordingDisplayName": "ShortcutVoiceRecordingDisplayName sample 451", + "ShortcutVoiceRecordingDisplaySource": "ShortcutVoiceRecordingDisplaySource sample 452", + "HttpClientTimeoutSeconds": 43, + "ShareFeatureUsageWithSelfHostedServerOperators": true, + "ExternalHttpCustomRootCertificatesEnabled": true, + "ExternalHttpCustomRootCertificateBundlePath": "/samples/ExternalHttpCustomRootCertificateBundlePath-454.txt", + "ExternalHttpCustomRootCertificateAllowedHosts": [ + "ExternalHttpCustomRootCertificateAllowedHosts sample 455", + "ExternalHttpCustomRootCertificateAllowedHosts sample 456" + ], + "AllowUserToAddProvider": true, + "AllowUserToAddLLMProvider": true, + "AllowUserToAddEmbeddingProvider": true, + "AllowUserToAddTranscriptionProvider": true, + "ProhibitedProviders": [ + "OPEN_AI", + "ANTHROPIC" + ], + "AllowUserToAddMailbox": true, + "AllowUserToImportConfigurationSnippets": true, + "AllowUserToImportProfile": true, + "AllowUserToImportLLMProvider": true, + "AllowUserToImportEmbeddingProvider": true, + "AllowUserToImportTranscriptionProvider": true, + "AllowUserToImportChatTemplate": true, + "AllowUserToImportERIDataSource": true, + "AllowUserToImportDocumentAnalysisPolicy": true, + "AllowUserToImportPlugins": true, + "AllowUserToImportConfigurationPlugins": true, + "AllowUserToSharePlugins": true, + "AllowUserToBackUpData": true, + "AllowUserToRestoreData": true, + "ShowAdminSettings": true, + "EnterpriseEncryptionExportFormat": "V2", + "AddAIGeneratedContentDisclosure": true, + "DataSourceIndexing": { + "AutomaticRefresh": true, + "MinimumPauseBetweenStepsSeconds": 47, + "MaximumPauseBetweenStepsSeconds": 48 + }, + "HiddenAssistants": [ + "UNKNOWN", + "GRAMMAR_SPELLING_ASSISTANT" + ] + }, + "Chat": { + "ShortcutSendBehavior": "MODIFER_ENTER_IS_SENDING", + "LoadingProviderBehavior": "ALWAYS_USE_DEFAULT_CHAT_PROVIDER", + "AddChatProviderBehavior": "ADDED_CHATS_USE_LATEST_PROVIDER", + "SendToChatDataSourceBehavior": "APPLY_STANDARD_CHAT_DATA_SOURCE_OPTIONS", + "PreselectOptions": true, + "PreselectedProvider": "PreselectedProvider sample 459", + "PreselectedProfile": "PreselectedProfile sample 460", + "PreselectedChatTemplate": "PreselectedChatTemplate sample 461", + "PreselectedDataSourcesDisabled": true, + "PreselectedDataSourcesAutomaticSelection": true, + "PreselectedDataSourcesAutomaticValidation": true, + "PreselectedDataSourceIds": [ + "PreselectedDataSourceIds sample 464", + "PreselectedDataSourceIds sample 465" + ], + "PreselectedDataSourcesRetrievalMode": "EVERY_MESSAGE", + "PreselectedDataSourceOptions": { + "DisableDataSources": true, + "AutomaticDataSourceSelection": true, + "AutomaticValidation": true, + "RetrievalMode": "EVERY_MESSAGE", + "PreselectedDataSourceIds": [ + "PreselectedDataSourceIds sample 464", + "PreselectedDataSourceIds sample 465" + ] + }, + "ShowLatestMessageAfterLoading": true, + "ReadChangedAttachmentsAgain": true + }, + "Workspace": { + "StorageBehavior": "STORE_CHATS_AUTOMATICALLY", + "StorageTemporaryMaintenancePolicy": "DELETE_OLDER_THAN_7_DAYS", + "DisplayBehavior": "TOGGLE_SIDEBAR", + "IsSidebarVisible": true, + "SplitterPosition": 1.5 + }, + "IconFinder": { + "PreselectOptions": true, + "PreselectedSource": "ICONS8", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 466" + }, + "Translation": { + "DebounceIntervalMilliseconds": 57, + "PreselectOptions": true, + "PreselectLiveTranslation": true, + "HideWebContentReader": true, + "PreselectWebContentReader": true, + "PreselectContentCleanerAgent": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectOtherLanguage": "PreselectOtherLanguage sample 468", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 469" + }, + "Coding": { + "PreselectOptions": true, + "PreselectCompilerMessages": true, + "PreselectedProgrammingLanguage": "BASH", + "PreselectedOtherProgrammingLanguage": "PreselectedOtherProgrammingLanguage sample 470", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 471", + "PreselectedProfile": "PreselectedProfile sample 472" + }, + "ERI": { + "AutoSaveChanges": true, + "PreselectOptions": true, + "ERIServers": [ + { + "ServerName": "ServerName sample 473", + "ServerDescription": "ServerDescription sample 474", + "ERIVersion": "V1", + "ProgrammingLanguage": "C", + "OtherProgrammingLanguage": "OtherProgrammingLanguage sample 475", + "DataSource": "CUSTOM", + "DataSourceProductName": "DataSourceProductName sample 476", + "OtherDataSource": "OtherDataSource sample 477", + "DataSourceHostname": "DataSourceHostname sample 478", + "DataSourcePort": 69, + "UserTypedPort": true, + "AuthMethods": [ + "KERBEROS", + "USERNAME_PASSWORD" + ], + "AuthDescription": "AuthDescription sample 480", + "OperatingSystem": "WINDOWS", + "AllowedLLMProviders": "ANY", + "EmbeddingInfos": [ + { + "EmbeddingType": "EmbeddingType sample 481", + "EmbeddingName": "EmbeddingName sample 482", + "Description": "Description sample 483", + "UsedWhen": "UsedWhen sample 484", + "Link": "Link sample 485" + }, + { + "EmbeddingType": "EmbeddingType sample 486", + "EmbeddingName": "EmbeddingName sample 487", + "Description": "Description sample 488", + "UsedWhen": "UsedWhen sample 489", + "Link": "Link sample 490" + } + ], + "RetrievalInfos": [ + { + "Name": "Name sample 491", + "Description": "Description sample 492", + "Link": "Link sample 493", + "ParametersDescription": { + "ParametersDescriptionKey sample 494": "ParametersDescription sample 495", + "ParametersDescriptionKey sample 496": "ParametersDescription sample 497" + }, + "Embeddings": [ + { + "EmbeddingType": "EmbeddingType sample 498", + "EmbeddingName": "EmbeddingName sample 499", + "Description": "Description sample 500", + "UsedWhen": "UsedWhen sample 501", + "Link": "Link sample 502" + }, + { + "EmbeddingType": "EmbeddingType sample 503", + "EmbeddingName": "EmbeddingName sample 504", + "Description": "Description sample 505", + "UsedWhen": "UsedWhen sample 506", + "Link": "Link sample 507" + } + ] + }, + { + "Name": "Name sample 508", + "Description": "Description sample 509", + "Link": "Link sample 510", + "ParametersDescription": { + "ParametersDescriptionKey sample 511": "ParametersDescription sample 512", + "ParametersDescriptionKey sample 513": "ParametersDescription sample 514" + }, + "Embeddings": [ + { + "EmbeddingType": "EmbeddingType sample 515", + "EmbeddingName": "EmbeddingName sample 516", + "Description": "Description sample 517", + "UsedWhen": "UsedWhen sample 518", + "Link": "Link sample 519" + }, + { + "EmbeddingType": "EmbeddingType sample 520", + "EmbeddingName": "EmbeddingName sample 521", + "Description": "Description sample 522", + "UsedWhen": "UsedWhen sample 523", + "Link": "Link sample 524" + } + ] + } + ], + "AdditionalLibraries": "AdditionalLibraries sample 525", + "WriteToFilesystem": true, + "BaseDirectory": "BaseDirectory sample 526", + "PreviouslyGeneratedFiles": [ + "PreviouslyGeneratedFiles sample 527", + "PreviouslyGeneratedFiles sample 528" + ] + }, + { + "ServerName": "ServerName sample 529", + "ServerDescription": "ServerDescription sample 530", + "ERIVersion": "V1", + "ProgrammingLanguage": "C", + "OtherProgrammingLanguage": "OtherProgrammingLanguage sample 531", + "DataSource": "CUSTOM", + "DataSourceProductName": "DataSourceProductName sample 532", + "OtherDataSource": "OtherDataSource sample 533", + "DataSourceHostname": "DataSourceHostname sample 534", + "DataSourcePort": 75, + "UserTypedPort": true, + "AuthMethods": [ + "KERBEROS", + "USERNAME_PASSWORD" + ], + "AuthDescription": "AuthDescription sample 536", + "OperatingSystem": "WINDOWS", + "AllowedLLMProviders": "ANY", + "EmbeddingInfos": [ + { + "EmbeddingType": "EmbeddingType sample 537", + "EmbeddingName": "EmbeddingName sample 538", + "Description": "Description sample 539", + "UsedWhen": "UsedWhen sample 540", + "Link": "Link sample 541" + }, + { + "EmbeddingType": "EmbeddingType sample 542", + "EmbeddingName": "EmbeddingName sample 543", + "Description": "Description sample 544", + "UsedWhen": "UsedWhen sample 545", + "Link": "Link sample 546" + } + ], + "RetrievalInfos": [ + { + "Name": "Name sample 547", + "Description": "Description sample 548", + "Link": "Link sample 549", + "ParametersDescription": { + "ParametersDescriptionKey sample 550": "ParametersDescription sample 551", + "ParametersDescriptionKey sample 552": "ParametersDescription sample 553" + }, + "Embeddings": [ + { + "EmbeddingType": "EmbeddingType sample 554", + "EmbeddingName": "EmbeddingName sample 555", + "Description": "Description sample 556", + "UsedWhen": "UsedWhen sample 557", + "Link": "Link sample 558" + }, + { + "EmbeddingType": "EmbeddingType sample 559", + "EmbeddingName": "EmbeddingName sample 560", + "Description": "Description sample 561", + "UsedWhen": "UsedWhen sample 562", + "Link": "Link sample 563" + } + ] + }, + { + "Name": "Name sample 564", + "Description": "Description sample 565", + "Link": "Link sample 566", + "ParametersDescription": { + "ParametersDescriptionKey sample 567": "ParametersDescription sample 568", + "ParametersDescriptionKey sample 569": "ParametersDescription sample 570" + }, + "Embeddings": [ + { + "EmbeddingType": "EmbeddingType sample 571", + "EmbeddingName": "EmbeddingName sample 572", + "Description": "Description sample 573", + "UsedWhen": "UsedWhen sample 574", + "Link": "Link sample 575" + }, + { + "EmbeddingType": "EmbeddingType sample 576", + "EmbeddingName": "EmbeddingName sample 577", + "Description": "Description sample 578", + "UsedWhen": "UsedWhen sample 579", + "Link": "Link sample 580" + } + ] + } + ], + "AdditionalLibraries": "AdditionalLibraries sample 581", + "WriteToFilesystem": true, + "BaseDirectory": "BaseDirectory sample 582", + "PreviouslyGeneratedFiles": [ + "PreviouslyGeneratedFiles sample 583", + "PreviouslyGeneratedFiles sample 584" + ] + } + ], + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 585", + "PreselectedProfile": "PreselectedProfile sample 586" + }, + "DocumentAnalysis": { + "Policies": [ + { + "Id": "Id sample 587", + "Num": 7, + "Name": "PolicyName sample 589", + "IsEnterpriseConfiguration": true, + "PolicyName": "PolicyName sample 589", + "PolicyDescription": "PolicyDescription sample 590", + "IsProtected": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000591", + "AnalysisRules": "AnalysisRules sample 592", + "OutputRules": "OutputRules sample 593", + "MinimumProviderConfidence": "UNTRUSTED", + "AllowedToolIds": [ + "AllowedToolIds sample 594", + "AllowedToolIds sample 595" + ], + "PreselectedProvider": "PreselectedProvider sample 596", + "PreselectedProfile": "PreselectedProfile sample 597", + "HidePolicyDefinition": true + }, + { + "Id": "Id sample 598", + "Num": 7, + "Name": "PolicyName sample 600", + "IsEnterpriseConfiguration": true, + "PolicyName": "PolicyName sample 600", + "PolicyDescription": "PolicyDescription sample 601", + "IsProtected": true, + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000602", + "AnalysisRules": "AnalysisRules sample 603", + "OutputRules": "OutputRules sample 604", + "MinimumProviderConfidence": "UNTRUSTED", + "AllowedToolIds": [ + "AllowedToolIds sample 605", + "AllowedToolIds sample 606" + ], + "PreselectedProvider": "PreselectedProvider sample 607", + "PreselectedProfile": "PreselectedProfile sample 608", + "HidePolicyDefinition": true + } + ] + }, + "BatchProcessing": { + "PreselectOptions": true, + "InputDirectory": "InputDirectory sample 609", + "OutputDirectory": "OutputDirectory sample 610", + "FilePatterns": "FilePatterns sample 611", + "IncludeSubdirectories": true, + "IncludeHiddenFilesAndFolders": true, + "ExcludePatterns": "ExcludePatterns sample 612", + "MaxFileSizeMegabytes": 53, + "PromptSource": "POLICY", + "FreePrompt": "FreePrompt sample 614", + "PromptFilePath": "/samples/PromptFilePath-615.txt", + "PreselectedPolicyId": "PreselectedPolicyId sample 616", + "OutputMode": "TABLE_ONLY", + "ResultFileFormat": "UNKNOWN", + "CsvFileName": "CsvFileName sample 617", + "ResultColumnHeader": "ResultColumnHeader sample 618", + "CsvSeparator": "SEMICOLON", + "CustomCsvSeparator": "CustomCsvSeparator sample 619", + "MinimumDelaySeconds": 60, + "MaximumDelaySeconds": 61, + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 622" + }, + "MandatoryInformation": { + "Acceptances": [ + { + "InfoId": "InfoId sample 623", + "AcceptedVersion": "AcceptedVersion sample 624", + "AcceptedHash": "AcceptedHash sample 625", + "AcceptedAtUtc": "2026-10-29T22:56:15+01:00", + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000627" + }, + { + "InfoId": "InfoId sample 628", + "AcceptedVersion": "AcceptedVersion sample 629", + "AcceptedHash": "AcceptedHash sample 630", + "AcceptedAtUtc": "2026-10-29T23:01:15+01:00", + "EnterpriseConfigurationPluginId": "00000000-0000-4000-8000-000000000632" + } + ] + }, + "TextSummarizer": { + "PreselectOptions": true, + "HideWebContentReader": true, + "PreselectWebContentReader": true, + "PreselectContentCleanerAgent": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 633", + "PreselectedComplexity": "SIMPLE_LANGUAGE", + "PreselectedExpertInField": "PreselectedExpertInField sample 634", + "PreselectedImportantAspects": "PreselectedImportantAspects sample 635", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 636" + }, + "SWOTAnalysis": { + "PreselectOptions": true, + "HideWebContentReader": true, + "PreselectWebContentReader": true, + "PreselectContentCleanerAgent": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 637", + "PreselectedImportantAspects": "PreselectedImportantAspects sample 638", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 639" + }, + "TextContentCleaner": { + "PreselectAgentOptions": true, + "PreselectedAgentProvider": "PreselectedAgentProvider sample 640" + }, + "AgentDataSourceSelection": { + "PreselectAgentOptions": true, + "PreselectedAgentProvider": "PreselectedAgentProvider sample 641" + }, + "AgentRetrievalContextValidation": { + "EnableRetrievalContextValidation": true, + "PreselectAgentOptions": true, + "PreselectedAgentProvider": "PreselectedAgentProvider sample 642", + "NumParallelValidations": 83 + }, + "AssistantPluginAudit": { + "RequireAuditBeforeActivation": true, + "PreselectedAgentProvider": "PreselectedAgentProvider sample 644", + "MinimumLevel": "DANGEROUS", + "BlockActivationBelowMinimum": true, + "AutomaticallyAuditAssistants": true, + "EnterpriseApprovedPlugins": [ + { + "PluginHash": "PluginHash sample 645", + "DisplayName": "DisplayName sample 646", + "Comment": "Comment sample 647", + "ApprovedBy": "ApprovedBy sample 648", + "ApprovedAtUtc": "2026-10-29T23:19:15+01:00", + "Activate": true, + "AllowUserOverride": true + }, + { + "PluginHash": "PluginHash sample 650", + "DisplayName": "DisplayName sample 651", + "Comment": "Comment sample 652", + "ApprovedBy": "ApprovedBy sample 653", + "ApprovedAtUtc": "2026-10-29T23:24:15+01:00", + "Activate": true, + "AllowUserOverride": true + } + ] + }, + "Agenda": { + "PreselectOptions": true, + "PreselectName": "PreselectName sample 655", + "PreselectTopic": "PreselectTopic sample 656", + "PreselectObjective": "PreselectObjective sample 657", + "PreselectModerator": "PreselectModerator sample 658", + "PreselectDuration": "PreselectDuration sample 659", + "PreselectStartTime": "PreselectStartTime sample 660", + "PreselectIntroduceParticipants": true, + "PreselectNumberParticipants": "PEER_TO_PEER", + "PreselectActiveParticipation": true, + "PreselectIsMeetingVirtual": true, + "PreselectLocation": "PreselectLocation sample 661", + "PreselectJointDinner": true, + "PreselectSocialActivity": true, + "PreselectArriveAndDepart": true, + "PreselectLunchTime": 52, + "PreselectBreakTime": 53, + "PreselectedTargetLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 664", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 665", + "PreselectedProfile": "PreselectedProfile sample 666" + }, + "GrammarSpelling": { + "PreselectOptions": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 667", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 668" + }, + "RewriteImprove": { + "PreselectOptions": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 669", + "PreselectedWritingStyle": "EVERYDAY", + "PreselectedSentenceStructure": "ACTIVE", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 670" + }, + "PromptOptimizer": { + "PreselectOptions": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 671", + "PreselectedImportantAspects": "PreselectedImportantAspects sample 672", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 673" + }, + "EMail": { + "PreselectOptions": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectOtherLanguage": "PreselectOtherLanguage sample 674", + "PreselectedWritingStyle": "BUSINESS_FORMAL", + "Greeting": "Greeting sample 675", + "SenderName": "SenderName sample 676", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 677", + "PreselectedProfile": "PreselectedProfile sample 678" + }, + "SlideBuilder": { + "TemplatePath": "/samples/TemplatePath-679.txt", + "PreselectedFooterText": "PreselectedFooterText sample 680", + "PreselectedMaxBulletPointsPerSlide": 71, + "PreselectedKeepEmptyPicturePlaceholders": true, + "PreselectedPictureLibraryPath": "/samples/PreselectedPictureLibraryPath-682.txt", + "PreselectedLayouts": { + "TABLE_OF_CONTENTS": "PreselectedLayouts sample 683", + "AGENDA": "PreselectedLayouts sample 684" + }, + "PreselectedTemplateSlideUses": { + "75": "KEEP", + "76": "EDIT" + }, + "PreselectOptions": true, + "PreselectedProfile": "PreselectedProfile sample 687", + "PreselectedProvider": "PreselectedProvider sample 688", + "PreselectedTargetLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 689", + "PreselectedAudienceProfile": "STUDENTS", + "PreselectedAudienceAgeGroup": "CHILDREN", + "PreselectedAudienceOrganizationalLevel": "TRAINEES", + "PreselectedAudienceExpertise": "NON_EXPERTS", + "PreselectedOccasion": "TALK", + "PreselectedOtherOccasion": "PreselectedOtherOccasion sample 690", + "PreselectedImportantAspects": "PreselectedImportantAspects sample 691", + "MinimumProviderConfidence": "UNTRUSTED" + }, + "AssistantBuilder": { + "PreselectOptions": true, + "PreselectedProvider": "PreselectedProvider sample 692", + "PreselectedOutputLanguage": "EN_US", + "PreselectedOtherOutputLanguage": "PreselectedOtherOutputLanguage sample 693", + "MinimumProviderConfidence": "UNTRUSTED" + }, + "VisualBriefing": { + "PreselectedProfile": "PreselectedProfile sample 694", + "PreselectedProvider": "PreselectedProvider sample 695", + "PreselectedTargetLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 696", + "PreselectedAudienceProfile": "STUDENTS", + "PreselectedAudienceAgeGroup": "CHILDREN", + "PreselectedAudienceOrganizationalLevel": "TRAINEES", + "PreselectedAudienceExpertise": "NON_EXPERTS", + "ShowSourceReferences": true, + "OptimizeImages": true, + "MinimumProviderConfidence": "UNTRUSTED" + }, + "LegalCheck": { + "PreselectOptions": true, + "HideWebContentReader": true, + "PreselectWebContentReader": true, + "PreselectContentCleanerAgent": true, + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 697", + "PreselectedProfile": "PreselectedProfile sample 698" + }, + "Synonyms": { + "PreselectOptions": true, + "PreselectedLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 699", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 700" + }, + "MyTasks": { + "PreselectOptions": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectOtherLanguage": "PreselectOtherLanguage sample 701", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 702", + "PreselectedProfile": "PreselectedProfile sample 703" + }, + "JobPostings": { + "PreselectOptions": true, + "PreselectedMandatoryInformation": "PreselectedMandatoryInformation sample 704", + "PreselectedJobDescription": "PreselectedJobDescription sample 705", + "PreselectedQualifications": "PreselectedQualifications sample 706", + "PreselectedResponsibilities": "PreselectedResponsibilities sample 707", + "PreselectedCompanyName": "PreselectedCompanyName sample 708", + "PreselectedWorkLocation": "PreselectedWorkLocation sample 709", + "PreselectedCountryLegalFramework": "PreselectedCountryLegalFramework sample 710", + "PreselectedTargetLanguage": "EN_US", + "PreselectOtherLanguage": "PreselectOtherLanguage sample 711", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProvider": "PreselectedProvider sample 712" + }, + "BiasOfTheDay": { + "UsedBias": [ + 53, + 54 + ], + "DateLastBiasDrawn": "2026-10-29", + "BiasOfTheDayChatId": "00000000-0000-4000-8000-000000000715", + "BiasOfTheDayId": "00000000-0000-4000-8000-000000000716", + "RestrictOneBiasPerDay": true, + "PreselectOptions": true, + "PreselectedTargetLanguage": "EN_US", + "PreselectedOtherLanguage": "PreselectedOtherLanguage sample 717", + "MinimumProviderConfidence": "UNTRUSTED", + "PreselectedProfile": "PreselectedProfile sample 718", + "PreselectedProvider": "PreselectedProvider sample 719" + }, + "I18N": { + "PreselectOptions": true, + "PreselectedLanguagePluginId": "00000000-0000-4000-8000-000000000720", + "PreselectedTargetLanguage": "EN_US", + "PreselectOtherLanguage": "PreselectOtherLanguage sample 721", + "PreselectedProvider": "PreselectedProvider sample 722" + }, + "Tools": { + "Settings": { + "SettingsKey sample 723": { + "SettingsKey sample 724": "Settings sample 725", + "SettingsKey sample 726": "Settings sample 727" + }, + "SettingsKey sample 728": { + "SettingsKey sample 729": "Settings sample 730", + "SettingsKey sample 731": "Settings sample 732" + } + }, + "DefaultToolIdsByComponent": { + "DefaultToolIdsByComponentKey sample 733": [ + "DefaultToolIdsByComponent sample 734", + "DefaultToolIdsByComponent sample 735" + ], + "DefaultToolIdsByComponentKey sample 736": [ + "DefaultToolIdsByComponent sample 737", + "DefaultToolIdsByComponent sample 738" + ] + }, + "VisibleToolSelectionComponents": [ + "VisibleToolSelectionComponents sample 739", + "VisibleToolSelectionComponents sample 740" + ], + "EnableTools": true, + "DisabledToolIds": [ + "DisabledToolIds sample 741", + "DisabledToolIds sample 742" + ], + "UserDisabledToolIds": [ + "UserDisabledToolIds sample 743", + "UserDisabledToolIds sample 744" + ], + "MinimumProviderConfidenceByToolId": { + "MinimumProviderConfidenceByToolIdKey sample 745": "MinimumProviderConfidenceByToolId sample 746", + "MinimumProviderConfidenceByToolIdKey sample 747": "MinimumProviderConfidenceByToolId sample 748" + }, + "LockedToolSettings": { + "LockedToolSettingsKey sample 749": "LockedToolSettings sample 750", + "LockedToolSettingsKey sample 751": "LockedToolSettings sample 752" + }, + "DefaultToolSettings": { + "DefaultToolSettingsKey sample 753": "DefaultToolSettings sample 754", + "DefaultToolSettingsKey sample 755": "DefaultToolSettings sample 756" + } + } +} \ No newline at end of file diff --git a/app/Tests/Serialization/Fixtures/swot-analysis.json b/app/Tests/Serialization/Fixtures/swot-analysis.json new file mode 100644 index 000000000..c90416f47 --- /dev/null +++ b/app/Tests/Serialization/Fixtures/swot-analysis.json @@ -0,0 +1,103 @@ +{ + "matrix_heading": "matrix_heading sample 1", + "internal_label": "internal_label sample 2", + "external_label": "external_label sample 3", + "positive_label": "positive_label sample 4", + "negative_label": "negative_label sample 5", + "strengths": { + "label": "label sample 6", + "empty_message": "empty_message sample 7", + "findings": [ + { + "summary": "summary sample 8", + "explanation": "explanation sample 9" + }, + { + "summary": "summary sample 10", + "explanation": "explanation sample 11" + } + ] + }, + "weaknesses": { + "label": "label sample 12", + "empty_message": "empty_message sample 13", + "findings": [ + { + "summary": "summary sample 14", + "explanation": "explanation sample 15" + }, + { + "summary": "summary sample 16", + "explanation": "explanation sample 17" + } + ] + }, + "opportunities": { + "label": "label sample 18", + "empty_message": "empty_message sample 19", + "findings": [ + { + "summary": "summary sample 20", + "explanation": "explanation sample 21" + }, + { + "summary": "summary sample 22", + "explanation": "explanation sample 23" + } + ] + }, + "threats": { + "label": "label sample 24", + "empty_message": "empty_message sample 25", + "findings": [ + { + "summary": "summary sample 26", + "explanation": "explanation sample 27" + }, + { + "summary": "summary sample 28", + "explanation": "explanation sample 29" + } + ] + }, + "overall_assessment": { + "label": "label sample 30", + "text": "text sample 31" + }, + "prioritized_actions": { + "label": "label sample 32", + "empty_message": "empty_message sample 33", + "items": [ + { + "action": "action sample 34", + "rationale": "rationale sample 35", + "addressed_factors": [ + "addressed_factors sample 36", + "addressed_factors sample 37" + ] + }, + { + "action": "action sample 38", + "rationale": "rationale sample 39", + "addressed_factors": [ + "addressed_factors sample 40", + "addressed_factors sample 41" + ] + } + ] + }, + "moderation_notes": { + "label": "label sample 42", + "empty_message": "empty_message sample 43", + "items": [ + { + "change": "change sample 44", + "reason": "reason sample 45" + }, + { + "change": "change sample 46", + "reason": "reason sample 47" + } + ] + } +} \ No newline at end of file diff --git a/app/Tests/Serialization/JsonContainment.cs b/app/Tests/Serialization/JsonContainment.cs new file mode 100644 index 000000000..4bf04bcd9 --- /dev/null +++ b/app/Tests/Serialization/JsonContainment.cs @@ -0,0 +1,67 @@ +using System.Text.Json.Nodes; + +namespace AIStudio.Tests.Serialization; + +/// +/// Finds the values of one JSON document which another one lacks. +/// +public static class JsonContainment +{ + /// + /// Returns the path of every value in the expected document which the actual one lacks or holds otherwise. + /// + /// + /// Properties only the actual document has don't count, e.g., one added to a type after the expected document + /// was written. A property which is null in the expected document may be missing in the actual one, since + /// some properties are only written with a value. Arrays have to hold the same elements, in any order: an + /// ImmutableHashSet of strings orders them by their hash codes, which differ from process to process. + /// + /// The document whose values have to be there. + /// The document which has to hold them. + /// One line per value, with its path and both values. + public static IReadOnlyList FindMissing(JsonNode? expected, JsonNode? actual) + { + var missing = new List(); + Compare(expected, actual, "$", missing); + return missing; + } + + private static void Compare(JsonNode? expected, JsonNode? actual, string path, List missing) + { + switch (expected) + { + case JsonObject expectedObject when actual is JsonObject actualObject: + foreach (var (name, expectedValue) in expectedObject) + { + if (actualObject.TryGetPropertyValue(name, out var actualValue)) + Compare(expectedValue, actualValue, $"{path}.{name}", missing); + else if (expectedValue is not null) + missing.Add($"{path}.{name}: missing, expected {expectedValue.ToJsonString()}"); + } + + break; + + case JsonArray expectedArray when actual is JsonArray actualArray && expectedArray.Count == actualArray.Count: + var unmatched = actualArray.ToList(); + for (var index = 0; index < expectedArray.Count; index++) + { + var match = unmatched.FindIndex(candidate => FindMissing(expectedArray[index], candidate).Count is 0); + if (match < 0) + { + missing.Add($"{path}[{index}]: no element holds {expectedArray[index]?.ToJsonString() ?? "null"}"); + continue; + } + + unmatched.RemoveAt(match); + } + + break; + + default: + if (!JsonNode.DeepEquals(expected, actual)) + missing.Add($"{path}: {actual?.ToJsonString() ?? "null"}, expected {expected?.ToJsonString() ?? "null"}"); + + break; + } + } +} \ No newline at end of file diff --git a/app/Tests/Serialization/JsonContractDescription.cs b/app/Tests/Serialization/JsonContractDescription.cs new file mode 100644 index 000000000..25a919e11 --- /dev/null +++ b/app/Tests/Serialization/JsonContractDescription.cs @@ -0,0 +1,59 @@ +using System.Text; +using System.Text.Json.Serialization; +using System.Text.Json.Serialization.Metadata; + +namespace AIStudio.Tests.Serialization; + +/// +/// Describes the contract System.Text.Json uses for a type as text, so that two contracts can be compared and +/// a difference shows up readable in the message of a test. +/// +public static class JsonContractDescription +{ + /// + /// Describes everything in a contract which decides what gets written and what a read accepts. + /// + /// The contract. + /// One line for the type, and one line per property, polymorphism, and callback. + public static string Describe(JsonTypeInfo typeInfo) + { + var text = new StringBuilder(); + text.AppendLine($"{TypeName(typeInfo.Type)}: {typeInfo.Kind}, converter {ConverterName(typeInfo.Converter)}, created {(typeInfo.CreateObject is null ? "otherwise" : "without arguments")}"); + text.AppendLine($" handling: numbers {typeInfo.NumberHandling}, unmapped members {typeInfo.UnmappedMemberHandling}, object creation {typeInfo.PreferredPropertyObjectCreationHandling}"); + text.AppendLine($" callbacks: serializing {typeInfo.OnSerializing is not null}, serialized {typeInfo.OnSerialized is not null}, deserializing {typeInfo.OnDeserializing is not null}, deserialized {typeInfo.OnDeserialized is not null}"); + if (typeInfo.KeyType is { } keyType) + text.AppendLine($" key: {TypeName(keyType)}"); + + if (typeInfo.ElementType is { } elementType) + text.AppendLine($" element: {TypeName(elementType)}"); + + if (typeInfo.PolymorphismOptions is { } polymorphism) + { + text.AppendLine($" polymorphism: discriminator {polymorphism.TypeDiscriminatorPropertyName}, unrecognized ignored {polymorphism.IgnoreUnrecognizedTypeDiscriminators}, unknown types {polymorphism.UnknownDerivedTypeHandling}"); + foreach (var derivedType in polymorphism.DerivedTypes) + text.AppendLine($" derived: {TypeName(derivedType.DerivedType)} as {derivedType.TypeDiscriminator}"); + } + + foreach (var property in typeInfo.Properties) + text.AppendLine($" property {property.Name}: {TypeName(property.PropertyType)}, order {property.Order}, get {property.Get is not null}, set {property.Set is not null}, required {property.IsRequired}, extension data {property.IsExtensionData}, conditional {property.ShouldSerialize is not null}, converter {ConverterName(property.CustomConverter)}, constructor parameter {property.AssociatedParameter?.Name ?? "none"}, nullable get {property.IsGetNullable}, nullable set {property.IsSetNullable}, numbers {property.NumberHandling}, object creation {property.ObjectCreationHandling}"); + + return text.ToString(); + } + + /// + /// Returns the name of a type the way C# writes it, e.g., Dictionary<String, Int32>. + /// + /// The type. + public static string TypeName(Type type) + { + var arity = type.Name.IndexOf('`'); + var name = arity < 0 ? type.Name : $"{type.Name[..arity]}<{string.Join(", ", type.GetGenericArguments().Select(TypeName))}>"; + return type is { IsNested: true, IsGenericParameter: false } ?$"{TypeName(type.DeclaringType!)}.{name}" : name; + } + + // + // Reflection reads the constructor parameters of a record through converters of its own, whose names end + // with "WithReflection". Source generation does the same with the plain ones, which read the same JSON: + // + private static string ConverterName(JsonConverter? converter) => converter is null ? "none" : TypeName(converter.GetType()).Replace("WithReflection", string.Empty, StringComparison.Ordinal); +} \ No newline at end of file diff --git a/app/Tests/Serialization/JsonContractTests.cs b/app/Tests/Serialization/JsonContractTests.cs new file mode 100644 index 000000000..d88a05909 --- /dev/null +++ b/app/Tests/Serialization/JsonContractTests.cs @@ -0,0 +1,23 @@ +namespace AIStudio.Tests.Serialization; + +/// +/// Checks that the contracts AI Studio uses for its JSON match those reflection builds. +/// +/// +/// AI Studio wrote all its files with contracts which reflection built. Any other contract, e.g., one which +/// source generation builds, has to match them in every detail, or AI Studio no longer reads what it wrote +/// before: a property with another name, without a setter, or without its converter silently loses its value. +/// +[TestFixture] +public sealed class JsonContractTests +{ + [TestCaseSource(typeof(JsonTestRoots), nameof(JsonTestRoots.Stored))] + public void TheContractsMatchThoseOfReflection(JsonTestRoot root) + { + var baseline = JsonReflectionBaseline.Of(root.Options); + var expected = JsonTypeGraph.Collect(root.Type, baseline).Select(type => JsonContractDescription.Describe(baseline.GetTypeInfo(type))); + var actual = JsonTypeGraph.Collect(root.Type, root.Options).Select(type => JsonContractDescription.Describe(root.Options.GetTypeInfo(type))); + + Assert.That(actual, Is.EqualTo(expected)); + } +} \ No newline at end of file diff --git a/app/Tests/Serialization/JsonDefaultsTests.cs b/app/Tests/Serialization/JsonDefaultsTests.cs new file mode 100644 index 000000000..f655a92e5 --- /dev/null +++ b/app/Tests/Serialization/JsonDefaultsTests.cs @@ -0,0 +1,61 @@ +using System.Text.Json; +using System.Text.Json.Serialization.Metadata; + +namespace AIStudio.Tests.Serialization; + +/// +/// Checks that a property missing in the JSON keeps the value a new object starts with. +/// +/// +/// Files written by an older version of AI Studio lack every property added since. Reading them has to give +/// those properties their defaults, as a new object has them, e.g., a sub-object of the settings instead of +/// null. Source generation in .NET 10 breaks this for init-only properties: it sets them all while creating +/// the object, and a property missing in the JSON gets the default of its type instead (dotnet/runtime#84484). +/// Hence, the types AI Studio stores use set instead of init. +/// +[TestFixture] +public sealed class JsonDefaultsTests +{ + [TestCaseSource(typeof(JsonTestRoots), nameof(JsonTestRoots.Stored))] + public void AnEmptyObjectGetsTheDefaultsOfANewOne(JsonTestRoot root) + { + var failures = new List(); + foreach (var type in JsonTypeGraph.Collect(root.Type, root.Options)) + { + // + // A type which gets created through its constructor receives every value as an argument, so nothing + // gets lost there. A required property refuses an empty object anyway: + // + var typeInfo = root.Options.GetTypeInfo(type); + if (typeInfo is not { Kind: JsonTypeInfoKind.Object, CreateObject: { } createObject } || typeInfo.Properties.Any(property => property.IsRequired)) + continue; + + var newObject = createObject(); + var otherNewObject = createObject(); + var readObject = JsonSerializer.Deserialize("{}", typeInfo)!; + foreach (var property in typeInfo.Properties.Where(property => property.Get is not null)) + { + var expected = ValueAsJson(property, newObject, root.Options); + var actual = ValueAsJson(property, readObject, root.Options); + + // + // Some properties start with a value of their own each time, e.g., a new ID. There, the read object + // just needs any value but the default of the type: + // + if (expected == ValueAsJson(property, otherNewObject, root.Options)) + { + if (actual != expected) + failures.Add($"{JsonContractDescription.TypeName(type)}.{property.Name}: read as {actual}, while a new object has {expected}."); + } + else if (actual == DefaultAsJson(property.PropertyType, root.Options)) + failures.Add($"{JsonContractDescription.TypeName(type)}.{property.Name}: read as {actual}, while a new object gets a value of its own."); + } + } + + Assert.That(failures, Is.Empty); + } + + private static string ValueAsJson(JsonPropertyInfo property, object instance, JsonSerializerOptions options) => JsonSerializer.Serialize(property.Get!(instance), property.PropertyType, options); + + private static string DefaultAsJson(Type type, JsonSerializerOptions options) => type.IsValueType ? JsonSerializer.Serialize(Activator.CreateInstance(type), type, options) : "null"; +} \ No newline at end of file diff --git a/app/Tests/Serialization/JsonGoldenFile.cs b/app/Tests/Serialization/JsonGoldenFile.cs new file mode 100644 index 000000000..929889eac --- /dev/null +++ b/app/Tests/Serialization/JsonGoldenFile.cs @@ -0,0 +1,15 @@ +using System.Text.Json; + +namespace AIStudio.Tests.Serialization; + +/// +/// A stored file in the fixtures, together with the type and the options AI Studio reads it with. +/// +/// The name of the file in the folder Fixtures next to the tests. +/// The type AI Studio reads the file as. +/// The options AI Studio reads and writes the file with. +public sealed record JsonGoldenFile(string FileName, Type Type, JsonSerializerOptions Options) +{ + /// + public override string ToString() => this.FileName; +} \ No newline at end of file diff --git a/app/Tests/Serialization/JsonGoldenFileTests.cs b/app/Tests/Serialization/JsonGoldenFileTests.cs new file mode 100644 index 000000000..1c43590aa --- /dev/null +++ b/app/Tests/Serialization/JsonGoldenFileTests.cs @@ -0,0 +1,89 @@ +using System.Runtime.CompilerServices; +using System.Text.Json; +using System.Text.Json.Nodes; + +using AIStudio.Assistants.SWOTAnalysis; +using AIStudio.Chat; +using AIStudio.Settings; +using AIStudio.Settings.DataModel; +using AIStudio.Settings.DataModel.PreviousModels; +using AIStudio.Tools; +using AIStudio.Tools.Databases.ProvenanceStore; +using AIStudio.Tools.DataBackup; + +using Microsoft.Extensions.Logging.Abstractions; + +using Version = AIStudio.Settings.Version; + +namespace AIStudio.Tests.Serialization; + +/// +/// Reads and writes stored files of AI Studio, and checks that nothing gets lost and nothing gets written +/// otherwise than with the contracts of reflection. +/// +/// +/// The files in the folder Fixtures were written with the contracts of reflection, before AI Studio got +/// contracts of its own, and every property holds a value. They are made up: no real chat or setting of +/// anybody is among them. A property added later is missing in them, which the tests allow. +/// +[TestFixture] +public sealed class JsonGoldenFileTests +{ + private static IEnumerable GoldenFiles() + { + TestHost.PrepareStaticState(); + yield return new("settings.json", typeof(Data), SettingsManager.JSON_OPTIONS); + yield return new("settings-v1.json", typeof(DataV1V3), SettingsManager.JSON_OPTIONS); + yield return new("settings-v4.json", typeof(DataV4), SettingsManager.JSON_OPTIONS); + yield return new("settings-v5.json", typeof(DataV5), SettingsManager.JSON_OPTIONS); + yield return new("chat.json", typeof(ChatThread), WorkspaceBehaviour.JSON_OPTIONS); + yield return new("swot-analysis.json", typeof(SwotAnalysisResult), SwotAnalysisContentPresentation.JSON_OPTIONS); + yield return new("data-backup-manifest.json", typeof(DataBackupManifest), DataBackupFormat.JSON_OPTIONS); + yield return new("data-restore-plan.json", typeof(DataRestorePlan), DataBackupFormat.JSON_OPTIONS); + yield return new("data-restore-report.json", typeof(DataRestoreReport), DataBackupFormat.JSON_OPTIONS); + yield return new("provenance-surrounding-content.json", typeof(List), SqliteProvenanceStoreClientImplementation.JSON_OPTIONS); + } + + [TestCaseSource(nameof(GoldenFiles))] + public void AStoredFileIsWrittenAgainAsWithReflection(JsonGoldenFile goldenFile) + { + var json = ReadFixture(goldenFile.FileName); + var baseline = JsonReflectionBaseline.Of(goldenFile.Options); + + var writtenAgain = JsonSerializer.Serialize(JsonSerializer.Deserialize(json, goldenFile.Type, goldenFile.Options), goldenFile.Type, goldenFile.Options); + var writtenAgainByReflection = JsonSerializer.Serialize(JsonSerializer.Deserialize(json, goldenFile.Type, baseline), goldenFile.Type, baseline); + + Assert.That(writtenAgain, Is.EqualTo(writtenAgainByReflection)); + } + + [TestCaseSource(nameof(GoldenFiles))] + public void AStoredFileKeepsAllItsValues(JsonGoldenFile goldenFile) + { + var json = ReadFixture(goldenFile.FileName); + var writtenAgain = JsonSerializer.Serialize(JsonSerializer.Deserialize(json, goldenFile.Type, goldenFile.Options), goldenFile.Type, goldenFile.Options); + + Assert.That(JsonContainment.FindMissing(JsonNode.Parse(json), JsonNode.Parse(writtenAgain)), Is.Empty); + } + + [TestCase("settings-v1.json", Version.V1)] + [TestCase("settings-v4.json", Version.V4)] + [TestCase("settings-v5.json", Version.V5)] + public void OldSettingsMigrateAsWithReflection(string fileName, Version version) + { + var json = ReadFixture(fileName); + var baseline = JsonReflectionBaseline.Of(SettingsManager.JSON_OPTIONS); + + var migrated = SettingsMigrations.Migrate(NullLogger.Instance, version, json, SettingsManager.JSON_OPTIONS); + var migratedByReflection = SettingsMigrations.Migrate(NullLogger.Instance, version, json, baseline); + + Assert.That(JsonSerializer.Serialize(migrated, SettingsManager.JSON_OPTIONS), Is.EqualTo(JsonSerializer.Serialize(migratedByReflection, baseline))); + } + + /// + /// Reads a file from the fixtures next to this test. + /// + /// + /// Read from the source tree, the way the other fixtures are, so the file needs no entry in the project file. + /// + private static string ReadFixture(string fileName, [CallerFilePath] string sourceFilePath = "") => File.ReadAllText(Path.Combine(Path.GetDirectoryName(sourceFilePath)!, "Fixtures", fileName)); +} \ No newline at end of file diff --git a/app/Tests/Serialization/JsonReflectionBaseline.cs b/app/Tests/Serialization/JsonReflectionBaseline.cs new file mode 100644 index 000000000..aa85b4037 --- /dev/null +++ b/app/Tests/Serialization/JsonReflectionBaseline.cs @@ -0,0 +1,27 @@ +using System.Runtime.CompilerServices; +using System.Text.Json; +using System.Text.Json.Serialization.Metadata; + +namespace AIStudio.Tests.Serialization; + +/// +/// The options of AI Studio as System.Text.Json uses them without source generation: the same settings, but +/// with contracts which reflection builds. +/// +/// +/// AI Studio stored all its files with such contracts, so they are the baseline every other contract has to +/// match. Each baseline is built once per options, since reflection builds its contracts once per options, too. +/// +public static class JsonReflectionBaseline +{ + private static readonly ConditionalWeakTable BASELINES = new(); + + /// + /// Returns a copy of the given options, whose contracts reflection builds. + /// + /// The options AI Studio uses. + public static JsonSerializerOptions Of(JsonSerializerOptions options) => BASELINES.GetValue(options, static original => new JsonSerializerOptions(original) + { + TypeInfoResolver = new DefaultJsonTypeInfoResolver(), + }); +} \ No newline at end of file diff --git a/app/Tests/Serialization/JsonTestRoot.cs b/app/Tests/Serialization/JsonTestRoot.cs new file mode 100644 index 000000000..3a43ec8de --- /dev/null +++ b/app/Tests/Serialization/JsonTestRoot.cs @@ -0,0 +1,14 @@ +using System.Text.Json; + +namespace AIStudio.Tests.Serialization; + +/// +/// A type which AI Studio reads or writes as JSON on its own, together with the options it uses for that. +/// +/// The type which gets serialized. Whatever it holds gets checked along with it. +/// The options AI Studio passes to System.Text.Json for this type. +public sealed record JsonTestRoot(Type Type, JsonSerializerOptions Options) +{ + /// + public override string ToString() => JsonContractDescription.TypeName(this.Type); +} \ No newline at end of file diff --git a/app/Tests/Serialization/JsonTestRoots.cs b/app/Tests/Serialization/JsonTestRoots.cs new file mode 100644 index 000000000..96438acdd --- /dev/null +++ b/app/Tests/Serialization/JsonTestRoots.cs @@ -0,0 +1,80 @@ +using AIStudio.Assistants.SWOTAnalysis; +using AIStudio.Chat; +using AIStudio.Settings; +using AIStudio.Settings.DataModel; +using AIStudio.Settings.DataModel.PreviousModels; +using AIStudio.Tools; +using AIStudio.Tools.Databases.ProvenanceStore; +using AIStudio.Tools.DataBackup; + +namespace AIStudio.Tests.Serialization; + +/// +/// The types which AI Studio reads or writes as JSON on their own, for the tests which compare the contracts of +/// System.Text.Json. +/// +/// +/// Only the outermost types belong here: whatever they hold gets checked along with them. Add a type whenever +/// AI Studio starts to store a new kind of file, with the options it stores the file with. +/// +public static class JsonTestRoots +{ + /// + /// The data AI Studio keeps on the disk of the user. + /// + public static IEnumerable Stored() + { + TestHost.PrepareStaticState(); + + // Chats, in the workspaces, among the temporary chats, and in chat archives: + yield return Case(new(typeof(ChatThread), WorkspaceBehaviour.JSON_OPTIONS)); + + // The settings, and their older versions, which the migrations still read: + yield return Case(new(typeof(Data), SettingsManager.JSON_OPTIONS)); + yield return Case(new(typeof(DataV1V3), SettingsManager.JSON_OPTIONS)); + yield return Case(new(typeof(DataV4), SettingsManager.JSON_OPTIONS)); + yield return Case(new(typeof(DataV5), SettingsManager.JSON_OPTIONS)); + + // + // The values of managed settings, which get written and read on their own, as the type of their + // setting. That type is often an interface, such as ISet, which the settings themselves + // never use: + // + foreach (var valueType in ManagedSettingValueTypes()) + yield return Case(new(valueType, SettingsManager.JSON_OPTIONS)); + + // The SWOT analysis, which a chat stores as the presentation of a message: + yield return Case(new(typeof(SwotAnalysisResult), SwotAnalysisContentPresentation.JSON_OPTIONS)); + + // Backups and their restore: + yield return Case(new(typeof(DataBackupManifest), DataBackupFormat.JSON_OPTIONS)); + yield return Case(new(typeof(DataRestorePlan), DataBackupFormat.JSON_OPTIONS)); + yield return Case(new(typeof(DataRestoreReport), DataBackupFormat.JSON_OPTIONS)); + + // The text around a passage which the provenance store keeps: + yield return Case(new(typeof(IReadOnlyList), SqliteProvenanceStoreClientImplementation.JSON_OPTIONS)); + yield return Case(new(typeof(List), SqliteProvenanceStoreClientImplementation.JSON_OPTIONS)); + } + + private static TestCaseData Case(JsonTestRoot root) + { + // + // The same System.Text.Json does with the first call of Serialize or Deserialize. Only then, the + // options hand out contracts: + // + root.Options.MakeReadOnly(populateMissingResolver: true); + return new TestCaseData(root).SetArgDisplayNames(root.ToString()); + } + + private static IEnumerable ManagedSettingValueTypes() + { + // + // Creating the settings registers every managed setting, just like the start of the app does: + // + _ = new Data(); + return ManagedConfiguration.RegisteredSettings + .Select(setting => setting.GetType().GetGenericArguments()[1]) + .Distinct() + .OrderBy(JsonContractDescription.TypeName, StringComparer.Ordinal); + } +} \ No newline at end of file diff --git a/app/Tests/Serialization/JsonTypeGraph.cs b/app/Tests/Serialization/JsonTypeGraph.cs new file mode 100644 index 000000000..d22d58f95 --- /dev/null +++ b/app/Tests/Serialization/JsonTypeGraph.cs @@ -0,0 +1,43 @@ +using System.Text.Json; + +namespace AIStudio.Tests.Serialization; + +/// +/// Collects every type System.Text.Json meets while it reads or writes a root. +/// +public static class JsonTypeGraph +{ + /// + /// Returns the root and every type it holds: the types of its properties, the keys and elements of its + /// collections, and its derived types, each of them once and in the order they were met. + /// + /// The type to start with. + /// The options whose contracts tell what a type holds. + public static IReadOnlyList Collect(Type root, JsonSerializerOptions options) + { + var types = new List(); + Visit(root, options, [], types); + return types; + } + + private static void Visit(Type type, JsonSerializerOptions options, HashSet visited, List types) + { + if (!visited.Add(type)) + return; + + types.Add(type); + var typeInfo = options.GetTypeInfo(type); + foreach (var property in typeInfo.Properties) + Visit(property.PropertyType, options, visited, types); + + if (typeInfo.KeyType is { } keyType) + Visit(keyType, options, visited, types); + + if (typeInfo.ElementType is { } elementType) + Visit(elementType, options, visited, types); + + if (typeInfo.PolymorphismOptions is { } polymorphism) + foreach (var derivedType in polymorphism.DerivedTypes) + Visit(derivedType.DerivedType, options, visited, types); + } +} \ No newline at end of file diff --git a/app/Tests/TestHost.cs b/app/Tests/TestHost.cs index 553ce5485..9668ad21b 100644 --- a/app/Tests/TestHost.cs +++ b/app/Tests/TestHost.cs @@ -12,7 +12,16 @@ namespace AIStudio.Tests; public sealed class TestHost { [OneTimeSetUp] - public void PrepareStaticApplicationState() + public void PrepareStaticApplicationState() => PrepareStaticState(); + + /// + /// Fills the static state of the app which the tests need. + /// + /// + /// NUnit builds the cases of a TestCaseSource while it discovers the tests, before this fixture runs. + /// A source which touches a type of the app with a static logger calls this first. + /// + public static void PrepareStaticState() { // // A number of types in the app hold a static logger field that is initialized from