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 FooterButtons => []; protected override string SubmitText => "Show me the bias of the day"; protected override Func 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); } }