mirror of
https://github.com/MindWorkAI/AI-Studio.git
synced 2026-10-21 22:58:00 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f8e06faea5 | ||
|
|
8aeeda5dca | ||
|
|
909fbe89bb |
No files matched your search
@@ -3,7 +3,7 @@ namespace AIStudio.Chat;
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Data structure for a chat thread.
|
/// Data structure for a chat thread.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public sealed class ChatThread
|
public sealed record ChatThread
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The unique identifier of the chat thread.
|
/// The unique identifier of the chat thread.
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
namespace AIStudio.Chat;
|
||||||
|
|
||||||
|
public static class SystemPrompts
|
||||||
|
{
|
||||||
|
public const string DEFAULT = "You are a helpful assistant!";
|
||||||
|
}
|
||||||
@@ -1,21 +1,23 @@
|
|||||||
@using AIStudio.Chat
|
@using AIStudio.Chat
|
||||||
|
@using AIStudio.Components.Pages
|
||||||
|
@using AIStudio.Tools
|
||||||
<MudText Typo="Typo.h3" Class="mb-2 mr-3">
|
<MudText Typo="Typo.h3" Class="mb-2 mr-3">
|
||||||
@this.Title
|
@(this.Title)
|
||||||
</MudText>
|
</MudText>
|
||||||
|
|
||||||
<InnerScrolling HeaderHeight="12.3em">
|
<InnerScrolling HeaderHeight="12.3em">
|
||||||
<ChildContent>
|
<ChildContent>
|
||||||
<MudForm @ref="@this.form" @bind-IsValid="@this.inputIsValid" @bind-Errors="@this.inputIssues" Class="pr-2">
|
<MudForm @ref="@(this.form)" @bind-IsValid="@(this.inputIsValid)" @bind-Errors="@(this.inputIssues)" Class="pr-2">
|
||||||
<MudText Typo="Typo.body1" Align="Align.Justify" Class="mb-6">
|
<MudText Typo="Typo.body1" Align="Align.Justify" Class="mb-6">
|
||||||
@this.Description
|
@(this.Description)
|
||||||
</MudText>
|
</MudText>
|
||||||
|
|
||||||
@if (this.Body is not null)
|
@if (this.Body is not null)
|
||||||
{
|
{
|
||||||
@this.Body
|
@(this.Body)
|
||||||
}
|
}
|
||||||
</MudForm>
|
</MudForm>
|
||||||
<Issues IssuesData="@this.inputIssues"/>
|
<Issues IssuesData="@(this.inputIssues)"/>
|
||||||
|
|
||||||
@if (this.ShowDedicatedProgress && this.isProcessing)
|
@if (this.ShowDedicatedProgress && this.isProcessing)
|
||||||
{
|
{
|
||||||
@@ -24,7 +26,7 @@
|
|||||||
<div id="@ASSISTANT_RESULT_DIV_ID" class="mr-2 mt-3">
|
<div id="@ASSISTANT_RESULT_DIV_ID" class="mr-2 mt-3">
|
||||||
@if (this.ShowResult && this.resultingContentBlock is not null)
|
@if (this.ShowResult && this.resultingContentBlock is not null)
|
||||||
{
|
{
|
||||||
<ContentBlockComponent Role="@this.resultingContentBlock.Role" Type="@this.resultingContentBlock.ContentType" Time="@this.resultingContentBlock.Time" Content="@this.resultingContentBlock.Content"/>
|
<ContentBlockComponent Role="@(this.resultingContentBlock.Role)" Type="@(this.resultingContentBlock.ContentType)" Time="@(this.resultingContentBlock.Time)" Content="@(this.resultingContentBlock.Content)"/>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -34,11 +36,11 @@
|
|||||||
@if (this.FooterButtons.Count > 0)
|
@if (this.FooterButtons.Count > 0)
|
||||||
{
|
{
|
||||||
<MudStack Row="@true" Wrap="Wrap.Wrap" Class="mt-3 mr-2">
|
<MudStack Row="@true" Wrap="Wrap.Wrap" Class="mt-3 mr-2">
|
||||||
@foreach (var buttonData in this.FooterButtons)
|
@foreach (var button in this.FooterButtons)
|
||||||
{
|
{
|
||||||
switch (buttonData)
|
switch (button)
|
||||||
{
|
{
|
||||||
case var _ when !string.IsNullOrWhiteSpace(buttonData.Tooltip):
|
case ButtonData buttonData when !string.IsNullOrWhiteSpace(buttonData.Tooltip):
|
||||||
<MudTooltip Text="@buttonData.Tooltip">
|
<MudTooltip Text="@buttonData.Tooltip">
|
||||||
<MudButton Variant="Variant.Filled" Color="@buttonData.Color" StartIcon="@GetButtonIcon(buttonData.Icon)" OnClick="async () => await buttonData.AsyncAction()">
|
<MudButton Variant="Variant.Filled" Color="@buttonData.Color" StartIcon="@GetButtonIcon(buttonData.Icon)" OnClick="async () => await buttonData.AsyncAction()">
|
||||||
@buttonData.Text
|
@buttonData.Text
|
||||||
@@ -46,13 +48,30 @@
|
|||||||
</MudTooltip>
|
</MudTooltip>
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
case ButtonData buttonData:
|
||||||
<MudButton Variant="Variant.Filled" Color="@buttonData.Color" StartIcon="@GetButtonIcon(buttonData.Icon)" OnClick="async () => await buttonData.AsyncAction()">
|
<MudButton Variant="Variant.Filled" Color="@buttonData.Color" StartIcon="@GetButtonIcon(buttonData.Icon)" OnClick="async () => await buttonData.AsyncAction()">
|
||||||
@buttonData.Text
|
@buttonData.Text
|
||||||
</MudButton>
|
</MudButton>
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SendToButton sendToButton:
|
||||||
|
<MudMenu StartIcon="@Icons.Material.Filled.Apps" EndIcon="@Icons.Material.Filled.KeyboardArrowDown" Label="Send to ..." Variant="Variant.Filled" Color="Color.Info">
|
||||||
|
@foreach (var assistant in Enum.GetValues<SendTo>().OrderBy(n => n.Name().Length))
|
||||||
|
{
|
||||||
|
if(assistant is SendTo.NONE || sendToButton.Self == assistant)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
<MudMenuItem OnClick="() => this.SendToAssistant(assistant, sendToButton)">
|
||||||
|
@assistant.Name()
|
||||||
|
</MudMenuItem>
|
||||||
|
}
|
||||||
|
</MudMenu>
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
<MudButton Variant="Variant.Filled" Color="Color.Warning" StartIcon="@Icons.Material.Filled.Refresh" OnClick="() => this.InnerResetForm()">
|
||||||
|
Reset
|
||||||
|
</MudButton>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
}
|
}
|
||||||
</ChildContent>
|
</ChildContent>
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
using AIStudio.Chat;
|
using AIStudio.Chat;
|
||||||
|
using AIStudio.Components.Pages;
|
||||||
using AIStudio.Provider;
|
using AIStudio.Provider;
|
||||||
using AIStudio.Settings;
|
using AIStudio.Settings;
|
||||||
using AIStudio.Tools;
|
using AIStudio.Tools;
|
||||||
|
|
||||||
using Microsoft.AspNetCore.Components;
|
using Microsoft.AspNetCore.Components;
|
||||||
|
|
||||||
|
using Path = AIStudio.Components.Pages.Path;
|
||||||
|
|
||||||
namespace AIStudio.Components;
|
namespace AIStudio.Components;
|
||||||
|
|
||||||
public abstract partial class AssistantBase : ComponentBase
|
public abstract partial class AssistantBase : ComponentBase
|
||||||
@@ -24,6 +27,9 @@ public abstract partial class AssistantBase : ComponentBase
|
|||||||
[Inject]
|
[Inject]
|
||||||
protected Rust Rust { get; init; } = null!;
|
protected Rust Rust { get; init; } = null!;
|
||||||
|
|
||||||
|
[Inject]
|
||||||
|
protected NavigationManager NavigationManager { get; init; } = null!;
|
||||||
|
|
||||||
internal const string AFTER_RESULT_DIV_ID = "afterAssistantResult";
|
internal const string AFTER_RESULT_DIV_ID = "afterAssistantResult";
|
||||||
internal const string ASSISTANT_RESULT_DIV_ID = "assistantResult";
|
internal const string ASSISTANT_RESULT_DIV_ID = "assistantResult";
|
||||||
|
|
||||||
@@ -32,6 +38,10 @@ public abstract partial class AssistantBase : ComponentBase
|
|||||||
protected abstract string Description { get; }
|
protected abstract string Description { get; }
|
||||||
|
|
||||||
protected abstract string SystemPrompt { get; }
|
protected abstract string SystemPrompt { get; }
|
||||||
|
|
||||||
|
protected abstract void ResetFrom();
|
||||||
|
|
||||||
|
protected abstract bool MightPreselectValues();
|
||||||
|
|
||||||
private protected virtual RenderFragment? Body => null;
|
private protected virtual RenderFragment? Body => null;
|
||||||
|
|
||||||
@@ -39,7 +49,9 @@ public abstract partial class AssistantBase : ComponentBase
|
|||||||
|
|
||||||
protected virtual bool ShowDedicatedProgress => false;
|
protected virtual bool ShowDedicatedProgress => false;
|
||||||
|
|
||||||
protected virtual IReadOnlyList<ButtonData> FooterButtons => [];
|
protected virtual ChatThread ConvertToChatThread => this.chatThread ?? new();
|
||||||
|
|
||||||
|
protected virtual IReadOnlyList<IButtonData> FooterButtons => [];
|
||||||
|
|
||||||
protected static readonly Dictionary<string, object?> USER_INPUT_ATTRIBUTES = new();
|
protected static readonly Dictionary<string, object?> USER_INPUT_ATTRIBUTES = new();
|
||||||
|
|
||||||
@@ -47,7 +59,7 @@ public abstract partial class AssistantBase : ComponentBase
|
|||||||
protected MudForm? form;
|
protected MudForm? form;
|
||||||
protected bool inputIsValid;
|
protected bool inputIsValid;
|
||||||
|
|
||||||
private ChatThread? chatThread;
|
protected ChatThread? chatThread;
|
||||||
private ContentBlock? resultingContentBlock;
|
private ContentBlock? resultingContentBlock;
|
||||||
private string[] inputIssues = [];
|
private string[] inputIssues = [];
|
||||||
private bool isProcessing;
|
private bool isProcessing;
|
||||||
@@ -157,4 +169,64 @@ public abstract partial class AssistantBase : ComponentBase
|
|||||||
|
|
||||||
return icon;
|
return icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Task SendToAssistant(SendTo destination, SendToButton sendToButton)
|
||||||
|
{
|
||||||
|
var contentToSend = sendToButton.UseResultingContentBlockData switch
|
||||||
|
{
|
||||||
|
false => sendToButton.GetText(),
|
||||||
|
true => this.resultingContentBlock?.Content switch
|
||||||
|
{
|
||||||
|
ContentText textBlock => textBlock.Text,
|
||||||
|
_ => string.Empty,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
var (eventItem, path) = destination switch
|
||||||
|
{
|
||||||
|
SendTo.AGENDA_ASSISTANT => (Event.SEND_TO_AGENDA_ASSISTANT, Path.ASSISTANT_AGENDA),
|
||||||
|
SendTo.CODING_ASSISTANT => (Event.SEND_TO_CODING_ASSISTANT, Path.ASSISTANT_CODING),
|
||||||
|
SendTo.REWRITE_ASSISTANT => (Event.SEND_TO_REWRITE_ASSISTANT, Path.ASSISTANT_REWRITE),
|
||||||
|
SendTo.TRANSLATION_ASSISTANT => (Event.SEND_TO_TRANSLATION_ASSISTANT, Path.ASSISTANT_TRANSLATION),
|
||||||
|
SendTo.ICON_FINDER_ASSISTANT => (Event.SEND_TO_ICON_FINDER_ASSISTANT, Path.ASSISTANT_ICON_FINDER),
|
||||||
|
SendTo.GRAMMAR_SPELLING_ASSISTANT => (Event.SEND_TO_GRAMMAR_SPELLING_ASSISTANT, Path.ASSISTANT_GRAMMAR_SPELLING),
|
||||||
|
SendTo.TEXT_SUMMARIZER_ASSISTANT => (Event.SEND_TO_TEXT_SUMMARIZER_ASSISTANT, Path.ASSISTANT_SUMMARIZER),
|
||||||
|
|
||||||
|
SendTo.CHAT => (Event.SEND_TO_CHAT, Path.CHAT),
|
||||||
|
|
||||||
|
_ => (Event.NONE, Path.ASSISTANTS),
|
||||||
|
};
|
||||||
|
|
||||||
|
switch (destination)
|
||||||
|
{
|
||||||
|
case SendTo.CHAT:
|
||||||
|
MessageBus.INSTANCE.DeferMessage(this, eventItem, this.ConvertToChatThread);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
MessageBus.INSTANCE.DeferMessage(this, eventItem, contentToSend);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.NavigationManager.NavigateTo(path);
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task InnerResetForm()
|
||||||
|
{
|
||||||
|
this.resultingContentBlock = null;
|
||||||
|
this.providerSettings = default;
|
||||||
|
|
||||||
|
await this.JsRuntime.ClearDiv(ASSISTANT_RESULT_DIV_ID);
|
||||||
|
await this.JsRuntime.ClearDiv(AFTER_RESULT_DIV_ID);
|
||||||
|
|
||||||
|
this.ResetFrom();
|
||||||
|
|
||||||
|
this.inputIsValid = false;
|
||||||
|
this.inputIssues = [];
|
||||||
|
|
||||||
|
this.form?.ResetValidation();
|
||||||
|
this.StateHasChanged();
|
||||||
|
this.form?.ResetValidation();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -13,6 +13,8 @@ public partial class Changelog
|
|||||||
|
|
||||||
public static readonly Log[] LOGS =
|
public static readonly Log[] LOGS =
|
||||||
[
|
[
|
||||||
|
new (172, "v0.8.10, build 172 (2024-08-18 19:44 UTC)", "v0.8.10.md"),
|
||||||
|
new (171, "v0.8.9, build 171 (2024-08-18 10:35 UTC)", "v0.8.9.md"),
|
||||||
new (170, "v0.8.8, build 170 (2024-08-14 06:30 UTC)", "v0.8.8.md"),
|
new (170, "v0.8.8, build 170 (2024-08-14 06:30 UTC)", "v0.8.8.md"),
|
||||||
new (169, "v0.8.7, build 169 (2024-08-01 19:08 UTC)", "v0.8.7.md"),
|
new (169, "v0.8.7, build 169 (2024-08-01 19:08 UTC)", "v0.8.7.md"),
|
||||||
new (168, "v0.8.6, build 168 (2024-08-01 19:50 UTC)", "v0.8.6.md"),
|
new (168, "v0.8.6, build 168 (2024-08-01 19:50 UTC)", "v0.8.6.md"),
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
@typeparam T
|
||||||
|
|
||||||
|
<MudButtonGroup Color="@this.Color" Variant="Variant.Filled">
|
||||||
|
@if (string.IsNullOrWhiteSpace(this.Icon))
|
||||||
|
{
|
||||||
|
<MudButton OnClick="() => this.OnClick(this.selectedValue)">
|
||||||
|
@this.SelectedValueName()
|
||||||
|
</MudButton>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<MudButton StartIcon="@this.Icon" OnClick="() => this.OnClick(this.selectedValue)">
|
||||||
|
@this.SelectedValueName()
|
||||||
|
</MudButton>
|
||||||
|
}
|
||||||
|
<MudMenu Icon="@Icons.Material.Filled.ArrowDropDown" Style="align-self: auto;">
|
||||||
|
@foreach(var item in this.Items)
|
||||||
|
{
|
||||||
|
<MudMenuItem OnClick="() => this.SelectItem(item)">
|
||||||
|
@this.NameFunc(item)
|
||||||
|
</MudMenuItem>
|
||||||
|
}
|
||||||
|
</MudMenu>
|
||||||
|
</MudButtonGroup>
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
|
||||||
|
namespace AIStudio.Components.Blocks;
|
||||||
|
|
||||||
|
public partial class SplitButton<T> : ComponentBase
|
||||||
|
{
|
||||||
|
[Parameter]
|
||||||
|
public Color Color { get; set; } = Color.Default;
|
||||||
|
|
||||||
|
[Parameter]
|
||||||
|
public string Icon { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
[Parameter]
|
||||||
|
public IReadOnlyCollection<T> Items { get; set; } = [];
|
||||||
|
|
||||||
|
[Parameter]
|
||||||
|
public Func<T, string> NameFunc { get; set; } = _ => string.Empty;
|
||||||
|
|
||||||
|
[Parameter]
|
||||||
|
public T? PreselectedValue { get; set; }
|
||||||
|
|
||||||
|
[Parameter]
|
||||||
|
public Func<T?, Task> OnClick { get; set; } = _ => Task.CompletedTask;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// What happens when the user selects an item by the dropdown?
|
||||||
|
/// Immediate = true means that the OnClick event is triggered immediately
|
||||||
|
/// after the user selects an item. Immediate = false means that the OnClick
|
||||||
|
/// event is triggered only when the user clicks the button.
|
||||||
|
/// </summary>
|
||||||
|
[Parameter]
|
||||||
|
public bool Immediate { get; set; }
|
||||||
|
|
||||||
|
#region Overrides of ComponentBase
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
if(this.PreselectedValue is not null)
|
||||||
|
this.selectedValue = this.PreselectedValue;
|
||||||
|
else
|
||||||
|
this.selectedValue = this.Items.FirstOrDefault();
|
||||||
|
|
||||||
|
await base.OnInitializedAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private T? selectedValue;
|
||||||
|
|
||||||
|
private string SelectedValueName()
|
||||||
|
{
|
||||||
|
if(this.selectedValue is null)
|
||||||
|
return "Select...";
|
||||||
|
|
||||||
|
return this.NameFunc(this.selectedValue!);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SelectItem(T item)
|
||||||
|
{
|
||||||
|
this.selectedValue = item;
|
||||||
|
if(this.Immediate)
|
||||||
|
this.OnClick(this.selectedValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -51,12 +51,12 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, IDis
|
|||||||
|
|
||||||
private static readonly IReadOnlyCollection<NavBarItem> NAV_ITEMS = new List<NavBarItem>
|
private static readonly IReadOnlyCollection<NavBarItem> NAV_ITEMS = new List<NavBarItem>
|
||||||
{
|
{
|
||||||
new("Home", Icons.Material.Filled.Home, Color.Default, "/", true),
|
new("Home", Icons.Material.Filled.Home, Color.Default, Pages.Path.HOME, true),
|
||||||
new("Chat", Icons.Material.Filled.Chat, Color.Default, "/chat", false),
|
new("Chat", Icons.Material.Filled.Chat, Color.Default, Pages.Path.CHAT, false),
|
||||||
new("Assistants", Icons.Material.Filled.Apps, Color.Default ,"/assistants", false),
|
new("Assistants", Icons.Material.Filled.Apps, Color.Default, Pages.Path.ASSISTANTS, false),
|
||||||
new("Supporters", Icons.Material.Filled.Favorite, Color.Error ,"/supporters", false),
|
new("Supporters", Icons.Material.Filled.Favorite, Color.Error, Pages.Path.SUPPORTERS, false),
|
||||||
new("About", Icons.Material.Filled.Info, Color.Default ,"/about", false),
|
new("About", Icons.Material.Filled.Info, Color.Default, Pages.Path.ABOUT, false),
|
||||||
new("Settings", Icons.Material.Filled.Settings, Color.Default ,"/settings", false),
|
new("Settings", Icons.Material.Filled.Settings, Color.Default, Pages.Path.SETTINGS, false),
|
||||||
};
|
};
|
||||||
|
|
||||||
#region Overrides of ComponentBase
|
#region Overrides of ComponentBase
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
@page "/about"
|
@attribute [Route(Path.ABOUT)]
|
||||||
@using AIStudio.Tools
|
@using AIStudio.Tools
|
||||||
|
|
||||||
<MudText Typo="Typo.h3" Class="mb-2">About MindWork AI Studio</MudText>
|
<MudText Typo="Typo.h3" Class="mb-2">About MindWork AI Studio</MudText>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
@page "/assistant/agenda"
|
@attribute [Route(Path.ASSISTANT_AGENDA)]
|
||||||
@using AIStudio.Tools
|
@using AIStudio.Tools
|
||||||
@inherits AssistantBaseCore
|
@inherits AssistantBaseCore
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
|
using AIStudio.Chat;
|
||||||
using AIStudio.Tools;
|
using AIStudio.Tools;
|
||||||
|
|
||||||
namespace AIStudio.Components.Pages.Agenda;
|
namespace AIStudio.Components.Pages.Agenda;
|
||||||
@@ -93,6 +94,78 @@ public partial class AssistantAgenda : AssistantBaseCore
|
|||||||
- Mary Jane: Work package 3
|
- Mary Jane: Work package 3
|
||||||
""";
|
""";
|
||||||
|
|
||||||
|
protected override IReadOnlyList<IButtonData> FooterButtons =>
|
||||||
|
[
|
||||||
|
new SendToButton
|
||||||
|
{
|
||||||
|
Self = SendTo.AGENDA_ASSISTANT,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
protected override ChatThread ConvertToChatThread => (this.chatThread ?? new()) with
|
||||||
|
{
|
||||||
|
SystemPrompt = SystemPrompts.DEFAULT,
|
||||||
|
};
|
||||||
|
|
||||||
|
protected override void ResetFrom()
|
||||||
|
{
|
||||||
|
this.inputContent = string.Empty;
|
||||||
|
this.contentLines.Clear();
|
||||||
|
this.selectedFoci = [];
|
||||||
|
this.justBriefly = [];
|
||||||
|
this.inputWhoIsPresenting = string.Empty;
|
||||||
|
if (!this.MightPreselectValues())
|
||||||
|
{
|
||||||
|
this.inputTopic = string.Empty;
|
||||||
|
this.inputName = string.Empty;
|
||||||
|
this.inputDuration = string.Empty;
|
||||||
|
this.inputStartTime = string.Empty;
|
||||||
|
this.inputObjective = string.Empty;
|
||||||
|
this.inputModerator = string.Empty;
|
||||||
|
this.selectedTargetLanguage = CommonLanguages.AS_IS;
|
||||||
|
this.customTargetLanguage = string.Empty;
|
||||||
|
this.introduceParticipants = false;
|
||||||
|
this.isMeetingVirtual = true;
|
||||||
|
this.inputLocation = string.Empty;
|
||||||
|
this.goingToDinner = false;
|
||||||
|
this.doingSocialActivity = false;
|
||||||
|
this.needToArriveAndDepart = false;
|
||||||
|
this.durationLunchBreak = 0;
|
||||||
|
this.durationBreaks = 0;
|
||||||
|
this.activeParticipation = false;
|
||||||
|
this.numberParticipants = NumberParticipants.NOT_SPECIFIED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool MightPreselectValues()
|
||||||
|
{
|
||||||
|
if (this.SettingsManager.ConfigurationData.Agenda.PreselectOptions)
|
||||||
|
{
|
||||||
|
this.inputTopic = this.SettingsManager.ConfigurationData.Agenda.PreselectTopic;
|
||||||
|
this.inputName = this.SettingsManager.ConfigurationData.Agenda.PreselectName;
|
||||||
|
this.inputDuration = this.SettingsManager.ConfigurationData.Agenda.PreselectDuration;
|
||||||
|
this.inputStartTime = this.SettingsManager.ConfigurationData.Agenda.PreselectStartTime;
|
||||||
|
this.inputObjective = this.SettingsManager.ConfigurationData.Agenda.PreselectObjective;
|
||||||
|
this.inputModerator = this.SettingsManager.ConfigurationData.Agenda.PreselectModerator;
|
||||||
|
this.selectedTargetLanguage = this.SettingsManager.ConfigurationData.Agenda.PreselectedTargetLanguage;
|
||||||
|
this.customTargetLanguage = this.SettingsManager.ConfigurationData.Agenda.PreselectedOtherLanguage;
|
||||||
|
this.introduceParticipants = this.SettingsManager.ConfigurationData.Agenda.PreselectIntroduceParticipants;
|
||||||
|
this.isMeetingVirtual = this.SettingsManager.ConfigurationData.Agenda.PreselectIsMeetingVirtual;
|
||||||
|
this.inputLocation = this.SettingsManager.ConfigurationData.Agenda.PreselectLocation;
|
||||||
|
this.goingToDinner = this.SettingsManager.ConfigurationData.Agenda.PreselectJointDinner;
|
||||||
|
this.doingSocialActivity = this.SettingsManager.ConfigurationData.Agenda.PreselectSocialActivity;
|
||||||
|
this.needToArriveAndDepart = this.SettingsManager.ConfigurationData.Agenda.PreselectArriveAndDepart;
|
||||||
|
this.durationLunchBreak = this.SettingsManager.ConfigurationData.Agenda.PreselectLunchTime;
|
||||||
|
this.durationBreaks = this.SettingsManager.ConfigurationData.Agenda.PreselectBreakTime;
|
||||||
|
this.activeParticipation = this.SettingsManager.ConfigurationData.Agenda.PreselectActiveParticipation;
|
||||||
|
this.numberParticipants = this.SettingsManager.ConfigurationData.Agenda.PreselectNumberParticipants;
|
||||||
|
this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.Agenda.PreselectedProvider);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private string inputTopic = string.Empty;
|
private string inputTopic = string.Empty;
|
||||||
private string inputName = string.Empty;
|
private string inputName = string.Empty;
|
||||||
private string inputContent = string.Empty;
|
private string inputContent = string.Empty;
|
||||||
@@ -122,28 +195,10 @@ public partial class AssistantAgenda : AssistantBaseCore
|
|||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
if (this.SettingsManager.ConfigurationData.Agenda.PreselectOptions)
|
this.MightPreselectValues();
|
||||||
{
|
var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages<string>(Event.SEND_TO_AGENDA_ASSISTANT).FirstOrDefault();
|
||||||
this.inputTopic = this.SettingsManager.ConfigurationData.Agenda.PreselectTopic;
|
if (deferredContent is not null)
|
||||||
this.inputName = this.SettingsManager.ConfigurationData.Agenda.PreselectName;
|
this.inputContent = deferredContent;
|
||||||
this.inputDuration = this.SettingsManager.ConfigurationData.Agenda.PreselectDuration;
|
|
||||||
this.inputStartTime = this.SettingsManager.ConfigurationData.Agenda.PreselectStartTime;
|
|
||||||
this.inputObjective = this.SettingsManager.ConfigurationData.Agenda.PreselectObjective;
|
|
||||||
this.inputModerator = this.SettingsManager.ConfigurationData.Agenda.PreselectModerator;
|
|
||||||
this.selectedTargetLanguage = this.SettingsManager.ConfigurationData.Agenda.PreselectedTargetLanguage;
|
|
||||||
this.customTargetLanguage = this.SettingsManager.ConfigurationData.Agenda.PreselectedOtherLanguage;
|
|
||||||
this.introduceParticipants = this.SettingsManager.ConfigurationData.Agenda.PreselectIntroduceParticipants;
|
|
||||||
this.isMeetingVirtual = this.SettingsManager.ConfigurationData.Agenda.PreselectIsMeetingVirtual;
|
|
||||||
this.inputLocation = this.SettingsManager.ConfigurationData.Agenda.PreselectLocation;
|
|
||||||
this.goingToDinner = this.SettingsManager.ConfigurationData.Agenda.PreselectJointDinner;
|
|
||||||
this.doingSocialActivity = this.SettingsManager.ConfigurationData.Agenda.PreselectSocialActivity;
|
|
||||||
this.needToArriveAndDepart = this.SettingsManager.ConfigurationData.Agenda.PreselectArriveAndDepart;
|
|
||||||
this.durationLunchBreak = this.SettingsManager.ConfigurationData.Agenda.PreselectLunchTime;
|
|
||||||
this.durationBreaks = this.SettingsManager.ConfigurationData.Agenda.PreselectBreakTime;
|
|
||||||
this.activeParticipation = this.SettingsManager.ConfigurationData.Agenda.PreselectActiveParticipation;
|
|
||||||
this.numberParticipants = this.SettingsManager.ConfigurationData.Agenda.PreselectNumberParticipants;
|
|
||||||
this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.Agenda.PreselectedProvider);
|
|
||||||
}
|
|
||||||
|
|
||||||
await base.OnInitializedAsync();
|
await base.OnInitializedAsync();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
@page "/assistants"
|
@attribute [Route(Path.ASSISTANTS)]
|
||||||
|
|
||||||
<MudText Typo="Typo.h3" Class="mb-2 mr-3">
|
<MudText Typo="Typo.h3" Class="mb-2 mr-3">
|
||||||
Assistants
|
Assistants
|
||||||
@@ -10,25 +10,25 @@
|
|||||||
General
|
General
|
||||||
</MudText>
|
</MudText>
|
||||||
<MudStack Row="@true" Wrap="@Wrap.Wrap" Class="mb-3">
|
<MudStack Row="@true" Wrap="@Wrap.Wrap" Class="mb-3">
|
||||||
<AssistantBlock Name="Text Summarizer" Description="Using a LLM to summarize a given text." Icon="@Icons.Material.Filled.TextSnippet" Link="/assistant/summarizer"/>
|
<AssistantBlock Name="Text Summarizer" Description="Using a LLM to summarize a given text." Icon="@Icons.Material.Filled.TextSnippet" Link="@Path.ASSISTANT_SUMMARIZER"/>
|
||||||
<AssistantBlock Name="Translation" Description="Translate text into another language." Icon="@Icons.Material.Filled.Translate" Link="/assistant/translation"/>
|
<AssistantBlock Name="Translation" Description="Translate text into another language." Icon="@Icons.Material.Filled.Translate" Link="@Path.ASSISTANT_TRANSLATION"/>
|
||||||
<AssistantBlock Name="Grammar & Spelling" Description="Check grammar and spelling of a given text." Icon="@Icons.Material.Filled.Edit" Link="/assistant/grammar-spelling"/>
|
<AssistantBlock Name="Grammar & Spelling" Description="Check grammar and spelling of a given text." Icon="@Icons.Material.Filled.Edit" Link="@Path.ASSISTANT_GRAMMAR_SPELLING"/>
|
||||||
<AssistantBlock Name="Rewrite & Improve" Description="Rewrite and improve a given text for a chosen style." Icon="@Icons.Material.Filled.Edit" Link="/assistant/rewrite-improve"/>
|
<AssistantBlock Name="Rewrite & Improve" Description="Rewrite and improve a given text for a chosen style." Icon="@Icons.Material.Filled.Edit" Link="@Path.ASSISTANT_REWRITE"/>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
|
|
||||||
<MudText Typo="Typo.h4" Class="mb-2 mr-3 mt-6">
|
<MudText Typo="Typo.h4" Class="mb-2 mr-3 mt-6">
|
||||||
Business
|
Business
|
||||||
</MudText>
|
</MudText>
|
||||||
<MudStack Row="@true" Wrap="@Wrap.Wrap" Class="mb-3">
|
<MudStack Row="@true" Wrap="@Wrap.Wrap" Class="mb-3">
|
||||||
<AssistantBlock Name="Agenda Planner" Description="Generate an agenda for a given meeting, seminar, etc." Icon="@Icons.Material.Filled.CalendarToday" Link="/assistant/agenda"/>
|
<AssistantBlock Name="Agenda Planner" Description="Generate an agenda for a given meeting, seminar, etc." Icon="@Icons.Material.Filled.CalendarToday" Link="@Path.ASSISTANT_AGENDA"/>
|
||||||
<AssistantBlock Name="Icon Finder" Description="Using a LLM to find an icon for a given context." Icon="@Icons.Material.Filled.FindInPage" Link="/assistant/icons"/>
|
<AssistantBlock Name="Icon Finder" Description="Using a LLM to find an icon for a given context." Icon="@Icons.Material.Filled.FindInPage" Link="@Path.ASSISTANT_ICON_FINDER"/>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
|
|
||||||
<MudText Typo="Typo.h4" Class="mb-2 mr-3 mt-6">
|
<MudText Typo="Typo.h4" Class="mb-2 mr-3 mt-6">
|
||||||
Software Engineering
|
Software Engineering
|
||||||
</MudText>
|
</MudText>
|
||||||
<MudStack Row="@true" Wrap="@Wrap.Wrap" Class="mb-3">
|
<MudStack Row="@true" Wrap="@Wrap.Wrap" Class="mb-3">
|
||||||
<AssistantBlock Name="Coding" Description="Get coding and debugging support from a LLM." Icon="@Icons.Material.Filled.Code" Link="/assistant/coding"/>
|
<AssistantBlock Name="Coding" Description="Get coding and debugging support from a LLM." Icon="@Icons.Material.Filled.Code" Link="@Path.ASSISTANT_CODING"/>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
|
|
||||||
</InnerScrolling>
|
</InnerScrolling>
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
@page "/chat"
|
@attribute [Route(Path.CHAT)]
|
||||||
@using AIStudio.Chat
|
@using AIStudio.Chat
|
||||||
@using AIStudio.Settings.DataModel
|
@using AIStudio.Settings.DataModel
|
||||||
|
|
||||||
|
|||||||
@@ -62,6 +62,24 @@ public partial class Chat : MSGComponentBase, IAsyncDisposable
|
|||||||
this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.Chat.PreselectedProvider);
|
this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.Chat.PreselectedProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages<ChatThread>(Event.SEND_TO_CHAT).FirstOrDefault();
|
||||||
|
if (deferredContent is not null)
|
||||||
|
{
|
||||||
|
this.chatThread = deferredContent;
|
||||||
|
if (this.chatThread is not null)
|
||||||
|
{
|
||||||
|
var firstUserBlock = this.chatThread.Blocks.FirstOrDefault(x => x.Role == ChatRole.USER);
|
||||||
|
if (firstUserBlock is not null)
|
||||||
|
{
|
||||||
|
this.chatThread.Name = firstUserBlock.Content switch
|
||||||
|
{
|
||||||
|
ContentText textBlock => this.ExtractThreadName(textBlock.Text),
|
||||||
|
_ => "Thread"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
await base.OnInitializedAsync();
|
await base.OnInitializedAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,7 +111,7 @@ public partial class Chat : MSGComponentBase, IAsyncDisposable
|
|||||||
ChatId = Guid.NewGuid(),
|
ChatId = Guid.NewGuid(),
|
||||||
Name = threadName,
|
Name = threadName,
|
||||||
Seed = this.RNG.Next(),
|
Seed = this.RNG.Next(),
|
||||||
SystemPrompt = "You are a helpful assistant!",
|
SystemPrompt = SystemPrompts.DEFAULT,
|
||||||
Blocks = [],
|
Blocks = [],
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -250,11 +268,11 @@ public partial class Chat : MSGComponentBase, IAsyncDisposable
|
|||||||
string chatPath;
|
string chatPath;
|
||||||
if (this.chatThread.WorkspaceId == Guid.Empty)
|
if (this.chatThread.WorkspaceId == Guid.Empty)
|
||||||
{
|
{
|
||||||
chatPath = Path.Join(SettingsManager.DataDirectory, "tempChats", this.chatThread.ChatId.ToString());
|
chatPath = System.IO.Path.Join(SettingsManager.DataDirectory, "tempChats", this.chatThread.ChatId.ToString());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
chatPath = Path.Join(SettingsManager.DataDirectory, "workspaces", this.chatThread.WorkspaceId.ToString(), this.chatThread.ChatId.ToString());
|
chatPath = System.IO.Path.Join(SettingsManager.DataDirectory, "workspaces", this.chatThread.WorkspaceId.ToString(), this.chatThread.ChatId.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.workspaces.DeleteChat(chatPath, askForConfirmation: false, unloadChat: true);
|
await this.workspaces.DeleteChat(chatPath, askForConfirmation: false, unloadChat: true);
|
||||||
@@ -327,12 +345,12 @@ public partial class Chat : MSGComponentBase, IAsyncDisposable
|
|||||||
if (this.chatThread!.WorkspaceId == Guid.Empty)
|
if (this.chatThread!.WorkspaceId == Guid.Empty)
|
||||||
{
|
{
|
||||||
// Case: The chat is stored in the temporary storage:
|
// Case: The chat is stored in the temporary storage:
|
||||||
await this.workspaces.DeleteChat(Path.Join(SettingsManager.DataDirectory, "tempChats", this.chatThread.ChatId.ToString()), askForConfirmation: false, unloadChat: false);
|
await this.workspaces.DeleteChat(System.IO.Path.Join(SettingsManager.DataDirectory, "tempChats", this.chatThread.ChatId.ToString()), askForConfirmation: false, unloadChat: false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Case: The chat is stored in a workspace.
|
// Case: The chat is stored in a workspace.
|
||||||
await this.workspaces.DeleteChat(Path.Join(SettingsManager.DataDirectory, "workspaces", this.chatThread.WorkspaceId.ToString(), this.chatThread.ChatId.ToString()), askForConfirmation: false, unloadChat: false);
|
await this.workspaces.DeleteChat(System.IO.Path.Join(SettingsManager.DataDirectory, "workspaces", this.chatThread.WorkspaceId.ToString(), this.chatThread.ChatId.ToString()), askForConfirmation: false, unloadChat: false);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.chatThread!.WorkspaceId = workspaceId;
|
this.chatThread!.WorkspaceId = workspaceId;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
@page "/assistant/coding"
|
@attribute [Route(Path.ASSISTANT_CODING)]
|
||||||
@inherits AssistantBaseCore
|
@inherits AssistantBaseCore
|
||||||
|
|
||||||
<MudExpansionPanels Class="mb-3">
|
<MudExpansionPanels Class="mb-3">
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
|
using AIStudio.Tools;
|
||||||
|
|
||||||
namespace AIStudio.Components.Pages.Coding;
|
namespace AIStudio.Components.Pages.Coding;
|
||||||
|
|
||||||
public partial class AssistantCoding : AssistantBaseCore
|
public partial class AssistantCoding : AssistantBaseCore
|
||||||
@@ -24,6 +26,37 @@ public partial class AssistantCoding : AssistantBaseCore
|
|||||||
When the user asks in a different language than English, you answer in the same language!
|
When the user asks in a different language than English, you answer in the same language!
|
||||||
""";
|
""";
|
||||||
|
|
||||||
|
protected override IReadOnlyList<IButtonData> FooterButtons =>
|
||||||
|
[
|
||||||
|
new SendToButton
|
||||||
|
{
|
||||||
|
Self = SendTo.CODING_ASSISTANT,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
protected override void ResetFrom()
|
||||||
|
{
|
||||||
|
this.codingContexts.Clear();
|
||||||
|
this.compilerMessages = string.Empty;
|
||||||
|
this.questions = string.Empty;
|
||||||
|
if (!this.MightPreselectValues())
|
||||||
|
{
|
||||||
|
this.provideCompilerMessages = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool MightPreselectValues()
|
||||||
|
{
|
||||||
|
if (this.SettingsManager.ConfigurationData.Coding.PreselectOptions)
|
||||||
|
{
|
||||||
|
this.provideCompilerMessages = this.SettingsManager.ConfigurationData.Coding.PreselectCompilerMessages;
|
||||||
|
this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.Coding.PreselectedProvider);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private readonly List<CodingContext> codingContexts = new();
|
private readonly List<CodingContext> codingContexts = new();
|
||||||
private bool provideCompilerMessages;
|
private bool provideCompilerMessages;
|
||||||
private string compilerMessages = string.Empty;
|
private string compilerMessages = string.Empty;
|
||||||
@@ -33,11 +66,10 @@ public partial class AssistantCoding : AssistantBaseCore
|
|||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
if (this.SettingsManager.ConfigurationData.Coding.PreselectOptions)
|
this.MightPreselectValues();
|
||||||
{
|
var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages<string>(Event.SEND_TO_CODING_ASSISTANT).FirstOrDefault();
|
||||||
this.provideCompilerMessages = this.SettingsManager.ConfigurationData.Coding.PreselectCompilerMessages;
|
if (deferredContent is not null)
|
||||||
this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.Coding.PreselectedProvider);
|
this.questions = deferredContent;
|
||||||
}
|
|
||||||
|
|
||||||
await base.OnInitializedAsync();
|
await base.OnInitializedAsync();
|
||||||
}
|
}
|
||||||
@@ -87,9 +119,13 @@ public partial class AssistantCoding : AssistantBaseCore
|
|||||||
foreach (var codingContext in this.codingContexts)
|
foreach (var codingContext in this.codingContexts)
|
||||||
{
|
{
|
||||||
sbContext.AppendLine($"ID: {codingContext.Id}");
|
sbContext.AppendLine($"ID: {codingContext.Id}");
|
||||||
sbContext.AppendLine($"Language: {codingContext.Language.Name()}");
|
|
||||||
sbContext.AppendLine($"Other Language: {codingContext.OtherLanguage}");
|
if(codingContext.Language is not CommonCodingLanguages.OTHER)
|
||||||
sbContext.AppendLine($"Content:");
|
sbContext.AppendLine($"Language: {codingContext.Language.Name()}");
|
||||||
|
else
|
||||||
|
sbContext.AppendLine($"Language: {codingContext.OtherLanguage}");
|
||||||
|
|
||||||
|
sbContext.AppendLine("Content:");
|
||||||
sbContext.AppendLine("```");
|
sbContext.AppendLine("```");
|
||||||
sbContext.AppendLine(codingContext.Code);
|
sbContext.AppendLine(codingContext.Code);
|
||||||
sbContext.AppendLine("```");
|
sbContext.AppendLine("```");
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
@using AIStudio.Tools
|
@using AIStudio.Tools
|
||||||
@page "/assistant/grammar-spelling"
|
@attribute [Route(Path.ASSISTANT_GRAMMAR_SPELLING)]
|
||||||
@inherits AssistantBaseCore
|
@inherits AssistantBaseCore
|
||||||
|
|
||||||
<MudTextField T="string" @bind-Text="@this.inputText" Validation="@this.ValidateText" AdornmentIcon="@Icons.Material.Filled.DocumentScanner" Adornment="Adornment.Start" Label="Your input to check" Variant="Variant.Outlined" Lines="6" AutoGrow="@true" MaxLines="12" Class="mb-3" UserAttributes="@USER_INPUT_ATTRIBUTES"/>
|
<MudTextField T="string" @bind-Text="@this.inputText" Validation="@this.ValidateText" AdornmentIcon="@Icons.Material.Filled.DocumentScanner" Adornment="Adornment.Start" Label="Your input to check" Variant="Variant.Outlined" Lines="6" AutoGrow="@true" MaxLines="12" Class="mb-3" UserAttributes="@USER_INPUT_ATTRIBUTES"/>
|
||||||
|
|||||||
+38
-4
@@ -1,3 +1,4 @@
|
|||||||
|
using AIStudio.Chat;
|
||||||
using AIStudio.Tools;
|
using AIStudio.Tools;
|
||||||
|
|
||||||
namespace AIStudio.Components.Pages.GrammarSpelling;
|
namespace AIStudio.Components.Pages.GrammarSpelling;
|
||||||
@@ -25,22 +26,55 @@ public partial class AssistantGrammarSpelling : AssistantBaseCore
|
|||||||
|
|
||||||
protected override bool ShowDedicatedProgress => true;
|
protected override bool ShowDedicatedProgress => true;
|
||||||
|
|
||||||
protected override IReadOnlyList<ButtonData> FooterButtons => new[]
|
protected override IReadOnlyList<IButtonData> FooterButtons =>
|
||||||
{
|
[
|
||||||
new ButtonData("Copy result", Icons.Material.Filled.ContentCopy, Color.Default, string.Empty, () => this.CopyToClipboard(this.correctedText)),
|
new ButtonData("Copy result", Icons.Material.Filled.ContentCopy, Color.Default, string.Empty, () => this.CopyToClipboard(this.correctedText)),
|
||||||
|
new SendToButton
|
||||||
|
{
|
||||||
|
Self = SendTo.GRAMMAR_SPELLING_ASSISTANT,
|
||||||
|
UseResultingContentBlockData = false,
|
||||||
|
GetText = () => string.IsNullOrWhiteSpace(this.correctedText) ? this.inputText : this.correctedText
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
protected override ChatThread ConvertToChatThread => (this.chatThread ?? new()) with
|
||||||
|
{
|
||||||
|
SystemPrompt = SystemPrompts.DEFAULT,
|
||||||
};
|
};
|
||||||
|
|
||||||
#region Overrides of ComponentBase
|
protected override void ResetFrom()
|
||||||
|
{
|
||||||
|
this.inputText = string.Empty;
|
||||||
|
this.correctedText = string.Empty;
|
||||||
|
if (!this.MightPreselectValues())
|
||||||
|
{
|
||||||
|
this.selectedTargetLanguage = CommonLanguages.AS_IS;
|
||||||
|
this.customTargetLanguage = string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override bool MightPreselectValues()
|
||||||
{
|
{
|
||||||
if (this.SettingsManager.ConfigurationData.GrammarSpelling.PreselectOptions)
|
if (this.SettingsManager.ConfigurationData.GrammarSpelling.PreselectOptions)
|
||||||
{
|
{
|
||||||
this.selectedTargetLanguage = this.SettingsManager.ConfigurationData.GrammarSpelling.PreselectedTargetLanguage;
|
this.selectedTargetLanguage = this.SettingsManager.ConfigurationData.GrammarSpelling.PreselectedTargetLanguage;
|
||||||
this.customTargetLanguage = this.SettingsManager.ConfigurationData.GrammarSpelling.PreselectedOtherLanguage;
|
this.customTargetLanguage = this.SettingsManager.ConfigurationData.GrammarSpelling.PreselectedOtherLanguage;
|
||||||
this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.GrammarSpelling.PreselectedProvider);
|
this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.GrammarSpelling.PreselectedProvider);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Overrides of ComponentBase
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
this.MightPreselectValues();
|
||||||
|
var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages<string>(Event.SEND_TO_GRAMMAR_SPELLING_ASSISTANT).FirstOrDefault();
|
||||||
|
if (deferredContent is not null)
|
||||||
|
this.inputText = deferredContent;
|
||||||
|
|
||||||
await base.OnInitializedAsync();
|
await base.OnInitializedAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
@page "/"
|
@attribute [Route(Path.HOME)]
|
||||||
@using AIStudio.Tools
|
@using AIStudio.Tools
|
||||||
|
|
||||||
<MudImage Src="svg/banner.svg" />
|
<MudImage Src="svg/banner.svg" />
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
@page "/assistant/icons"
|
@attribute [Route(Path.ASSISTANT_ICON_FINDER)]
|
||||||
@inherits AssistantBaseCore
|
@inherits AssistantBaseCore
|
||||||
|
|
||||||
<MudTextField T="string" @bind-Text="@this.inputContext" Validation="@this.ValidatingContext" AdornmentIcon="@Icons.Material.Filled.Description" Adornment="Adornment.Start" Label="Your context" Variant="Variant.Outlined" Lines="3" AutoGrow="@true" MaxLines="12" Class="mb-3" UserAttributes="@USER_INPUT_ATTRIBUTES"/>
|
<MudTextField T="string" @bind-Text="@this.inputContext" Validation="@this.ValidatingContext" AdornmentIcon="@Icons.Material.Filled.Description" Adornment="Adornment.Start" Label="Your context" Variant="Variant.Outlined" Lines="3" AutoGrow="@true" MaxLines="12" Class="mb-3" UserAttributes="@USER_INPUT_ATTRIBUTES"/>
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
using AIStudio.Tools;
|
||||||
|
|
||||||
namespace AIStudio.Components.Pages.IconFinder;
|
namespace AIStudio.Components.Pages.IconFinder;
|
||||||
|
|
||||||
public partial class AssistantIconFinder : AssistantBaseCore
|
public partial class AssistantIconFinder : AssistantBaseCore
|
||||||
@@ -5,21 +7,6 @@ public partial class AssistantIconFinder : AssistantBaseCore
|
|||||||
private string inputContext = string.Empty;
|
private string inputContext = string.Empty;
|
||||||
private IconSources selectedIconSource;
|
private IconSources selectedIconSource;
|
||||||
|
|
||||||
#region Overrides of ComponentBase
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
|
||||||
{
|
|
||||||
if (this.SettingsManager.ConfigurationData.IconFinder.PreselectOptions)
|
|
||||||
{
|
|
||||||
this.selectedIconSource = this.SettingsManager.ConfigurationData.IconFinder.PreselectedSource;
|
|
||||||
this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.IconFinder.PreselectedProvider);
|
|
||||||
}
|
|
||||||
|
|
||||||
await base.OnInitializedAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
protected override string Title => "Icon Finder";
|
protected override string Title => "Icon Finder";
|
||||||
|
|
||||||
protected override string Description =>
|
protected override string Description =>
|
||||||
@@ -40,7 +27,50 @@ public partial class AssistantIconFinder : AssistantBaseCore
|
|||||||
related to the keyword "buildings" might be the best match. Provide your keywords in a Markdown list without
|
related to the keyword "buildings" might be the best match. Provide your keywords in a Markdown list without
|
||||||
quotation marks.
|
quotation marks.
|
||||||
""";
|
""";
|
||||||
|
|
||||||
|
protected override IReadOnlyList<IButtonData> FooterButtons =>
|
||||||
|
[
|
||||||
|
new SendToButton
|
||||||
|
{
|
||||||
|
Self = SendTo.ICON_FINDER_ASSISTANT,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
protected override void ResetFrom()
|
||||||
|
{
|
||||||
|
this.inputContext = string.Empty;
|
||||||
|
if (!this.MightPreselectValues())
|
||||||
|
{
|
||||||
|
this.selectedIconSource = IconSources.GENERIC;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool MightPreselectValues()
|
||||||
|
{
|
||||||
|
if (this.SettingsManager.ConfigurationData.IconFinder.PreselectOptions)
|
||||||
|
{
|
||||||
|
this.selectedIconSource = this.SettingsManager.ConfigurationData.IconFinder.PreselectedSource;
|
||||||
|
this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.IconFinder.PreselectedProvider);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Overrides of ComponentBase
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
this.MightPreselectValues();
|
||||||
|
var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages<string>(Event.SEND_TO_ICON_FINDER_ASSISTANT).FirstOrDefault();
|
||||||
|
if (deferredContent is not null)
|
||||||
|
this.inputContext = deferredContent;
|
||||||
|
|
||||||
|
await base.OnInitializedAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
private string? ValidatingContext(string context)
|
private string? ValidatingContext(string context)
|
||||||
{
|
{
|
||||||
if(string.IsNullOrWhiteSpace(context))
|
if(string.IsNullOrWhiteSpace(context))
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
namespace AIStudio.Components.Pages;
|
||||||
|
|
||||||
|
public static class Path
|
||||||
|
{
|
||||||
|
public const string HOME = "/";
|
||||||
|
public const string CHAT = "/chat";
|
||||||
|
public const string ABOUT = "/about";
|
||||||
|
public const string ASSISTANTS = "/assistants";
|
||||||
|
public const string SETTINGS = "/settings";
|
||||||
|
public const string SUPPORTERS = "/supporters";
|
||||||
|
|
||||||
|
public const string ASSISTANT_TRANSLATION = "/assistant/translation";
|
||||||
|
public const string ASSISTANT_REWRITE = "/assistant/rewrite-improve";
|
||||||
|
public const string ASSISTANT_ICON_FINDER = "/assistant/icons";
|
||||||
|
public const string ASSISTANT_GRAMMAR_SPELLING = "/assistant/grammar-spelling";
|
||||||
|
public const string ASSISTANT_SUMMARIZER = "/assistant/summarizer";
|
||||||
|
public const string ASSISTANT_CODING = "/assistant/coding";
|
||||||
|
public const string ASSISTANT_AGENDA = "/assistant/agenda";
|
||||||
|
}
|
||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
@using AIStudio.Tools
|
@using AIStudio.Tools
|
||||||
@page "/assistant/rewrite-improve"
|
@attribute [Route(Path.ASSISTANT_REWRITE)]
|
||||||
@inherits AssistantBaseCore
|
@inherits AssistantBaseCore
|
||||||
|
|
||||||
<MudTextField T="string" @bind-Text="@this.inputText" Validation="@this.ValidateText" AdornmentIcon="@Icons.Material.Filled.DocumentScanner" Adornment="Adornment.Start" Label="Your input to improve" Variant="Variant.Outlined" Lines="6" AutoGrow="@true" MaxLines="12" Class="mb-3" UserAttributes="@USER_INPUT_ATTRIBUTES"/>
|
<MudTextField T="string" @bind-Text="@this.inputText" Validation="@this.ValidateText" AdornmentIcon="@Icons.Material.Filled.DocumentScanner" Adornment="Adornment.Start" Label="Your input to improve" Variant="Variant.Outlined" Lines="6" AutoGrow="@true" MaxLines="12" Class="mb-3" UserAttributes="@USER_INPUT_ATTRIBUTES"/>
|
||||||
|
|||||||
+40
-9
@@ -1,3 +1,4 @@
|
|||||||
|
using AIStudio.Chat;
|
||||||
using AIStudio.Tools;
|
using AIStudio.Tools;
|
||||||
|
|
||||||
namespace AIStudio.Components.Pages.RewriteImprove;
|
namespace AIStudio.Components.Pages.RewriteImprove;
|
||||||
@@ -24,20 +25,37 @@ public partial class AssistantRewriteImprove : AssistantBaseCore
|
|||||||
|
|
||||||
protected override bool ShowResult => false;
|
protected override bool ShowResult => false;
|
||||||
|
|
||||||
#region Overrides of AssistantBase
|
|
||||||
|
|
||||||
protected override bool ShowDedicatedProgress => true;
|
protected override bool ShowDedicatedProgress => true;
|
||||||
|
|
||||||
#endregion
|
protected override IReadOnlyList<IButtonData> FooterButtons =>
|
||||||
|
[
|
||||||
protected override IReadOnlyList<ButtonData> FooterButtons => new[]
|
|
||||||
{
|
|
||||||
new ButtonData("Copy result", Icons.Material.Filled.ContentCopy, Color.Default, string.Empty, () => this.CopyToClipboard(this.rewrittenText)),
|
new ButtonData("Copy result", Icons.Material.Filled.ContentCopy, Color.Default, string.Empty, () => this.CopyToClipboard(this.rewrittenText)),
|
||||||
};
|
new SendToButton
|
||||||
|
{
|
||||||
|
Self = SendTo.REWRITE_ASSISTANT,
|
||||||
|
UseResultingContentBlockData = false,
|
||||||
|
GetText = () => string.IsNullOrWhiteSpace(this.rewrittenText) ? this.inputText : this.rewrittenText,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
#region Overrides of ComponentBase
|
protected override ChatThread ConvertToChatThread => (this.chatThread ?? new()) with
|
||||||
|
{
|
||||||
|
SystemPrompt = SystemPrompts.DEFAULT,
|
||||||
|
};
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override void ResetFrom()
|
||||||
|
{
|
||||||
|
this.inputText = string.Empty;
|
||||||
|
this.rewrittenText = string.Empty;
|
||||||
|
if (!this.MightPreselectValues())
|
||||||
|
{
|
||||||
|
this.selectedTargetLanguage = CommonLanguages.AS_IS;
|
||||||
|
this.customTargetLanguage = string.Empty;
|
||||||
|
this.selectedWritingStyle = WritingStyles.NOT_SPECIFIED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool MightPreselectValues()
|
||||||
{
|
{
|
||||||
if (this.SettingsManager.ConfigurationData.RewriteImprove.PreselectOptions)
|
if (this.SettingsManager.ConfigurationData.RewriteImprove.PreselectOptions)
|
||||||
{
|
{
|
||||||
@@ -45,8 +63,21 @@ public partial class AssistantRewriteImprove : AssistantBaseCore
|
|||||||
this.customTargetLanguage = this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedOtherLanguage;
|
this.customTargetLanguage = this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedOtherLanguage;
|
||||||
this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedProvider);
|
this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedProvider);
|
||||||
this.selectedWritingStyle = this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedWritingStyle;
|
this.selectedWritingStyle = this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedWritingStyle;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Overrides of ComponentBase
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
this.MightPreselectValues();
|
||||||
|
var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages<string>(Event.SEND_TO_REWRITE_ASSISTANT).FirstOrDefault();
|
||||||
|
if (deferredContent is not null)
|
||||||
|
this.inputText = deferredContent;
|
||||||
|
|
||||||
await base.OnInitializedAsync();
|
await base.OnInitializedAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
namespace AIStudio.Components.Pages;
|
||||||
|
|
||||||
|
public enum SendTo
|
||||||
|
{
|
||||||
|
NONE = 0,
|
||||||
|
|
||||||
|
GRAMMAR_SPELLING_ASSISTANT,
|
||||||
|
ICON_FINDER_ASSISTANT,
|
||||||
|
REWRITE_ASSISTANT,
|
||||||
|
TRANSLATION_ASSISTANT,
|
||||||
|
AGENDA_ASSISTANT,
|
||||||
|
CODING_ASSISTANT,
|
||||||
|
TEXT_SUMMARIZER_ASSISTANT,
|
||||||
|
|
||||||
|
CHAT,
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
namespace AIStudio.Components.Pages;
|
||||||
|
|
||||||
|
public static class SendToExtensions
|
||||||
|
{
|
||||||
|
public static string Name(this SendTo assistant)
|
||||||
|
{
|
||||||
|
return assistant switch
|
||||||
|
{
|
||||||
|
SendTo.GRAMMAR_SPELLING_ASSISTANT => "Grammar & Spelling Assistant",
|
||||||
|
SendTo.TEXT_SUMMARIZER_ASSISTANT => "Text Summarizer Assistant",
|
||||||
|
SendTo.ICON_FINDER_ASSISTANT => "Icon Finder Assistant",
|
||||||
|
SendTo.TRANSLATION_ASSISTANT => "Translation Assistant",
|
||||||
|
SendTo.REWRITE_ASSISTANT => "Rewrite Assistant",
|
||||||
|
SendTo.AGENDA_ASSISTANT => "Agenda Assistant",
|
||||||
|
SendTo.CODING_ASSISTANT => "Coding Assistant",
|
||||||
|
|
||||||
|
SendTo.CHAT => "New Chat",
|
||||||
|
|
||||||
|
_ => "Send to ...",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
@page "/settings"
|
@attribute [Route(Path.SETTINGS)]
|
||||||
@using AIStudio.Components.Pages.Coding
|
@using AIStudio.Components.Pages.Coding
|
||||||
@using AIStudio.Components.Pages.TextSummarizer
|
@using AIStudio.Components.Pages.TextSummarizer
|
||||||
@using AIStudio.Provider
|
@using AIStudio.Provider
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
@page "/Supporters"
|
@attribute [Route(Path.SUPPORTERS)]
|
||||||
|
|
||||||
<MudText Typo="Typo.h3" Class="mb-2">Supporters</MudText>
|
<MudText Typo="Typo.h3" Class="mb-2">Supporters</MudText>
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
@page "/assistant/summarizer"
|
@attribute [Route(Path.ASSISTANT_SUMMARIZER)]
|
||||||
@using AIStudio.Tools
|
@using AIStudio.Tools
|
||||||
@inherits AssistantBaseCore
|
@inherits AssistantBaseCore
|
||||||
|
|
||||||
|
|||||||
+45
-8
@@ -1,3 +1,4 @@
|
|||||||
|
using AIStudio.Chat;
|
||||||
using AIStudio.Tools;
|
using AIStudio.Tools;
|
||||||
|
|
||||||
namespace AIStudio.Components.Pages.TextSummarizer;
|
namespace AIStudio.Components.Pages.TextSummarizer;
|
||||||
@@ -23,6 +24,46 @@ public partial class AssistantTextSummarizer : AssistantBaseCore
|
|||||||
a summary with the requested complexity. In any case, do not add any information.
|
a summary with the requested complexity. In any case, do not add any information.
|
||||||
""";
|
""";
|
||||||
|
|
||||||
|
protected override IReadOnlyList<IButtonData> FooterButtons =>
|
||||||
|
[
|
||||||
|
new SendToButton
|
||||||
|
{
|
||||||
|
Self = SendTo.TEXT_SUMMARIZER_ASSISTANT,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
protected override ChatThread ConvertToChatThread => (this.chatThread ?? new()) with
|
||||||
|
{
|
||||||
|
SystemPrompt = SystemPrompts.DEFAULT,
|
||||||
|
};
|
||||||
|
|
||||||
|
protected override void ResetFrom()
|
||||||
|
{
|
||||||
|
this.inputText = string.Empty;
|
||||||
|
if(!this.MightPreselectValues())
|
||||||
|
{
|
||||||
|
this.selectedTargetLanguage = CommonLanguages.AS_IS;
|
||||||
|
this.customTargetLanguage = string.Empty;
|
||||||
|
this.selectedComplexity = Complexity.NO_CHANGE;
|
||||||
|
this.expertInField = string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool MightPreselectValues()
|
||||||
|
{
|
||||||
|
if (this.SettingsManager.ConfigurationData.TextSummarizer.PreselectOptions)
|
||||||
|
{
|
||||||
|
this.selectedTargetLanguage = this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedTargetLanguage;
|
||||||
|
this.customTargetLanguage = this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedOtherLanguage;
|
||||||
|
this.selectedComplexity = this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedComplexity;
|
||||||
|
this.expertInField = this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedExpertInField;
|
||||||
|
this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedProvider);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private string inputText = string.Empty;
|
private string inputText = string.Empty;
|
||||||
private bool isAgentRunning;
|
private bool isAgentRunning;
|
||||||
private CommonLanguages selectedTargetLanguage;
|
private CommonLanguages selectedTargetLanguage;
|
||||||
@@ -34,14 +75,10 @@ public partial class AssistantTextSummarizer : AssistantBaseCore
|
|||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
if(this.SettingsManager.ConfigurationData.TextSummarizer.PreselectOptions)
|
this.MightPreselectValues();
|
||||||
{
|
var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages<string>(Event.SEND_TO_TEXT_SUMMARIZER_ASSISTANT).FirstOrDefault();
|
||||||
this.selectedTargetLanguage = this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedTargetLanguage;
|
if (deferredContent is not null)
|
||||||
this.customTargetLanguage = this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedOtherLanguage;
|
this.inputText = deferredContent;
|
||||||
this.selectedComplexity = this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedComplexity;
|
|
||||||
this.expertInField = this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedExpertInField;
|
|
||||||
this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.TextSummarizer.PreselectedProvider);
|
|
||||||
}
|
|
||||||
|
|
||||||
await base.OnInitializedAsync();
|
await base.OnInitializedAsync();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
@page "/assistant/translation"
|
@attribute [Route(Path.ASSISTANT_TRANSLATION)]
|
||||||
@using AIStudio.Tools
|
@using AIStudio.Tools
|
||||||
@inherits AssistantBaseCore
|
@inherits AssistantBaseCore
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using AIStudio.Chat;
|
||||||
using AIStudio.Tools;
|
using AIStudio.Tools;
|
||||||
|
|
||||||
namespace AIStudio.Components.Pages.Translation;
|
namespace AIStudio.Components.Pages.Translation;
|
||||||
@@ -19,6 +20,45 @@ public partial class AssistantTranslation : AssistantBaseCore
|
|||||||
language requires, e.g., shorter sentences, you should split the text into shorter sentences.
|
language requires, e.g., shorter sentences, you should split the text into shorter sentences.
|
||||||
""";
|
""";
|
||||||
|
|
||||||
|
protected override IReadOnlyList<IButtonData> FooterButtons =>
|
||||||
|
[
|
||||||
|
new SendToButton
|
||||||
|
{
|
||||||
|
Self = SendTo.TRANSLATION_ASSISTANT,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
protected override ChatThread ConvertToChatThread => (this.chatThread ?? new()) with
|
||||||
|
{
|
||||||
|
SystemPrompt = SystemPrompts.DEFAULT,
|
||||||
|
};
|
||||||
|
|
||||||
|
protected override void ResetFrom()
|
||||||
|
{
|
||||||
|
this.inputText = string.Empty;
|
||||||
|
this.inputTextLastTranslation = string.Empty;
|
||||||
|
if (!this.MightPreselectValues())
|
||||||
|
{
|
||||||
|
this.liveTranslation = false;
|
||||||
|
this.selectedTargetLanguage = CommonLanguages.AS_IS;
|
||||||
|
this.customTargetLanguage = string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool MightPreselectValues()
|
||||||
|
{
|
||||||
|
if (this.SettingsManager.ConfigurationData.Translation.PreselectOptions)
|
||||||
|
{
|
||||||
|
this.liveTranslation = this.SettingsManager.ConfigurationData.Translation.PreselectLiveTranslation;
|
||||||
|
this.selectedTargetLanguage = this.SettingsManager.ConfigurationData.Translation.PreselectedTargetLanguage;
|
||||||
|
this.customTargetLanguage = this.SettingsManager.ConfigurationData.Translation.PreselectOtherLanguage;
|
||||||
|
this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.Translation.PreselectedProvider);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private bool liveTranslation;
|
private bool liveTranslation;
|
||||||
private bool isAgentRunning;
|
private bool isAgentRunning;
|
||||||
private string inputText = string.Empty;
|
private string inputText = string.Empty;
|
||||||
@@ -30,13 +70,10 @@ public partial class AssistantTranslation : AssistantBaseCore
|
|||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
if (this.SettingsManager.ConfigurationData.Translation.PreselectOptions)
|
this.MightPreselectValues();
|
||||||
{
|
var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages<string>(Event.SEND_TO_TRANSLATION_ASSISTANT).FirstOrDefault();
|
||||||
this.liveTranslation = this.SettingsManager.ConfigurationData.Translation.PreselectLiveTranslation;
|
if (deferredContent is not null)
|
||||||
this.selectedTargetLanguage = this.SettingsManager.ConfigurationData.Translation.PreselectedTargetLanguage;
|
this.inputText = deferredContent;
|
||||||
this.customTargetLanguage = this.SettingsManager.ConfigurationData.Translation.PreselectOtherLanguage;
|
|
||||||
this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.Translation.PreselectedProvider);
|
|
||||||
}
|
|
||||||
|
|
||||||
await base.OnInitializedAsync();
|
await base.OnInitializedAsync();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
namespace AIStudio.Tools;
|
namespace AIStudio.Tools;
|
||||||
|
|
||||||
public readonly record struct ButtonData(string Text, string Icon, Color Color, string Tooltip, Func<Task> AsyncAction);
|
public readonly record struct ButtonData(string Text, string Icon, Color Color, string Tooltip, Func<Task> AsyncAction) : IButtonData
|
||||||
|
{
|
||||||
|
public ButtonTypes Type => ButtonTypes.BUTTON;
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
namespace AIStudio.Tools;
|
||||||
|
|
||||||
|
public enum ButtonTypes
|
||||||
|
{
|
||||||
|
BUTTON = 0,
|
||||||
|
SEND_TO,
|
||||||
|
}
|
||||||
@@ -15,4 +15,14 @@ public enum Event
|
|||||||
// Chat events:
|
// Chat events:
|
||||||
HAS_CHAT_UNSAVED_CHANGES,
|
HAS_CHAT_UNSAVED_CHANGES,
|
||||||
RESET_CHAT_STATE,
|
RESET_CHAT_STATE,
|
||||||
|
|
||||||
|
// Send events:
|
||||||
|
SEND_TO_GRAMMAR_SPELLING_ASSISTANT,
|
||||||
|
SEND_TO_ICON_FINDER_ASSISTANT,
|
||||||
|
SEND_TO_REWRITE_ASSISTANT,
|
||||||
|
SEND_TO_TRANSLATION_ASSISTANT,
|
||||||
|
SEND_TO_AGENDA_ASSISTANT,
|
||||||
|
SEND_TO_CODING_ASSISTANT,
|
||||||
|
SEND_TO_TEXT_SUMMARIZER_ASSISTANT,
|
||||||
|
SEND_TO_CHAT,
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
namespace AIStudio.Tools;
|
||||||
|
|
||||||
|
public interface IButtonData
|
||||||
|
{
|
||||||
|
public ButtonTypes Type { get; }
|
||||||
|
}
|
||||||
@@ -8,4 +8,9 @@ public static class JsRuntimeExtensions
|
|||||||
{
|
{
|
||||||
await jsRuntime.InvokeVoidAsync("generateDiff", text1, text2, AssistantBase.ASSISTANT_RESULT_DIV_ID, AssistantBase.AFTER_RESULT_DIV_ID);
|
await jsRuntime.InvokeVoidAsync("generateDiff", text1, text2, AssistantBase.ASSISTANT_RESULT_DIV_ID, AssistantBase.AFTER_RESULT_DIV_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async Task ClearDiv(this IJSRuntime jsRuntime, string divId)
|
||||||
|
{
|
||||||
|
await jsRuntime.InvokeVoidAsync("clearDiv", divId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -11,6 +11,7 @@ public sealed class MessageBus
|
|||||||
|
|
||||||
private readonly ConcurrentDictionary<IMessageBusReceiver, ComponentBase[]> componentFilters = new();
|
private readonly ConcurrentDictionary<IMessageBusReceiver, ComponentBase[]> componentFilters = new();
|
||||||
private readonly ConcurrentDictionary<IMessageBusReceiver, Event[]> componentEvents = new();
|
private readonly ConcurrentDictionary<IMessageBusReceiver, Event[]> componentEvents = new();
|
||||||
|
private readonly ConcurrentDictionary<Event, ConcurrentQueue<Message>> deferredMessages = new();
|
||||||
private readonly ConcurrentQueue<Message> messageQueue = new();
|
private readonly ConcurrentQueue<Message> messageQueue = new();
|
||||||
private readonly SemaphoreSlim sendingSemaphore = new(1, 1);
|
private readonly SemaphoreSlim sendingSemaphore = new(1, 1);
|
||||||
|
|
||||||
@@ -65,6 +66,24 @@ public sealed class MessageBus
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void DeferMessage<T>(ComponentBase? sendingComponent, Event triggeredEvent, T? data = default)
|
||||||
|
{
|
||||||
|
if (this.deferredMessages.TryGetValue(triggeredEvent, out var queue))
|
||||||
|
queue.Enqueue(new Message(sendingComponent, triggeredEvent, data));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.deferredMessages[triggeredEvent] = new();
|
||||||
|
this.deferredMessages[triggeredEvent].Enqueue(new Message(sendingComponent, triggeredEvent, data));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<T?> CheckDeferredMessages<T>(Event triggeredEvent)
|
||||||
|
{
|
||||||
|
if (this.deferredMessages.TryGetValue(triggeredEvent, out var queue))
|
||||||
|
while (queue.TryDequeue(out var message))
|
||||||
|
yield return message.Data is T data ? data : default;
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<TResult?> SendMessageUseFirstResult<TPayload, TResult>(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data = default)
|
public async Task<TResult?> SendMessageUseFirstResult<TPayload, TResult>(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data = default)
|
||||||
{
|
{
|
||||||
foreach (var (receiver, componentFilter) in this.componentFilters)
|
foreach (var (receiver, componentFilter) in this.componentFilters)
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
using AIStudio.Components.Pages;
|
||||||
|
|
||||||
|
namespace AIStudio.Tools;
|
||||||
|
|
||||||
|
public readonly record struct SendToButton() : IButtonData
|
||||||
|
{
|
||||||
|
public ButtonTypes Type => ButtonTypes.SEND_TO;
|
||||||
|
|
||||||
|
public Func<string> GetText { get; init; } = () => string.Empty;
|
||||||
|
|
||||||
|
public bool UseResultingContentBlockData { get; init; } = true;
|
||||||
|
|
||||||
|
public SendTo Self { get; init; } = SendTo.NONE;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -16,4 +16,9 @@ window.generateDiff = function (text1, text2, divDiff, divLegend) {
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.clearDiv = function (divName) {
|
||||||
|
let targetDiv = document.getElementById(divName);
|
||||||
|
targetDiv.innerHTML = '';
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
# v0.8.10, build 172 (2024-08-18 19:44 UTC)
|
||||||
|
- Added the possibility to send any assistant context to a new chat session for further questions
|
||||||
|
- Added a reset button to all assistants to clear the current context
|
||||||
|
- Improved the coding assistant's language handling when creating the corresponding prompt
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
# v0.8.9, build 171 (2024-08-18 10:35 UTC)
|
||||||
|
- Added the possibility to send an assistant's result to another assistant
|
||||||
|
- Refactored page paths
|
||||||
|
- Refactored assistant footer buttons
|
||||||
|
- Refactored message bus to support deferred messages
|
||||||
@@ -2,4 +2,4 @@
|
|||||||
* MudBlazor (https://mudblazor.com/)
|
* MudBlazor (https://mudblazor.com/)
|
||||||
* Copyright (c) 2021 MudBlazor
|
* Copyright (c) 2021 MudBlazor
|
||||||
* Licensed under MIT (https://github.com/MudBlazor/MudBlazor/blob/master/LICENSE)
|
* Licensed under MIT (https://github.com/MudBlazor/MudBlazor/blob/master/LICENSE)
|
||||||
*/.mud-primary{background-color:var(--mud-palette-primary) !important}.mud-primary-text{color:var(--mud-palette-primary) !important;--mud-ripple-color: var(--mud-palette-primary) !important}.mud-primary-hover{background-color:var(--mud-palette-primary-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-primary-hover:hover{background-color:var(--mud-palette-primary-hover) !important}}.hover\:mud-primary-hover:focus-visible,.hover\:mud-primary-hover:active{background-color:var(--mud-palette-primary-hover) !important}.mud-border-primary{border-color:var(--mud-palette-primary) !important}.mud-theme-primary{color:var(--mud-palette-primary-text) !important;background-color:var(--mud-palette-primary) !important}.mud-secondary{background-color:var(--mud-palette-secondary) !important}.mud-secondary-text{color:var(--mud-palette-secondary) !important;--mud-ripple-color: var(--mud-palette-secondary) !important}.mud-secondary-hover{background-color:var(--mud-palette-secondary-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-secondary-hover:hover{background-color:var(--mud-palette-secondary-hover) !important}}.hover\:mud-secondary-hover:focus-visible,.hover\:mud-secondary-hover:active{background-color:var(--mud-palette-secondary-hover) !important}.mud-border-secondary{border-color:var(--mud-palette-secondary) !important}.mud-theme-secondary{color:var(--mud-palette-secondary-text) !important;background-color:var(--mud-palette-secondary) !important}.mud-tertiary{background-color:var(--mud-palette-tertiary) !important}.mud-tertiary-text{color:var(--mud-palette-tertiary) !important;--mud-ripple-color: var(--mud-palette-tertiary) !important}.mud-tertiary-hover{background-color:var(--mud-palette-tertiary-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-tertiary-hover:hover{background-color:var(--mud-palette-tertiary-hover) !important}}.hover\:mud-tertiary-hover:focus-visible,.hover\:mud-tertiary-hover:active{background-color:var(--mud-palette-tertiary-hover) !important}.mud-border-tertiary{border-color:var(--mud-palette-tertiary) !important}.mud-theme-tertiary{color:var(--mud-palette-tertiary-text) !important;background-color:var(--mud-palette-tertiary) !important}.mud-info{background-color:var(--mud-palette-info) !important}.mud-info-text{color:var(--mud-palette-info) !important;--mud-ripple-color: var(--mud-palette-info) !important}.mud-info-hover{background-color:var(--mud-palette-info-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-info-hover:hover{background-color:var(--mud-palette-info-hover) !important}}.hover\:mud-info-hover:focus-visible,.hover\:mud-info-hover:active{background-color:var(--mud-palette-info-hover) !important}.mud-border-info{border-color:var(--mud-palette-info) !important}.mud-theme-info{color:var(--mud-palette-info-text) !important;background-color:var(--mud-palette-info) !important}.mud-success{background-color:var(--mud-palette-success) !important}.mud-success-text{color:var(--mud-palette-success) !important;--mud-ripple-color: var(--mud-palette-success) !important}.mud-success-hover{background-color:var(--mud-palette-success-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-success-hover:hover{background-color:var(--mud-palette-success-hover) !important}}.hover\:mud-success-hover:focus-visible,.hover\:mud-success-hover:active{background-color:var(--mud-palette-success-hover) !important}.mud-border-success{border-color:var(--mud-palette-success) !important}.mud-theme-success{color:var(--mud-palette-success-text) !important;background-color:var(--mud-palette-success) !important}.mud-warning{background-color:var(--mud-palette-warning) !important}.mud-warning-text{color:var(--mud-palette-warning) !important;--mud-ripple-color: var(--mud-palette-warning) !important}.mud-warning-hover{background-color:var(--mud-palette-warning-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-warning-hover:hover{background-color:var(--mud-palette-warning-hover) !important}}.hover\:mud-warning-hover:focus-visible,.hover\:mud-warning-hover:active{background-color:var(--mud-palette-warning-hover) !important}.mud-border-warning{border-color:var(--mud-palette-warning) !important}.mud-theme-warning{color:var(--mud-palette-warning-text) !important;background-color:var(--mud-palette-warning) !important}.mud-error{background-color:var(--mud-palette-error) !important}.mud-error-text{color:var(--mud-palette-error) !important;--mud-ripple-color: var(--mud-palette-error) !important}.mud-error-hover{background-color:var(--mud-palette-error-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-error-hover:hover{background-color:var(--mud-palette-error-hover) !important}}.hover\:mud-error-hover:focus-visible,.hover\:mud-error-hover:active{background-color:var(--mud-palette-error-hover) !important}.mud-border-error{border-color:var(--mud-palette-error) !important}.mud-theme-error{color:var(--mud-paleLine truncated
|
*/.mud-primary{background-color:var(--mud-palette-primary) !important}.mud-primary-text{color:var(--mud-palette-primary) !important;--mud-ripple-color: var(--mud-palette-primary) !important}.mud-primary-hover{background-color:var(--mud-palette-primary-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-primary-hover:hover{background-color:var(--mud-palette-primary-hover) !important}}.hover\:mud-primary-hover:focus-visible,.hover\:mud-primary-hover:active{background-color:var(--mud-palette-primary-hover) !important}.mud-border-primary{border-color:var(--mud-palette-primary) !important}.mud-theme-primary{color:var(--mud-palette-primary-text) !important;background-color:var(--mud-palette-primary) !important}.mud-secondary{background-color:var(--mud-palette-secondary) !important}.mud-secondary-text{color:var(--mud-palette-secondary) !important;--mud-ripple-color: var(--mud-palette-secondary) !important}.mud-secondary-hover{background-color:var(--mud-palette-secondary-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-secondary-hover:hover{background-color:var(--mud-palette-secondary-hover) !important}}.hover\:mud-secondary-hover:focus-visible,.hover\:mud-secondary-hover:active{background-color:var(--mud-palette-secondary-hover) !important}.mud-border-secondary{border-color:var(--mud-palette-secondary) !important}.mud-theme-secondary{color:var(--mud-palette-secondary-text) !important;background-color:var(--mud-palette-secondary) !important}.mud-tertiary{background-color:var(--mud-palette-tertiary) !important}.mud-tertiary-text{color:var(--mud-palette-tertiary) !important;--mud-ripple-color: var(--mud-palette-tertiary) !important}.mud-tertiary-hover{background-color:var(--mud-palette-tertiary-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-tertiary-hover:hover{background-color:var(--mud-palette-tertiary-hover) !important}}.hover\:mud-tertiary-hover:focus-visible,.hover\:mud-tertiary-hover:active{background-color:var(--mud-palette-tertiary-hover) !important}.mud-border-tertiary{border-color:var(--mud-palette-tertiary) !important}.mud-theme-tertiary{color:var(--mud-palette-tertiary-text) !important;background-color:var(--mud-palette-tertiary) !important}.mud-info{background-color:var(--mud-palette-info) !important}.mud-info-text{color:var(--mud-palette-info) !important;--mud-ripple-color: var(--mud-palette-info) !important}.mud-info-hover{background-color:var(--mud-palette-info-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-info-hover:hover{background-color:var(--mud-palette-info-hover) !important}}.hover\:mud-info-hover:focus-visible,.hover\:mud-info-hover:active{background-color:var(--mud-palette-info-hover) !important}.mud-border-info{border-color:var(--mud-palette-info) !important}.mud-theme-info{color:var(--mud-palette-info-text) !important;background-color:var(--mud-palette-info) !important}.mud-success{background-color:var(--mud-palette-success) !important}.mud-success-text{color:var(--mud-palette-success) !important;--mud-ripple-color: var(--mud-palette-success) !important}.mud-success-hover{background-color:var(--mud-palette-success-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-success-hover:hover{background-color:var(--mud-palette-success-hover) !important}}.hover\:mud-success-hover:focus-visible,.hover\:mud-success-hover:active{background-color:var(--mud-palette-success-hover) !important}.mud-border-success{border-color:var(--mud-palette-success) !important}.mud-theme-success{color:var(--mud-palette-success-text) !important;background-color:var(--mud-palette-success) !important}.mud-warning{background-color:var(--mud-palette-warning) !important}.mud-warning-text{color:var(--mud-palette-warning) !important;--mud-ripple-color: var(--mud-palette-warning) !important}.mud-warning-hover{background-color:var(--mud-palette-warning-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-warning-hover:hover{background-color:var(--mud-palette-warning-hover) !important}}.hover\:mud-warning-hover:focus-visible,.hover\:mud-warning-hover:active{background-color:var(--mud-palette-warning-hover) !important}.mud-border-warning{border-color:var(--mud-palette-warning) !important}.mud-theme-warning{color:var(--mud-palette-warning-text) !important;background-color:var(--mud-palette-warning) !important}.mud-error{background-color:var(--mud-palette-error) !important}.mud-error-text{color:var(--mud-palette-error) !important;--mud-ripple-color: var(--mud-palette-error) !important}.mud-error-hover{background-color:var(--mud-palette-error-hover) !important}@media(hover: hover)and (pointer: fine){.hover\:mud-error-hover:hover{background-color:var(--mud-palette-error-hover) !important}}.hover\:mud-error-hover:focus-visible,.hover\:mud-error-hover:active{background-color:var(--mud-palette-error-hover) !important}.mud-border-error{border-color:var(--mud-palette-error) !important}.mud-theme-error{color:var(--mud-paleLine truncated
|
||||||
+4
-4
@@ -1,9 +1,9 @@
|
|||||||
0.8.8
|
0.8.10
|
||||||
2024-08-14 06:30:58 UTC
|
2024-08-18 19:44:06 UTC
|
||||||
170
|
172
|
||||||
8.0.108 (commit 665a05cea7)
|
8.0.108 (commit 665a05cea7)
|
||||||
8.0.8 (commit 08338fcaa5)
|
8.0.8 (commit 08338fcaa5)
|
||||||
1.80.1 (commit 3f5fd8dd4)
|
1.80.1 (commit 3f5fd8dd4)
|
||||||
7.6.0
|
7.6.0
|
||||||
1.7.1
|
1.7.1
|
||||||
30f5ae463f2, dev debug
|
9a928d41e15, release
|
||||||
Generated
+1
-1
@@ -2308,7 +2308,7 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mindwork-ai-studio"
|
name = "mindwork-ai-studio"
|
||||||
version = "0.8.8"
|
version = "0.8.10"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arboard",
|
"arboard",
|
||||||
"flexi_logger",
|
"flexi_logger",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "mindwork-ai-studio"
|
name = "mindwork-ai-studio"
|
||||||
version = "0.8.8"
|
version = "0.8.10"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
description = "MindWork AI Studio"
|
description = "MindWork AI Studio"
|
||||||
authors = ["Thorsten Sommer"]
|
authors = ["Thorsten Sommer"]
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
},
|
},
|
||||||
"package": {
|
"package": {
|
||||||
"productName": "MindWork AI Studio",
|
"productName": "MindWork AI Studio",
|
||||||
"version": "0.8.8"
|
"version": "0.8.10"
|
||||||
},
|
},
|
||||||
"tauri": {
|
"tauri": {
|
||||||
"allowlist": {
|
"allowlist": {
|
||||||
|
|||||||
Reference in new issue
Block a user