Implemented bias of the day assistant

This commit is contained in:
Thorsten Sommer 2024-10-27 21:00:35 +01:00
parent 0c19146f05
commit 3e0832d3ca
Signed by: tsommer
GPG Key ID: 371BBA77A02C0108
4 changed files with 211 additions and 0 deletions

View File

@ -0,0 +1,5 @@
@attribute [Route(Routes.ASSISTANT_BIAS)]
@inherits AssistantBaseCore
<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"/>

View File

@ -0,0 +1,148 @@
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 have the opportunity to ask your questions to the LLM.
""";
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()
{
if(this.SettingsManager.ConfigurationData.BiasOfTheDay.RestrictOneBiasPerDay)
{
if(this.SettingsManager.ConfigurationData.BiasOfTheDay.DateLastBiasDrawn == DateOnly.FromDateTime(DateTime.Now))
{
MessageBus.INSTANCE.DeferMessage(this, Event.LOAD_CHAT,
new LoadChat
{
WorkspaceId = Workspaces.WORKSPACE_ID_BIAS,
ChatId = this.SettingsManager.ConfigurationData.BiasOfTheDay.BiasOfTheDayChatId,
});
this.NavigationManager.NavigateTo(Routes.CHAT);
return;
}
}
await this.form!.Validate();
if (!this.inputIsValid)
return;
this.biasOfTheDay = BiasCatalog.GetRandomBias(this.SettingsManager.ConfigurationData.BiasOfTheDay.UsedBias);
var chatId = this.CreateChatThread(Workspaces.WORKSPACE_ID_BIAS, this.biasOfTheDay.Name);
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);
}
}

View File

@ -67,4 +67,6 @@ public sealed class Data
public DataMyTasks MyTasks { get; init; } = new();
public DataJobPostings JobPostings { get; init; } = new();
public DataBiasOfTheDay BiasOfTheDay { get; init; } = new();
}

View File

@ -0,0 +1,56 @@
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>
/// 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;
}