mirror of
https://github.com/MindWorkAI/AI-Studio.git
synced 2025-02-05 13:49:07 +00:00
Add mail assistant (#84)
This commit is contained in:
parent
50bf0baff7
commit
34884859d7
@ -303,7 +303,7 @@ public partial class AssistantAgenda : AssistantBaseCore
|
|||||||
if(string.IsNullOrWhiteSpace(content))
|
if(string.IsNullOrWhiteSpace(content))
|
||||||
return "Please provide some content for the agenda. What are the main points of the meeting or the seminar?";
|
return "Please provide some content for the agenda. What are the main points of the meeting or the seminar?";
|
||||||
|
|
||||||
var lines = content.Split('\n');
|
var lines = content.Split('\n', StringSplitOptions.RemoveEmptyEntries);
|
||||||
foreach (var line in lines)
|
foreach (var line in lines)
|
||||||
if(!line.TrimStart().StartsWith('-'))
|
if(!line.TrimStart().StartsWith('-'))
|
||||||
return "Please start each line of your content list with a dash (-) to create a bullet point list.";
|
return "Please start each line of your content list with a dash (-) to create a bullet point list.";
|
||||||
@ -363,6 +363,9 @@ public partial class AssistantAgenda : AssistantBaseCore
|
|||||||
|
|
||||||
private string PromptLanguage()
|
private string PromptLanguage()
|
||||||
{
|
{
|
||||||
|
if(this.selectedTargetLanguage is CommonLanguages.AS_IS)
|
||||||
|
return "Use the same language as the input.";
|
||||||
|
|
||||||
if(this.selectedTargetLanguage is CommonLanguages.OTHER)
|
if(this.selectedTargetLanguage is CommonLanguages.OTHER)
|
||||||
return this.customTargetLanguage;
|
return this.customTargetLanguage;
|
||||||
|
|
||||||
|
@ -184,6 +184,7 @@ public abstract partial class AssistantBase : ComponentBase
|
|||||||
SendTo.AGENDA_ASSISTANT => (Event.SEND_TO_AGENDA_ASSISTANT, Routes.ASSISTANT_AGENDA),
|
SendTo.AGENDA_ASSISTANT => (Event.SEND_TO_AGENDA_ASSISTANT, Routes.ASSISTANT_AGENDA),
|
||||||
SendTo.CODING_ASSISTANT => (Event.SEND_TO_CODING_ASSISTANT, Routes.ASSISTANT_CODING),
|
SendTo.CODING_ASSISTANT => (Event.SEND_TO_CODING_ASSISTANT, Routes.ASSISTANT_CODING),
|
||||||
SendTo.REWRITE_ASSISTANT => (Event.SEND_TO_REWRITE_ASSISTANT, Routes.ASSISTANT_REWRITE),
|
SendTo.REWRITE_ASSISTANT => (Event.SEND_TO_REWRITE_ASSISTANT, Routes.ASSISTANT_REWRITE),
|
||||||
|
SendTo.EMAIL_ASSISTANT => (Event.SEND_TO_EMAIL_ASSISTANT, Routes.ASSISTANT_EMAIL),
|
||||||
SendTo.TRANSLATION_ASSISTANT => (Event.SEND_TO_TRANSLATION_ASSISTANT, Routes.ASSISTANT_TRANSLATION),
|
SendTo.TRANSLATION_ASSISTANT => (Event.SEND_TO_TRANSLATION_ASSISTANT, Routes.ASSISTANT_TRANSLATION),
|
||||||
SendTo.ICON_FINDER_ASSISTANT => (Event.SEND_TO_ICON_FINDER_ASSISTANT, Routes.ASSISTANT_ICON_FINDER),
|
SendTo.ICON_FINDER_ASSISTANT => (Event.SEND_TO_ICON_FINDER_ASSISTANT, Routes.ASSISTANT_ICON_FINDER),
|
||||||
SendTo.GRAMMAR_SPELLING_ASSISTANT => (Event.SEND_TO_GRAMMAR_SPELLING_ASSISTANT, Routes.ASSISTANT_GRAMMAR_SPELLING),
|
SendTo.GRAMMAR_SPELLING_ASSISTANT => (Event.SEND_TO_GRAMMAR_SPELLING_ASSISTANT, Routes.ASSISTANT_GRAMMAR_SPELLING),
|
||||||
|
27
app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor
Normal file
27
app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
@attribute [Route(Routes.ASSISTANT_EMAIL)]
|
||||||
|
@inherits AssistantBaseCore
|
||||||
|
|
||||||
|
<MudTextSwitch Label="Is there a history, a previous conversation?" @bind-Value="@this.provideHistory" LabelOn="Yes, I provide the previous conversation" LabelOff="No, I don't provide a previous conversation" />
|
||||||
|
@if (this.provideHistory)
|
||||||
|
{
|
||||||
|
<MudPaper Class="pa-3 mb-8 border-dashed border rounded-lg">
|
||||||
|
<MudTextField T="string" @bind-Text="@this.inputHistory" Validation="@this.ValidateHistory" Label="Previous conversation" Variant="Variant.Outlined" Lines="6" AutoGrow="@true" MaxLines="12" Margin="Margin.Dense" UserAttributes="@USER_INPUT_ATTRIBUTES" HelperText="Provide the previous conversation, e.g., the last e-mail, the last chat, etc." Class="mb-3" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.DocumentScanner"/>
|
||||||
|
</MudPaper>
|
||||||
|
}
|
||||||
|
|
||||||
|
<MudTextField T="string" @bind-Text="@this.inputGreeting" Label="(Optional) The greeting phrase to use" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Person" Variant="Variant.Outlined" Margin="Margin.Dense" UserAttributes="@USER_INPUT_ATTRIBUTES" Placeholder="Dear Colleagues" Class="mb-3"/>
|
||||||
|
<MudTextField T="string" @bind-Text="@this.inputBulletPoints" Validation="@this.ValidateBulletPoints" AdornmentIcon="@Icons.Material.Filled.ListAlt" Adornment="Adornment.Start" Label="Your bullet points" Variant="Variant.Outlined" Lines="6" AutoGrow="@true" MaxLines="12" Class="mb-3" UserAttributes="@USER_INPUT_ATTRIBUTES" HelperText="Bullet list the content of the e-mail roughly. Use dashes (-) to separate the items." Immediate="@false" DebounceInterval="1_000" OnDebounceIntervalElapsed="@this.OnContentChanged" Placeholder="@PLACEHOLDER_BULLET_POINTS"/>
|
||||||
|
<MudSelect T="string" Label="(Optional) Are any of your points particularly important?" MultiSelection="@true" @bind-SelectedValues="@this.selectedFoci" Variant="Variant.Outlined" Class="mb-3" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.ListAlt">
|
||||||
|
@foreach (var contentLine in this.bulletPointsLines)
|
||||||
|
{
|
||||||
|
<MudSelectItem T="string" Value="@contentLine">@contentLine</MudSelectItem>
|
||||||
|
}
|
||||||
|
</MudSelect>
|
||||||
|
<MudTextField T="string" @bind-Text="@this.inputName" Label="(Optional) Your name for the closing salutation" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Person" Variant="Variant.Outlined" Margin="Margin.Dense" UserAttributes="@USER_INPUT_ATTRIBUTES" HelperText="Your name for the closing salutation of your e-mail." Class="mb-3"/>
|
||||||
|
<EnumSelection T="WritingStyles" NameFunc="@(style => style.Name())" @bind-Value="@this.selectedWritingStyle" Icon="@Icons.Material.Filled.Edit" Label="Select the writing style" ValidateSelection="@this.ValidateWritingStyle"/>
|
||||||
|
<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"/>
|
||||||
|
|
||||||
|
<MudButton Variant="Variant.Filled" Class="mb-3" OnClick="() => this.CreateMail()">
|
||||||
|
Create e-mail
|
||||||
|
</MudButton>
|
252
app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor.cs
Normal file
252
app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor.cs
Normal file
@ -0,0 +1,252 @@
|
|||||||
|
using System.Text;
|
||||||
|
|
||||||
|
using AIStudio.Chat;
|
||||||
|
using AIStudio.Tools;
|
||||||
|
|
||||||
|
namespace AIStudio.Assistants.EMail;
|
||||||
|
|
||||||
|
public partial class AssistantEMail : AssistantBaseCore
|
||||||
|
{
|
||||||
|
protected override string Title => "E-Mail";
|
||||||
|
|
||||||
|
protected override string Description =>
|
||||||
|
"""
|
||||||
|
Provide a list of bullet points and some basic information for an e-mail. The assistant will generate an e-mail based on that input.
|
||||||
|
""";
|
||||||
|
|
||||||
|
protected override string SystemPrompt =>
|
||||||
|
$"""
|
||||||
|
You are an automated system that writes emails. {this.SystemPromptHistory()} The user provides you with bullet points on what
|
||||||
|
he want to address in the response. Regarding the writing style of the email: {this.selectedWritingStyle.Prompt()}
|
||||||
|
{this.SystemPromptGreeting()} {this.SystemPromptName()} You write the email in the following language: {this.SystemPromptLanguage()}.
|
||||||
|
""";
|
||||||
|
|
||||||
|
protected override IReadOnlyList<IButtonData> FooterButtons =>
|
||||||
|
[
|
||||||
|
new SendToButton
|
||||||
|
{
|
||||||
|
Self = SendTo.EMAIL_ASSISTANT,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
protected override ChatThread ConvertToChatThread => (this.chatThread ?? new()) with
|
||||||
|
{
|
||||||
|
SystemPrompt = SystemPrompts.DEFAULT,
|
||||||
|
};
|
||||||
|
|
||||||
|
protected override void ResetFrom()
|
||||||
|
{
|
||||||
|
this.inputBulletPoints = string.Empty;
|
||||||
|
this.bulletPointsLines.Clear();
|
||||||
|
this.selectedFoci = [];
|
||||||
|
this.provideHistory = false;
|
||||||
|
this.inputHistory = string.Empty;
|
||||||
|
if (!this.MightPreselectValues())
|
||||||
|
{
|
||||||
|
this.inputName = string.Empty;
|
||||||
|
this.selectedTargetLanguage = CommonLanguages.AS_IS;
|
||||||
|
this.customTargetLanguage = string.Empty;
|
||||||
|
this.selectedWritingStyle = WritingStyles.NONE;
|
||||||
|
this.inputGreeting = string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool MightPreselectValues()
|
||||||
|
{
|
||||||
|
if (this.SettingsManager.ConfigurationData.EMail.PreselectOptions)
|
||||||
|
{
|
||||||
|
this.inputName = this.SettingsManager.ConfigurationData.EMail.SenderName;
|
||||||
|
this.inputGreeting = this.SettingsManager.ConfigurationData.EMail.Greeting;
|
||||||
|
this.selectedWritingStyle = this.SettingsManager.ConfigurationData.EMail.PreselectedWritingStyle;
|
||||||
|
this.selectedTargetLanguage = this.SettingsManager.ConfigurationData.EMail.PreselectedTargetLanguage;
|
||||||
|
this.customTargetLanguage = this.SettingsManager.ConfigurationData.EMail.PreselectOtherLanguage;
|
||||||
|
this.providerSettings = this.SettingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == this.SettingsManager.ConfigurationData.EMail.PreselectedProvider);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private const string PLACEHOLDER_BULLET_POINTS = """
|
||||||
|
- The last meeting was good
|
||||||
|
- Thank you for feedback
|
||||||
|
- Next is milestone 3
|
||||||
|
- I need your input by next Wednesday
|
||||||
|
""";
|
||||||
|
|
||||||
|
private WritingStyles selectedWritingStyle = WritingStyles.NONE;
|
||||||
|
private string inputGreeting = string.Empty;
|
||||||
|
private string inputBulletPoints = string.Empty;
|
||||||
|
private readonly List<string> bulletPointsLines = [];
|
||||||
|
private IEnumerable<string> selectedFoci = new HashSet<string>();
|
||||||
|
private string inputName = string.Empty;
|
||||||
|
private CommonLanguages selectedTargetLanguage = CommonLanguages.AS_IS;
|
||||||
|
private string customTargetLanguage = string.Empty;
|
||||||
|
private bool provideHistory;
|
||||||
|
private string inputHistory = string.Empty;
|
||||||
|
|
||||||
|
#region Overrides of ComponentBase
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
this.MightPreselectValues();
|
||||||
|
var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages<string>(Event.SEND_TO_EMAIL_ASSISTANT).FirstOrDefault();
|
||||||
|
if (deferredContent is not null)
|
||||||
|
this.inputBulletPoints = deferredContent;
|
||||||
|
|
||||||
|
await base.OnInitializedAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private string? ValidateBulletPoints(string content)
|
||||||
|
{
|
||||||
|
if(string.IsNullOrWhiteSpace(content))
|
||||||
|
return "Please provide some content for the e-mail.";
|
||||||
|
|
||||||
|
var lines = content.Split('\n', StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
foreach (var line in lines)
|
||||||
|
if(!line.TrimStart().StartsWith('-'))
|
||||||
|
return "Please start each line of your content list with a dash (-) to create a bullet point list.";
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string? ValidateTargetLanguage(CommonLanguages language)
|
||||||
|
{
|
||||||
|
if(language is CommonLanguages.AS_IS)
|
||||||
|
return "Please select a target language for the e-mail.";
|
||||||
|
|
||||||
|
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? ValidateWritingStyle(WritingStyles style)
|
||||||
|
{
|
||||||
|
if(style == WritingStyles.NONE)
|
||||||
|
return "Please select a writing style for the e-mail.";
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string? ValidateHistory(string history)
|
||||||
|
{
|
||||||
|
if(this.provideHistory && string.IsNullOrWhiteSpace(history))
|
||||||
|
return "Please provide some history for the e-mail.";
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnContentChanged(string content)
|
||||||
|
{
|
||||||
|
this.bulletPointsLines.Clear();
|
||||||
|
var previousSelectedFoci = new HashSet<string>();
|
||||||
|
foreach (var line in content.AsSpan().EnumerateLines())
|
||||||
|
{
|
||||||
|
var trimmedLine = line.Trim();
|
||||||
|
if (trimmedLine.StartsWith("-"))
|
||||||
|
trimmedLine = trimmedLine[1..].Trim();
|
||||||
|
|
||||||
|
if (trimmedLine.Length == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var finalLine = trimmedLine.ToString();
|
||||||
|
if(this.selectedFoci.Any(x => x.StartsWith(finalLine, StringComparison.InvariantCultureIgnoreCase)))
|
||||||
|
previousSelectedFoci.Add(finalLine);
|
||||||
|
|
||||||
|
this.bulletPointsLines.Add(finalLine);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.selectedFoci = previousSelectedFoci;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string SystemPromptHistory()
|
||||||
|
{
|
||||||
|
if (this.provideHistory)
|
||||||
|
return "You receive the previous conversation as context.";
|
||||||
|
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string SystemPromptGreeting()
|
||||||
|
{
|
||||||
|
if(!string.IsNullOrWhiteSpace(this.inputGreeting))
|
||||||
|
return $"Your greeting should consider the following formulation: {this.inputGreeting}.";
|
||||||
|
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string SystemPromptName()
|
||||||
|
{
|
||||||
|
if(!string.IsNullOrWhiteSpace(this.inputName))
|
||||||
|
return $"For the closing phrase of the email, please use the following name: {this.inputName}.";
|
||||||
|
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string SystemPromptLanguage()
|
||||||
|
{
|
||||||
|
if(this.selectedTargetLanguage is CommonLanguages.AS_IS)
|
||||||
|
return "Use the same language as the input";
|
||||||
|
|
||||||
|
if(this.selectedTargetLanguage is CommonLanguages.OTHER)
|
||||||
|
return this.customTargetLanguage;
|
||||||
|
|
||||||
|
return this.selectedTargetLanguage.Name();
|
||||||
|
}
|
||||||
|
|
||||||
|
private string PromptFoci()
|
||||||
|
{
|
||||||
|
if(!this.selectedFoci.Any())
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
sb.AppendLine("I want to amplify the following points:");
|
||||||
|
foreach (var focus in this.selectedFoci)
|
||||||
|
sb.AppendLine($"- {focus}");
|
||||||
|
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private string PromptHistory()
|
||||||
|
{
|
||||||
|
if(!this.provideHistory)
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
return $"""
|
||||||
|
The previous conversation was:
|
||||||
|
|
||||||
|
```
|
||||||
|
{this.inputHistory}
|
||||||
|
```
|
||||||
|
""";
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task CreateMail()
|
||||||
|
{
|
||||||
|
await this.form!.Validate();
|
||||||
|
if (!this.inputIsValid)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.CreateChatThread();
|
||||||
|
var time = this.AddUserRequest(
|
||||||
|
$"""
|
||||||
|
{this.PromptHistory()}
|
||||||
|
|
||||||
|
My bullet points for the e-mail are:
|
||||||
|
|
||||||
|
{this.inputBulletPoints}
|
||||||
|
|
||||||
|
{this.PromptFoci()}
|
||||||
|
""");
|
||||||
|
|
||||||
|
await this.AddAIResponseAsync(time);
|
||||||
|
}
|
||||||
|
}
|
11
app/MindWork AI Studio/Assistants/EMail/WritingStyles.cs
Normal file
11
app/MindWork AI Studio/Assistants/EMail/WritingStyles.cs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
namespace AIStudio.Assistants.EMail;
|
||||||
|
|
||||||
|
public enum WritingStyles
|
||||||
|
{
|
||||||
|
NONE = 0,
|
||||||
|
|
||||||
|
BUSINESS_FORMAL,
|
||||||
|
BUSINESS_INFORMAL,
|
||||||
|
ACADEMIC,
|
||||||
|
PERSONAL,
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
namespace AIStudio.Assistants.EMail;
|
||||||
|
|
||||||
|
public static class WritingStylesExtensions
|
||||||
|
{
|
||||||
|
public static string Name(this WritingStyles style) => style switch
|
||||||
|
{
|
||||||
|
WritingStyles.ACADEMIC => "Academic",
|
||||||
|
WritingStyles.PERSONAL => "Personal",
|
||||||
|
WritingStyles.BUSINESS_FORMAL => "Business formal",
|
||||||
|
WritingStyles.BUSINESS_INFORMAL => "Business informal",
|
||||||
|
|
||||||
|
_ => "Not specified",
|
||||||
|
};
|
||||||
|
|
||||||
|
public static string Prompt(this WritingStyles style) => style switch
|
||||||
|
{
|
||||||
|
WritingStyles.ACADEMIC => "Use an academic style for communication in an academic context like between students and professors.",
|
||||||
|
WritingStyles.PERSONAL => "Use a personal style for communication between friends and family.",
|
||||||
|
WritingStyles.BUSINESS_FORMAL => "Use a formal business style for this e-mail.",
|
||||||
|
WritingStyles.BUSINESS_INFORMAL => "Use an informal business style for this e-mail.",
|
||||||
|
|
||||||
|
_ => "Use a formal business style for this e-mail.",
|
||||||
|
};
|
||||||
|
}
|
@ -2,39 +2,33 @@ namespace AIStudio.Assistants.RewriteImprove;
|
|||||||
|
|
||||||
public static class WritingStylesExtensions
|
public static class WritingStylesExtensions
|
||||||
{
|
{
|
||||||
public static string Name(this WritingStyles style)
|
public static string Name(this WritingStyles style) => style switch
|
||||||
{
|
{
|
||||||
return style switch
|
WritingStyles.EVERYDAY => "Everyday (personal texts, social media)",
|
||||||
{
|
WritingStyles.BUSINESS => "Business (business emails, reports, presentations)",
|
||||||
WritingStyles.EVERYDAY => "Everyday (personal texts, social media)",
|
WritingStyles.SCIENTIFIC => "Scientific (scientific papers, research reports)",
|
||||||
WritingStyles.BUSINESS => "Business (business emails, reports, presentations)",
|
WritingStyles.JOURNALISTIC => "Journalistic (magazines, newspapers, news)",
|
||||||
WritingStyles.SCIENTIFIC => "Scientific (scientific papers, research reports)",
|
WritingStyles.LITERARY => "Literary (fiction, poetry)",
|
||||||
WritingStyles.JOURNALISTIC => "Journalistic (magazines, newspapers, news)",
|
WritingStyles.TECHNICAL => "Technical (manuals, documentation)",
|
||||||
WritingStyles.LITERARY => "Literary (fiction, poetry)",
|
WritingStyles.MARKETING => "Marketing (advertisements, sales texts)",
|
||||||
WritingStyles.TECHNICAL => "Technical (manuals, documentation)",
|
WritingStyles.ACADEMIC => "Academic (essays, seminar papers)",
|
||||||
WritingStyles.MARKETING => "Marketing (advertisements, sales texts)",
|
WritingStyles.LEGAL => "Legal (legal texts, contracts)",
|
||||||
WritingStyles.ACADEMIC => "Academic (essays, seminar papers)",
|
|
||||||
WritingStyles.LEGAL => "Legal (legal texts, contracts)",
|
_ => "Not specified",
|
||||||
|
};
|
||||||
_ => "Not specified",
|
|
||||||
};
|
public static string Prompt(this WritingStyles style) => style switch
|
||||||
}
|
|
||||||
|
|
||||||
public static string Prompt(this WritingStyles style)
|
|
||||||
{
|
{
|
||||||
return style switch
|
WritingStyles.EVERYDAY => "Use a everyday style like for personal texts, social media, and informal communication.",
|
||||||
{
|
WritingStyles.BUSINESS => "Use a business style like for business emails, reports, and presentations. Most important is clarity and professionalism.",
|
||||||
WritingStyles.EVERYDAY => "Use a everyday style like for personal texts, social media, and informal communication.",
|
WritingStyles.SCIENTIFIC => "Use a scientific style like for scientific papers, research reports, and academic writing. Most important is precision and objectivity.",
|
||||||
WritingStyles.BUSINESS => "Use a business style like for business emails, reports, and presentations. Most important is clarity and professionalism.",
|
WritingStyles.JOURNALISTIC => "Use a journalistic style like for magazines, newspapers, and news. Most important is readability and engaging content.",
|
||||||
WritingStyles.SCIENTIFIC => "Use a scientific style like for scientific papers, research reports, and academic writing. Most important is precision and objectivity.",
|
WritingStyles.LITERARY => "Use a literary style like for fiction, poetry, and creative writing. Most important is creativity and emotional impact.",
|
||||||
WritingStyles.JOURNALISTIC => "Use a journalistic style like for magazines, newspapers, and news. Most important is readability and engaging content.",
|
WritingStyles.TECHNICAL => "Use a technical style like for manuals, documentation, and technical writing. Most important is clarity and precision.",
|
||||||
WritingStyles.LITERARY => "Use a literary style like for fiction, poetry, and creative writing. Most important is creativity and emotional impact.",
|
WritingStyles.MARKETING => "Use a marketing style like for advertisements, sales texts, and promotional content. Most important is persuasiveness and engagement.",
|
||||||
WritingStyles.TECHNICAL => "Use a technical style like for manuals, documentation, and technical writing. Most important is clarity and precision.",
|
WritingStyles.ACADEMIC => "Use a academic style like for essays, seminar papers, and academic writing. Most important is clarity and objectivity.",
|
||||||
WritingStyles.MARKETING => "Use a marketing style like for advertisements, sales texts, and promotional content. Most important is persuasiveness and engagement.",
|
WritingStyles.LEGAL => "Use a legal style like for legal texts, contracts, and official documents. Most important is precision and legal correctness. Use formal legal language.",
|
||||||
WritingStyles.ACADEMIC => "Use a academic style like for essays, seminar papers, and academic writing. Most important is clarity and objectivity.",
|
|
||||||
WritingStyles.LEGAL => "Use a legal style like for legal texts, contracts, and official documents. Most important is precision and legal correctness. Use formal legal language.",
|
_ => "Keep the style of the text as it is.",
|
||||||
|
};
|
||||||
_ => "Keep the style of the text as it is.",
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -20,6 +20,7 @@
|
|||||||
Business
|
Business
|
||||||
</MudText>
|
</MudText>
|
||||||
<MudStack Row="@true" Wrap="@Wrap.Wrap" Class="mb-3">
|
<MudStack Row="@true" Wrap="@Wrap.Wrap" Class="mb-3">
|
||||||
|
<AssistantBlock Name="E-Mail" Description="Generate an e-mail for a given context." Icon="@Icons.Material.Filled.Email" Link="@Routes.ASSISTANT_EMAIL"/>
|
||||||
<AssistantBlock Name="Agenda Planner" Description="Generate an agenda for a given meeting, seminar, etc." Icon="@Icons.Material.Filled.CalendarToday" Link="@Routes.ASSISTANT_AGENDA"/>
|
<AssistantBlock Name="Agenda Planner" Description="Generate an agenda for a given meeting, seminar, etc." Icon="@Icons.Material.Filled.CalendarToday" Link="@Routes.ASSISTANT_AGENDA"/>
|
||||||
<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>
|
||||||
|
@ -193,10 +193,25 @@
|
|||||||
{
|
{
|
||||||
<ConfigurationText OptionDescription="Preselect another target language" Disabled="@(() => !this.SettingsManager.ConfigurationData.RewriteImprove.PreselectOptions)" Icon="@Icons.Material.Filled.Translate" Text="@(() => this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedOtherLanguage)" TextUpdate="@(updatedText => this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedOtherLanguage = updatedText)"/>
|
<ConfigurationText OptionDescription="Preselect another target language" Disabled="@(() => !this.SettingsManager.ConfigurationData.RewriteImprove.PreselectOptions)" Icon="@Icons.Material.Filled.Translate" Text="@(() => this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedOtherLanguage)" TextUpdate="@(updatedText => this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedOtherLanguage = updatedText)"/>
|
||||||
}
|
}
|
||||||
<ConfigurationSelect OptionDescription="Preselect a writing style" Disabled="@(() => !this.SettingsManager.ConfigurationData.RewriteImprove.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedWritingStyle)" Data="@ConfigurationSelectDataFactory.GetWritingStylesData()" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedWritingStyle = selectedValue)" OptionHelp="Which writing style should be preselected?"/>
|
<ConfigurationSelect OptionDescription="Preselect a writing style" Disabled="@(() => !this.SettingsManager.ConfigurationData.RewriteImprove.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedWritingStyle)" Data="@ConfigurationSelectDataFactory.GetWritingStyles4RewriteData()" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedWritingStyle = selectedValue)" OptionHelp="Which writing style should be preselected?"/>
|
||||||
<ConfigurationProviderSelection Data="@this.availableProviders" Disabled="@(() => !this.SettingsManager.ConfigurationData.RewriteImprove.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedProvider)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedProvider = selectedValue)"/>
|
<ConfigurationProviderSelection Data="@this.availableProviders" Disabled="@(() => !this.SettingsManager.ConfigurationData.RewriteImprove.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedProvider)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedProvider = selectedValue)"/>
|
||||||
</MudPaper>
|
</MudPaper>
|
||||||
</ExpansionPanel>
|
</ExpansionPanel>
|
||||||
|
|
||||||
|
<ExpansionPanel HeaderIcon="@Icons.Material.Filled.Email" HeaderText="Assistant: Writing E-Mails">
|
||||||
|
<MudPaper Class="pa-3 mb-8 border-dashed border rounded-lg">
|
||||||
|
<ConfigurationOption OptionDescription="Preselect e-mail options?" LabelOn="E-Mail options are preselected" LabelOff="No e-mail options are preselected" State="@(() => this.SettingsManager.ConfigurationData.EMail.PreselectOptions)" StateUpdate="@(updatedState => this.SettingsManager.ConfigurationData.EMail.PreselectOptions = updatedState)" OptionHelp="When enabled, you can preselect the e-mail options. This is might be useful when you prefer a specific language or LLM model."/>
|
||||||
|
<ConfigurationText OptionDescription="Preselect a greeting?" Disabled="@(() => !this.SettingsManager.ConfigurationData.EMail.PreselectOptions)" Icon="@Icons.Material.Filled.Person" Text="@(() => this.SettingsManager.ConfigurationData.EMail.Greeting)" TextUpdate="@(updatedText => this.SettingsManager.ConfigurationData.EMail.Greeting = updatedText)" />
|
||||||
|
<ConfigurationText OptionDescription="Preselect your name for the closing salutation?" Disabled="@(() => !this.SettingsManager.ConfigurationData.EMail.PreselectOptions)" Icon="@Icons.Material.Filled.Person" Text="@(() => this.SettingsManager.ConfigurationData.EMail.SenderName)" TextUpdate="@(updatedText => this.SettingsManager.ConfigurationData.EMail.SenderName = updatedText)" />
|
||||||
|
<ConfigurationSelect OptionDescription="Preselect the target language" Disabled="@(() => !this.SettingsManager.ConfigurationData.EMail.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.EMail.PreselectedTargetLanguage)" Data="@ConfigurationSelectDataFactory.GetCommonLanguagesTranslationData()" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.EMail.PreselectedTargetLanguage = selectedValue)" OptionHelp="Which target language should be preselected?"/>
|
||||||
|
@if (this.SettingsManager.ConfigurationData.EMail.PreselectedTargetLanguage is CommonLanguages.OTHER)
|
||||||
|
{
|
||||||
|
<ConfigurationText OptionDescription="Preselect another target language" Disabled="@(() => !this.SettingsManager.ConfigurationData.EMail.PreselectOptions)" Icon="@Icons.Material.Filled.Translate" Text="@(() => this.SettingsManager.ConfigurationData.EMail.PreselectOtherLanguage)" TextUpdate="@(updatedText => this.SettingsManager.ConfigurationData.EMail.PreselectOtherLanguage = updatedText)"/>
|
||||||
|
}
|
||||||
|
<ConfigurationSelect OptionDescription="Preselect a writing style" Disabled="@(() => !this.SettingsManager.ConfigurationData.EMail.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.EMail.PreselectedWritingStyle)" Data="@ConfigurationSelectDataFactory.GetWritingStyles4EMailData()" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.EMail.PreselectedWritingStyle = selectedValue)" OptionHelp="Which writing style should be preselected?"/>
|
||||||
|
<ConfigurationProviderSelection Data="@this.availableProviders" Disabled="@(() => !this.SettingsManager.ConfigurationData.EMail.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.EMail.PreselectedProvider)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.EMail.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">
|
||||||
|
@ -17,5 +17,6 @@ public sealed partial class Routes
|
|||||||
public const string ASSISTANT_SUMMARIZER = "/assistant/summarizer";
|
public const string ASSISTANT_SUMMARIZER = "/assistant/summarizer";
|
||||||
public const string ASSISTANT_CODING = "/assistant/coding";
|
public const string ASSISTANT_CODING = "/assistant/coding";
|
||||||
public const string ASSISTANT_AGENDA = "/assistant/agenda";
|
public const string ASSISTANT_AGENDA = "/assistant/agenda";
|
||||||
|
public const string ASSISTANT_EMAIL = "/assistant/email";
|
||||||
// ReSharper restore InconsistentNaming
|
// ReSharper restore InconsistentNaming
|
||||||
}
|
}
|
@ -3,9 +3,13 @@ using AIStudio.Assistants.Coding;
|
|||||||
using AIStudio.Assistants.IconFinder;
|
using AIStudio.Assistants.IconFinder;
|
||||||
using AIStudio.Assistants.RewriteImprove;
|
using AIStudio.Assistants.RewriteImprove;
|
||||||
using AIStudio.Assistants.TextSummarizer;
|
using AIStudio.Assistants.TextSummarizer;
|
||||||
|
using AIStudio.Assistants.EMail;
|
||||||
using AIStudio.Settings.DataModel;
|
using AIStudio.Settings.DataModel;
|
||||||
using AIStudio.Tools;
|
using AIStudio.Tools;
|
||||||
|
|
||||||
|
using WritingStylesRewrite = AIStudio.Assistants.RewriteImprove.WritingStyles;
|
||||||
|
using WritingStylesEMail = AIStudio.Assistants.EMail.WritingStyles;
|
||||||
|
|
||||||
namespace AIStudio.Settings;
|
namespace AIStudio.Settings;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -101,9 +105,15 @@ public static class ConfigurationSelectDataFactory
|
|||||||
yield return new(number.Name(), number);
|
yield return new(number.Name(), number);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IEnumerable<ConfigurationSelectData<WritingStyles>> GetWritingStylesData()
|
public static IEnumerable<ConfigurationSelectData<WritingStylesRewrite>> GetWritingStyles4RewriteData()
|
||||||
{
|
{
|
||||||
foreach (var style in Enum.GetValues<WritingStyles>())
|
foreach (var style in Enum.GetValues<WritingStylesRewrite>())
|
||||||
|
yield return new(style.Name(), style);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IEnumerable<ConfigurationSelectData<WritingStylesEMail>> GetWritingStyles4EMailData()
|
||||||
|
{
|
||||||
|
foreach (var style in Enum.GetValues<WritingStylesEMail>())
|
||||||
yield return new(style.Name(), style);
|
yield return new(style.Name(), style);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -42,4 +42,6 @@ public sealed class Data
|
|||||||
public DataGrammarSpelling GrammarSpelling { get; init; } = new();
|
public DataGrammarSpelling GrammarSpelling { get; init; } = new();
|
||||||
|
|
||||||
public DataRewriteImprove RewriteImprove { get; init; } = new();
|
public DataRewriteImprove RewriteImprove { get; init; } = new();
|
||||||
|
|
||||||
|
public DataEMail EMail { get; set; } = new();
|
||||||
}
|
}
|
42
app/MindWork AI Studio/Settings/DataModel/DataEMail.cs
Normal file
42
app/MindWork AI Studio/Settings/DataModel/DataEMail.cs
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
using AIStudio.Assistants.EMail;
|
||||||
|
using AIStudio.Tools;
|
||||||
|
|
||||||
|
namespace AIStudio.Settings.DataModel;
|
||||||
|
|
||||||
|
public sealed class DataEMail
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect any rewrite options?
|
||||||
|
/// </summary>
|
||||||
|
public bool PreselectOptions { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect the target language?
|
||||||
|
/// </summary>
|
||||||
|
public CommonLanguages PreselectedTargetLanguage { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect any other language?
|
||||||
|
/// </summary>
|
||||||
|
public string PreselectOtherLanguage { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect any writing style?
|
||||||
|
/// </summary>
|
||||||
|
public WritingStyles PreselectedWritingStyle { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect a provider?
|
||||||
|
/// </summary>
|
||||||
|
public string PreselectedProvider { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect a greeting phrase?
|
||||||
|
/// </summary>
|
||||||
|
public string Greeting { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect the sender name for the closing salutation?
|
||||||
|
/// </summary>
|
||||||
|
public string SenderName { get; set; } = string.Empty;
|
||||||
|
}
|
@ -25,4 +25,5 @@ public enum Event
|
|||||||
SEND_TO_CODING_ASSISTANT,
|
SEND_TO_CODING_ASSISTANT,
|
||||||
SEND_TO_TEXT_SUMMARIZER_ASSISTANT,
|
SEND_TO_TEXT_SUMMARIZER_ASSISTANT,
|
||||||
SEND_TO_CHAT,
|
SEND_TO_CHAT,
|
||||||
|
SEND_TO_EMAIL_ASSISTANT,
|
||||||
}
|
}
|
@ -11,6 +11,7 @@ public enum SendTo
|
|||||||
AGENDA_ASSISTANT,
|
AGENDA_ASSISTANT,
|
||||||
CODING_ASSISTANT,
|
CODING_ASSISTANT,
|
||||||
TEXT_SUMMARIZER_ASSISTANT,
|
TEXT_SUMMARIZER_ASSISTANT,
|
||||||
|
EMAIL_ASSISTANT,
|
||||||
|
|
||||||
CHAT,
|
CHAT,
|
||||||
}
|
}
|
@ -13,6 +13,7 @@ public static class SendToExtensions
|
|||||||
SendTo.REWRITE_ASSISTANT => "Rewrite Assistant",
|
SendTo.REWRITE_ASSISTANT => "Rewrite Assistant",
|
||||||
SendTo.AGENDA_ASSISTANT => "Agenda Assistant",
|
SendTo.AGENDA_ASSISTANT => "Agenda Assistant",
|
||||||
SendTo.CODING_ASSISTANT => "Coding Assistant",
|
SendTo.CODING_ASSISTANT => "Coding Assistant",
|
||||||
|
SendTo.EMAIL_ASSISTANT => "E-Mail Assistant",
|
||||||
|
|
||||||
SendTo.CHAT => "New Chat",
|
SendTo.CHAT => "New Chat",
|
||||||
|
|
||||||
|
5
app/MindWork AI Studio/wwwroot/changelog/v0.8.12.md
Normal file
5
app/MindWork AI Studio/wwwroot/changelog/v0.8.12.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# v0.8.12, build 174
|
||||||
|
- Added an e-mail writing assistant.
|
||||||
|
- Added the possibility to preselect some e-mail writing assistant options.
|
||||||
|
- Improved the content validation for the agenda assistant.
|
||||||
|
- Improved the language handling of the agenda assistant.
|
Loading…
Reference in New Issue
Block a user