mirror of
https://github.com/MindWorkAI/AI-Studio.git
synced 2025-02-05 17:49:05 +00:00
Bias of the day (#173)
This commit is contained in:
parent
e9c805f0df
commit
217b9c4db3
@ -47,6 +47,8 @@
|
|||||||
<MudStack Row="@true" Wrap="Wrap.Wrap" Class="ma-1">
|
<MudStack Row="@true" Wrap="Wrap.Wrap" Class="ma-1">
|
||||||
|
|
||||||
@if (!this.FooterButtons.Any(x => x.Type is ButtonTypes.SEND_TO))
|
@if (!this.FooterButtons.Any(x => x.Type is ButtonTypes.SEND_TO))
|
||||||
|
{
|
||||||
|
@if (this.ShowSendTo)
|
||||||
{
|
{
|
||||||
<MudMenu StartIcon="@Icons.Material.Filled.Apps" EndIcon="@Icons.Material.Filled.KeyboardArrowDown" Label="Send to ..." Variant="Variant.Filled" Style="@this.GetSendToColor()" Class="rounded">
|
<MudMenu StartIcon="@Icons.Material.Filled.Apps" EndIcon="@Icons.Material.Filled.KeyboardArrowDown" Label="Send to ..." Variant="Variant.Filled" Style="@this.GetSendToColor()" Class="rounded">
|
||||||
@foreach (var assistant in Enum.GetValues<Components>().OrderBy(n => n.Name().Length))
|
@foreach (var assistant in Enum.GetValues<Components>().OrderBy(n => n.Name().Length))
|
||||||
@ -60,6 +62,7 @@
|
|||||||
}
|
}
|
||||||
</MudMenu>
|
</MudMenu>
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@foreach (var button in this.FooterButtons)
|
@foreach (var button in this.FooterButtons)
|
||||||
{
|
{
|
||||||
@ -95,13 +98,19 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@if (this.ShowCopyResult)
|
||||||
|
{
|
||||||
<MudButton Variant="Variant.Filled" StartIcon="@Icons.Material.Filled.ContentCopy" OnClick="() => this.CopyToClipboard()">
|
<MudButton Variant="Variant.Filled" StartIcon="@Icons.Material.Filled.ContentCopy" OnClick="() => this.CopyToClipboard()">
|
||||||
Copy result
|
Copy result
|
||||||
</MudButton>
|
</MudButton>
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (this.ShowReset)
|
||||||
|
{
|
||||||
<MudButton Variant="Variant.Filled" Style="@this.GetResetColor()" StartIcon="@Icons.Material.Filled.Refresh" OnClick="() => this.InnerResetForm()">
|
<MudButton Variant="Variant.Filled" Style="@this.GetResetColor()" StartIcon="@Icons.Material.Filled.Refresh" OnClick="() => this.InnerResetForm()">
|
||||||
Reset
|
Reset
|
||||||
</MudButton>
|
</MudButton>
|
||||||
|
}
|
||||||
|
|
||||||
@if (this.SettingsManager.ConfigurationData.LLMProviders.ShowProviderConfidence)
|
@if (this.SettingsManager.ConfigurationData.LLMProviders.ShowProviderConfidence)
|
||||||
{
|
{
|
||||||
|
@ -75,6 +75,12 @@ public abstract partial class AssistantBase : ComponentBase, IMessageBusReceiver
|
|||||||
|
|
||||||
protected virtual bool ShowDedicatedProgress => false;
|
protected virtual bool ShowDedicatedProgress => false;
|
||||||
|
|
||||||
|
protected virtual bool ShowSendTo => true;
|
||||||
|
|
||||||
|
protected virtual bool ShowCopyResult => true;
|
||||||
|
|
||||||
|
protected virtual bool ShowReset => true;
|
||||||
|
|
||||||
protected virtual ChatThread ConvertToChatThread => this.chatThread ?? new();
|
protected virtual ChatThread ConvertToChatThread => this.chatThread ?? new();
|
||||||
|
|
||||||
protected virtual IReadOnlyList<IButtonData> FooterButtons => [];
|
protected virtual IReadOnlyList<IButtonData> FooterButtons => [];
|
||||||
@ -174,13 +180,35 @@ public abstract partial class AssistantBase : ComponentBase, IMessageBusReceiver
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
protected DateTimeOffset AddUserRequest(string request)
|
protected Guid CreateChatThread(Guid workspaceId, string name)
|
||||||
|
{
|
||||||
|
var chatId = Guid.NewGuid();
|
||||||
|
this.chatThread = new()
|
||||||
|
{
|
||||||
|
WorkspaceId = workspaceId,
|
||||||
|
ChatId = chatId,
|
||||||
|
Name = name,
|
||||||
|
Seed = this.RNG.Next(),
|
||||||
|
SystemPrompt = !this.AllowProfiles ? this.SystemPrompt :
|
||||||
|
$"""
|
||||||
|
{this.SystemPrompt}
|
||||||
|
|
||||||
|
{this.currentProfile.ToSystemPrompt()}
|
||||||
|
""",
|
||||||
|
Blocks = [],
|
||||||
|
};
|
||||||
|
|
||||||
|
return chatId;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected DateTimeOffset AddUserRequest(string request, bool hideContentFromUser = false)
|
||||||
{
|
{
|
||||||
var time = DateTimeOffset.Now;
|
var time = DateTimeOffset.Now;
|
||||||
this.chatThread!.Blocks.Add(new ContentBlock
|
this.chatThread!.Blocks.Add(new ContentBlock
|
||||||
{
|
{
|
||||||
Time = time,
|
Time = time,
|
||||||
ContentType = ContentType.TEXT,
|
ContentType = ContentType.TEXT,
|
||||||
|
HideFromUser = hideContentFromUser,
|
||||||
Role = ChatRole.USER,
|
Role = ChatRole.USER,
|
||||||
Content = new ContentText
|
Content = new ContentText
|
||||||
{
|
{
|
||||||
@ -237,9 +265,9 @@ public abstract partial class AssistantBase : ComponentBase, IMessageBusReceiver
|
|||||||
return icon;
|
return icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task SendToAssistant(Tools.Components destination, SendToButton sendToButton)
|
protected Task SendToAssistant(Tools.Components destination, SendToButton sendToButton)
|
||||||
{
|
{
|
||||||
var contentToSend = sendToButton.UseResultingContentBlockData switch
|
var contentToSend = sendToButton == default ? string.Empty : sendToButton.UseResultingContentBlockData switch
|
||||||
{
|
{
|
||||||
false => sendToButton.GetText(),
|
false => sendToButton.GetText(),
|
||||||
true => this.resultingContentBlock?.Content switch
|
true => this.resultingContentBlock?.Content switch
|
||||||
|
@ -0,0 +1,14 @@
|
|||||||
|
@attribute [Route(Routes.ASSISTANT_BIAS)]
|
||||||
|
@inherits AssistantBaseCore
|
||||||
|
|
||||||
|
<MudText Typo="Typo.body1">
|
||||||
|
<b>Links:</b>
|
||||||
|
</MudText>
|
||||||
|
<MudList T="string" Class="mb-6">
|
||||||
|
<MudListItem T="string" Icon="@Icons.Material.Filled.Link" Target="_blank" Href="https://en.wikipedia.org/wiki/List_of_cognitive_biases">Wikipedia list of cognitive biases</MudListItem>
|
||||||
|
<MudListItem T="string" Icon="@Icons.Material.Filled.Link" Target="_blank" Href="https://commons.wikimedia.org/wiki/File:Cognitive_Bias_Codex_With_Definitions_1-2,_an_Extension_of_the_work_of_John_Manoogian_by_Brian_Rene_Morrissette.png">Extended bias poster</MudListItem>
|
||||||
|
<MudListItem T="string" Icon="@Icons.Material.Filled.Link" Target="_blank" Href="https://betterhumans.pub/cognitive-bias-cheat-sheet-55a472476b18">Blog post of Buster Benson: "Cognitive bias cheat sheet"</MudListItem>
|
||||||
|
</MudList>
|
||||||
|
|
||||||
|
<EnumSelection T="CommonLanguages" NameFunc="@(language => language.NameSelecting())" @bind-Value="@this.selectedTargetLanguage" ValidateSelection="@this.ValidateTargetLanguage" Icon="@Icons.Material.Filled.Translate" Label="Target language" AllowOther="@true" OtherValue="CommonLanguages.OTHER" @bind-OtherInput="@this.customTargetLanguage" ValidateOther="@this.ValidateCustomLanguage" LabelOther="Custom target language" />
|
||||||
|
<ProviderSelection @bind-ProviderSettings="@this.providerSettings" ValidateProvider="@this.ValidatingProvider"/>
|
@ -0,0 +1,164 @@
|
|||||||
|
using System.Text;
|
||||||
|
|
||||||
|
using AIStudio.Components;
|
||||||
|
using AIStudio.Settings.DataModel;
|
||||||
|
|
||||||
|
namespace AIStudio.Assistants.BiasDay;
|
||||||
|
|
||||||
|
public partial class BiasOfTheDayAssistant : AssistantBaseCore
|
||||||
|
{
|
||||||
|
public override Tools.Components Component => Tools.Components.BIAS_DAY_ASSISTANT;
|
||||||
|
|
||||||
|
protected override string Title => "Bias of the Day";
|
||||||
|
|
||||||
|
protected override string Description =>
|
||||||
|
"""
|
||||||
|
Learn about a different cognitive bias every day. You can also ask the LLM your questions. The idea behind
|
||||||
|
"Bias of the Day" is based on work by Buster Benson, John Manoogian III, and Brian Rene Morrissette. Buster
|
||||||
|
Benson grouped the biases, and the original texts come from Wikipedia. Brian Rene Morrissette condensed them
|
||||||
|
into a shorter version. Finally, John Manoogian III created the original poster based on Benson's work and
|
||||||
|
Morrissette's texts. Thorsten Sommer compared all texts for integration into AI Studio with the current Wikipedia
|
||||||
|
versions, updated them, and added source references. The idea of learning about one bias each day based on John's
|
||||||
|
poster comes from Drew Nelson.
|
||||||
|
""";
|
||||||
|
|
||||||
|
protected override string SystemPrompt => $"""
|
||||||
|
You are a friendly, helpful expert on cognitive bias. You studied psychology and
|
||||||
|
have a lot of experience. You explain a bias every day. Today's bias belongs to
|
||||||
|
the category: "{this.biasOfTheDay.Category.ToName()}". We have the following
|
||||||
|
thoughts on this category:
|
||||||
|
|
||||||
|
{this.biasOfTheDay.Category.GetThoughts()}
|
||||||
|
|
||||||
|
Today's bias is:
|
||||||
|
{this.biasOfTheDay.Description}
|
||||||
|
{this.SystemPromptSources()}
|
||||||
|
Important: you use the following language: {this.SystemPromptLanguage()}. Please
|
||||||
|
ask the user a personal question at the end to encourage them to think about
|
||||||
|
this bias.
|
||||||
|
""";
|
||||||
|
|
||||||
|
protected override IReadOnlyList<IButtonData> FooterButtons => [];
|
||||||
|
|
||||||
|
protected override string SubmitText => "Show me the bias of the day";
|
||||||
|
|
||||||
|
protected override Func<Task> SubmitAction => this.TellBias;
|
||||||
|
|
||||||
|
protected override bool ShowSendTo => false;
|
||||||
|
|
||||||
|
protected override bool ShowCopyResult => false;
|
||||||
|
|
||||||
|
protected override bool ShowReset => false;
|
||||||
|
|
||||||
|
protected override void ResetFrom()
|
||||||
|
{
|
||||||
|
if (!this.MightPreselectValues())
|
||||||
|
{
|
||||||
|
this.selectedTargetLanguage = CommonLanguages.AS_IS;
|
||||||
|
this.customTargetLanguage = string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool MightPreselectValues()
|
||||||
|
{
|
||||||
|
if (this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectOptions)
|
||||||
|
{
|
||||||
|
this.selectedTargetLanguage = this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedTargetLanguage;
|
||||||
|
this.customTargetLanguage = this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedOtherLanguage;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Bias biasOfTheDay = BiasCatalog.NONE;
|
||||||
|
private CommonLanguages selectedTargetLanguage = CommonLanguages.AS_IS;
|
||||||
|
private string customTargetLanguage = string.Empty;
|
||||||
|
|
||||||
|
private string? ValidateTargetLanguage(CommonLanguages language)
|
||||||
|
{
|
||||||
|
if(language is CommonLanguages.AS_IS)
|
||||||
|
return "Please select a target language for the bias.";
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string? ValidateCustomLanguage(string language)
|
||||||
|
{
|
||||||
|
if(this.selectedTargetLanguage == CommonLanguages.OTHER && string.IsNullOrWhiteSpace(language))
|
||||||
|
return "Please provide a custom language.";
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string SystemPromptSources()
|
||||||
|
{
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
if (this.biasOfTheDay.Links.Count > 0)
|
||||||
|
{
|
||||||
|
sb.AppendLine();
|
||||||
|
sb.AppendLine("Please share the following sources with the user as a Markdown list:");
|
||||||
|
foreach (var link in this.biasOfTheDay.Links)
|
||||||
|
sb.AppendLine($"- {link}");
|
||||||
|
|
||||||
|
sb.AppendLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private string SystemPromptLanguage()
|
||||||
|
{
|
||||||
|
if(this.selectedTargetLanguage is CommonLanguages.OTHER)
|
||||||
|
return this.customTargetLanguage;
|
||||||
|
|
||||||
|
return this.selectedTargetLanguage.Name();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task TellBias()
|
||||||
|
{
|
||||||
|
bool useDrawnBias = false;
|
||||||
|
if(this.SettingsManager.ConfigurationData.BiasOfTheDay.RestrictOneBiasPerDay)
|
||||||
|
{
|
||||||
|
if(this.SettingsManager.ConfigurationData.BiasOfTheDay.DateLastBiasDrawn == DateOnly.FromDateTime(DateTime.Now))
|
||||||
|
{
|
||||||
|
var biasChat = new LoadChat
|
||||||
|
{
|
||||||
|
WorkspaceId = Workspaces.WORKSPACE_ID_BIAS,
|
||||||
|
ChatId = this.SettingsManager.ConfigurationData.BiasOfTheDay.BiasOfTheDayChatId,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (Workspaces.IsChatExisting(biasChat))
|
||||||
|
{
|
||||||
|
MessageBus.INSTANCE.DeferMessage(this, Event.LOAD_CHAT, biasChat);
|
||||||
|
this.NavigationManager.NavigateTo(Routes.CHAT);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
useDrawnBias = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.form!.Validate();
|
||||||
|
if (!this.inputIsValid)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.biasOfTheDay = useDrawnBias ?
|
||||||
|
BiasCatalog.ALL_BIAS[this.SettingsManager.ConfigurationData.BiasOfTheDay.BiasOfTheDayId] :
|
||||||
|
BiasCatalog.GetRandomBias(this.SettingsManager.ConfigurationData.BiasOfTheDay.UsedBias);
|
||||||
|
|
||||||
|
var chatId = this.CreateChatThread(Workspaces.WORKSPACE_ID_BIAS, this.biasOfTheDay.Name);
|
||||||
|
this.SettingsManager.ConfigurationData.BiasOfTheDay.BiasOfTheDayId = this.biasOfTheDay.Id;
|
||||||
|
this.SettingsManager.ConfigurationData.BiasOfTheDay.BiasOfTheDayChatId = chatId;
|
||||||
|
this.SettingsManager.ConfigurationData.BiasOfTheDay.DateLastBiasDrawn = DateOnly.FromDateTime(DateTime.Now);
|
||||||
|
await this.SettingsManager.StoreSettings();
|
||||||
|
var time = this.AddUserRequest(
|
||||||
|
"""
|
||||||
|
Please tell me about the bias of the day.
|
||||||
|
""", true);
|
||||||
|
|
||||||
|
// Start the AI response without waiting for it to finish:
|
||||||
|
_ = this.AddAIResponseAsync(time);
|
||||||
|
await this.SendToAssistant(Tools.Components.CHAT, default);
|
||||||
|
}
|
||||||
|
}
|
@ -18,10 +18,15 @@ public class ContentBlock
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The content of the block.
|
/// The content of the block.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public IContent? Content { get; init; } = null;
|
public IContent? Content { get; init; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The role of the content block in the chat thread, e.g., user, AI, etc.
|
/// The role of the content block in the chat thread, e.g., user, AI, etc.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ChatRole Role { get; init; } = ChatRole.NONE;
|
public ChatRole Role { get; init; } = ChatRole.NONE;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Should the content block be hidden from the user?
|
||||||
|
/// </summary>
|
||||||
|
public bool HideFromUser { get; set; }
|
||||||
}
|
}
|
@ -64,7 +64,7 @@ public partial class ContentBlockComponent : ComponentBase
|
|||||||
private async Task AfterStreaming()
|
private async Task AfterStreaming()
|
||||||
{
|
{
|
||||||
// Might be called from a different thread, so we need to invoke the UI thread:
|
// Might be called from a different thread, so we need to invoke the UI thread:
|
||||||
await this.InvokeAsync(() =>
|
await this.InvokeAsync(async () =>
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
// Issue we try to solve: When the content changes during streaming,
|
// Issue we try to solve: When the content changes during streaming,
|
||||||
@ -83,6 +83,9 @@ public partial class ContentBlockComponent : ComponentBase
|
|||||||
|
|
||||||
// Let Blazor update the UI, i.e., to see the render tree diff:
|
// Let Blazor update the UI, i.e., to see the render tree diff:
|
||||||
this.StateHasChanged();
|
this.StateHasChanged();
|
||||||
|
|
||||||
|
// Inform the chat that the streaming is done:
|
||||||
|
await MessageBus.INSTANCE.SendMessage<bool>(this, Event.CHAT_STREAMING_DONE);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@ public partial class Workspaces : ComponentBase
|
|||||||
|
|
||||||
private const Placement WORKSPACE_ITEM_TOOLTIP_PLACEMENT = Placement.Bottom;
|
private const Placement WORKSPACE_ITEM_TOOLTIP_PLACEMENT = Placement.Bottom;
|
||||||
|
|
||||||
|
public static readonly Guid WORKSPACE_ID_BIAS = Guid.Parse("82050a4e-ee92-43d7-8ee5-ab512f847e02");
|
||||||
private static readonly JsonSerializerOptions JSON_OPTIONS = new()
|
private static readonly JsonSerializerOptions JSON_OPTIONS = new()
|
||||||
{
|
{
|
||||||
WriteIndented = true,
|
WriteIndented = true,
|
||||||
@ -63,6 +64,7 @@ public partial class Workspaces : ComponentBase
|
|||||||
// - When assigning the tree items to the MudTreeViewItem component, we must set the Value property to the value of the item
|
// - When assigning the tree items to the MudTreeViewItem component, we must set the Value property to the value of the item
|
||||||
//
|
//
|
||||||
|
|
||||||
|
await this.EnsureBiasWorkspace();
|
||||||
await this.LoadTreeItems();
|
await this.LoadTreeItems();
|
||||||
await base.OnInitializedAsync();
|
await base.OnInitializedAsync();
|
||||||
}
|
}
|
||||||
@ -250,7 +252,7 @@ public partial class Workspaces : ComponentBase
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task StoreChat(ChatThread chat)
|
public async Task StoreChat(ChatThread chat, bool reloadTreeItems = true)
|
||||||
{
|
{
|
||||||
string chatDirectory;
|
string chatDirectory;
|
||||||
if (chat.WorkspaceId == Guid.Empty)
|
if (chat.WorkspaceId == Guid.Empty)
|
||||||
@ -270,10 +272,30 @@ public partial class Workspaces : ComponentBase
|
|||||||
await File.WriteAllTextAsync(chatPath, JsonSerializer.Serialize(chat, JSON_OPTIONS), Encoding.UTF8);
|
await File.WriteAllTextAsync(chatPath, JsonSerializer.Serialize(chat, JSON_OPTIONS), Encoding.UTF8);
|
||||||
|
|
||||||
// Reload the tree items:
|
// Reload the tree items:
|
||||||
|
if(reloadTreeItems)
|
||||||
await this.LoadTreeItems();
|
await this.LoadTreeItems();
|
||||||
|
|
||||||
this.StateHasChanged();
|
this.StateHasChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task LoadChat(LoadChat loadChat)
|
||||||
|
{
|
||||||
|
var chatPath = loadChat.WorkspaceId == Guid.Empty
|
||||||
|
? Path.Join(SettingsManager.DataDirectory, "tempChats", loadChat.ChatId.ToString())
|
||||||
|
: Path.Join(SettingsManager.DataDirectory, "workspaces", loadChat.WorkspaceId.ToString(), loadChat.ChatId.ToString());
|
||||||
|
|
||||||
|
await this.LoadChat(chatPath, switchToChat: true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsChatExisting(LoadChat loadChat)
|
||||||
|
{
|
||||||
|
var chatPath = loadChat.WorkspaceId == Guid.Empty
|
||||||
|
? Path.Join(SettingsManager.DataDirectory, "tempChats", loadChat.ChatId.ToString())
|
||||||
|
: Path.Join(SettingsManager.DataDirectory, "workspaces", loadChat.WorkspaceId.ToString(), loadChat.ChatId.ToString());
|
||||||
|
|
||||||
|
return Directory.Exists(chatPath);
|
||||||
|
}
|
||||||
|
|
||||||
private async Task<ChatThread?> LoadChat(string? chatPath, bool switchToChat)
|
private async Task<ChatThread?> LoadChat(string? chatPath, bool switchToChat)
|
||||||
{
|
{
|
||||||
if(string.IsNullOrWhiteSpace(chatPath))
|
if(string.IsNullOrWhiteSpace(chatPath))
|
||||||
@ -435,6 +457,18 @@ public partial class Workspaces : ComponentBase
|
|||||||
await this.LoadTreeItems();
|
await this.LoadTreeItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task EnsureBiasWorkspace()
|
||||||
|
{
|
||||||
|
var workspacePath = Path.Join(SettingsManager.DataDirectory, "workspaces", WORKSPACE_ID_BIAS.ToString());
|
||||||
|
|
||||||
|
if(Path.Exists(workspacePath))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Directory.CreateDirectory(workspacePath);
|
||||||
|
var workspaceNamePath = Path.Join(workspacePath, "name");
|
||||||
|
await File.WriteAllTextAsync(workspaceNamePath, "Bias of the Day", Encoding.UTF8);
|
||||||
|
}
|
||||||
|
|
||||||
private async Task DeleteWorkspace(string? workspacePath)
|
private async Task DeleteWorkspace(string? workspacePath)
|
||||||
{
|
{
|
||||||
if(workspacePath is null)
|
if(workspacePath is null)
|
||||||
|
@ -29,6 +29,13 @@
|
|||||||
<AssistantBlock Name="Icon Finder" Description="Using a LLM to find an icon for a given context." Icon="@Icons.Material.Filled.FindInPage" Link="@Routes.ASSISTANT_ICON_FINDER"/>
|
<AssistantBlock Name="Icon Finder" Description="Using a LLM to find an icon for a given context." Icon="@Icons.Material.Filled.FindInPage" Link="@Routes.ASSISTANT_ICON_FINDER"/>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
|
|
||||||
|
<MudText Typo="Typo.h4" Class="mb-2 mr-3 mt-6">
|
||||||
|
Learning
|
||||||
|
</MudText>
|
||||||
|
<MudStack Row="@true" Wrap="@Wrap.Wrap" Class="mb-3">
|
||||||
|
<AssistantBlock Name="Bias of the Day" Description="Learn about one cognitive bias every day." Icon="@Icons.Material.Filled.Psychology" Link="@Routes.ASSISTANT_BIAS"/>
|
||||||
|
</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>
|
||||||
|
@ -21,10 +21,13 @@
|
|||||||
@if (this.chatThread is not null)
|
@if (this.chatThread is not null)
|
||||||
{
|
{
|
||||||
foreach (var block in this.chatThread.Blocks.OrderBy(n => n.Time))
|
foreach (var block in this.chatThread.Blocks.OrderBy(n => n.Time))
|
||||||
|
{
|
||||||
|
@if (!block.HideFromUser)
|
||||||
{
|
{
|
||||||
<ContentBlockComponent Role="@block.Role" Type="@block.ContentType" Time="@block.Time" Content="@block.Content"/>
|
<ContentBlockComponent Role="@block.Role" Type="@block.ContentType" Time="@block.Time" Content="@block.Content"/>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
</ChildContent>
|
</ChildContent>
|
||||||
<FooterContent>
|
<FooterContent>
|
||||||
<MudElement Style="flex: 0 0 auto;">
|
<MudElement Style="flex: 0 0 auto;">
|
||||||
|
@ -45,7 +45,11 @@ public partial class Chat : MSGComponentBase, IAsyncDisposable
|
|||||||
private bool workspacesVisible;
|
private bool workspacesVisible;
|
||||||
private Workspaces? workspaces;
|
private Workspaces? workspaces;
|
||||||
private bool mustScrollToBottomAfterRender;
|
private bool mustScrollToBottomAfterRender;
|
||||||
|
private bool mustStoreChat;
|
||||||
|
private bool mustLoadChat;
|
||||||
|
private LoadChat loadChat;
|
||||||
private byte scrollRenderCountdown;
|
private byte scrollRenderCountdown;
|
||||||
|
private bool autoSaveEnabled;
|
||||||
|
|
||||||
// Unfortunately, we need the input field reference to blur the focus away. Without
|
// Unfortunately, we need the input field reference to blur the focus away. Without
|
||||||
// this, we cannot clear the input field.
|
// this, we cannot clear the input field.
|
||||||
@ -55,7 +59,7 @@ public partial class Chat : MSGComponentBase, IAsyncDisposable
|
|||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
this.ApplyFilters([], [ Event.HAS_CHAT_UNSAVED_CHANGES, Event.RESET_CHAT_STATE ]);
|
this.ApplyFilters([], [ Event.HAS_CHAT_UNSAVED_CHANGES, Event.RESET_CHAT_STATE, Event.CHAT_STREAMING_DONE ]);
|
||||||
|
|
||||||
// Configure the spellchecking for the user input:
|
// Configure the spellchecking for the user input:
|
||||||
this.SettingsManager.InjectSpellchecking(USER_INPUT_ATTRIBUTES);
|
this.SettingsManager.InjectSpellchecking(USER_INPUT_ATTRIBUTES);
|
||||||
@ -67,6 +71,8 @@ public partial class Chat : MSGComponentBase, IAsyncDisposable
|
|||||||
{
|
{
|
||||||
this.chatThread = deferredContent;
|
this.chatThread = deferredContent;
|
||||||
if (this.chatThread is not null)
|
if (this.chatThread is not null)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(this.chatThread.Name))
|
||||||
{
|
{
|
||||||
var firstUserBlock = this.chatThread.Blocks.FirstOrDefault(x => x.Role == ChatRole.USER);
|
var firstUserBlock = this.chatThread.Blocks.FirstOrDefault(x => x.Role == ChatRole.USER);
|
||||||
if (firstUserBlock is not null)
|
if (firstUserBlock is not null)
|
||||||
@ -79,6 +85,13 @@ public partial class Chat : MSGComponentBase, IAsyncDisposable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(this.chatThread.WorkspaceId != Guid.Empty)
|
||||||
|
{
|
||||||
|
this.autoSaveEnabled = true;
|
||||||
|
this.mustStoreChat = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (this.SettingsManager.ConfigurationData.Chat.ShowLatestMessageAfterLoading)
|
if (this.SettingsManager.ConfigurationData.Chat.ShowLatestMessageAfterLoading)
|
||||||
{
|
{
|
||||||
this.mustScrollToBottomAfterRender = true;
|
this.mustScrollToBottomAfterRender = true;
|
||||||
@ -87,11 +100,32 @@ public partial class Chat : MSGComponentBase, IAsyncDisposable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var deferredLoading = MessageBus.INSTANCE.CheckDeferredMessages<LoadChat>(Event.LOAD_CHAT).FirstOrDefault();
|
||||||
|
if (deferredLoading != default)
|
||||||
|
{
|
||||||
|
this.loadChat = deferredLoading;
|
||||||
|
this.mustLoadChat = true;
|
||||||
|
}
|
||||||
|
|
||||||
await base.OnInitializedAsync();
|
await base.OnInitializedAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override async Task OnAfterRenderAsync(bool firstRender)
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||||
{
|
{
|
||||||
|
if (firstRender && this.workspaces is not null && this.chatThread is not null && this.mustStoreChat)
|
||||||
|
{
|
||||||
|
this.mustStoreChat = false;
|
||||||
|
await this.workspaces.StoreChat(this.chatThread, false);
|
||||||
|
this.currentWorkspaceId = this.chatThread.WorkspaceId;
|
||||||
|
this.currentWorkspaceName = await this.workspaces.LoadWorkspaceName(this.chatThread.WorkspaceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (firstRender && this.workspaces is not null && this.mustLoadChat)
|
||||||
|
{
|
||||||
|
this.mustLoadChat = false;
|
||||||
|
await this.workspaces.LoadChat(this.loadChat);
|
||||||
|
}
|
||||||
|
|
||||||
if(this.mustScrollToBottomAfterRender)
|
if(this.mustScrollToBottomAfterRender)
|
||||||
{
|
{
|
||||||
if (--this.scrollRenderCountdown == 0)
|
if (--this.scrollRenderCountdown == 0)
|
||||||
@ -455,16 +489,19 @@ public partial class Chat : MSGComponentBase, IAsyncDisposable
|
|||||||
|
|
||||||
#region Overrides of MSGComponentBase
|
#region Overrides of MSGComponentBase
|
||||||
|
|
||||||
public override Task ProcessIncomingMessage<T>(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default
|
public override async Task ProcessIncomingMessage<T>(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default
|
||||||
{
|
{
|
||||||
switch (triggeredEvent)
|
switch (triggeredEvent)
|
||||||
{
|
{
|
||||||
case Event.RESET_CHAT_STATE:
|
case Event.RESET_CHAT_STATE:
|
||||||
this.ResetState();
|
this.ResetState();
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
return Task.CompletedTask;
|
case Event.CHAT_STREAMING_DONE:
|
||||||
|
if(this.autoSaveEnabled)
|
||||||
|
await this.SaveThread();
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Task<TResult?> ProcessMessageWithResult<TPayload, TResult>(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) where TResult : default where TPayload : default
|
public override Task<TResult?> ProcessMessageWithResult<TPayload, TResult>(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) where TResult : default where TPayload : default
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
@using AIStudio.Assistants.TextSummarizer
|
@using AIStudio.Assistants.TextSummarizer
|
||||||
@using AIStudio.Provider
|
@using AIStudio.Provider
|
||||||
@using AIStudio.Settings
|
@using AIStudio.Settings
|
||||||
|
@using AIStudio.Settings.DataModel
|
||||||
@using Host = AIStudio.Provider.SelfHosted.Host
|
@using Host = AIStudio.Provider.SelfHosted.Host
|
||||||
|
|
||||||
<MudText Typo="Typo.h3" Class="mb-12">Settings</MudText>
|
<MudText Typo="Typo.h3" Class="mb-12">Settings</MudText>
|
||||||
@ -401,6 +402,32 @@
|
|||||||
</MudPaper>
|
</MudPaper>
|
||||||
</ExpansionPanel>
|
</ExpansionPanel>
|
||||||
|
|
||||||
|
<ExpansionPanel HeaderIcon="@Icons.Material.Filled.Psychology" HeaderText="Assistant: Bias of the Day">
|
||||||
|
|
||||||
|
<ConfigurationOption OptionDescription="Restrict to one bias a day?" LabelOn="Yes, you can only retrieve one bias per day" LabelOff="No restriction. You can retrieve as many biases as you want per day." State="@(() => this.SettingsManager.ConfigurationData.BiasOfTheDay.RestrictOneBiasPerDay)" StateUpdate="@(updatedState => this.SettingsManager.ConfigurationData.BiasOfTheDay.RestrictOneBiasPerDay = updatedState)"/>
|
||||||
|
|
||||||
|
<MudField Label="Statistics" Variant="Variant.Outlined" Class="mb-2">
|
||||||
|
<MudText Typo="Typo.body1">
|
||||||
|
You have learned about @this.SettingsManager.ConfigurationData.BiasOfTheDay.UsedBias.Count out of @BiasCatalog.ALL_BIAS.Count biases.
|
||||||
|
</MudText>
|
||||||
|
<MudButton Size="Size.Small" Variant="Variant.Filled" StartIcon="@Icons.Material.Filled.Restore" Color="Color.Error" OnClick="@(() => this.ResetBiasOfTheDayHistory())">
|
||||||
|
Reset
|
||||||
|
</MudButton>
|
||||||
|
</MudField>
|
||||||
|
|
||||||
|
<MudPaper Class="pa-3 mb-8 border-dashed border rounded-lg">
|
||||||
|
<ConfigurationOption OptionDescription="Preselect options?" LabelOn="Options are preselected" LabelOff="No options are preselected" State="@(() => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectOptions)" StateUpdate="@(updatedState => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectOptions = updatedState)" OptionHelp="When enabled, you can preselect options. This is might be useful when you prefer a specific language or LLM model."/>
|
||||||
|
<ConfigurationSelect OptionDescription="Preselect the language" Disabled="@(() => !this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedTargetLanguage)" Data="@ConfigurationSelectDataFactory.GetCommonLanguagesOptionalData()" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedTargetLanguage = selectedValue)" OptionHelp="Which language should be preselected?"/>
|
||||||
|
@if (this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedTargetLanguage is CommonLanguages.OTHER)
|
||||||
|
{
|
||||||
|
<ConfigurationText OptionDescription="Preselect another language" Disabled="@(() => !this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectOptions)" Icon="@Icons.Material.Filled.Translate" Text="@(() => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedOtherLanguage)" TextUpdate="@(updatedText => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedOtherLanguage = updatedText)"/>
|
||||||
|
}
|
||||||
|
<ConfigurationSelect OptionDescription="Preselect one of your profiles?" Disabled="@(() => !this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedProfile)" Data="@ConfigurationSelectDataFactory.GetProfilesData(this.SettingsManager.ConfigurationData.Profiles)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedProfile = selectedValue)" OptionHelp="Would you like to preselect one of your profiles?"/>
|
||||||
|
<ConfigurationMinConfidenceSelection Disabled="@(() => !this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectOptions)" RestrictToGlobalMinimumConfidence="@true" SelectedValue="@(() => this.SettingsManager.ConfigurationData.BiasOfTheDay.MinimumProviderConfidence)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.BiasOfTheDay.MinimumProviderConfidence = selectedValue)"/>
|
||||||
|
<ConfigurationProviderSelection Component="Components.BIAS_DAY_ASSISTANT" Data="@this.availableProviders" Disabled="@(() => !this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedProvider)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedProvider = selectedValue)"/>
|
||||||
|
</MudPaper>
|
||||||
|
</ExpansionPanel>
|
||||||
|
|
||||||
<ExpansionPanel HeaderIcon="@Icons.Material.Filled.TextFields" HeaderText="Agent: Text Content Cleaner Options">
|
<ExpansionPanel HeaderIcon="@Icons.Material.Filled.TextFields" HeaderText="Agent: Text Content Cleaner Options">
|
||||||
<MudPaper Class="pa-3 mb-8 border-dashed border rounded-lg">
|
<MudPaper Class="pa-3 mb-8 border-dashed border rounded-lg">
|
||||||
<MudText Typo="Typo.body1" Class="mb-3">
|
<MudText Typo="Typo.body1" Class="mb-3">
|
||||||
|
@ -251,6 +251,29 @@ public partial class Settings : ComponentBase, IMessageBusReceiver, IDisposable
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region Bias-of-the-day related
|
||||||
|
|
||||||
|
private async Task ResetBiasOfTheDayHistory()
|
||||||
|
{
|
||||||
|
var dialogParameters = new DialogParameters
|
||||||
|
{
|
||||||
|
{ "Message", "Are you sure you want to reset your bias-of-the-day statistics? The system will no longer remember which biases you already know. As a result, biases you are already familiar with may be addressed again." },
|
||||||
|
};
|
||||||
|
|
||||||
|
var dialogReference = await this.DialogService.ShowAsync<ConfirmDialog>("Reset your bias-of-the-day statistics", dialogParameters, DialogOptions.FULLSCREEN);
|
||||||
|
var dialogResult = await dialogReference.Result;
|
||||||
|
if (dialogResult is null || dialogResult.Canceled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.SettingsManager.ConfigurationData.BiasOfTheDay.UsedBias.Clear();
|
||||||
|
this.SettingsManager.ConfigurationData.BiasOfTheDay.DateLastBiasDrawn = DateOnly.MinValue;
|
||||||
|
await this.SettingsManager.StoreSettings();
|
||||||
|
|
||||||
|
await this.MessageBus.SendMessage<bool>(this, Event.CONFIGURATION_CHANGED);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region Implementation of IMessageBusReceiver
|
#region Implementation of IMessageBusReceiver
|
||||||
|
|
||||||
public Task ProcessMessage<TMsg>(ComponentBase? sendingComponent, Event triggeredEvent, TMsg? data)
|
public Task ProcessMessage<TMsg>(ComponentBase? sendingComponent, Event triggeredEvent, TMsg? data)
|
||||||
|
@ -22,5 +22,6 @@ public sealed partial class Routes
|
|||||||
public const string ASSISTANT_SYNONYMS = "/assistant/synonyms";
|
public const string ASSISTANT_SYNONYMS = "/assistant/synonyms";
|
||||||
public const string ASSISTANT_MY_TASKS = "/assistant/my-tasks";
|
public const string ASSISTANT_MY_TASKS = "/assistant/my-tasks";
|
||||||
public const string ASSISTANT_JOB_POSTING = "/assistant/job-posting";
|
public const string ASSISTANT_JOB_POSTING = "/assistant/job-posting";
|
||||||
|
public const string ASSISTANT_BIAS = "/assistant/bias-of-the-day";
|
||||||
// ReSharper restore InconsistentNaming
|
// ReSharper restore InconsistentNaming
|
||||||
}
|
}
|
@ -22,6 +22,16 @@ namespace AIStudio.Settings.DataModel;
|
|||||||
/// </remarks>
|
/// </remarks>
|
||||||
public static class BiasCatalog
|
public static class BiasCatalog
|
||||||
{
|
{
|
||||||
|
public static readonly Bias NONE = new()
|
||||||
|
{
|
||||||
|
Id = Guid.Empty,
|
||||||
|
Category = BiasCategory.NONE,
|
||||||
|
Name = "None",
|
||||||
|
Description = "No bias selected.",
|
||||||
|
Related = [],
|
||||||
|
Links = [],
|
||||||
|
};
|
||||||
|
|
||||||
#region WHAT_SHOULD_WE_REMEMBER
|
#region WHAT_SHOULD_WE_REMEMBER
|
||||||
|
|
||||||
private static readonly Bias MISATTRIBUTION_OF_MEMORY = new()
|
private static readonly Bias MISATTRIBUTION_OF_MEMORY = new()
|
||||||
@ -5909,4 +5919,23 @@ public static class BiasCatalog
|
|||||||
{ IMPLICIT_STEREOTYPES.Id, IMPLICIT_STEREOTYPES },
|
{ IMPLICIT_STEREOTYPES.Id, IMPLICIT_STEREOTYPES },
|
||||||
{ IMPLICIT_ASSOCIATIONS.Id, IMPLICIT_ASSOCIATIONS },
|
{ IMPLICIT_ASSOCIATIONS.Id, IMPLICIT_ASSOCIATIONS },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public static Bias GetRandomBias(IList<int> usedBias)
|
||||||
|
{
|
||||||
|
if(usedBias.Count >= ALL_BIAS.Count)
|
||||||
|
usedBias.Clear();
|
||||||
|
|
||||||
|
int randomBiasIndex;
|
||||||
|
lock (RANDOM)
|
||||||
|
{
|
||||||
|
randomBiasIndex = RANDOM.Next(0, ALL_BIAS.Count);
|
||||||
|
while(usedBias.Contains(randomBiasIndex))
|
||||||
|
randomBiasIndex = RANDOM.Next(0, ALL_BIAS.Count);
|
||||||
|
}
|
||||||
|
|
||||||
|
usedBias.Add(randomBiasIndex);
|
||||||
|
return ALL_BIAS.Values.ElementAt(randomBiasIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static readonly Random RANDOM = new();
|
||||||
}
|
}
|
@ -67,4 +67,6 @@ public sealed class Data
|
|||||||
public DataMyTasks MyTasks { get; init; } = new();
|
public DataMyTasks MyTasks { get; init; } = new();
|
||||||
|
|
||||||
public DataJobPostings JobPostings { get; init; } = new();
|
public DataJobPostings JobPostings { get; init; } = new();
|
||||||
|
|
||||||
|
public DataBiasOfTheDay BiasOfTheDay { get; init; } = new();
|
||||||
}
|
}
|
@ -0,0 +1,61 @@
|
|||||||
|
using AIStudio.Provider;
|
||||||
|
|
||||||
|
namespace AIStudio.Settings.DataModel;
|
||||||
|
|
||||||
|
public sealed class DataBiasOfTheDay
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A list of bias IDs that have been used.
|
||||||
|
/// </summary>
|
||||||
|
public List<int> UsedBias { get; set; } = new();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// When was the last bias drawn?
|
||||||
|
/// </summary>
|
||||||
|
public DateOnly DateLastBiasDrawn { get; set; } = DateOnly.MinValue;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Which bias is the bias of the day? This isn't the bias id, but rather the chat id in the bias workspace.
|
||||||
|
/// </summary>
|
||||||
|
public Guid BiasOfTheDayChatId { get; set; } = Guid.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Which bias is the bias of the day?
|
||||||
|
/// </summary>
|
||||||
|
public Guid BiasOfTheDayId { get; set; } = Guid.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Restrict to one bias per day?
|
||||||
|
/// </summary>
|
||||||
|
public bool RestrictOneBiasPerDay { get; set; } = true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect any rewrite options?
|
||||||
|
/// </summary>
|
||||||
|
public bool PreselectOptions { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect the language?
|
||||||
|
/// </summary>
|
||||||
|
public CommonLanguages PreselectedTargetLanguage { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect any other language?
|
||||||
|
/// </summary>
|
||||||
|
public string PreselectedOtherLanguage { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The minimum confidence level required for a provider to be considered.
|
||||||
|
/// </summary>
|
||||||
|
public ConfidenceLevel MinimumProviderConfidence { get; set; } = ConfidenceLevel.NONE;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect a profile?
|
||||||
|
/// </summary>
|
||||||
|
public string PreselectedProfile { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect a provider?
|
||||||
|
/// </summary>
|
||||||
|
public string PreselectedProvider { get; set; } = string.Empty;
|
||||||
|
}
|
@ -16,6 +16,7 @@ public enum Components
|
|||||||
SYNONYMS_ASSISTANT,
|
SYNONYMS_ASSISTANT,
|
||||||
MY_TASKS_ASSISTANT,
|
MY_TASKS_ASSISTANT,
|
||||||
JOB_POSTING_ASSISTANT,
|
JOB_POSTING_ASSISTANT,
|
||||||
|
BIAS_DAY_ASSISTANT,
|
||||||
|
|
||||||
CHAT,
|
CHAT,
|
||||||
}
|
}
|
@ -59,6 +59,7 @@ public static class ComponentsExtensions
|
|||||||
Components.SYNONYMS_ASSISTANT => settingsManager.ConfigurationData.Synonyms.PreselectOptions ? settingsManager.ConfigurationData.Synonyms.MinimumProviderConfidence : default,
|
Components.SYNONYMS_ASSISTANT => settingsManager.ConfigurationData.Synonyms.PreselectOptions ? settingsManager.ConfigurationData.Synonyms.MinimumProviderConfidence : default,
|
||||||
Components.MY_TASKS_ASSISTANT => settingsManager.ConfigurationData.MyTasks.PreselectOptions ? settingsManager.ConfigurationData.MyTasks.MinimumProviderConfidence : default,
|
Components.MY_TASKS_ASSISTANT => settingsManager.ConfigurationData.MyTasks.PreselectOptions ? settingsManager.ConfigurationData.MyTasks.MinimumProviderConfidence : default,
|
||||||
Components.JOB_POSTING_ASSISTANT => settingsManager.ConfigurationData.JobPostings.PreselectOptions ? settingsManager.ConfigurationData.JobPostings.MinimumProviderConfidence : default,
|
Components.JOB_POSTING_ASSISTANT => settingsManager.ConfigurationData.JobPostings.PreselectOptions ? settingsManager.ConfigurationData.JobPostings.MinimumProviderConfidence : default,
|
||||||
|
Components.BIAS_DAY_ASSISTANT => settingsManager.ConfigurationData.BiasOfTheDay.PreselectOptions ? settingsManager.ConfigurationData.BiasOfTheDay.MinimumProviderConfidence : default,
|
||||||
|
|
||||||
_ => default,
|
_ => default,
|
||||||
};
|
};
|
||||||
@ -77,6 +78,7 @@ public static class ComponentsExtensions
|
|||||||
Components.SYNONYMS_ASSISTANT => settingsManager.ConfigurationData.Synonyms.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.Synonyms.PreselectedProvider) : default,
|
Components.SYNONYMS_ASSISTANT => settingsManager.ConfigurationData.Synonyms.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.Synonyms.PreselectedProvider) : default,
|
||||||
Components.MY_TASKS_ASSISTANT => settingsManager.ConfigurationData.MyTasks.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.MyTasks.PreselectedProvider) : default,
|
Components.MY_TASKS_ASSISTANT => settingsManager.ConfigurationData.MyTasks.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.MyTasks.PreselectedProvider) : default,
|
||||||
Components.JOB_POSTING_ASSISTANT => settingsManager.ConfigurationData.JobPostings.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.JobPostings.PreselectedProvider) : default,
|
Components.JOB_POSTING_ASSISTANT => settingsManager.ConfigurationData.JobPostings.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.JobPostings.PreselectedProvider) : default,
|
||||||
|
Components.BIAS_DAY_ASSISTANT => settingsManager.ConfigurationData.BiasOfTheDay.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.BiasOfTheDay.PreselectedProvider) : default,
|
||||||
|
|
||||||
Components.CHAT => settingsManager.ConfigurationData.Chat.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.Chat.PreselectedProvider) : default,
|
Components.CHAT => settingsManager.ConfigurationData.Chat.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.Chat.PreselectedProvider) : default,
|
||||||
|
|
||||||
@ -90,6 +92,7 @@ public static class ComponentsExtensions
|
|||||||
Components.EMAIL_ASSISTANT => settingsManager.ConfigurationData.EMail.PreselectOptions ? settingsManager.ConfigurationData.Profiles.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.EMail.PreselectedProfile) : default,
|
Components.EMAIL_ASSISTANT => settingsManager.ConfigurationData.EMail.PreselectOptions ? settingsManager.ConfigurationData.Profiles.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.EMail.PreselectedProfile) : default,
|
||||||
Components.LEGAL_CHECK_ASSISTANT => settingsManager.ConfigurationData.LegalCheck.PreselectOptions ? settingsManager.ConfigurationData.Profiles.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.LegalCheck.PreselectedProfile) : default,
|
Components.LEGAL_CHECK_ASSISTANT => settingsManager.ConfigurationData.LegalCheck.PreselectOptions ? settingsManager.ConfigurationData.Profiles.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.LegalCheck.PreselectedProfile) : default,
|
||||||
Components.MY_TASKS_ASSISTANT => settingsManager.ConfigurationData.MyTasks.PreselectOptions ? settingsManager.ConfigurationData.Profiles.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.MyTasks.PreselectedProfile) : default,
|
Components.MY_TASKS_ASSISTANT => settingsManager.ConfigurationData.MyTasks.PreselectOptions ? settingsManager.ConfigurationData.Profiles.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.MyTasks.PreselectedProfile) : default,
|
||||||
|
Components.BIAS_DAY_ASSISTANT => settingsManager.ConfigurationData.BiasOfTheDay.PreselectOptions ? settingsManager.ConfigurationData.Profiles.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.BiasOfTheDay.PreselectedProfile) : default,
|
||||||
|
|
||||||
Components.CHAT => settingsManager.ConfigurationData.Chat.PreselectOptions ? settingsManager.ConfigurationData.Profiles.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.Chat.PreselectedProfile) : default,
|
Components.CHAT => settingsManager.ConfigurationData.Chat.PreselectOptions ? settingsManager.ConfigurationData.Profiles.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.Chat.PreselectedProfile) : default,
|
||||||
|
|
||||||
|
@ -16,6 +16,8 @@ public enum Event
|
|||||||
// Chat events:
|
// Chat events:
|
||||||
HAS_CHAT_UNSAVED_CHANGES,
|
HAS_CHAT_UNSAVED_CHANGES,
|
||||||
RESET_CHAT_STATE,
|
RESET_CHAT_STATE,
|
||||||
|
LOAD_CHAT,
|
||||||
|
CHAT_STREAMING_DONE,
|
||||||
|
|
||||||
// Send events:
|
// Send events:
|
||||||
SEND_TO_GRAMMAR_SPELLING_ASSISTANT,
|
SEND_TO_GRAMMAR_SPELLING_ASSISTANT,
|
||||||
|
3
app/MindWork AI Studio/Tools/LoadChat.cs
Normal file
3
app/MindWork AI Studio/Tools/LoadChat.cs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
namespace AIStudio.Tools;
|
||||||
|
|
||||||
|
public readonly record struct LoadChat(Guid WorkspaceId, Guid ChatId);
|
Loading…
Reference in New Issue
Block a user