From b87f7d1cc301f875155196d1327e74643d1baa50 Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Mon, 6 Jul 2026 19:31:27 +0200 Subject: [PATCH] Reworked coding context management --- .../Assistants/Coding/AssistantCoding.razor | 22 +++--- .../Coding/AssistantCoding.razor.cs | 68 +++++-------------- .../Assistants/Coding/CodingContext.cs | 16 ----- .../Assistants/Coding/CodingContextItem.razor | 18 ----- .../Coding/CodingContextItem.razor.cs | 47 ------------- .../Settings/SettingsDialogCoding.razor | 8 +-- 6 files changed, 25 insertions(+), 154 deletions(-) delete mode 100644 app/MindWork AI Studio/Assistants/Coding/CodingContext.cs delete mode 100644 app/MindWork AI Studio/Assistants/Coding/CodingContextItem.razor delete mode 100644 app/MindWork AI Studio/Assistants/Coding/CodingContextItem.razor.cs diff --git a/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor b/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor index 7c6a56bf..e2d3e719 100644 --- a/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor +++ b/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor @@ -1,19 +1,13 @@ @attribute [Route(Routes.ASSISTANT_CODING)] @inherits AssistantBaseCore - - @for (var contextIndex = 0; contextIndex < this.codingContexts.Count; contextIndex++) - { - var codingContext = this.codingContexts[contextIndex]; - var index = contextIndex; - - - - } - - - @T("Add context") - +@T("Context") + + @T("You can attach source files as optional context for your coding question.") + +
+ +
@@ -24,4 +18,4 @@ - \ No newline at end of file + diff --git a/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor.cs b/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor.cs index bb55421a..7cd162aa 100644 --- a/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor.cs +++ b/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor.cs @@ -1,5 +1,6 @@ using System.Text; +using AIStudio.Chat; using AIStudio.Dialogs.Settings; using AIStudio.Tools.AssistantSessions; @@ -11,7 +12,7 @@ public partial class AssistantCoding : AssistantBaseCore protected override string Title => T("Coding Assistant"); - protected override string Description => T("This coding assistant supports you in writing code. Provide some coding context by copying and pasting your code into the input fields. You might assign an ID to your code snippet to easily reference it later. When you have compiler messages, you can paste them into the input fields to get help with debugging as well."); + protected override string Description => T("This coding assistant supports you in writing code. Ask your coding question and optionally attach source files as context. When you have compiler messages, you can paste them into the input fields to get help with debugging as well."); protected override string SystemPrompt => """ @@ -20,6 +21,12 @@ public partial class AssistantCoding : AssistantBaseCore You know object-oriented programming, as well as functional programming and procedural programming. You are also familiar with design patterns and can explain them. You are an expert of debugging and can help with compiler messages. You can also help with code refactoring and optimization. + + The user may attach source files, project files, configuration files, logs, or other documents as coding context. + Treat attached files as source context for the user's question. Use the file paths and file contents provided in + the message to reason about the code. Do not invent files or APIs that are not present in the user's question or + attached context. If the question conflicts with attached context, prioritize the user's explicit question and + explain any relevant mismatch. When the user asks in a different language than English, you answer in the same language! """; @@ -36,7 +43,7 @@ public partial class AssistantCoding : AssistantBaseCore protected override void ResetForm() { - this.codingContexts.Clear(); + this.loadedDocumentPaths.Clear(); this.compilerMessages = string.Empty; this.questions = string.Empty; if (!this.MightPreselectValues()) @@ -56,11 +63,11 @@ public partial class AssistantCoding : AssistantBaseCore return false; } - private readonly List codingContexts = new(); + private HashSet loadedDocumentPaths = []; private bool provideCompilerMessages; private string compilerMessages = string.Empty; private string questions = string.Empty; - private static readonly AssistantSessionStateKey> CODING_CONTEXTS_STATE_KEY = new(nameof(codingContexts)); + private static readonly AssistantSessionStateKey> LOADED_DOCUMENT_PATHS_STATE_KEY = new(nameof(loadedDocumentPaths)); private static readonly AssistantSessionStateKey PROVIDE_COMPILER_MESSAGES_STATE_KEY = new(nameof(provideCompilerMessages)); private static readonly AssistantSessionStateKey COMPILER_MESSAGES_STATE_KEY = new(nameof(compilerMessages)); private static readonly AssistantSessionStateKey QUESTIONS_STATE_KEY = new(nameof(questions)); @@ -68,7 +75,7 @@ public partial class AssistantCoding : AssistantBaseCore /// protected override void CaptureCustomAssistantSessionState(AssistantSessionStateWriter state) { - state.SetList(CODING_CONTEXTS_STATE_KEY, this.codingContexts); + state.SetHashSet(LOADED_DOCUMENT_PATHS_STATE_KEY, this.loadedDocumentPaths); state.Set(PROVIDE_COMPILER_MESSAGES_STATE_KEY, this.provideCompilerMessages); state.Set(COMPILER_MESSAGES_STATE_KEY, this.compilerMessages); state.Set(QUESTIONS_STATE_KEY, this.questions); @@ -77,7 +84,7 @@ public partial class AssistantCoding : AssistantBaseCore /// protected override void RestoreCustomAssistantSessionState(AssistantSessionStateReader state) { - state.RestoreList(CODING_CONTEXTS_STATE_KEY, this.codingContexts); + state.RestoreHashSet(LOADED_DOCUMENT_PATHS_STATE_KEY, this.loadedDocumentPaths); state.Restore(PROVIDE_COMPILER_MESSAGES_STATE_KEY, value => this.provideCompilerMessages = value); state.Restore(COMPILER_MESSAGES_STATE_KEY, value => this.compilerMessages = value); state.Restore(QUESTIONS_STATE_KEY, value => this.questions = value); @@ -115,56 +122,12 @@ public partial class AssistantCoding : AssistantBaseCore return null; } - private void AddCodingContext() - { - this.codingContexts.Add(new() - { - Id = string.Format(T("Context {0}"), this.codingContexts.Count + 1), - Language = this.SettingsManager.ConfigurationData.Coding.PreselectOptions ? this.SettingsManager.ConfigurationData.Coding.PreselectedProgrammingLanguage : default, - OtherLanguage = this.SettingsManager.ConfigurationData.Coding.PreselectOptions ? this.SettingsManager.ConfigurationData.Coding.PreselectedOtherProgrammingLanguage : string.Empty, - }); - } - - private ValueTask DeleteContext(int index) - { - if(this.codingContexts.Count < index + 1) - return ValueTask.CompletedTask; - - this.codingContexts.RemoveAt(index); - this.Form?.ResetValidation(); - - this.StateHasChanged(); - return ValueTask.CompletedTask; - } - private async Task GetSupport() { await this.Form!.Validate(); if (!this.InputIsValid) return; - var sbContext = new StringBuilder(); - if (this.codingContexts.Count > 0) - { - sbContext.AppendLine("I have the following coding context:"); - sbContext.AppendLine(); - foreach (var codingContext in this.codingContexts) - { - sbContext.AppendLine($"ID: {codingContext.Id}"); - - if(codingContext.Language is not CommonCodingLanguages.OTHER) - sbContext.AppendLine($"Language: {codingContext.Language.Name()}"); - else - sbContext.AppendLine($"Language: {codingContext.OtherLanguage}"); - - sbContext.AppendLine("Content:"); - sbContext.AppendLine("```"); - sbContext.AppendLine(codingContext.Code); - sbContext.AppendLine("```"); - sbContext.AppendLine(); - } - } - var sbCompilerMessages = new StringBuilder(); if (this.provideCompilerMessages) { @@ -179,12 +142,13 @@ public partial class AssistantCoding : AssistantBaseCore this.CreateChatThread(); var time = this.AddUserRequest( $""" - {sbContext} {sbCompilerMessages} My questions are: {this.questions} - """); + """, + false, + this.loadedDocumentPaths.ToList()); await this.AddAIResponseAsync(time); } diff --git a/app/MindWork AI Studio/Assistants/Coding/CodingContext.cs b/app/MindWork AI Studio/Assistants/Coding/CodingContext.cs deleted file mode 100644 index 5ef42ed2..00000000 --- a/app/MindWork AI Studio/Assistants/Coding/CodingContext.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace AIStudio.Assistants.Coding; - -public sealed class CodingContext(string id, CommonCodingLanguages language, string otherLanguage, string code) -{ - public CodingContext() : this(string.Empty, CommonCodingLanguages.NONE, string.Empty, string.Empty) - { - } - - public string Id { get; set; } = id; - - public CommonCodingLanguages Language { get; set; } = language; - - public string OtherLanguage { get; set; } = otherLanguage; - - public string Code { get; set; } = code; -} \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/Coding/CodingContextItem.razor b/app/MindWork AI Studio/Assistants/Coding/CodingContextItem.razor deleted file mode 100644 index 6bf1b20f..00000000 --- a/app/MindWork AI Studio/Assistants/Coding/CodingContextItem.razor +++ /dev/null @@ -1,18 +0,0 @@ -@inherits MSGComponentBase - - - - - @foreach (var language in Enum.GetValues()) - { - - @language.Name() - - } - - @if (this.CodingContext.Language is CommonCodingLanguages.OTHER) - { - - } - - \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/Coding/CodingContextItem.razor.cs b/app/MindWork AI Studio/Assistants/Coding/CodingContextItem.razor.cs deleted file mode 100644 index 592b4f3a..00000000 --- a/app/MindWork AI Studio/Assistants/Coding/CodingContextItem.razor.cs +++ /dev/null @@ -1,47 +0,0 @@ -using AIStudio.Components; - -using Microsoft.AspNetCore.Components; - -namespace AIStudio.Assistants.Coding; - -public partial class CodingContextItem : MSGComponentBase -{ - [Parameter] - public CodingContext CodingContext { get; set; } = new(); - - [Parameter] - public EventCallback CodingContextChanged { get; set; } - - private static readonly Dictionary USER_INPUT_ATTRIBUTES = new(); - - #region Overrides of ComponentBase - - protected override async Task OnParametersSetAsync() - { - // Configure the spellchecking for the user input: - this.SettingsManager.InjectSpellchecking(USER_INPUT_ATTRIBUTES); - - await base.OnParametersSetAsync(); - } - - #endregion - - private string? ValidatingCode(string code) - { - if(string.IsNullOrWhiteSpace(code)) - return string.Format(T("{0}: Please provide your input."), this.CodingContext.Id); - - return null; - } - - private string? ValidatingOtherLanguage(string language) - { - if(this.CodingContext.Language != CommonCodingLanguages.OTHER) - return null; - - if(string.IsNullOrWhiteSpace(language)) - return T("Please specify the language."); - - return null; - } -} \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogCoding.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogCoding.razor index 323cbd8e..6c6c0181 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogCoding.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogCoding.razor @@ -1,4 +1,3 @@ -@using AIStudio.Assistants.Coding @using AIStudio.Settings @inherits SettingsDialogBase @@ -11,13 +10,8 @@ - + - - @if (this.SettingsManager.ConfigurationData.Coding.PreselectedProgrammingLanguage is CommonCodingLanguages.OTHER) - { - - }