From a956b55d6ba8560f200e0f5552836de7db3f0e33 Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Tue, 16 Jul 2024 20:06:04 +0200 Subject: [PATCH] Adding a coding assistant (#38) --- .../Components/AssistantBase.razor.cs | 8 ++ .../Components/Blocks/Changelog.Logs.cs | 1 + .../Components/Pages/Assistants.razor | 1 + .../Pages/Coding/AssistantCoding.razor | 39 +++++++ .../Pages/Coding/AssistantCoding.razor.cs | 106 ++++++++++++++++++ .../Components/Pages/Coding/CodingContext.cs | 16 +++ .../Pages/Coding/CodingContextItem.razor | 14 +++ .../Pages/Coding/CodingContextItem.razor.cs | 50 +++++++++ .../Coding/CommonCodingLanguageExtensions.cs | 43 +++++++ .../Pages/Coding/CommonCodingLanguages.cs | 39 +++++++ .../IconFinder/AssistantIconFinder.razor.cs | 8 -- .../AssistantTextSummarizer.razor.cs | 8 -- .../Translator/AssistantTranslator.razor.cs | 8 -- .../wwwroot/changelog/v0.8.2.md | 5 +- metadata.txt | 8 +- runtime/Cargo.lock | 2 +- runtime/Cargo.toml | 2 +- runtime/tauri.conf.json | 2 +- 18 files changed, 327 insertions(+), 33 deletions(-) create mode 100644 app/MindWork AI Studio/Components/Pages/Coding/AssistantCoding.razor create mode 100644 app/MindWork AI Studio/Components/Pages/Coding/AssistantCoding.razor.cs create mode 100644 app/MindWork AI Studio/Components/Pages/Coding/CodingContext.cs create mode 100644 app/MindWork AI Studio/Components/Pages/Coding/CodingContextItem.razor create mode 100644 app/MindWork AI Studio/Components/Pages/Coding/CodingContextItem.razor.cs create mode 100644 app/MindWork AI Studio/Components/Pages/Coding/CommonCodingLanguageExtensions.cs create mode 100644 app/MindWork AI Studio/Components/Pages/Coding/CommonCodingLanguages.cs diff --git a/app/MindWork AI Studio/Components/AssistantBase.razor.cs b/app/MindWork AI Studio/Components/AssistantBase.razor.cs index 7fcbd37..a2e46ea 100644 --- a/app/MindWork AI Studio/Components/AssistantBase.razor.cs +++ b/app/MindWork AI Studio/Components/AssistantBase.razor.cs @@ -57,6 +57,14 @@ public abstract partial class AssistantBase : ComponentBase #endregion + protected string? ValidatingProvider(AIStudio.Settings.Provider provider) + { + if(provider.UsedProvider == Providers.NONE) + return "Please select a provider."; + + return null; + } + protected void CreateChatThread() { this.chatThread = new() diff --git a/app/MindWork AI Studio/Components/Blocks/Changelog.Logs.cs b/app/MindWork AI Studio/Components/Blocks/Changelog.Logs.cs index 7e242b3..597bb63 100644 --- a/app/MindWork AI Studio/Components/Blocks/Changelog.Logs.cs +++ b/app/MindWork AI Studio/Components/Blocks/Changelog.Logs.cs @@ -13,6 +13,7 @@ public partial class Changelog public static readonly Log[] LOGS = [ + new (164, "v0.8.2, build 164 (2024-07-16 18:03 UTC)", "v0.8.2.md"), new (163, "v0.8.1, build 163 (2024-07-16 08:32 UTC)", "v0.8.1.md"), new (162, "v0.8.0, build 162 (2024-07-14 19:39 UTC)", "v0.8.0.md"), new (161, "v0.7.1, build 161 (2024-07-13 11:42 UTC)", "v0.7.1.md"), diff --git a/app/MindWork AI Studio/Components/Pages/Assistants.razor b/app/MindWork AI Studio/Components/Pages/Assistants.razor index 8bd4ea8..6495364 100644 --- a/app/MindWork AI Studio/Components/Pages/Assistants.razor +++ b/app/MindWork AI Studio/Components/Pages/Assistants.razor @@ -8,4 +8,5 @@ + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Pages/Coding/AssistantCoding.razor b/app/MindWork AI Studio/Components/Pages/Coding/AssistantCoding.razor new file mode 100644 index 0000000..b286582 --- /dev/null +++ b/app/MindWork AI Studio/Components/Pages/Coding/AssistantCoding.razor @@ -0,0 +1,39 @@ +@page "/assistant/coding" +@using AIStudio.Settings +@inherits AssistantBaseCore + + + @for (var contextIndex = 0; contextIndex < this.codingContexts.Count; contextIndex++) + { + var codingContext = this.codingContexts[contextIndex]; + + + + } + + + Add context + + + + + @(this.provideCompilerMessages ? "Provide compiler messages" : "Provide no compiler messages") + + @if (this.provideCompilerMessages) + { + + } + + + + + + @foreach (var provider in this.SettingsManager.ConfigurationData.Providers) + { + + } + + + + Get support + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Pages/Coding/AssistantCoding.razor.cs b/app/MindWork AI Studio/Components/Pages/Coding/AssistantCoding.razor.cs new file mode 100644 index 0000000..5c0a2be --- /dev/null +++ b/app/MindWork AI Studio/Components/Pages/Coding/AssistantCoding.razor.cs @@ -0,0 +1,106 @@ +using System.Text; + +namespace AIStudio.Components.Pages.Coding; + +public partial class AssistantCoding : AssistantBaseCore +{ + protected override string Title => "Coding Assistant"; + + protected override string Description => + """ + 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 SystemPrompt => + """ + You are a friendly, helpful senior software developer with extensive experience in various programming languages + and concepts. You are familiar with principles like DRY, KISS, YAGNI, and SOLID and can apply and explain them. + 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. + + When the user asks in a different language than English, you answer in the same language! + """; + + private readonly List codingContexts = new(); + private bool provideCompilerMessages; + private string compilerMessages = string.Empty; + private string questions = string.Empty; + + private string? ValidatingCompilerMessages(string checkCompilerMessages) + { + if(!this.provideCompilerMessages) + return null; + + if(string.IsNullOrWhiteSpace(checkCompilerMessages)) + return "Please provide the compiler messages."; + + return null; + } + + private string? ValidateQuestions(string checkQuestions) + { + if(string.IsNullOrWhiteSpace(checkQuestions)) + return "Please provide your questions."; + + return null; + } + + private void AddCodingContext() + { + this.codingContexts.Add(new() + { + Id = $"Context {this.codingContexts.Count + 1}", + }); + } + + 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}"); + sbContext.AppendLine($"Language: {codingContext.Language.Name()}"); + sbContext.AppendLine($"Other Language: {codingContext.OtherLanguage}"); + sbContext.AppendLine($"Content:"); + sbContext.AppendLine("```"); + sbContext.AppendLine(codingContext.Code); + sbContext.AppendLine("```"); + sbContext.AppendLine(); + } + } + + var sbCompilerMessages = new StringBuilder(); + if (this.provideCompilerMessages) + { + sbCompilerMessages.AppendLine("I have the following compiler messages:"); + sbCompilerMessages.AppendLine(); + sbCompilerMessages.AppendLine("```"); + sbCompilerMessages.AppendLine(this.compilerMessages); + sbCompilerMessages.AppendLine("```"); + sbCompilerMessages.AppendLine(); + } + + this.CreateChatThread(); + var time = this.AddUserRequest( + $""" + {sbContext} + {sbCompilerMessages} + + My questions are: + {this.questions} + """); + + await this.AddAIResponseAsync(time); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Pages/Coding/CodingContext.cs b/app/MindWork AI Studio/Components/Pages/Coding/CodingContext.cs new file mode 100644 index 0000000..726ecca --- /dev/null +++ b/app/MindWork AI Studio/Components/Pages/Coding/CodingContext.cs @@ -0,0 +1,16 @@ +namespace AIStudio.Components.Pages.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/Components/Pages/Coding/CodingContextItem.razor b/app/MindWork AI Studio/Components/Pages/Coding/CodingContextItem.razor new file mode 100644 index 0000000..5c28bb3 --- /dev/null +++ b/app/MindWork AI Studio/Components/Pages/Coding/CodingContextItem.razor @@ -0,0 +1,14 @@ + + + + @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/Components/Pages/Coding/CodingContextItem.razor.cs b/app/MindWork AI Studio/Components/Pages/Coding/CodingContextItem.razor.cs new file mode 100644 index 0000000..bb425de --- /dev/null +++ b/app/MindWork AI Studio/Components/Pages/Coding/CodingContextItem.razor.cs @@ -0,0 +1,50 @@ +using AIStudio.Settings; + +using Microsoft.AspNetCore.Components; + +namespace AIStudio.Components.Pages.Coding; + +public partial class CodingContextItem : ComponentBase +{ + [Parameter] + public CodingContext CodingContext { get; set; } = new(); + + [Parameter] + public EventCallback CodingContextChanged { get; set; } + + [Inject] + protected SettingsManager SettingsManager { get; set; } = null!; + + 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 $"{this.CodingContext.Id}: Please provide your input."; + + return null; + } + + private string? ValidatingOtherLanguage(string language) + { + if(this.CodingContext.Language != CommonCodingLanguages.OTHER) + return null; + + if(string.IsNullOrWhiteSpace(language)) + return "Please specify the language."; + + return null; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Pages/Coding/CommonCodingLanguageExtensions.cs b/app/MindWork AI Studio/Components/Pages/Coding/CommonCodingLanguageExtensions.cs new file mode 100644 index 0000000..9d47105 --- /dev/null +++ b/app/MindWork AI Studio/Components/Pages/Coding/CommonCodingLanguageExtensions.cs @@ -0,0 +1,43 @@ +namespace AIStudio.Components.Pages.Coding; + +public static class CommonCodingLanguageExtensions +{ + public static string Name(this CommonCodingLanguages language) => language switch + { + CommonCodingLanguages.NONE => "None", + + CommonCodingLanguages.BASH => "Bash", + CommonCodingLanguages.BLAZOR => ".NET Blazor", + CommonCodingLanguages.C => "C", + CommonCodingLanguages.CPP => "C++", + CommonCodingLanguages.CSHARP => "C#", + CommonCodingLanguages.CSS => "CSS", + CommonCodingLanguages.FORTRAN => "Fortran", + CommonCodingLanguages.GDSCRIPT => "GDScript", + CommonCodingLanguages.GO => "Go", + CommonCodingLanguages.HTML => "HTML", + CommonCodingLanguages.JAVA => "Java", + CommonCodingLanguages.JAVASCRIPT => "JavaScript", + CommonCodingLanguages.JSON => "JSON", + CommonCodingLanguages.JULIA => "Julia", + CommonCodingLanguages.KOTLIN => "Kotlin", + CommonCodingLanguages.LUA => "Lua", + CommonCodingLanguages.MARKDOWN => "Markdown", + CommonCodingLanguages.MATHEMATICA => "Mathematica", + CommonCodingLanguages.MATLAB => "MATLAB", + CommonCodingLanguages.PHP => "PHP", + CommonCodingLanguages.POWERSHELL => "PowerShell", + CommonCodingLanguages.PROLOG => "Prolog", + CommonCodingLanguages.PYTHON => "Python", + CommonCodingLanguages.R => "R", + CommonCodingLanguages.RUBY => "Ruby", + CommonCodingLanguages.RUST => "Rust", + CommonCodingLanguages.SQL => "SQL", + CommonCodingLanguages.SWIFT => "Swift", + CommonCodingLanguages.TYPESCRIPT => "TypeScript", + CommonCodingLanguages.XML => "XML", + + CommonCodingLanguages.OTHER => "Other", + _ => "Unknown" + }; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Pages/Coding/CommonCodingLanguages.cs b/app/MindWork AI Studio/Components/Pages/Coding/CommonCodingLanguages.cs new file mode 100644 index 0000000..58d9d80 --- /dev/null +++ b/app/MindWork AI Studio/Components/Pages/Coding/CommonCodingLanguages.cs @@ -0,0 +1,39 @@ +namespace AIStudio.Components.Pages.Coding; + +public enum CommonCodingLanguages +{ + NONE, + + BASH, + BLAZOR, + C, + CPP, + CSHARP, + CSS, + FORTRAN, + GDSCRIPT, + GO, + HTML, + JAVA, + JAVASCRIPT, + JSON, + JULIA, + KOTLIN, + LUA, + MARKDOWN, + MATHEMATICA, + MATLAB, + PHP, + POWERSHELL, + PROLOG, + PYTHON, + R, + RUBY, + RUST, + SQL, + SWIFT, + TYPESCRIPT, + XML, + + OTHER, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Pages/IconFinder/AssistantIconFinder.razor.cs b/app/MindWork AI Studio/Components/Pages/IconFinder/AssistantIconFinder.razor.cs index e595837..96d06e9 100644 --- a/app/MindWork AI Studio/Components/Pages/IconFinder/AssistantIconFinder.razor.cs +++ b/app/MindWork AI Studio/Components/Pages/IconFinder/AssistantIconFinder.razor.cs @@ -35,14 +35,6 @@ public partial class AssistantIconFinder : AssistantBaseCore return null; } - - private string? ValidatingProvider(AIStudio.Settings.Provider provider) - { - if(provider.UsedProvider == Providers.NONE) - return "Please select a provider."; - - return null; - } private async Task FindIcon() { diff --git a/app/MindWork AI Studio/Components/Pages/TextSummarizer/AssistantTextSummarizer.razor.cs b/app/MindWork AI Studio/Components/Pages/TextSummarizer/AssistantTextSummarizer.razor.cs index 2bf92e4..00e0742 100644 --- a/app/MindWork AI Studio/Components/Pages/TextSummarizer/AssistantTextSummarizer.razor.cs +++ b/app/MindWork AI Studio/Components/Pages/TextSummarizer/AssistantTextSummarizer.razor.cs @@ -38,14 +38,6 @@ public partial class AssistantTextSummarizer : AssistantBaseCore return null; } - private string? ValidatingProvider(AIStudio.Settings.Provider provider) - { - if(provider.UsedProvider == Providers.NONE) - return "Please select a provider."; - - return null; - } - private string? ValidateCustomLanguage(string language) { if(this.selectedTargetLanguage == CommonLanguages.OTHER && string.IsNullOrWhiteSpace(language)) diff --git a/app/MindWork AI Studio/Components/Pages/Translator/AssistantTranslator.razor.cs b/app/MindWork AI Studio/Components/Pages/Translator/AssistantTranslator.razor.cs index cdd022b..87c93f4 100644 --- a/app/MindWork AI Studio/Components/Pages/Translator/AssistantTranslator.razor.cs +++ b/app/MindWork AI Studio/Components/Pages/Translator/AssistantTranslator.razor.cs @@ -34,14 +34,6 @@ public partial class AssistantTranslator : AssistantBaseCore return null; } - private string? ValidatingProvider(AIStudio.Settings.Provider provider) - { - if(provider.UsedProvider == Providers.NONE) - return "Please select a provider."; - - return null; - } - private string? ValidatingTargetLanguage(CommonLanguages language) { if(language == CommonLanguages.AS_IS) diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.8.2.md b/app/MindWork AI Studio/wwwroot/changelog/v0.8.2.md index 9854a0b..4d424e2 100644 --- a/app/MindWork AI Studio/wwwroot/changelog/v0.8.2.md +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.8.2.md @@ -1,2 +1,3 @@ -# v0.8.2, build 164 (2024-07-xxx -- Fixed the in-app description of possible self-hosted models. \ No newline at end of file +# v0.8.2, build 164 (2024-07-16 18:03 UTC) +- Added the coding assistant. +- Fixed the in-app description of possible self-hosted models. \ No newline at end of file diff --git a/metadata.txt b/metadata.txt index 9bf4703..9c50c4d 100644 --- a/metadata.txt +++ b/metadata.txt @@ -1,9 +1,9 @@ -0.8.1 -2024-07-16 08:32:21 UTC -163 +0.8.2 +2024-07-16 18:03:04 UTC +164 8.0.107 (commit 1bdaef7265) 8.0.7 (commit 2aade6beb0) 1.79.0 (commit 129f3b996) 6.20.0 1.6.1 -063fd0fcfa2, release +c92ce49af2d, release diff --git a/runtime/Cargo.lock b/runtime/Cargo.lock index 9d18ad3..d0ecabb 100644 --- a/runtime/Cargo.lock +++ b/runtime/Cargo.lock @@ -2313,7 +2313,7 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mindwork-ai-studio" -version = "0.8.1" +version = "0.8.2" dependencies = [ "arboard", "flexi_logger", diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 6ad6f3c..140e669 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mindwork-ai-studio" -version = "0.8.1" +version = "0.8.2" edition = "2021" description = "MindWork AI Studio" authors = ["Thorsten Sommer"] diff --git a/runtime/tauri.conf.json b/runtime/tauri.conf.json index 1382a43..97c54b2 100644 --- a/runtime/tauri.conf.json +++ b/runtime/tauri.conf.json @@ -6,7 +6,7 @@ }, "package": { "productName": "MindWork AI Studio", - "version": "0.8.1" + "version": "0.8.2" }, "tauri": { "allowlist": {