diff --git a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua
index f0d2efe5..f24d7c37 100644
--- a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua
+++ b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua
@@ -3643,6 +3643,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2670286472"] = "Profile u
-- The selected provider is not allowed in this chat due to data security or confidence-level requirements.
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2672162875"] = "The selected provider is not allowed in this chat due to data security or confidence-level requirements."
+-- Show the complete system prompt the AI receives
+UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2931983492"] = "Show the complete system prompt the AI receives"
+
-- Bulleted List
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2957125464"] = "Bulleted List"
@@ -3676,6 +3679,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T4231005109"] = "Heading"
-- Please select the workspace where you want to move the chat to.
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T474393241"] = "Please select the workspace where you want to move the chat to."
+-- Complete system prompt of this chat
+UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T544159998"] = "Complete system prompt of this chat"
+
-- Move the chat to a workspace, or to another if it is already in one.
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T636393754"] = "Move the chat to a workspace, or to another if it is already in one."
@@ -8824,6 +8830,48 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SINGLEINPUTDIALOG::T4030229154"] = "Your Inp
-- Cancel
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SINGLEINPUTDIALOG::T900713019"] = "Cancel"
+-- Included, retrieved for an earlier message
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T1359693360"] = "Included, retrieved for an earlier message"
+
+-- Data from your data sources
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T1629973648"] = "Data from your data sources"
+
+-- Date and time
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T2054731205"] = "Date and time"
+
+-- Included
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T3098410457"] = "Included"
+
+-- This is the complete system prompt the AI receives with your next message. AI Studio assembles it from the parts listed here.
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T3315883870"] = "This is the complete system prompt the AI receives with your next message. AI Studio assembles it from the parts listed here."
+
+-- Profile
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T3440849550"] = "Profile"
+
+-- Close
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T3448155331"] = "Close"
+
+-- Complete system prompt
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T3725933563"] = "Complete system prompt"
+
+-- Switched off by the chat template
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T3728646729"] = "Switched off by the chat template"
+
+-- Tool instructions
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T4067010756"] = "Tool instructions"
+
+-- the complete system prompt
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T471427542"] = "the complete system prompt"
+
+-- None
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T810547195"] = "None"
+
+-- Not included
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T885651534"] = "Not included"
+
+-- Chat template
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T923285303"] = "Chat template"
+
-- Hugging Face Inference Provider
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::TRANSCRIPTIONPROVIDERDIALOG::T1085481431"] = "Hugging Face Inference Provider"
diff --git a/app/MindWork AI Studio/Components/ChatComponent.razor b/app/MindWork AI Studio/Components/ChatComponent.razor
index dcdcfc31..a0c4210c 100644
--- a/app/MindWork AI Studio/Components/ChatComponent.razor
+++ b/app/MindWork AI Studio/Components/ChatComponent.razor
@@ -132,6 +132,10 @@
+
+
+
+
@if (this.SettingsManager.AreToolsEnabled())
diff --git a/app/MindWork AI Studio/Components/ChatComponent.razor.cs b/app/MindWork AI Studio/Components/ChatComponent.razor.cs
index c902e2b0..d2ed1db8 100644
--- a/app/MindWork AI Studio/Components/ChatComponent.razor.cs
+++ b/app/MindWork AI Studio/Components/ChatComponent.razor.cs
@@ -1655,6 +1655,46 @@ public partial class ChatComponent : MSGComponentBase
/// The system prompt as it would be sent.
private string BuildSystemPromptFor(ChatThread thread, IReadOnlyList toolDefinitions) => thread.BuildSystemPrompt(this.SettingsManager, toolDefinitions).Text;
+ ///
+ /// Shows the system prompt the next request would send, and what it was assembled from.
+ ///
+ ///
+ /// Built the same way the token count builds it, so the dialog shows what is counted and sent.
+ /// Before the first message there is no thread yet, and the one a new chat would start with
+ /// stands in for it, as it does for the count.
+ ///
+ /// The parts are read from the same values the prompt is built from, but the decisions are the
+ /// ones makes: should it ever weigh them differently,
+ /// the list has to follow, while the text is always right.
+ ///
+ private async Task ShowSystemPrompt()
+ {
+ var thread = this.ChatThread ?? this.NewChatThread(string.Empty);
+ var toolDefinitions = this.GetRunnableToolDefinitions();
+ var prepared = thread.BuildSystemPrompt(this.SettingsManager, toolDefinitions);
+
+ var chatTemplate = this.SettingsManager.GetChatTemplateById(thread.SelectedChatTemplate);
+ var profile = this.SettingsManager.GetProfileById(thread.SelectedProfile);
+ var toolNames = toolDefinitions
+ .Where(definition => !string.IsNullOrWhiteSpace(definition.SystemPromptInstructions))
+ .Select(definition => this.ToolRegistry.GetImplementation(definition.ImplementationKey)?.GetDisplayName() ?? definition.Function.Name)
+ .Distinct(StringComparer.Ordinal)
+ .ToList();
+
+ var dialogParameters = new DialogParameters
+ {
+ { x => x.SystemPrompt, prepared.Text },
+ { x => x.ChatTemplateName, chatTemplate == ChatTemplate.NO_CHAT_TEMPLATE ? string.Empty : chatTemplate.Name },
+ { x => x.ProfileName, !prepared.ProfileIsAllowed || profile == Profile.NO_PROFILE ? string.Empty : profile.Name },
+ { x => x.IsProfileForbiddenByChatTemplate, !prepared.ProfileIsAllowed },
+ { x => x.HasRetrievedData, !string.IsNullOrWhiteSpace(thread.AugmentedData) },
+ { x => x.ToolNames, toolNames },
+ { x => x.IncludesDateTime, thread.IncludeDateTime },
+ };
+
+ await this.DialogService.ShowAsync(T("Complete system prompt of this chat"), dialogParameters, DialogOptions.FULLSCREEN);
+ }
+
///
/// The tools the next request would offer the model.
///
diff --git a/app/MindWork AI Studio/Dialogs/SystemPromptDialog.razor b/app/MindWork AI Studio/Dialogs/SystemPromptDialog.razor
new file mode 100644
index 00000000..6a9880b4
--- /dev/null
+++ b/app/MindWork AI Studio/Dialogs/SystemPromptDialog.razor
@@ -0,0 +1,42 @@
+@inherits MSGComponentBase
+
+
+
+
+ @T("This is the complete system prompt the AI receives with your next message. AI Studio assembles it from the parts listed here.")
+
+
+ @* In the order in which the parts appear in the prompt below: *@
+
+
+
+
@T("Date and time")
+
@this.DateTimeText
+
+
+
@T("Chat template")
+
@this.ChatTemplateText
+
+
+
@T("Data from your data sources")
+
@this.RetrievedDataText
+
+
+
@T("Profile")
+
@this.ProfileText
+
+
+
@T("Tool instructions")
+
@this.ToolNamesText
+
+
+
+
+
+
+
+
+ @T("Close")
+
+
+
\ No newline at end of file
diff --git a/app/MindWork AI Studio/Dialogs/SystemPromptDialog.razor.cs b/app/MindWork AI Studio/Dialogs/SystemPromptDialog.razor.cs
new file mode 100644
index 00000000..7dc65864
--- /dev/null
+++ b/app/MindWork AI Studio/Dialogs/SystemPromptDialog.razor.cs
@@ -0,0 +1,97 @@
+using AIStudio.Components;
+
+using Microsoft.AspNetCore.Components;
+
+namespace AIStudio.Dialogs;
+
+///
+/// Shows the system prompt a chat sends, together with the parts it was assembled from.
+///
+///
+/// Nobody types this prompt as it is sent. A chat template replaces the default, a profile, the
+/// retrieved data of a data source, and the policy of the selected tools are added to it, and the
+/// date goes in front. The list above the text names these parts, so a person does not have to
+/// work out from the text alone where a paragraph came from.
+///
+public partial class SystemPromptDialog : MSGComponentBase
+{
+ [CascadingParameter]
+ private IMudDialogInstance MudDialog { get; set; } = null!;
+
+ ///
+ /// The whole system prompt, as the provider receives it.
+ ///
+ [Parameter]
+ public string SystemPrompt { get; set; } = string.Empty;
+
+ ///
+ /// The name of the chat template whose prompt replaces the default, or empty when there is none.
+ ///
+ [Parameter]
+ public string ChatTemplateName { get; set; } = string.Empty;
+
+ ///
+ /// The name of the profile which takes part, or empty when there is none.
+ ///
+ [Parameter]
+ public string ProfileName { get; set; } = string.Empty;
+
+ ///
+ /// Whether the chat template forbids a profile, which explains why none takes part even though one may be selected.
+ ///
+ [Parameter]
+ public bool IsProfileForbiddenByChatTemplate { get; set; }
+
+ ///
+ /// Whether the prompt carries data retrieved from a data source.
+ ///
+ [Parameter]
+ public bool HasRetrievedData { get; set; }
+
+ ///
+ /// The names of the tools whose usage policy is part of the prompt.
+ ///
+ [Parameter]
+ public IReadOnlyList ToolNames { get; set; } = [];
+
+ ///
+ /// Whether the current date and time go in front of the prompt.
+ ///
+ [Parameter]
+ public bool IncludesDateTime { get; set; }
+
+ private string ChatTemplateText => string.IsNullOrWhiteSpace(this.ChatTemplateName)
+ ? T("None")
+ : this.ChatTemplateName;
+
+ private string ProfileText
+ {
+ get
+ {
+ if (this.IsProfileForbiddenByChatTemplate)
+ return T("Switched off by the chat template");
+
+ return string.IsNullOrWhiteSpace(this.ProfileName)
+ ? T("None")
+ : this.ProfileName;
+ }
+ }
+
+ //
+ // Not promised to be refreshed with the next message: the data is replaced only when a new
+ // retrieval finds something. Until then, what was retrieved earlier travels along again.
+ //
+ private string RetrievedDataText => this.HasRetrievedData
+ ? T("Included, retrieved for an earlier message")
+ : T("None");
+
+ private string ToolNamesText => this.ToolNames.Count == 0
+ ? T("None")
+ : string.Join(", ", this.ToolNames);
+
+ private string DateTimeText => this.IncludesDateTime
+ ? T("Included")
+ : T("Not included");
+
+ private void Close() => this.MudDialog.Close();
+}
\ No newline at end of file
diff --git a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua
index e555badf..b71b3ad3 100644
--- a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua
+++ b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua
@@ -3645,6 +3645,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2670286472"] = "Die Profi
-- The selected provider is not allowed in this chat due to data security or confidence-level requirements.
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2672162875"] = "Der ausgewählte Anbieter ist in diesem Chat aufgrund der Datensicherheit oder der Anforderungen an das Vertrauensniveau nicht zulässig."
+-- Show the complete system prompt the AI receives
+UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2931983492"] = "Den vollständigen Systemprompt anzeigen, den die KI erhält"
+
-- Bulleted List
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2957125464"] = "Aufzählungszeichen"
@@ -3678,6 +3681,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T4231005109"] = "Überschr
-- Please select the workspace where you want to move the chat to.
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T474393241"] = "Bitte wählen Sie den Arbeitsbereich aus, in den Sie den Chat verschieben möchten."
+-- Complete system prompt of this chat
+UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T544159998"] = "Vollständiger Systemprompt dieses Chats"
+
-- Move the chat to a workspace, or to another if it is already in one.
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T636393754"] = "Verschieben Sie den Chat in einen Arbeitsbereich oder in einen anderen, falls er sich bereits in einem befindet."
@@ -8826,6 +8832,48 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SINGLEINPUTDIALOG::T4030229154"] = "Ihre Ein
-- Cancel
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SINGLEINPUTDIALOG::T900713019"] = "Abbrechen"
+-- Included, retrieved for an earlier message
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T1359693360"] = "Enthalten, abgerufen für eine frühere Nachricht"
+
+-- Data from your data sources
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T1629973648"] = "Daten aus Ihren Datenquellen"
+
+-- Date and time
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T2054731205"] = "Datum und Uhrzeit"
+
+-- Included
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T3098410457"] = "Enthalten"
+
+-- This is the complete system prompt the AI receives with your next message. AI Studio assembles it from the parts listed here.
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T3315883870"] = "Dies ist der vollständige Systemprompt, den die KI mit Ihrer nächsten Nachricht erhält. AI Studio setzt ihn aus den hier aufgeführten Teilen zusammen."
+
+-- Profile
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T3440849550"] = "Profil"
+
+-- Close
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T3448155331"] = "Schließen"
+
+-- Complete system prompt
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T3725933563"] = "Vollständiger Systemprompt"
+
+-- Switched off by the chat template
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T3728646729"] = "Von der Chat-Vorlage abgeschaltet"
+
+-- Tool instructions
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T4067010756"] = "Anweisungen für Werkzeuge"
+
+-- the complete system prompt
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T471427542"] = "Den vollständigen Systemprompt"
+
+-- None
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T810547195"] = "Keine"
+
+-- Not included
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T885651534"] = "Nicht enthalten"
+
+-- Chat template
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T923285303"] = "Chat-Vorlage"
+
-- Hugging Face Inference Provider
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::TRANSCRIPTIONPROVIDERDIALOG::T1085481431"] = "Hugging Face-Inferenzanbieter"
diff --git a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua
index df9b2a7c..4847d2d9 100644
--- a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua
+++ b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua
@@ -3645,6 +3645,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2670286472"] = "Profile u
-- The selected provider is not allowed in this chat due to data security or confidence-level requirements.
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2672162875"] = "The selected provider is not allowed in this chat due to data security or confidence-level requirements."
+-- Show the complete system prompt the AI receives
+UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2931983492"] = "Show the complete system prompt the AI receives"
+
-- Bulleted List
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2957125464"] = "Bulleted List"
@@ -3678,6 +3681,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T4231005109"] = "Heading"
-- Please select the workspace where you want to move the chat to.
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T474393241"] = "Please select the workspace where you want to move the chat to."
+-- Complete system prompt of this chat
+UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T544159998"] = "Complete system prompt of this chat"
+
-- Move the chat to a workspace, or to another if it is already in one.
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T636393754"] = "Move the chat to a workspace, or to another if it is already in one."
@@ -8826,6 +8832,48 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SINGLEINPUTDIALOG::T4030229154"] = "Your Inp
-- Cancel
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SINGLEINPUTDIALOG::T900713019"] = "Cancel"
+-- Included, retrieved for an earlier message
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T1359693360"] = "Included, retrieved for an earlier message"
+
+-- Data from your data sources
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T1629973648"] = "Data from your data sources"
+
+-- Date and time
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T2054731205"] = "Date and time"
+
+-- Included
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T3098410457"] = "Included"
+
+-- This is the complete system prompt the AI receives with your next message. AI Studio assembles it from the parts listed here.
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T3315883870"] = "This is the complete system prompt the AI receives with your next message. AI Studio assembles it from the parts listed here."
+
+-- Profile
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T3440849550"] = "Profile"
+
+-- Close
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T3448155331"] = "Close"
+
+-- Complete system prompt
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T3725933563"] = "Complete system prompt"
+
+-- Switched off by the chat template
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T3728646729"] = "Switched off by the chat template"
+
+-- Tool instructions
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T4067010756"] = "Tool instructions"
+
+-- the complete system prompt
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T471427542"] = "the complete system prompt"
+
+-- None
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T810547195"] = "None"
+
+-- Not included
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T885651534"] = "Not included"
+
+-- Chat template
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SYSTEMPROMPTDIALOG::T923285303"] = "Chat template"
+
-- Hugging Face Inference Provider
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::TRANSCRIPTIONPROVIDERDIALOG::T1085481431"] = "Hugging Face Inference Provider"
diff --git a/app/MindWork AI Studio/wwwroot/changelog/v26.9.1.md b/app/MindWork AI Studio/wwwroot/changelog/v26.9.1.md
index 360ffbb6..cd6684ec 100644
--- a/app/MindWork AI Studio/wwwroot/changelog/v26.9.1.md
+++ b/app/MindWork AI Studio/wwwroot/changelog/v26.9.1.md
@@ -2,6 +2,7 @@
- Added a way to copy an entire chat, either with the button in the chat toolbar or next to the chat in the chat list. The copy opens right away so you can continue in it, while the original conversation stays exactly as it was. Many thanks to Peer Hogeterp (`peerschuett`) and Jens Erler (`j-erler`) for this feature.
- Added a way to roll a chat back to an earlier AI response. The response you pick stays, and every message after it is removed permanently, together with the attachments of those messages.
- Added a way to save a single code block of an answer. When an answer holds a web page, a LaTeX document, or a Markdown text, the export menu now offers that block as a file of its own.
+- Added a way to see the complete system prompt a chat sends to the AI. The new button with the eye in the chat toolbar shows it exactly as the AI receives it. That is rarely just the default prompt: a chat template may replace it, and your profile, data from your data sources, the instructions of your tools, and the current date may be added to it. A short list above the prompt names the parts it was assembled from, and you can copy the prompt with one click.
- Added tools that AI models can use on their own, starting with Web Search and Read Web Page. When you ask something a model cannot answer from what it knows, it now searches the web, reads the pages it found, and answers with the sources it used. You decide which tools a model may use, right below the message field, and you can watch it work: AI Studio shows which tool is running and, afterward, every call it made with its result. Whether tools are offered at all depends on the model because it has to support them. Read Web Page works right away; for Web Search you pick a search service in the app settings — Tavily or Staan with a free API key, or a SearXNG instance you run yourself. Set up more than one, and they can take turns when one of them finds nothing, or be asked all at once with their results combined. Many thanks to Peer Hogeterp (`peerschuett`) and Nils Kruthoff (`nilskruthoff`) for building this feature.
- Added answers that appear word by word even while the AI uses its tools. You read along as the model writes, including the short note it puts down before it looks something up, and the answer that follows a tool call arrives the same way instead of all at once at the end.
- Added safeguards around everything these tools bring back. Anything fetched from the web is treated as untrusted: AI Studio removes instructions hidden in a page before a model reads it and tells you when it did, exactly as it already does for the documents and web pages you load yourself. A model can never point a tool at your own network. Each tool states how much you have to trust a provider before it may be used with it, so your questions do not travel further than you allow. You can adjust that requirement per tool in the app settings.