mirror of
https://github.com/MindWorkAI/AI-Studio.git
synced 2025-02-05 14:49:06 +00:00
Add job posting assistant (#150)
This commit is contained in:
parent
b99866b8fe
commit
375be805a1
@ -0,0 +1,15 @@
|
|||||||
|
@attribute [Route(Routes.ASSISTANT_JOB_POSTING)]
|
||||||
|
@inherits AssistantBaseCore
|
||||||
|
|
||||||
|
<MudTextField T="string" @bind-Text="@this.inputCompanyName" Label="(Optional) The company name" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Warehouse" Variant="Variant.Outlined" Margin="Margin.Dense" UserAttributes="@USER_INPUT_ATTRIBUTES" Class="mb-3"/>
|
||||||
|
<MudTextField T="string" @bind-Text="@this.inputCountryLegalFramework" Label="Provide the country, where the company is located" Validation="@this.ValidateCountryLegalFramework" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Flag" Variant="Variant.Outlined" Margin="Margin.Dense" UserAttributes="@USER_INPUT_ATTRIBUTES" Class="mb-3" HelperText="This is important to consider the legal framework of the country."/>
|
||||||
|
<MudTextField T="string" @bind-Text="@this.inputMandatoryInformation" Label="(Optional) Provide mandatory information" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.TextSnippet" Variant="Variant.Outlined" Lines="6" AutoGrow="@true" MaxLines="12" Class="mb-3" UserAttributes="@USER_INPUT_ATTRIBUTES" HelperText="Mandatory information that your company requires for all job postings. This can include the company description, etc." />
|
||||||
|
<MudTextField T="string" @bind-Text="@this.inputJobDescription" Label="Job description" Validation="@this.ValidateJobDescription" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Settings" Variant="Variant.Outlined" Lines="6" AutoGrow="@true" MaxLines="12" Class="mb-3" UserAttributes="@USER_INPUT_ATTRIBUTES" HelperText="Describe what the person is supposed to do in the company. This might be just short bullet points." />
|
||||||
|
<MudTextField T="string" @bind-Text="@this.inputQualifications" Label="(Optional) Provide necessary job qualifications" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Settings" Variant="Variant.Outlined" Lines="6" AutoGrow="@true" MaxLines="12" Class="mb-3" UserAttributes="@USER_INPUT_ATTRIBUTES" HelperText="Describe what the person should bring to the table. This might be just short bullet points." />
|
||||||
|
<MudTextField T="string" @bind-Text="@this.inputResponsibilities" Label="(Optional) Provide job responsibilities" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Settings" Variant="Variant.Outlined" Lines="6" AutoGrow="@true" MaxLines="12" Class="mb-3" UserAttributes="@USER_INPUT_ATTRIBUTES" HelperText="Describe the responsibilities the person should take on in the company." />
|
||||||
|
<MudTextField T="string" @bind-Text="@this.inputWorkLocation" Label="(Optional) Provide the work location" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.MyLocation" Variant="Variant.Outlined" Margin="Margin.Dense" UserAttributes="@USER_INPUT_ATTRIBUTES" Class="mb-3"/>
|
||||||
|
<MudTextField T="string" @bind-Text="@this.inputEntryDate" Label="(Optional) Provide the entry date" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.DateRange" Variant="Variant.Outlined" Margin="Margin.Dense" UserAttributes="@USER_INPUT_ATTRIBUTES" Class="mb-3"/>
|
||||||
|
<MudTextField T="string" @bind-Text="@this.inputValidUntil" Label="(Optional) Provide the date until the job posting is valid" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.DateRange" Variant="Variant.Outlined" Margin="Margin.Dense" UserAttributes="@USER_INPUT_ATTRIBUTES" Class="mb-3"/>
|
||||||
|
|
||||||
|
<EnumSelection T="CommonLanguages" NameFunc="@(language => language.NameSelectingOptional())" @bind-Value="@this.selectedTargetLanguage" 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,283 @@
|
|||||||
|
namespace AIStudio.Assistants.JobPosting;
|
||||||
|
|
||||||
|
public partial class AssistantJobPostings : AssistantBaseCore
|
||||||
|
{
|
||||||
|
public override Tools.Components Component => Tools.Components.JOB_POSTING_ASSISTANT;
|
||||||
|
|
||||||
|
protected override string Title => "Job Posting";
|
||||||
|
|
||||||
|
protected override string Description =>
|
||||||
|
"""
|
||||||
|
Provide some key points about the job you want to post. The AI will then
|
||||||
|
formulate a suggestion that you can finalize.
|
||||||
|
""";
|
||||||
|
|
||||||
|
protected override string SystemPrompt =>
|
||||||
|
$"""
|
||||||
|
You are an experienced specialist in personnel matters. You write job postings.
|
||||||
|
You follow the usual guidelines in the country of the posting. You ensure that
|
||||||
|
no individuals are discriminated against or excluded by the job posting. You do
|
||||||
|
not ask any questions and you do not repeat the task. You provide your response
|
||||||
|
in a Markdown format. Missing information necessary for the job posting, you try
|
||||||
|
to derive from the other details provided.
|
||||||
|
|
||||||
|
Structure of your response:
|
||||||
|
---
|
||||||
|
# <TITLE>
|
||||||
|
<Description of the job and the company>
|
||||||
|
|
||||||
|
# <TASKS>
|
||||||
|
<Describe what takes the job entails>
|
||||||
|
|
||||||
|
# <QUALIFICATIONS>
|
||||||
|
<What qualifications are required>
|
||||||
|
|
||||||
|
# <RESPONSIBILITIES>
|
||||||
|
<What responsibilities are associated with the job>
|
||||||
|
|
||||||
|
<When available, closing details such as the entry date etc.>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
You write the job posting in the following language: {this.SystemPromptLanguage()}.
|
||||||
|
""";
|
||||||
|
|
||||||
|
protected override IReadOnlyList<IButtonData> FooterButtons => [];
|
||||||
|
|
||||||
|
protected override string SubmitText => "Create the job posting";
|
||||||
|
|
||||||
|
protected override Func<Task> SubmitAction => this.CreateJobPosting;
|
||||||
|
|
||||||
|
protected override bool SubmitDisabled => false;
|
||||||
|
|
||||||
|
protected override bool AllowProfiles => false;
|
||||||
|
|
||||||
|
protected override void ResetFrom()
|
||||||
|
{
|
||||||
|
this.inputEntryDate = string.Empty;
|
||||||
|
this.inputValidUntil = string.Empty;
|
||||||
|
if (!this.MightPreselectValues())
|
||||||
|
{
|
||||||
|
this.selectedTargetLanguage = CommonLanguages.AS_IS;
|
||||||
|
this.customTargetLanguage = string.Empty;
|
||||||
|
this.inputMandatoryInformation = string.Empty;
|
||||||
|
this.inputJobDescription = string.Empty;
|
||||||
|
this.inputQualifications = string.Empty;
|
||||||
|
this.inputResponsibilities = string.Empty;
|
||||||
|
this.inputCompanyName = string.Empty;
|
||||||
|
this.inputWorkLocation = string.Empty;
|
||||||
|
this.inputCountryLegalFramework = string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool MightPreselectValues()
|
||||||
|
{
|
||||||
|
if (this.SettingsManager.ConfigurationData.JobPostings.PreselectOptions)
|
||||||
|
{
|
||||||
|
this.inputMandatoryInformation = this.SettingsManager.ConfigurationData.JobPostings.PreselectedMandatoryInformation;
|
||||||
|
if(string.IsNullOrWhiteSpace(this.inputJobDescription))
|
||||||
|
this.inputJobDescription = this.SettingsManager.ConfigurationData.JobPostings.PreselectedJobDescription;
|
||||||
|
this.inputQualifications = this.SettingsManager.ConfigurationData.JobPostings.PreselectedQualifications;
|
||||||
|
this.inputResponsibilities = this.SettingsManager.ConfigurationData.JobPostings.PreselectedResponsibilities;
|
||||||
|
this.inputCompanyName = this.SettingsManager.ConfigurationData.JobPostings.PreselectedCompanyName;
|
||||||
|
this.inputWorkLocation = this.SettingsManager.ConfigurationData.JobPostings.PreselectedWorkLocation;
|
||||||
|
this.inputCountryLegalFramework = this.SettingsManager.ConfigurationData.JobPostings.PreselectedCountryLegalFramework;
|
||||||
|
this.selectedTargetLanguage = this.SettingsManager.ConfigurationData.JobPostings.PreselectedTargetLanguage;
|
||||||
|
this.customTargetLanguage = this.SettingsManager.ConfigurationData.JobPostings.PreselectOtherLanguage;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string inputMandatoryInformation = string.Empty;
|
||||||
|
private string inputJobDescription = string.Empty;
|
||||||
|
private string inputQualifications = string.Empty;
|
||||||
|
private string inputResponsibilities = string.Empty;
|
||||||
|
private string inputCompanyName = string.Empty;
|
||||||
|
private string inputEntryDate = string.Empty;
|
||||||
|
private string inputValidUntil = string.Empty;
|
||||||
|
private string inputWorkLocation = string.Empty;
|
||||||
|
private string inputCountryLegalFramework = string.Empty;
|
||||||
|
private CommonLanguages selectedTargetLanguage = CommonLanguages.AS_IS;
|
||||||
|
private string customTargetLanguage = string.Empty;
|
||||||
|
|
||||||
|
#region Overrides of ComponentBase
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages<string>(Event.SEND_TO_JOB_POSTING_ASSISTANT).FirstOrDefault();
|
||||||
|
if (deferredContent is not null)
|
||||||
|
this.inputJobDescription = deferredContent;
|
||||||
|
|
||||||
|
await base.OnInitializedAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private string? ValidateCustomLanguage(string language)
|
||||||
|
{
|
||||||
|
if(this.selectedTargetLanguage == CommonLanguages.OTHER && string.IsNullOrWhiteSpace(language))
|
||||||
|
return "Please provide a custom target language.";
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string? ValidateJobDescription(string jobDescription)
|
||||||
|
{
|
||||||
|
if(string.IsNullOrWhiteSpace(jobDescription))
|
||||||
|
return "Please provide a job description.";
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string? ValidateCountryLegalFramework(string countryLegalFramework)
|
||||||
|
{
|
||||||
|
if(string.IsNullOrWhiteSpace(countryLegalFramework))
|
||||||
|
return "Please provide the country where the job is posted (legal framework).";
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 UserPromptMandatoryInformation()
|
||||||
|
{
|
||||||
|
if(string.IsNullOrWhiteSpace(this.inputMandatoryInformation))
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
return $"""
|
||||||
|
# Mandatory Information
|
||||||
|
{this.inputMandatoryInformation}
|
||||||
|
|
||||||
|
""";
|
||||||
|
}
|
||||||
|
|
||||||
|
private string UserPromptJobDescription()
|
||||||
|
{
|
||||||
|
if(string.IsNullOrWhiteSpace(this.inputJobDescription))
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
return $"""
|
||||||
|
# Job Description
|
||||||
|
{this.inputJobDescription}
|
||||||
|
|
||||||
|
""";
|
||||||
|
}
|
||||||
|
|
||||||
|
private string UserPromptQualifications()
|
||||||
|
{
|
||||||
|
if(string.IsNullOrWhiteSpace(this.inputQualifications))
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
return $"""
|
||||||
|
# Qualifications
|
||||||
|
{this.inputQualifications}
|
||||||
|
|
||||||
|
""";
|
||||||
|
}
|
||||||
|
|
||||||
|
private string UserPromptResponsibilities()
|
||||||
|
{
|
||||||
|
if(string.IsNullOrWhiteSpace(this.inputResponsibilities))
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
return $"""
|
||||||
|
# Responsibilities
|
||||||
|
{this.inputResponsibilities}
|
||||||
|
|
||||||
|
""";
|
||||||
|
}
|
||||||
|
|
||||||
|
private string UserPromptCompanyName()
|
||||||
|
{
|
||||||
|
if(string.IsNullOrWhiteSpace(this.inputCompanyName))
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
return $"""
|
||||||
|
# Company Name
|
||||||
|
{this.inputCompanyName}
|
||||||
|
|
||||||
|
""";
|
||||||
|
}
|
||||||
|
|
||||||
|
private string UserPromptEntryDate()
|
||||||
|
{
|
||||||
|
if(string.IsNullOrWhiteSpace(this.inputEntryDate))
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
return $"""
|
||||||
|
# Entry Date
|
||||||
|
{this.inputEntryDate}
|
||||||
|
|
||||||
|
""";
|
||||||
|
}
|
||||||
|
|
||||||
|
private string UserPromptValidUntil()
|
||||||
|
{
|
||||||
|
if(string.IsNullOrWhiteSpace(this.inputValidUntil))
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
return $"""
|
||||||
|
# Job Posting Valid Until
|
||||||
|
{this.inputValidUntil}
|
||||||
|
|
||||||
|
""";
|
||||||
|
}
|
||||||
|
|
||||||
|
private string UserPromptWorkLocation()
|
||||||
|
{
|
||||||
|
if(string.IsNullOrWhiteSpace(this.inputWorkLocation))
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
return $"""
|
||||||
|
# Work Location
|
||||||
|
{this.inputWorkLocation}
|
||||||
|
|
||||||
|
""";
|
||||||
|
}
|
||||||
|
|
||||||
|
private string UserPromptCountryLegalFramework()
|
||||||
|
{
|
||||||
|
if(string.IsNullOrWhiteSpace(this.inputCountryLegalFramework))
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
return $"""
|
||||||
|
# Country where the job is posted (legal framework)
|
||||||
|
{this.inputCountryLegalFramework}
|
||||||
|
|
||||||
|
""";
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task CreateJobPosting()
|
||||||
|
{
|
||||||
|
await this.form!.Validate();
|
||||||
|
if (!this.inputIsValid)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.CreateChatThread();
|
||||||
|
var time = this.AddUserRequest(
|
||||||
|
$"""
|
||||||
|
{this.UserPromptCompanyName()}
|
||||||
|
{this.UserPromptCountryLegalFramework()}
|
||||||
|
{this.UserPromptMandatoryInformation()}
|
||||||
|
{this.UserPromptJobDescription()}
|
||||||
|
{this.UserPromptQualifications()}
|
||||||
|
{this.UserPromptResponsibilities()}
|
||||||
|
{this.UserPromptWorkLocation()}
|
||||||
|
{this.UserPromptEntryDate()}
|
||||||
|
{this.UserPromptValidUntil()}
|
||||||
|
""");
|
||||||
|
|
||||||
|
await this.AddAIResponseAsync(time);
|
||||||
|
}
|
||||||
|
}
|
@ -3,16 +3,17 @@
|
|||||||
<MudTextField
|
<MudTextField
|
||||||
T="string"
|
T="string"
|
||||||
Text="@this.Text()"
|
Text="@this.Text()"
|
||||||
TextChanged="@this.OptionChanged"
|
TextChanged="@this.InternalUpdate"
|
||||||
Label="@this.OptionDescription"
|
Label="@this.OptionDescription"
|
||||||
Disabled="@this.Disabled()"
|
Disabled="@this.Disabled()"
|
||||||
Class="mb-3"
|
Class="@MARGIN_CLASS"
|
||||||
Adornment="Adornment.Start"
|
Adornment="Adornment.Start"
|
||||||
AdornmentIcon="@this.Icon"
|
AdornmentIcon="@this.Icon"
|
||||||
AdornmentColor="@this.IconColor"
|
AdornmentColor="@this.IconColor"
|
||||||
UserAttributes="@SPELLCHECK_ATTRIBUTES"
|
UserAttributes="@SPELLCHECK_ATTRIBUTES"
|
||||||
Lines="1"
|
Lines="@this.NumLines"
|
||||||
Immediate="@false"
|
AutoGrow="@this.AutoGrow"
|
||||||
DebounceInterval="500"
|
MaxLines="@this.GetMaxLines"
|
||||||
|
Immediate="@true"
|
||||||
Variant="Variant.Outlined"
|
Variant="Variant.Outlined"
|
||||||
/>
|
/>
|
@ -1,5 +1,7 @@
|
|||||||
using Microsoft.AspNetCore.Components;
|
using Microsoft.AspNetCore.Components;
|
||||||
|
|
||||||
|
using Timer = System.Timers.Timer;
|
||||||
|
|
||||||
namespace AIStudio.Components;
|
namespace AIStudio.Components;
|
||||||
|
|
||||||
public partial class ConfigurationText : ConfigurationBase
|
public partial class ConfigurationText : ConfigurationBase
|
||||||
@ -11,7 +13,7 @@ public partial class ConfigurationText : ConfigurationBase
|
|||||||
public Func<string> Text { get; set; } = () => string.Empty;
|
public Func<string> Text { get; set; } = () => string.Empty;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// An action which is called when the option is changed.
|
/// An action which is called when the text was changed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Parameter]
|
[Parameter]
|
||||||
public Action<string> TextUpdate { get; set; } = _ => { };
|
public Action<string> TextUpdate { get; set; } = _ => { };
|
||||||
@ -27,6 +29,55 @@ public partial class ConfigurationText : ConfigurationBase
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
[Parameter]
|
[Parameter]
|
||||||
public Color IconColor { get; set; } = Color.Default;
|
public Color IconColor { get; set; } = Color.Default;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// How many lines should the textfield have?
|
||||||
|
/// </summary>
|
||||||
|
[Parameter]
|
||||||
|
public int NumLines { get; set; } = 1;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// What is the maximum number of lines?
|
||||||
|
/// </summary>
|
||||||
|
[Parameter]
|
||||||
|
public int MaxLines { get; set; } = 12;
|
||||||
|
|
||||||
|
private string internalText = string.Empty;
|
||||||
|
private Timer timer = new(TimeSpan.FromMilliseconds(500))
|
||||||
|
{
|
||||||
|
AutoReset = false
|
||||||
|
};
|
||||||
|
|
||||||
|
#region Overrides of ConfigurationBase
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
this.timer.Elapsed += async (_, _) => await this.InvokeAsync(async () => await this.OptionChanged(this.internalText));
|
||||||
|
await base.OnInitializedAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Overrides of ComponentBase
|
||||||
|
|
||||||
|
protected override async Task OnParametersSetAsync()
|
||||||
|
{
|
||||||
|
this.internalText = this.Text();
|
||||||
|
await base.OnParametersSetAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private bool AutoGrow => this.NumLines > 1;
|
||||||
|
|
||||||
|
private int GetMaxLines => this.AutoGrow ? this.MaxLines : 1;
|
||||||
|
|
||||||
|
private void InternalUpdate(string text)
|
||||||
|
{
|
||||||
|
this.timer.Stop();
|
||||||
|
this.internalText = text;
|
||||||
|
this.timer.Start();
|
||||||
|
}
|
||||||
|
|
||||||
private async Task OptionChanged(string updatedText)
|
private async Task OptionChanged(string updatedText)
|
||||||
{
|
{
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
<AssistantBlock Name="E-Mail" Description="Generate an e-mail for a given context." Icon="@Icons.Material.Filled.Email" Link="@Routes.ASSISTANT_EMAIL"/>
|
<AssistantBlock Name="E-Mail" Description="Generate an e-mail for a given context." Icon="@Icons.Material.Filled.Email" Link="@Routes.ASSISTANT_EMAIL"/>
|
||||||
<AssistantBlock Name="My Tasks" Description="Analyze a text or an email for tasks you need to complete." Icon="@Icons.Material.Filled.Task" Link="@Routes.ASSISTANT_MY_TASKS"/>
|
<AssistantBlock Name="My Tasks" Description="Analyze a text or an email for tasks you need to complete." Icon="@Icons.Material.Filled.Task" Link="@Routes.ASSISTANT_MY_TASKS"/>
|
||||||
<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="Job Posting" Description="Generate a job posting for a given job description." Icon="@Icons.Material.Filled.Work" Link="@Routes.ASSISTANT_JOB_POSTING"/>
|
||||||
<AssistantBlock Name="Legal Check" Description="Ask a question about a legal document." Icon="@Icons.Material.Filled.Gavel" Link="@Routes.ASSISTANT_LEGAL_CHECK"/>
|
<AssistantBlock Name="Legal Check" Description="Ask a question about a legal document." Icon="@Icons.Material.Filled.Gavel" Link="@Routes.ASSISTANT_LEGAL_CHECK"/>
|
||||||
<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>
|
||||||
|
@ -342,6 +342,26 @@
|
|||||||
</MudPaper>
|
</MudPaper>
|
||||||
</ExpansionPanel>
|
</ExpansionPanel>
|
||||||
|
|
||||||
|
<ExpansionPanel HeaderIcon="@Icons.Material.Filled.Work" HeaderText="Assistant: Job Postings">
|
||||||
|
<MudPaper Class="pa-3 mb-8 border-dashed border rounded-lg">
|
||||||
|
<ConfigurationOption OptionDescription="Preselect job posting options?" LabelOn="Job posting options are preselected" LabelOff="No job posting options are preselected" State="@(() => this.SettingsManager.ConfigurationData.JobPostings.PreselectOptions)" StateUpdate="@(updatedState => this.SettingsManager.ConfigurationData.JobPostings.PreselectOptions = updatedState)" OptionHelp="When enabled, you can preselect some job posting options. This is might be useful when you prefer a specific LLM model."/>
|
||||||
|
<ConfigurationText OptionDescription="Preselect the company name?" Disabled="@(() => !this.SettingsManager.ConfigurationData.JobPostings.PreselectOptions)" Icon="@Icons.Material.Filled.Warehouse" Text="@(() => this.SettingsManager.ConfigurationData.JobPostings.PreselectedCompanyName)" TextUpdate="@(updatedText => this.SettingsManager.ConfigurationData.JobPostings.PreselectedCompanyName = updatedText)" />
|
||||||
|
<ConfigurationText OptionDescription="Preselect some mandatory information about the job posting?" NumLines="6" Disabled="@(() => !this.SettingsManager.ConfigurationData.JobPostings.PreselectOptions)" Icon="@Icons.Material.Filled.TextSnippet" Text="@(() => this.SettingsManager.ConfigurationData.JobPostings.PreselectedMandatoryInformation)" TextUpdate="@(updatedText => this.SettingsManager.ConfigurationData.JobPostings.PreselectedMandatoryInformation = updatedText)" />
|
||||||
|
<ConfigurationText OptionDescription="Preselect the job description?" NumLines="3" MaxLines="6" Disabled="@(() => !this.SettingsManager.ConfigurationData.JobPostings.PreselectOptions)" Icon="@Icons.Material.Filled.Settings" Text="@(() => this.SettingsManager.ConfigurationData.JobPostings.PreselectedJobDescription)" TextUpdate="@(updatedText => this.SettingsManager.ConfigurationData.JobPostings.PreselectedJobDescription = updatedText)" />
|
||||||
|
<ConfigurationText OptionDescription="Preselect the job qualifications?" NumLines="3" MaxLines="6" Disabled="@(() => !this.SettingsManager.ConfigurationData.JobPostings.PreselectOptions)" Icon="@Icons.Material.Filled.Settings" Text="@(() => this.SettingsManager.ConfigurationData.JobPostings.PreselectedQualifications)" TextUpdate="@(updatedText => this.SettingsManager.ConfigurationData.JobPostings.PreselectedQualifications = updatedText)" />
|
||||||
|
<ConfigurationText OptionDescription="Preselect the job responsibilities?" NumLines="3" MaxLines="6" Disabled="@(() => !this.SettingsManager.ConfigurationData.JobPostings.PreselectOptions)" Icon="@Icons.Material.Filled.Settings" Text="@(() => this.SettingsManager.ConfigurationData.JobPostings.PreselectedResponsibilities)" TextUpdate="@(updatedText => this.SettingsManager.ConfigurationData.JobPostings.PreselectedResponsibilities = updatedText)" />
|
||||||
|
<ConfigurationText OptionDescription="Preselect the work location?" Disabled="@(() => !this.SettingsManager.ConfigurationData.JobPostings.PreselectOptions)" Icon="@Icons.Material.Filled.MyLocation" Text="@(() => this.SettingsManager.ConfigurationData.JobPostings.PreselectedWorkLocation)" TextUpdate="@(updatedText => this.SettingsManager.ConfigurationData.JobPostings.PreselectedWorkLocation = updatedText)" />
|
||||||
|
<ConfigurationText OptionDescription="Preselect the country (legal framework)?" Disabled="@(() => !this.SettingsManager.ConfigurationData.JobPostings.PreselectOptions)" Icon="@Icons.Material.Filled.Flag" Text="@(() => this.SettingsManager.ConfigurationData.JobPostings.PreselectedCountryLegalFramework)" TextUpdate="@(updatedText => this.SettingsManager.ConfigurationData.JobPostings.PreselectedCountryLegalFramework = updatedText)" />
|
||||||
|
<ConfigurationSelect OptionDescription="Preselect the language" Disabled="@(() => !this.SettingsManager.ConfigurationData.JobPostings.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.JobPostings.PreselectedTargetLanguage)" Data="@ConfigurationSelectDataFactory.GetCommonLanguagesOptionalData()" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.JobPostings.PreselectedTargetLanguage = selectedValue)" OptionHelp="Which target language should be preselected?"/>
|
||||||
|
@if (this.SettingsManager.ConfigurationData.JobPostings.PreselectedTargetLanguage is CommonLanguages.OTHER)
|
||||||
|
{
|
||||||
|
<ConfigurationText OptionDescription="Preselect another target language" Disabled="@(() => !this.SettingsManager.ConfigurationData.JobPostings.PreselectOptions)" Icon="@Icons.Material.Filled.Translate" Text="@(() => this.SettingsManager.ConfigurationData.JobPostings.PreselectOtherLanguage)" TextUpdate="@(updatedText => this.SettingsManager.ConfigurationData.JobPostings.PreselectOtherLanguage = updatedText)"/>
|
||||||
|
}
|
||||||
|
<ConfigurationMinConfidenceSelection Disabled="@(() => !this.SettingsManager.ConfigurationData.JobPostings.PreselectOptions)" RestrictToGlobalMinimumConfidence="@true" SelectedValue="@(() => this.SettingsManager.ConfigurationData.JobPostings.MinimumProviderConfidence)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.JobPostings.MinimumProviderConfidence = selectedValue)"/>
|
||||||
|
<ConfigurationProviderSelection Component="Components.JOB_POSTING_ASSISTANT" Data="@this.availableProviders" Disabled="@(() => !this.SettingsManager.ConfigurationData.JobPostings.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.JobPostings.PreselectedProvider)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.JobPostings.PreselectedProvider = selectedValue)"/>
|
||||||
|
</MudPaper>
|
||||||
|
</ExpansionPanel>
|
||||||
|
|
||||||
<ExpansionPanel HeaderIcon="@Icons.Material.Filled.Gavel" HeaderText="Assistant: Legal Check">
|
<ExpansionPanel HeaderIcon="@Icons.Material.Filled.Gavel" HeaderText="Assistant: Legal Check">
|
||||||
<ConfigurationOption OptionDescription="Hide the web content reader?" LabelOn="Web content reader is hidden" LabelOff="Web content reader is shown" State="@(() => this.SettingsManager.ConfigurationData.LegalCheck.HideWebContentReader)" StateUpdate="@(updatedState => this.SettingsManager.ConfigurationData.LegalCheck.HideWebContentReader = updatedState)" OptionHelp="When activated, the web content reader is hidden and cannot be used. As a result, the user interface becomes a bit easier to use."/>
|
<ConfigurationOption OptionDescription="Hide the web content reader?" LabelOn="Web content reader is hidden" LabelOff="Web content reader is shown" State="@(() => this.SettingsManager.ConfigurationData.LegalCheck.HideWebContentReader)" StateUpdate="@(updatedState => this.SettingsManager.ConfigurationData.LegalCheck.HideWebContentReader = updatedState)" OptionHelp="When activated, the web content reader is hidden and cannot be used. As a result, the user interface becomes a bit easier to use."/>
|
||||||
<MudPaper Class="pa-3 mb-8 border-dashed border rounded-lg">
|
<MudPaper Class="pa-3 mb-8 border-dashed border rounded-lg">
|
||||||
|
@ -7,7 +7,7 @@ using AIStudio.Settings;
|
|||||||
|
|
||||||
namespace AIStudio.Provider;
|
namespace AIStudio.Provider;
|
||||||
|
|
||||||
public static class ProvidersExtensions
|
public static class LLMProvidersExtensions
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns the human-readable name of the provider.
|
/// Returns the human-readable name of the provider.
|
@ -21,5 +21,6 @@ public sealed partial class Routes
|
|||||||
public const string ASSISTANT_LEGAL_CHECK = "/assistant/legal-check";
|
public const string ASSISTANT_LEGAL_CHECK = "/assistant/legal-check";
|
||||||
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";
|
||||||
// ReSharper restore InconsistentNaming
|
// ReSharper restore InconsistentNaming
|
||||||
}
|
}
|
@ -58,11 +58,13 @@ public sealed class Data
|
|||||||
|
|
||||||
public DataRewriteImprove RewriteImprove { get; init; } = new();
|
public DataRewriteImprove RewriteImprove { get; init; } = new();
|
||||||
|
|
||||||
public DataEMail EMail { get; set; } = new();
|
public DataEMail EMail { get; init; } = new();
|
||||||
|
|
||||||
public DataLegalCheck LegalCheck { get; set; } = new();
|
public DataLegalCheck LegalCheck { get; init; } = new();
|
||||||
|
|
||||||
public DataSynonyms Synonyms { get; set; } = new();
|
public DataSynonyms Synonyms { get; init; } = new();
|
||||||
|
|
||||||
public DataMyTasks MyTasks { get; set; } = new();
|
public DataMyTasks MyTasks { get; init; } = new();
|
||||||
|
|
||||||
|
public DataJobPostings JobPostings { get; init; } = new();
|
||||||
}
|
}
|
66
app/MindWork AI Studio/Settings/DataModel/DataJobPostings.cs
Normal file
66
app/MindWork AI Studio/Settings/DataModel/DataJobPostings.cs
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
using AIStudio.Provider;
|
||||||
|
|
||||||
|
namespace AIStudio.Settings.DataModel;
|
||||||
|
|
||||||
|
public sealed class DataJobPostings
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Do we want to preselect any translator options?
|
||||||
|
/// </summary>
|
||||||
|
public bool PreselectOptions { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The mandatory information for the job posting.
|
||||||
|
/// </summary>
|
||||||
|
public string PreselectedMandatoryInformation { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The job description.
|
||||||
|
/// </summary>
|
||||||
|
public string PreselectedJobDescription { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The qualifications required for the job.
|
||||||
|
/// </summary>
|
||||||
|
public string PreselectedQualifications { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// What are the responsibilities of the job?
|
||||||
|
/// </summary>
|
||||||
|
public string PreselectedResponsibilities { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Which company name should be preselected?
|
||||||
|
/// </summary>
|
||||||
|
public string PreselectedCompanyName { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Where should the work be done?
|
||||||
|
/// </summary>
|
||||||
|
public string PreselectedWorkLocation { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The preselected country legal framework.
|
||||||
|
/// </summary>
|
||||||
|
public string PreselectedCountryLegalFramework { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect the target language?
|
||||||
|
/// </summary>
|
||||||
|
public CommonLanguages PreselectedTargetLanguage { get; set; } = CommonLanguages.EN_US;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect any other language?
|
||||||
|
/// </summary>
|
||||||
|
public string PreselectOtherLanguage { 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>
|
||||||
|
/// The preselected translator provider.
|
||||||
|
/// </summary>
|
||||||
|
public string PreselectedProvider { get; set; } = string.Empty;
|
||||||
|
}
|
@ -15,6 +15,7 @@ public enum Components
|
|||||||
LEGAL_CHECK_ASSISTANT,
|
LEGAL_CHECK_ASSISTANT,
|
||||||
SYNONYMS_ASSISTANT,
|
SYNONYMS_ASSISTANT,
|
||||||
MY_TASKS_ASSISTANT,
|
MY_TASKS_ASSISTANT,
|
||||||
|
JOB_POSTING_ASSISTANT,
|
||||||
|
|
||||||
CHAT,
|
CHAT,
|
||||||
}
|
}
|
@ -18,6 +18,7 @@ public static class ComponentsExtensions
|
|||||||
Components.LEGAL_CHECK_ASSISTANT => "Legal Check Assistant",
|
Components.LEGAL_CHECK_ASSISTANT => "Legal Check Assistant",
|
||||||
Components.SYNONYMS_ASSISTANT => "Synonym Assistant",
|
Components.SYNONYMS_ASSISTANT => "Synonym Assistant",
|
||||||
Components.MY_TASKS_ASSISTANT => "My Tasks Assistant",
|
Components.MY_TASKS_ASSISTANT => "My Tasks Assistant",
|
||||||
|
Components.JOB_POSTING_ASSISTANT => "Job Posting Assistant",
|
||||||
|
|
||||||
Components.CHAT => "New Chat",
|
Components.CHAT => "New Chat",
|
||||||
|
|
||||||
@ -37,6 +38,7 @@ public static class ComponentsExtensions
|
|||||||
Components.LEGAL_CHECK_ASSISTANT => new(Event.SEND_TO_LEGAL_CHECK_ASSISTANT, Routes.ASSISTANT_LEGAL_CHECK),
|
Components.LEGAL_CHECK_ASSISTANT => new(Event.SEND_TO_LEGAL_CHECK_ASSISTANT, Routes.ASSISTANT_LEGAL_CHECK),
|
||||||
Components.SYNONYMS_ASSISTANT => new(Event.SEND_TO_SYNONYMS_ASSISTANT, Routes.ASSISTANT_SYNONYMS),
|
Components.SYNONYMS_ASSISTANT => new(Event.SEND_TO_SYNONYMS_ASSISTANT, Routes.ASSISTANT_SYNONYMS),
|
||||||
Components.MY_TASKS_ASSISTANT => new(Event.SEND_TO_MY_TASKS_ASSISTANT, Routes.ASSISTANT_MY_TASKS),
|
Components.MY_TASKS_ASSISTANT => new(Event.SEND_TO_MY_TASKS_ASSISTANT, Routes.ASSISTANT_MY_TASKS),
|
||||||
|
Components.JOB_POSTING_ASSISTANT => new(Event.SEND_TO_JOB_POSTING_ASSISTANT, Routes.ASSISTANT_JOB_POSTING),
|
||||||
|
|
||||||
Components.CHAT => new(Event.SEND_TO_CHAT, Routes.CHAT),
|
Components.CHAT => new(Event.SEND_TO_CHAT, Routes.CHAT),
|
||||||
|
|
||||||
@ -56,6 +58,7 @@ public static class ComponentsExtensions
|
|||||||
Components.LEGAL_CHECK_ASSISTANT => settingsManager.ConfigurationData.LegalCheck.PreselectOptions ? settingsManager.ConfigurationData.LegalCheck.MinimumProviderConfidence : default,
|
Components.LEGAL_CHECK_ASSISTANT => settingsManager.ConfigurationData.LegalCheck.PreselectOptions ? settingsManager.ConfigurationData.LegalCheck.MinimumProviderConfidence : default,
|
||||||
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,
|
||||||
|
|
||||||
_ => default,
|
_ => default,
|
||||||
};
|
};
|
||||||
@ -73,6 +76,7 @@ public static class ComponentsExtensions
|
|||||||
Components.LEGAL_CHECK_ASSISTANT => settingsManager.ConfigurationData.LegalCheck.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.LegalCheck.PreselectedProvider) : default,
|
Components.LEGAL_CHECK_ASSISTANT => settingsManager.ConfigurationData.LegalCheck.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.LegalCheck.PreselectedProvider) : default,
|
||||||
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.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,
|
||||||
|
|
||||||
|
@ -30,4 +30,5 @@ public enum Event
|
|||||||
SEND_TO_LEGAL_CHECK_ASSISTANT,
|
SEND_TO_LEGAL_CHECK_ASSISTANT,
|
||||||
SEND_TO_SYNONYMS_ASSISTANT,
|
SEND_TO_SYNONYMS_ASSISTANT,
|
||||||
SEND_TO_MY_TASKS_ASSISTANT,
|
SEND_TO_MY_TASKS_ASSISTANT,
|
||||||
|
SEND_TO_JOB_POSTING_ASSISTANT,
|
||||||
}
|
}
|
4
app/MindWork AI Studio/wwwroot/changelog/v0.9.12.md
Normal file
4
app/MindWork AI Studio/wwwroot/changelog/v0.9.12.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# v0.9.12, build 187 (2024-09-xx xx:xx UTC)
|
||||||
|
- Added a job posting assistant to the business category.
|
||||||
|
- Fixed margin-related issue in the `ConfigurationText` component.
|
||||||
|
- Refactored the `ConfigurationText` component to debounce the input field to prevent unnecessary configuration updates. The component now also supports multiline text.
|
Loading…
Reference in New Issue
Block a user